Mercurial > pidgin
diff src/protocols/novell/nmuser.c @ 8933:6663ad2386d9
[gaim-migrate @ 9703]
"Initial Comment:
* Added support for privacy settings
* Added support for invites - ability to initiate
multi-user conferences (chats).
* Changed the license notice (to the standard GPL notice)
* Fixed 64 bit issues
* Incorporated Joe Shaw's patch for better error messages
* Fixed the buddy list sync problems" --Mike Stoddard of Novell
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Sat, 15 May 2004 14:00:31 +0000 |
| parents | a2affcdf8e01 |
| children | 54fb1f466953 |
line wrap: on
line diff
--- a/src/protocols/novell/nmuser.c Sat May 15 06:24:52 2004 +0000 +++ b/src/protocols/novell/nmuser.c Sat May 15 14:00:31 2004 +0000 @@ -1,27 +1,26 @@ /* * nmuser.c * - * Copyright © 2004 Unpublished Work of Novell, Inc. All Rights Reserved. + * Copyright (c) 2004 Novell, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. * - * THIS WORK IS AN UNPUBLISHED WORK OF NOVELL, INC. NO PART OF THIS WORK MAY BE - * USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED, MODIFIED, - * TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, - * RECAST, TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL, - * INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT - * THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * AS BETWEEN [GAIM] AND NOVELL, NOVELL GRANTS [GAIM] THE RIGHT TO REPUBLISH - * THIS WORK UNDER THE GPL (GNU GENERAL PUBLIC LICENSE) WITH ALL RIGHTS AND - * LICENSES THEREUNDER. IF YOU HAVE RECEIVED THIS WORK DIRECTLY OR INDIRECTLY - * FROM [GAIM] AS PART OF SUCH A REPUBLICATION, YOU HAVE ALL RIGHTS AND LICENSES - * GRANTED BY [GAIM] UNDER THE GPL. IN CONNECTION WITH SUCH A REPUBLICATION, IF - * ANYTHING IN THIS NOTICE CONFLICTS WITH THE TERMS OF THE GPL, SUCH TERMS - * PREVAIL. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <glib.h> #include <string.h> +#include "internal.h" #include "nmfield.h" #include "nmuser.h" #include "nmconn.h" @@ -37,11 +36,16 @@ "Microsoft Sans Serif;}}\n{\\colortbl ;\\red0"\ "\\green0\\blue0;}\n\\viewkind4\\uc1\\pard\\ltrpar"\ "\\li50\\ri50\\cf1\\f0\\fs20 %s\\par\n}" +#define NM_MAX_MESSAGE_SIZE 2048 static NMERR_T nm_process_response(NMUser * user); static void _update_contact_list(NMUser * user, NMField * fields); +static void +_handle_multiple_get_details_login_cb(NMUser * user, NMERR_T ret_code, + gpointer resp_data, gpointer user_data); + /** * See header for comments on on "public" functions */ @@ -125,21 +129,20 @@ return NMERR_BAD_PARM; } - fields = nm_add_field(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(user->name), NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_SZ_CREDENTIALS, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(pwd), NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_SZ_USER_AGENT, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(user_agent), NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_UD_BUILD, 0, NMFIELD_METHOD_VALID, 0, - (guint32) NM_PROTOCOL_VERSION, - NMFIELD_TYPE_UDWORD); + fields = nm_field_add_pointer(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(user->name), NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_SZ_CREDENTIALS, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(pwd), NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_SZ_USER_AGENT, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(user_agent), NMFIELD_TYPE_UTF8); + + fields = nm_field_add_number(fields, NM_A_UD_BUILD, 0, NMFIELD_METHOD_VALID, 0, + NM_PROTOCOL_VERSION, NMFIELD_TYPE_UDWORD); if (my_addr) { - fields = nm_add_field(fields, NM_A_IP_ADDRESS, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(my_addr), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_IP_ADDRESS, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(my_addr), NMFIELD_TYPE_UTF8); } /* Send the login */ @@ -173,21 +176,20 @@ return NMERR_BAD_PARM; /* Add the status */ - fields = nm_add_field(fields, NM_A_SZ_STATUS, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf("%d", status), - NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_STATUS, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf("%d", status), NMFIELD_TYPE_UTF8); /* Add the status text and auto reply text if there is any */ if (text) { - fields = nm_add_field(fields, NM_A_SZ_STATUS_TEXT, - 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(text), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_STATUS_TEXT, 0, + NMFIELD_METHOD_VALID, 0, g_strdup(text), + NMFIELD_TYPE_UTF8); } if (auto_resp) { - fields = nm_add_field(fields, NM_A_SZ_MESSAGE_BODY, 0, - NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(auto_resp), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_MESSAGE_BODY, 0, + NMFIELD_METHOD_VALID, 0, g_strdup(auto_resp), + NMFIELD_TYPE_UTF8); } rc = nm_send_request(user->conn, "setstatus", fields, &req); @@ -209,6 +211,40 @@ } NMERR_T +nm_send_multiple_get_details(NMUser * user, GSList *names, + nm_response_cb callback, gpointer data) +{ + NMERR_T rc = NM_OK; + NMField *fields = NULL; + NMRequest *req = NULL; + GSList *node; + + if (user == NULL || names == NULL) + return NMERR_BAD_PARM; + + /* Add in DN or display id */ + for (node = names; node; node = node->next) { + fields = nm_field_add_pointer(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(node->data), NMFIELD_TYPE_UTF8); + } + + rc = nm_send_request(user->conn, "getdetails", fields, &req); + if (rc == NM_OK) { + nm_request_set_callback(req, callback); + nm_request_set_user_define(req, data); + nm_conn_add_request_item(user->conn, req); + } + + if (fields) + nm_free_fields(&fields); + + if (req) + nm_release_request(req); + + return rc; +} + +NMERR_T nm_send_get_details(NMUser * user, const char *name, nm_response_cb callback, gpointer data) { @@ -221,19 +257,19 @@ /* Add in DN or display id */ if (strstr("=", name)) { - fields = nm_add_field(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(name), NMFIELD_TYPE_DN); + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(name), NMFIELD_TYPE_DN); } else { const char *dn = nm_lookup_dn(user, name); if (dn) { - fields = nm_add_field(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(name), NMFIELD_TYPE_DN); + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(name), NMFIELD_TYPE_DN); } else { fields = - nm_add_field(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(name), NMFIELD_TYPE_UTF8); + nm_field_add_pointer(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(name), NMFIELD_TYPE_UTF8); } } @@ -269,40 +305,41 @@ return NMERR_BAD_PARM; /* Add in a blank guid */ - tmp = nm_add_field(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(BLANK_GUID), NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_FA_CONVERSATION, 0, - NMFIELD_METHOD_VALID, 0, (guint32) tmp, - NMFIELD_TYPE_ARRAY); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(BLANK_GUID), NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, + NMFIELD_METHOD_VALID, 0, tmp, + NMFIELD_TYPE_ARRAY); tmp = NULL; + /* Add participants in */ count = nm_conference_get_participant_count(conference); for (i = 0; i < count; i++) { NMUserRecord *user_record = nm_conference_get_participant(conference, i); if (user_record) { - fields = nm_add_field(fields, NM_A_SZ_DN, - 0, NMFIELD_METHOD_VALID, 0, - (guint32) - g_strdup(nm_user_record_get_dn(user_record)), - NMFIELD_TYPE_DN); + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, + 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_user_record_get_dn(user_record)), + NMFIELD_TYPE_DN); } } /* Add our user in */ field = nm_locate_field(NM_A_SZ_DN, user->fields); if (field) { - fields = nm_add_field(fields, NM_A_SZ_DN, - 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup((char *) field->value), - NMFIELD_TYPE_DN); + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, + 0, NMFIELD_METHOD_VALID, 0, + g_strdup((char *) field->ptr_value), + NMFIELD_TYPE_DN); } rc = nm_send_request(user->conn, "createconf", fields, &req); if (rc == NM_OK && req) { nm_request_set_callback(req, callback); + nm_conference_add_ref(conference); nm_request_set_data(req, conference); nm_request_set_user_define(req, message); nm_conn_add_request_item(user->conn, req); @@ -331,13 +368,13 @@ return NMERR_BAD_PARM; /* Add in the conference guid */ - tmp = nm_add_field(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(nm_conference_get_guid(conference)), - NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_FA_CONVERSATION, 0, - NMFIELD_METHOD_VALID, 0, (guint32) tmp, - NMFIELD_TYPE_ARRAY); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_conference_get_guid(conference)), + NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, + NMFIELD_METHOD_VALID, 0, tmp, + NMFIELD_TYPE_ARRAY); tmp = NULL; /* Send the request to the server */ @@ -370,13 +407,13 @@ return NMERR_BAD_PARM; /* Add in the conference guid */ - tmp = nm_add_field(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(nm_conference_get_guid(conference)), - NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_FA_CONVERSATION, 0, - NMFIELD_METHOD_VALID, 0, (guint32) tmp, - NMFIELD_TYPE_ARRAY); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_conference_get_guid(conference)), + NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, + NMFIELD_METHOD_VALID, 0, tmp, + NMFIELD_TYPE_ARRAY); tmp = NULL; /* Send the request to the server */ @@ -414,13 +451,13 @@ return NMERR_BAD_PARM; /* Add in the conference guid */ - tmp = nm_add_field(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(nm_conference_get_guid(conference)), - NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_FA_CONVERSATION, 0, - NMFIELD_METHOD_VALID, 0, (guint32) tmp, - NMFIELD_TYPE_ARRAY); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_conference_get_guid(conference)), + NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, + NMFIELD_METHOD_VALID, 0, tmp, + NMFIELD_TYPE_ARRAY); tmp = NULL; /* Send the request to the server */ @@ -446,10 +483,64 @@ } NMERR_T +nm_send_conference_invite(NMUser *user, NMConference *conference, NMUserRecord *user_record, + const char *message, nm_response_cb callback, gpointer data) +{ + NMERR_T rc = NM_OK; + NMField *fields = NULL; + NMField *tmp = NULL; + NMRequest *req = NULL; + + if (user == NULL || conference == NULL || user_record == NULL) + return NMERR_BAD_PARM; + + /* Add in the conference guid */ + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_conference_get_guid(conference)), + NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, + NMFIELD_METHOD_VALID, 0, tmp, + NMFIELD_TYPE_ARRAY); + tmp = NULL; + + /* Add in DN of user to invite */ + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_user_record_get_dn(user_record)), + NMFIELD_TYPE_DN); + + /* Add the invite message if there is one */ + if (message) + fields = nm_field_add_pointer(fields, NM_A_SZ_MESSAGE_BODY, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(message), NMFIELD_TYPE_UTF8); + + /* Send the request to the server */ + rc = nm_send_request(user->conn, "sendinvite", fields, &req); + + /* Set up the request object so that we know what to do + * when we get a response + */ + if (rc == NM_OK && req) { + nm_request_set_callback(req, callback); + nm_request_set_data(req, conference); + nm_request_set_user_define(req, data); + nm_conn_add_request_item(user->conn, req); + } + + if (req) + nm_release_request(req); + + if (fields) + nm_free_fields(&fields); + + return rc; +} + +NMERR_T nm_send_message(NMUser * user, NMMessage * message, nm_response_cb callback) { NMERR_T rc = NM_OK; - const char *text; + char *text; NMField *fields = NULL, *tmp = NULL; NMRequest *req = NULL; NMConference *conf; @@ -465,42 +556,46 @@ rc = NMERR_CONFERENCE_NOT_INSTANTIATED; } else { - tmp = nm_add_field(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(nm_conference_get_guid(conf)), - NMFIELD_TYPE_UTF8); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_conference_get_guid(conf)), + NMFIELD_TYPE_UTF8); fields = - nm_add_field(fields, NM_A_FA_CONVERSATION, 0, NMFIELD_METHOD_VALID, 0, - (guint32) tmp, NMFIELD_TYPE_ARRAY); + nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, NMFIELD_METHOD_VALID, 0, + tmp, NMFIELD_TYPE_ARRAY); tmp = NULL; /* Add RTF and plain text versions of the message */ - text = nm_message_get_text(message); - - tmp = nm_add_field(tmp, NM_A_SZ_MESSAGE_BODY, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf(RTF_TEMPLATE, text), - NMFIELD_TYPE_UTF8); - - tmp = nm_add_field(tmp, NM_A_UD_MESSAGE_TYPE, 0, NMFIELD_METHOD_VALID, 0, - (guint32) 0, NMFIELD_TYPE_UDWORD); - - tmp = nm_add_field(tmp, NM_A_SZ_MESSAGE_TEXT, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(text), NMFIELD_TYPE_UTF8); - - fields = nm_add_field(fields, NM_A_FA_MESSAGE, 0, NMFIELD_METHOD_VALID, 0, - (guint32) tmp, NMFIELD_TYPE_ARRAY); + text = g_strdup(nm_message_get_text(message)); + + /* Truncate if necessary */ + if (strlen(text) > NM_MAX_MESSAGE_SIZE) + text[NM_MAX_MESSAGE_SIZE] = 0; + + tmp = nm_field_add_pointer(tmp, NM_A_SZ_MESSAGE_BODY, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf(RTF_TEMPLATE, text), NMFIELD_TYPE_UTF8); + + tmp = nm_field_add_number(tmp, NM_A_UD_MESSAGE_TYPE, 0, NMFIELD_METHOD_VALID, 0, + 0, NMFIELD_TYPE_UDWORD); + + tmp = nm_field_add_pointer(tmp, NM_A_SZ_MESSAGE_TEXT, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(text), NMFIELD_TYPE_UTF8); + + fields = nm_field_add_pointer(fields, NM_A_FA_MESSAGE, 0, NMFIELD_METHOD_VALID, 0, + tmp, NMFIELD_TYPE_ARRAY); tmp = NULL; + g_free(text); + /* Add participants */ count = nm_conference_get_participant_count(conf); for (i = 0; i < count; i++) { user_record = nm_conference_get_participant(conf, i); if (user_record) { fields = - nm_add_field(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, - (guint32) - g_strdup(nm_user_record_get_dn(user_record)), - NMFIELD_TYPE_DN); + nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_user_record_get_dn(user_record)), + NMFIELD_TYPE_DN); } } @@ -540,21 +635,21 @@ rc = NMERR_CONFERENCE_NOT_INSTANTIATED; } else { /* Add the conference GUID */ - tmp = nm_add_field(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(nm_conference_get_guid(conf)), - NMFIELD_TYPE_UTF8); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(nm_conference_get_guid(conf)), + NMFIELD_TYPE_UTF8); /* Add typing type */ str = g_strdup_printf("%d", (typing ? NMEVT_USER_TYPING : NMEVT_USER_NOT_TYPING)); - tmp = nm_add_field(tmp, NM_A_SZ_TYPE, 0, NMFIELD_METHOD_VALID, 0, - (guint32) str, NMFIELD_TYPE_UTF8); + tmp = nm_field_add_pointer(tmp, NM_A_SZ_TYPE, 0, NMFIELD_METHOD_VALID, 0, + str, NMFIELD_TYPE_UTF8); fields = - nm_add_field(fields, NM_A_FA_CONVERSATION, 0, NMFIELD_METHOD_VALID, 0, - (guint32) tmp, NMFIELD_TYPE_ARRAY); + nm_field_add_pointer(fields, NM_A_FA_CONVERSATION, 0, NMFIELD_METHOD_VALID, 0, + tmp, NMFIELD_TYPE_ARRAY); tmp = NULL; rc = nm_send_request(user->conn, "sendtyping", fields, &req); @@ -589,10 +684,9 @@ } /* Add parent ID */ - fields = nm_add_field(fields, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf("%d", - nm_folder_get_id(folder)), - NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf("%d", nm_folder_get_id(folder)), + NMFIELD_TYPE_UTF8); /* Check to see if userid is current user and return an error? */ @@ -604,18 +698,18 @@ return NMERR_BAD_PARM; if (strstr("=", name)) { - fields = nm_add_field(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(name), NMFIELD_TYPE_DN); + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(name), NMFIELD_TYPE_DN); } else { - fields = nm_add_field(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(name), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(name), NMFIELD_TYPE_UTF8); } /* Add display name */ display_name = nm_contact_get_display_name(contact); if (display_name) - fields = nm_add_field(fields, NM_A_SZ_DISPLAY_NAME, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(display_name), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_DISPLAY_NAME, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(display_name), NMFIELD_TYPE_UTF8); /* Dispatch the request */ rc = nm_send_request(user->conn, "createcontact", fields, &req); @@ -649,16 +743,14 @@ } /* Add parent id */ - fields = nm_add_field(fields, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf("%d", - nm_folder_get_id(folder)), - NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf("%d", nm_folder_get_id(folder)), + NMFIELD_TYPE_UTF8); /* Add object id */ - fields = nm_add_field(fields, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf("%d", - nm_contact_get_id(contact)), - NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf("%d", nm_contact_get_id(contact)), + NMFIELD_TYPE_UTF8); /* Dispatch the request */ rc = nm_send_request(user->conn, "deletecontact", fields, &req); @@ -691,18 +783,18 @@ } /* Add parent ID */ - fields = nm_add_field(fields, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup("0"), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup("0"), NMFIELD_TYPE_UTF8); /* Add name of the folder to add */ fields = - nm_add_field(fields, NM_A_SZ_DISPLAY_NAME, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(name), NMFIELD_TYPE_UTF8); + nm_field_add_pointer(fields, NM_A_SZ_DISPLAY_NAME, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(name), NMFIELD_TYPE_UTF8); /* Add sequence, for now just put it at the bottom */ fields = - nm_add_field(fields, NM_A_SZ_SEQUENCE_NUMBER, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup("-1"), NMFIELD_TYPE_UTF8); + nm_field_add_pointer(fields, NM_A_SZ_SEQUENCE_NUMBER, 0, NMFIELD_METHOD_VALID, 0, + g_strdup("-1"), NMFIELD_TYPE_UTF8); /* Dispatch the request */ rc = nm_send_request(user->conn, "createfolder", fields, &req); @@ -735,9 +827,9 @@ } /* Add the object id */ - fields = nm_add_field(fields, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf("%d", nm_folder_get_id(folder)), - NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_OBJECT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf("%d", nm_folder_get_id(folder)), + NMFIELD_TYPE_UTF8); /* Dispatch the request */ rc = nm_send_request(user->conn, "deletecontact", fields, &req); @@ -774,8 +866,8 @@ if (dn == NULL) return (NMERR_T) -1; - fields = nm_add_field(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup(dn), NMFIELD_TYPE_UTF8); + fields = nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, + g_strdup(dn), NMFIELD_TYPE_UTF8); /* Dispatch the request */ rc = nm_send_request(user->conn, "getstatus", fields, &req); @@ -812,8 +904,8 @@ if (field) { fields = - nm_add_field(fields, NM_A_FA_CONTACT, 0, NMFIELD_METHOD_DELETE, 0, - (guint32) field, NMFIELD_TYPE_ARRAY); + nm_field_add_pointer(fields, NM_A_FA_CONTACT, 0, NMFIELD_METHOD_DELETE, 0, + field, NMFIELD_TYPE_ARRAY); field = NULL; /* Update the contacts display name locally */ @@ -823,14 +915,14 @@ field = nm_contact_to_fields(contact); if (field) { fields = - nm_add_field(fields, NM_A_FA_CONTACT, 0, NMFIELD_METHOD_ADD, 0, - (guint32) field, NMFIELD_TYPE_ARRAY); + nm_field_add_pointer(fields, NM_A_FA_CONTACT, 0, NMFIELD_METHOD_ADD, 0, + field, NMFIELD_TYPE_ARRAY); field = NULL; /* Package it up */ list = - nm_add_field(list, NM_A_FA_CONTACT_LIST, 0, NMFIELD_METHOD_VALID, - 0, (guint32) fields, NMFIELD_TYPE_ARRAY); + nm_field_add_pointer(list, NM_A_FA_CONTACT_LIST, 0, NMFIELD_METHOD_VALID, + 0, fields, NMFIELD_TYPE_ARRAY); fields = NULL; rc = nm_send_request(user->conn, "updateitem", list, &req); @@ -868,8 +960,8 @@ field = nm_folder_to_fields(folder); if (field) { - fields = nm_add_field(fields, NM_A_FA_FOLDER, 0, NMFIELD_METHOD_DELETE, 0, - (guint32) field, NMFIELD_TYPE_ARRAY); + fields = nm_field_add_pointer(fields, NM_A_FA_FOLDER, 0, NMFIELD_METHOD_DELETE, 0, + field, NMFIELD_TYPE_ARRAY); field = NULL; /* Update the folders display name locally */ @@ -878,15 +970,13 @@ /* Create field list for updated folder */ field = nm_folder_to_fields(folder); if (field) { - fields = - nm_add_field(fields, NM_A_FA_FOLDER, 0, NMFIELD_METHOD_ADD, 0, - (guint32) field, NMFIELD_TYPE_ARRAY); + fields = nm_field_add_pointer(fields, NM_A_FA_FOLDER, 0, NMFIELD_METHOD_ADD, 0, + field, NMFIELD_TYPE_ARRAY); field = NULL; /* Package it up */ - list = - nm_add_field(list, NM_A_FA_CONTACT_LIST, 0, NMFIELD_METHOD_VALID, - 0, (guint32) fields, NMFIELD_TYPE_ARRAY); + list = nm_field_add_pointer(list, NM_A_FA_CONTACT_LIST, 0, NMFIELD_METHOD_VALID, + 0, fields, NMFIELD_TYPE_ARRAY); fields = NULL; rc = nm_send_request(user->conn, "updateitem", list, &req); @@ -920,27 +1010,23 @@ field = nm_contact_to_fields(contact); if (field) { - fields = - nm_add_field(fields, NM_A_FA_CONTACT, 0, NMFIELD_METHOD_DELETE, 0, - (guint32) field, NMFIELD_TYPE_ARRAY); + fields = nm_field_add_pointer(fields, NM_A_FA_CONTACT, 0, NMFIELD_METHOD_DELETE, 0, + field, NMFIELD_TYPE_ARRAY); field = NULL; /* Wrap the contact up and add it to the request field list */ - list = - nm_add_field(list, NM_A_FA_CONTACT_LIST, 0, NMFIELD_METHOD_VALID, 0, - (guint32) fields, NMFIELD_TYPE_ARRAY); + list = nm_field_add_pointer(list, NM_A_FA_CONTACT_LIST, 0, NMFIELD_METHOD_VALID, 0, + fields, NMFIELD_TYPE_ARRAY); fields = NULL; /* Add sequence number */ - list = - nm_add_field(list, NM_A_SZ_SEQUENCE_NUMBER, 0, NMFIELD_METHOD_VALID, - 0, (guint32) g_strdup("-1"), NMFIELD_TYPE_UTF8); + list = nm_field_add_pointer(list, NM_A_SZ_SEQUENCE_NUMBER, 0, NMFIELD_METHOD_VALID, + 0, g_strdup("-1"), NMFIELD_TYPE_UTF8); /* Add parent ID */ - list = nm_add_field(list, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, - (guint32) g_strdup_printf("%d", - nm_folder_get_id(folder)), - NMFIELD_TYPE_UTF8); + list = nm_field_add_pointer(list, NM_A_SZ_PARENT_ID, 0, NMFIELD_METHOD_VALID, 0, + g_strdup_printf("%d", nm_folder_get_id(folder)), + NMFIELD_TYPE_UTF8); /* Dispatch the request */ rc = nm_send_request(user->conn, "movecontact", list, &req); @@ -961,6 +1047,114 @@ NMERR_T +nm_send_create_privacy_item(NMUser *user, const char *who, gboolean allow_list, + nm_response_cb callback, gpointer data) +{ + NMERR_T rc = NM_OK; + NMField *fields = NULL; + NMRequest *req = NULL; + const char *tag; + + if (user == NULL || who == NULL) + return NMERR_BAD_PARM; + + if (allow_list) + tag = NM_A_SZ_BLOCKING_ALLOW_ITEM; + else + tag = NM_A_SZ_BLOCKING_DENY_ITEM; + + fields = nm_field_add_pointer(fields, tag, 0, NMFIELD_METHOD_ADD, 0, + g_strdup(who), NMFIELD_TYPE_UTF8); + + rc = nm_send_request(user->conn, "createblock", fields, &req); + if (rc == NM_OK && req) { + nm_request_set_callback(req, callback); + nm_request_set_user_define(req, data); + nm_conn_add_request_item(user->conn, req); + } + + if (fields) + nm_free_fields(&fields); + + return rc; +} + +NMERR_T +nm_send_remove_privacy_item(NMUser *user, const char *dn, gboolean allow_list, + nm_response_cb callback, gpointer data) +{ + NMERR_T rc = NM_OK; + NMField *fields = NULL; + NMRequest *req = NULL; + const char *tag; + GSList **list_ptr, *node; + + if (user == NULL || dn == NULL) + return NMERR_BAD_PARM; + + if (allow_list) { + tag = NM_A_BLOCKING_ALLOW_LIST; + list_ptr = &user->allow_list; + } else { + tag = NM_A_BLOCKING_DENY_LIST; + list_ptr = &user->deny_list; + } + + /* Remove item from the cached list */ + if ((node = g_slist_find_custom(*list_ptr, dn, (GCompareFunc)nm_utf8_strcasecmp))) { + *list_ptr = g_slist_remove_link(*list_ptr, node); + g_slist_free_1(node); + } + + fields = nm_field_add_pointer(fields, tag, 0, NMFIELD_METHOD_DELETE, 0, + g_strdup(dn), NMFIELD_TYPE_DN); + + rc = nm_send_request(user->conn, "updateblocks", fields, &req); + if (rc == NM_OK && req) { + nm_request_set_callback(req, callback); + nm_request_set_user_define(req, data); + nm_conn_add_request_item(user->conn, req); + } + + if (rc == NM_OK) { + } + + if (fields) + nm_free_fields(&fields); + + return rc; + +} + +NMERR_T +nm_send_set_privacy_default(NMUser *user, gboolean default_deny, + nm_response_cb callback, gpointer data) +{ + NMERR_T rc = NM_OK; + NMField *fields = NULL; + NMRequest *req = NULL; + + if (user == NULL) + return NMERR_BAD_PARM; + + fields = nm_field_add_pointer(fields, NM_A_BLOCKING, 0, NMFIELD_METHOD_UPDATE, 0, + (default_deny ? g_strdup("1") : g_strdup("0")), + NMFIELD_TYPE_UTF8); + + rc = nm_send_request(user->conn, "updateblocks", fields, &req); + if (rc == NM_OK && req) { + nm_request_set_callback(req, callback); + nm_request_set_user_define(req, data); + nm_conn_add_request_item(user->conn, req); + } + + if (fields) + nm_free_fields(&fields); + + return rc; +} + +NMERR_T nm_process_new_data(NMUser * user) { NMConn *conn; @@ -1154,13 +1348,116 @@ /* Add the folders and then the contacts */ nm_folder_add_contacts_and_folders(user, user->root_folder, - (NMField *) (locate->value)); + (NMField *) (locate->ptr_value)); } return rc; } +gboolean nm_user_is_privacy_locked(NMUser *user) +{ + if (user) { + return user->privacy_locked; + } + + return FALSE; +} + +static gboolean +_create_privacy_list(NMUser * user, NMRequest *request) +{ + NMField *locate = NULL; + GSList *need_details = NULL; + + /* Are the privacy settings locked */ + locate = nm_locate_field(NM_A_LOCKED_ATTR_LIST, user->fields); + if (locate && locate->ptr_value) { + if (locate->type == NMFIELD_TYPE_UTF8 && + (nm_utf8_strcasecmp(locate->ptr_value, NM_A_BLOCKING) == 0)) { + user->privacy_locked = TRUE; + } else if (locate->type == NMFIELD_TYPE_MV || + locate->type == NMFIELD_TYPE_ARRAY) { + NMField *tmp = (NMField *)locate->ptr_value; + while (tmp && tmp->tag) { + if (nm_utf8_strcasecmp(tmp->ptr_value, NM_A_BLOCKING) == 0) { + user->privacy_locked = TRUE; + break; + } + tmp++; + } + } + } + + /* Set default deny flag */ + locate = nm_locate_field(NM_A_BLOCKING, user->fields); + if (locate && locate->ptr_value) { + user->default_deny = atoi((char *)locate->ptr_value); + } + + /* Read internal blocking allow list */ + locate = nm_locate_field(NM_A_BLOCKING_ALLOW_LIST, user->fields); + if (locate && locate->ptr_value) { + + if (locate->type == NMFIELD_TYPE_MV) { + locate = (NMField *)locate->ptr_value; + for (; locate->tag != NULL; locate++) { + if (locate->ptr_value) { + + user->allow_list = g_slist_append(user->allow_list, (char *)locate->ptr_value); + + if (nm_find_user_record(user, (char *)locate->ptr_value) == NULL) + need_details = g_slist_append(need_details, (char *)locate->ptr_value); + + } + } + } else { + + user->allow_list = g_slist_append(user->allow_list, (char *)locate->ptr_value); + + if (nm_find_user_record(user, (char *)locate->ptr_value) == NULL) + need_details = g_slist_append(need_details, (char *)locate->ptr_value); + + } + } + + /* Read internal blocking deny list */ + locate = nm_locate_field(NM_A_BLOCKING_DENY_LIST, user->fields); + if (locate && locate->ptr_value) { + + if (locate->type == NMFIELD_TYPE_MV) { + locate = (NMField *)locate->ptr_value; + for (; locate->tag != NULL; locate++) { + if (locate->ptr_value) { + + user->deny_list = g_slist_append(user->deny_list, (char *)locate->ptr_value); + + if (nm_find_user_record(user, (char *)locate->ptr_value) == NULL) + need_details = g_slist_append(need_details, (char *)locate->ptr_value); + + } + } + } else { + + user->deny_list = g_slist_append(user->deny_list, (char *)locate->ptr_value); + + if (nm_find_user_record(user, (char *)locate->ptr_value) == NULL) + need_details = g_slist_append(need_details, (char *)locate->ptr_value); + + } + } + + if (need_details) { + + nm_send_multiple_get_details(user, need_details, + _handle_multiple_get_details_login_cb, request); + + return FALSE; + } + + return TRUE; +} + void nm_destroy_contact_list(NMUser * user) { @@ -1305,7 +1602,6 @@ for (i = 0; i < num_folders; i++) { temp = nm_folder_get_subfolder(user->root_folder, i); tname = nm_folder_get_name(temp); - if (tname && (strcmp(tname, name) == 0)) { folder = temp; break; @@ -1340,6 +1636,22 @@ } static void +_handle_multiple_get_details_login_cb(NMUser * user, NMERR_T ret_code, + gpointer resp_data, gpointer user_data) +{ + nm_response_cb cb; + NMRequest *request = user_data; + + if (user == NULL || request == NULL) + return; + + if ((cb = nm_request_get_callback(request))) { + cb(user, ret_code, nm_request_get_data(request), + nm_request_get_user_define(request)); + } +} + +static void _handle_multiple_get_details_joinconf_cb(NMUser * user, NMERR_T ret_code, gpointer resp_data, gpointer user_data) { @@ -1401,7 +1713,7 @@ /* Get the return code */ field = nm_locate_field(NM_A_SZ_RESULT_CODE, fields); if (field) { - ret_code = atoi((char *) field->value); + ret_code = atoi((char *) field->ptr_value); } else { ret_code = NMERR_PROTOCOL; } @@ -1416,6 +1728,9 @@ /* Save the users fields */ user->fields = nm_copy_field_array(fields); + nm_create_contact_list(user); + done = _create_privacy_list(user, request); + } else if (strcmp("setstatus", cmd) == 0) { /* Nothing to do */ @@ -1428,13 +1743,14 @@ locate = nm_locate_field(NM_A_FA_CONVERSATION, fields); if (locate) { field = - nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) fields->value); + nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) fields->ptr_value); if (field) { - nm_conference_set_guid(conf, (char *) field->value); + nm_conference_set_guid(conf, (char *) field->ptr_value); } } nm_conference_list_add(user, conf); + nm_release_conference(conf); } else if (strcmp("leaveconf", cmd) == 0) { @@ -1447,26 +1763,26 @@ conf = nm_request_get_data(request); locate = nm_locate_field(NM_A_FA_CONTACT_LIST, fields); - if (locate && locate->value != 0) { - - field = (NMField *) locate->value; + if (locate && locate->ptr_value != 0) { + + field = (NMField *) locate->ptr_value; while ((field = nm_locate_field(NM_A_SZ_DN, field))) { - if (field && field->value != 0) { + if (field && field->ptr_value != 0) { if (nm_utf8_str_equal (nm_user_record_get_dn(user->user_record), - (const char *) field->value)) { + (const char *) field->ptr_value)) { field++; continue; } user_record = nm_find_user_record(user, - (const char *) field->value); + (const char *) field->ptr_value); if (user_record == NULL) { list = g_slist_append(list, - g_strdup((char *) field->value)); + g_strdup((char *) field->ptr_value)); } else { nm_conference_add_participant(conf, user_record); } @@ -1491,7 +1807,7 @@ } else if (strcmp("getdetails", cmd) == 0) { locate = nm_locate_field(NM_A_FA_RESULTS, fields); - if (locate && locate->value != 0) { + while (locate && locate->ptr_value != 0) { user_record = nm_create_user_record_from_fields(locate); if (user_record) { @@ -1508,16 +1824,15 @@ user_record = tmp; } else { - nm_user_add_user_record(user, user_record); nm_release_user_record(user_record); - } /* Response data is new user record */ nm_request_set_data(request, (gpointer) user_record); } + locate = nm_locate_field(NM_A_FA_RESULTS, locate+1); } } else if (strcmp("createfolder", cmd) == 0) { @@ -1529,13 +1844,12 @@ _update_contact_list(user, fields); locate = - nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) fields->value); + nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) fields->ptr_value); if (locate) { NMContact *new_contact = nm_folder_find_item_by_object_id(user->root_folder, - atoi((char *) locate-> - value)); + atoi((char *)locate->ptr_value)); if (new_contact) { @@ -1563,13 +1877,25 @@ if (locate) { nm_user_record_set_status((NMUserRecord *) nm_request_get_data(request), - atoi((char *) locate->value), NULL); + atoi((char *) locate->ptr_value), NULL); } } else if (strcmp("updateitem", cmd) == 0) { /* Nothing extra to do here */ + } else if (strcmp("createblock", cmd) == 0) { + if ((locate = nm_locate_field(NM_A_BLOCKING_DENY_LIST, fields))) { + if (locate->ptr_value) { + user->deny_list = g_slist_append(user->deny_list, g_strdup((char *)locate->ptr_value)); + } + } else if ((locate = nm_locate_field(NM_A_BLOCKING_ALLOW_LIST, fields))) { + if (locate->ptr_value) { + user->allow_list = g_slist_append(user->allow_list, g_strdup((char *)locate->ptr_value)); + } + } + } else if (strcmp("updateblocks", cmd) == 0) { + /* nothing to do here */ } else { /* Nothing to do, just print debug message */ @@ -1605,8 +1931,8 @@ if (rc == NM_OK) { field = nm_locate_field(NM_A_SZ_TRANSACTION_ID, fields); - if (field != NULL && field->value != 0) { - req = nm_conn_find_request(conn, atoi((char *) field->value)); + if (field != NULL && field->ptr_value != 0) { + req = nm_conn_find_request(conn, atoi((char *) field->ptr_value)); if (req != NULL) { rc = nm_call_handler(user, req, fields); } @@ -1687,6 +2013,115 @@ return dotted; } +const char * +nm_error_to_string(NMERR_T err) +{ + static char *unknown_msg = NULL; + + g_free(unknown_msg); + unknown_msg = NULL; + + switch (err) { + + case NMERR_BAD_PARM: + return _("Required parameters not passed in"); + + case NMERR_TCP_WRITE: + return _("Unable to write to network"); + + case NMERR_TCP_READ: + return _("Unable to read from network"); + + case NMERR_PROTOCOL: + return _("Error communicating with server"); + + case NMERR_CONFERENCE_NOT_FOUND: + case NMERR_CONFERENCE_NOT_FOUND_2: + return _("Conference not found"); + + case NMERR_CONFERENCE_NOT_INSTANTIATED: + return _("Conference does not exist"); + + case NMERR_DUPLICATE_FOLDER: + case NMERR_FOLDER_EXISTS: + return _("A folder with that name already exists"); + + case NMERR_NOT_SUPPORTED: + return _("Not supported"); + + case NMERR_PASSWORD_EXPIRED: + case NMERR_PASSWORD_EXPIRED_2: + return _("Password has expired"); + + case NMERR_PASSWORD_INVALID: + return _("Invalid password"); + + case NMERR_USER_NOT_FOUND: + return _("User not found"); + + case NMERR_USER_DISABLED: + return _("Account has been disabled"); + + case NMERR_DIRECTORY_FAILURE: + return _("The server could not access the directory"); + + case NMERR_ADMIN_LOCKED: + return _("Your system administrator has disabled this operation"); + + case NMERR_SERVER_BUSY: + return _("The server is unavailable; try again later"); + + case NMERR_DUPLICATE_CONTACT: + return _("Cannot add a contact to the same folder twice"); + + case NMERR_USER_NOT_ALLOWED: + return _("Cannot add yourself"); + + case NMERR_MASTER_ARCHIVE_MISSING: + return _("Master archive is misconfigured"); + + case NMERR_AUTHENTICATION_FAILED: + case NMERR_CREDENTIALS_MISSING: + return _("Invalid username or password"); + + case NMERR_HOST_NOT_FOUND: + return _("Could not recognize the host of the username you entered"); + + case NMERR_ACCESS_DENIED: + return _("Your account has been disabled because too many invalid passwords were entered"); + + case NMERR_DUPLICATE_PARTICIPANT: + return _("You cannot add the same person twice to a conversation"); + + case NMERR_TOO_MANY_CONTACTS: + case NMERR_TOO_MANY_FOLDERS: + return _("You have reached your limit for the number of contacts allowed"); + + case NMERR_OBJECT_NOT_FOUND: + return _("You have entered an invalid username"); + + case NMERR_DIRECTORY_UPDATE: + return _("An error occurred while updating the directory"); + + case NMERR_SERVER_PROTOCOL: + return _("Incompatible protocol version"); + + case NMERR_USER_BLOCKED: + return _("The user has blocked you"); + + case NMERR_EVAL_CONNECTION_LIMIT: + return _("This evaluation version does not allow more than ten users to log in at one time"); + + case NMERR_CONVERSATION_INVITE: + return _("The user is either offline or you are blocked"); + + default: + unknown_msg = g_strdup_printf (_("Unknown error: 0x%X"), err); + + return unknown_msg; + } +} + static void _update_contact_list(NMUser * user, NMField * fields) { @@ -1701,21 +2136,21 @@ /* Is it wrapped in a RESULTS array? */ if (strcmp(fields->tag, NM_A_FA_RESULTS) == 0) { - list = (NMField *) fields->value; + list = (NMField *) fields->ptr_value; } else { list = fields; } /* Update the cached contact list */ - cursor = (NMField *) list->value; + cursor = (NMField *) list->ptr_value; while (cursor->tag != NULL) { if ((g_ascii_strcasecmp(cursor->tag, NM_A_FA_CONTACT) == 0) || (g_ascii_strcasecmp(cursor->tag, NM_A_FA_FOLDER) == 0)) { locate = - nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) cursor->value); - if (locate != NULL && locate->value != 0) { - objid1 = atoi((char *) locate->value); + nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) cursor->ptr_value); + if (locate != NULL && locate->ptr_value != 0) { + objid1 = atoi((char *) locate->ptr_value); item = nm_folder_find_item_by_object_id(user->root_folder, objid1); if (item != NULL) { @@ -1757,9 +2192,9 @@ locate = nm_locate_field(NM_A_SZ_DN, - (NMField *) cursor->value); - if (locate != NULL && locate->value != 0) { - dn = (const char *) locate->value; + (NMField *) cursor->ptr_value); + if (locate != NULL && locate->ptr_value != 0) { + dn = (const char *) locate->ptr_value; if (dn != NULL) { contact = nm_create_contact_from_fields(cursor);
