⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nmuser.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
}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 + -