📄 nmuser.c
字号:
}voidnm_conference_list_free(NMUser * user){ GSList *cnode; NMConference *conference; if (user == NULL) return; if (user->conferences) { for (cnode = user->conferences; cnode; cnode = cnode->next) { conference = cnode->data; cnode->data = NULL; nm_release_conference(conference); } g_slist_free(user->conferences); user->conferences = NULL; }}NMConference *nm_conference_list_find(NMUser * user, const char *guid){ GSList *cnode; NMConference *conference = NULL, *tmp; if (user == NULL || guid == NULL) return NULL; if (user->conferences) { for (cnode = user->conferences; cnode; cnode = cnode->next) { tmp = cnode->data; if (nm_are_guids_equal(nm_conference_get_guid(tmp), guid)) { conference = tmp; break; } } } return conference;}gbooleannm_are_guids_equal(const char *guid1, const char *guid2){ if (guid1 == NULL || guid2 == NULL) return FALSE; return (strncmp(guid1, guid2, CONF_GUID_END) == 0);}voidnm_user_add_contact(NMUser * user, NMContact * contact){ if (user == NULL || contact == NULL) return; nm_contact_add_ref(contact); g_hash_table_insert(user->contacts, g_utf8_strdown(nm_contact_get_dn(contact), -1), contact);}voidnm_user_add_user_record(NMUser * user, NMUserRecord * user_record){ const char *display_id; const char *dn; if (!user || !user_record) return; display_id = nm_user_record_get_display_id(user_record); dn = nm_user_record_get_dn(user_record); if (!dn || !display_id) return; nm_user_record_add_ref(user_record); g_hash_table_insert(user->user_records, g_utf8_strdown(dn, -1), user_record); g_hash_table_insert(user->display_id_to_dn, g_utf8_strdown(display_id, -1), g_utf8_strdown(dn, -1));}nm_event_cbnm_user_get_event_callback(NMUser * user){ if (user == NULL) return NULL; return user->evt_callback;}NMConn *nm_user_get_conn(NMUser * user){ if (user == NULL) return NULL; return user->conn;}NMERR_Tnm_create_contact_list(NMUser * user){ NMERR_T rc = NM_OK; NMField *locate = NULL; if (user == NULL || user->fields == NULL) { return NMERR_BAD_PARM; } /* Create the root folder */ user->root_folder = nm_create_folder(""); /* Find the contact list in the login fields */ locate = nm_locate_field(NM_A_FA_CONTACT_LIST, user->fields); if (locate != NULL) { /* Add the folders and then the contacts */ nm_folder_add_contacts_and_folders(user, user->root_folder, (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 && (purple_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 (purple_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_request_add_ref(request); nm_send_multiple_get_details(user, need_details, _handle_multiple_get_details_login_cb, request); return FALSE; } return TRUE;}voidnm_destroy_contact_list(NMUser * user){ if (user == NULL) return; if (user->root_folder) { nm_release_folder(user->root_folder); user->root_folder = NULL; }}NMFolder *nm_get_root_folder(NMUser * user){ if (user == NULL) return NULL; if (user->root_folder == NULL) nm_create_contact_list(user); return user->root_folder;}NMContact *nm_find_contact(NMUser * user, const char *name){ char *str; const char *dn = NULL; NMContact *contact = NULL; if (user == NULL || name == NULL) return NULL; str = g_utf8_strdown(name, -1); if (strstr(str, "=")) { dn = str; } else { /* Assume that we have a display id instead of a dn */ dn = (const char *) g_hash_table_lookup(user->display_id_to_dn, str); } /* Find contact object in reference table */ if (dn) { contact = (NMContact *) g_hash_table_lookup(user->contacts, dn); } g_free(str); return contact;}GList *nm_find_contacts(NMUser * user, const char *dn){ guint32 i, cnt; NMFolder *folder; NMContact *contact; GList *contacts = NULL; if (user == NULL || dn == NULL) return NULL; /* Check for contact at the root */ contact = nm_folder_find_contact(user->root_folder, dn); if (contact) { contacts = g_list_append(contacts, contact); contact = NULL; } /* Check for contact in each subfolder */ cnt = nm_folder_get_subfolder_count(user->root_folder); for (i = 0; i < cnt; i++) { folder = nm_folder_get_subfolder(user->root_folder, i); contact = nm_folder_find_contact(folder, dn); if (contact) { contacts = g_list_append(contacts, contact); contact = NULL; } } return contacts;}NMUserRecord *nm_find_user_record(NMUser * user, const char *name){ char *str = NULL; const char *dn = NULL; NMUserRecord *user_record = NULL; if (user == NULL || name == NULL) return NULL; str = g_utf8_strdown(name, -1); if (strstr(str, "=")) { dn = str; } else { /* Assume that we have a display id instead of a dn */ dn = (const char *) g_hash_table_lookup(user->display_id_to_dn, str); } /* Find user record in reference table */ if (dn) { user_record = (NMUserRecord *) g_hash_table_lookup(user->user_records, dn); } g_free(str); return user_record;}const char *nm_lookup_dn(NMUser * user, const char *display_id){ const char *dn; char *lower; if (user == NULL || display_id == NULL) return NULL; lower = g_utf8_strdown(display_id, -1); dn = g_hash_table_lookup(user->display_id_to_dn, lower); g_free(lower); return dn;}NMFolder *nm_find_folder(NMUser * user, const char *name){ NMFolder *folder = NULL, *temp; int i, num_folders; const char *tname = NULL; if (user == NULL || name == NULL) return NULL; if (*name == '\0') return user->root_folder; num_folders = nm_folder_get_subfolder_count(user->root_folder); 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; } } return folder;}NMFolder *nm_find_folder_by_id(NMUser * user, int object_id){ NMFolder *folder = NULL, *temp; int i, num_folders; if (user == NULL) return NULL; if (object_id == 0) return user->root_folder; num_folders = nm_folder_get_subfolder_count(user->root_folder); for (i = 0; i < num_folders; i++) { temp = nm_folder_get_subfolder(user->root_folder, i); if (nm_folder_get_id(temp) == object_id) { folder = temp; break; } } return folder;}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)); nm_release_request(request); }}static void_handle_multiple_get_details_joinconf_cb(NMUser * user, NMERR_T ret_code, gpointer resp_data, gpointer user_data){ NMRequest *request = user_data; NMUserRecord *user_record = resp_data; NMConference *conference; GSList *list, *node; if (user == NULL || resp_data == NULL || user_data == NULL) return; conference = nm_request_get_data(request); list = nm_request_get_user_define(request); if (ret_code == 0 && conference && list) { /* Add the user to the conference */ nm_conference_add_participant(conference, user_record); /* Find the user in the list and remove it */ for (node = list; node; node = node->next) { if (nm_utf8_str_equal(nm_user_record_get_dn(user_record), (const char *) node->data)) { g_free(node->data); list = g_slist_remove(list, node->data); nm_request_set_user_define(request, list); break; } } /* Time to callback? */ if (list == NULL) { nm_response_cb cb = nm_request_get_callback(request); if (cb) { cb(user, 0, conference, conference); } nm_release_request(request); } }}static NMERR_Tnm_call_handler(NMUser * user, NMRequest * request, NMField * fields){ NMERR_T rc = NM_OK, ret_code = NM_OK; NMConference *conf = NULL; NMUserRecord *user_record = NULL; NMField *locate = NULL; NMField *field = NULL; const char *cmd; nm_response_cb cb; gboolean done = TRUE; if (user == NULL || request == NULL || fields == NULL) return NMERR_BAD_PARM; /* Get the return code */ field = nm_locate_field(NM_A_SZ_RESULT_CODE, fields); if (field) { ret_code = atoi((char *) field->ptr_value); } else { ret_code = NMERR_PROTOCOL; } cmd = nm_request_get_cmd(request); if (ret_code == NM_OK && cmd != NULL) { if (strcmp("login", cmd) == 0) { user->user_record = nm_create_user_record_from_fields(fields); /* 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 */ } else if (strcmp("createconf", cmd) == 0) { conf = (NMConference *) nm_request_get_data(request); /* get the convo guid */ locate = nm_locate_field(NM_A_FA_CONVERSATION, fields); if (locate) { field = nm_locate_field(NM_A_SZ_OBJECT_ID, (NMField *) fields->ptr_value); if (field) { 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) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -