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

📄 nmuser.c

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