📄 nmuser.c
字号:
/* Add typing type */ str = g_strdup_printf("%d", (typing ? NMEVT_USER_TYPING : NMEVT_USER_NOT_TYPING)); tmp = nm_field_add_pointer(tmp, NM_A_SZ_TYPE, 0, NMFIELD_METHOD_VALID, 0, str, NMFIELD_TYPE_UTF8); fields = 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, callback, NULL, NULL); } nm_free_fields(&fields); return rc;}NMERR_Tnm_send_create_contact(NMUser * user, NMFolder * folder, NMContact * contact, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *fields = NULL; NMRequest *req = NULL; const char *name = NULL; const char *display_name = NULL; if (user == NULL || folder == NULL || contact == NULL) { return NMERR_BAD_PARM; } /* Add parent ID */ 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? */ /* Check to see if contact already exists and return an error? */ /* Add userid or dn */ name = nm_contact_get_dn(contact); if (name == NULL) return NMERR_BAD_PARM; if (strstr("=", name)) { fields = nm_field_add_pointer(fields, NM_A_SZ_DN, 0, NMFIELD_METHOD_VALID, 0, g_strdup(name), NMFIELD_TYPE_DN); } else { 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_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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, contact); if (req) nm_release_request(req); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_remove_contact(NMUser * user, NMFolder * folder, NMContact * contact, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *fields = NULL; NMRequest *req = NULL; if (user == NULL || folder == NULL || contact == NULL) { return NMERR_BAD_PARM; } /* Add parent id */ 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_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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, contact); if (req) nm_release_request(req); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_create_folder(NMUser * user, const char *name, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *fields = NULL; NMRequest *req = NULL; if (user == NULL || name == NULL) { return NMERR_BAD_PARM; } /* Add parent ID */ 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_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_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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, g_strdup(name)); if (req) nm_release_request(req); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_remove_folder(NMUser * user, NMFolder * folder, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *fields = NULL; NMRequest *req = NULL; if (user == NULL || folder == NULL) { return NMERR_BAD_PARM; } /* Add the object id */ 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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, folder); if (req) nm_release_request(req); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_get_status(NMUser * user, NMUserRecord * user_record, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *fields = NULL; NMRequest *req = NULL; const char *dn; if (user == NULL || user_record == NULL) return NMERR_BAD_PARM; /* Add DN to field list */ dn = nm_user_record_get_dn(user_record); if (dn == NULL) return (NMERR_T) -1; 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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, user_record); if (req) nm_release_request(req); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_rename_contact(NMUser * user, NMContact * contact, const char *new_name, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *field = NULL, *fields = NULL, *list = NULL; NMRequest *req = NULL; if (user == NULL || contact == NULL || new_name == NULL) return NMERR_BAD_PARM; /* Create field list for current contact */ field = nm_contact_to_fields(contact); if (field) { fields = 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 */ nm_contact_set_display_name(contact, new_name); /* Create field list for updated contact */ field = nm_contact_to_fields(contact); if (field) { fields = 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_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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, contact); } } if (req) nm_release_request(req); if (list) nm_free_fields(&list); return rc;}NMERR_Tnm_send_rename_folder(NMUser * user, NMFolder * folder, const char *new_name, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *field = NULL, *fields = NULL, *list = NULL; NMRequest *req = NULL; if (user == NULL || folder == NULL || new_name == NULL) return NMERR_BAD_PARM; /* Make sure folder does not already exist!? */ if (nm_find_folder(user, new_name)) return NMERR_FOLDER_EXISTS; /* Create field list for current folder */ field = nm_folder_to_fields(folder); if (field) { 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 */ nm_folder_set_name(folder, new_name); /* Create field list for updated folder */ field = nm_folder_to_fields(folder); if (field) { 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_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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, folder); } } if (req) nm_release_request(req); if (list) nm_free_fields(&list); return rc;}NMERR_Tnm_send_move_contact(NMUser * user, NMContact * contact, NMFolder * folder, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *field = NULL, *fields = NULL, *list = NULL; NMRequest *req = NULL; if (user == NULL || contact == NULL || folder == NULL) return NMERR_BAD_PARM; /* Create field list for the contact */ field = nm_contact_to_fields(contact); if (field) { 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_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_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_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, callback, data, &req); if (rc == NM_OK && req) nm_request_set_data(req, contact); } if (req) nm_release_request(req); if (list) nm_free_fields(&list); return rc;}NMERR_Tnm_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; 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, callback, data, NULL); nm_free_fields(&fields); return rc;}NMERR_Tnm_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; 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)purple_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, callback, data, NULL); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_set_privacy_default(NMUser *user, gboolean default_deny, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; NMField *fields = 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, callback, data, NULL); nm_free_fields(&fields); return rc;}NMERR_Tnm_send_keepalive(NMUser *user, nm_response_cb callback, gpointer data){ NMERR_T rc = NM_OK; if (user == NULL) return NMERR_BAD_PARM; rc = nm_send_request(user->conn, "ping", NULL, callback, data, NULL); return rc;}NMERR_Tnm_process_new_data(NMUser * user){ NMConn *conn; NMERR_T rc = NM_OK; guint32 val; if (user == NULL) return NMERR_BAD_PARM; conn = user->conn; /* Check to see if this is an event or a response */ rc = nm_read_all(conn, (char *) &val, sizeof(val)); if (rc == NM_OK) { if (strncmp((char *) &val, "HTTP", strlen("HTTP")) == 0) rc = nm_process_response(user); else rc = nm_process_event(user, GUINT32_FROM_LE(val)); } else { if (errno == EAGAIN) rc = NM_OK; else rc = NMERR_PROTOCOL; } return rc;}NMConference *nm_find_conversation(NMUser * user, const char *who){ NMConference *conference = NULL; NMConference *tmp; GSList *cnode; if (user && user->conferences) { for (cnode = user->conferences; cnode; cnode = cnode->next) { tmp = cnode->data; if (nm_conference_get_participant_count(tmp) == 1) { NMUserRecord *ur = nm_conference_get_participant(tmp, 0); if (ur) { if (nm_utf8_str_equal(nm_user_record_get_dn(ur), who)) { conference = tmp; break; } } } } } return conference;}voidnm_conference_list_add(NMUser * user, NMConference * conf){ if (user == NULL || conf == NULL) return; nm_conference_add_ref(conf); user->conferences = g_slist_append(user->conferences, conf);}voidnm_conference_list_remove(NMUser * user, NMConference * conf){ if (user == NULL || conf == NULL) return; if (g_slist_find(user->conferences, conf)) { user->conferences = g_slist_remove(user->conferences, conf); nm_release_conference(conf); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -