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

📄 nmuser.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * nmuser.c * * 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 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. * * 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"#include "nmcontact.h"#include "nmuserrecord.h"#include "util.h"/* This is the template that we wrap outgoing messages in, since the other * GW Messenger clients expect messages to be in RTF. */#define RTF_TEMPLATE 	"{\\rtf1\\ansi\n"\                        "{\\fonttbl{\\f0\\fnil Unknown;}}\n"\						"{\\colortbl ;\\red0\\green0\\blue0;}\n"\						"\\uc1\\cf1\\f0\\fs24 %s\\par\n}"#define NM_MAX_MESSAGE_SIZE 2048static 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);static char * nm_rtfize_text(char *text);/** * See header for comments on on "public" functions */NMUser *nm_initialize_user(const char *name, const char *server_addr,				   int port, gpointer data, nm_event_cb event_callback){	NMUser *user;	if (name == NULL || server_addr == NULL || event_callback == NULL)		return NULL;	user = g_new0(NMUser, 1);	user->contacts =		g_hash_table_new_full(g_str_hash, nm_utf8_str_equal,							  g_free, (GDestroyNotify) nm_release_contact);	user->user_records =		g_hash_table_new_full(g_str_hash, nm_utf8_str_equal, g_free,							  (GDestroyNotify) nm_release_user_record);	user->display_id_to_dn = g_hash_table_new_full(g_str_hash, nm_utf8_str_equal,												   g_free, g_free);	user->name = g_strdup(name);	user->conn = nm_create_conn(server_addr, port);	user->conn->addr = g_strdup(server_addr);	user->conn->port = port;	user->evt_callback = event_callback;	user->client_data = data;	return user;}voidnm_deinitialize_user(NMUser * user){	nm_release_conn(user->conn);	if (user->contacts) {		g_hash_table_destroy(user->contacts);	}	if (user->user_records) {		g_hash_table_destroy(user->user_records);	}	if (user->display_id_to_dn) {		g_hash_table_destroy(user->display_id_to_dn);	}	if (user->name) {		g_free(user->name);	}	if (user->user_record) {		nm_release_user_record(user->user_record);	}	nm_conference_list_free(user);	nm_destroy_contact_list(user);	g_free(user);}NMERR_Tnm_send_login(NMUser * user, const char *pwd, const char *my_addr,			  const char *user_agent, nm_response_cb callback, gpointer data){	NMERR_T rc = NM_OK;	NMField *fields = NULL;	if (user == NULL || pwd == NULL || user_agent == NULL) {		return NMERR_BAD_PARM;	}	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_field_add_pointer(fields, NM_A_IP_ADDRESS, 0, NMFIELD_METHOD_VALID, 0,									  g_strdup(my_addr), NMFIELD_TYPE_UTF8);	}	/* Send the login */	rc = nm_send_request(user->conn, "login", fields, callback, data, NULL);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_set_status(NMUser * user, int status, const char *text,				   const char *auto_resp, nm_response_cb callback, gpointer data){	NMERR_T rc = NM_OK;	NMField *fields = NULL;	if (user == NULL)		return NMERR_BAD_PARM;	/* Add the status */	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_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_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, callback, data, NULL);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_multiple_get_details(NMUser * user, GSList *names,							 nm_response_cb callback, gpointer data){	NMERR_T rc = NM_OK;	NMField *fields = 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, callback, data, NULL);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_get_details(NMUser * user, const char *name,					nm_response_cb callback, gpointer data){	NMERR_T rc = NM_OK;	NMField *fields = NULL;	if (user == NULL || name == NULL)		return NMERR_BAD_PARM;	/* Add in DN or display id */	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 {		const char *dn = nm_lookup_dn(user, name);		if (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_field_add_pointer(fields, NM_A_SZ_USERID, 0, NMFIELD_METHOD_VALID, 0,									 g_strdup(name), NMFIELD_TYPE_UTF8);		}	}	rc = nm_send_request(user->conn, "getdetails", fields, callback, data, NULL);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_create_conference(NMUser * user, NMConference * conference,						  nm_response_cb callback, gpointer data){	NMERR_T rc = NM_OK;	NMField *fields = NULL;	NMField *tmp = NULL;	NMField *field = NULL;	NMRequest *req = NULL;	int count, i;	if (user == NULL || conference == NULL)		return NMERR_BAD_PARM;	/* Add in a blank guid */	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_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_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, callback, data, &req);	if (rc == NM_OK && req) {		nm_conference_add_ref(conference);		nm_request_set_data(req, conference);	}	if (req)		nm_release_request(req);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_leave_conference(NMUser * user, NMConference * conference,						 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)		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;	/* Send the request to the server */	rc = nm_send_request(user->conn, "leaveconf", fields, callback, data, &req);	if (rc == NM_OK && req)		nm_request_set_data(req, conference);	if (req)		nm_release_request(req);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_join_conference(NMUser * user, NMConference * conference,						nm_response_cb callback, gpointer data){	NMERR_T rc = NM_OK;	NMField *fields = NULL, *tmp = NULL;	NMRequest *req = NULL;	if (user == NULL || conference == 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;	/* Send the request to the server */	rc = nm_send_request(user->conn, "joinconf", fields, callback, data, &req);	if (rc == NM_OK && req)		nm_request_set_data(req, conference);	if (req)		nm_release_request(req);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_reject_conference(NMUser * user, NMConference * conference,						  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)		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;	/* Send the request to the server */	rc = nm_send_request(user->conn, "rejectconf", fields, callback, data, &req);	if (rc == NM_OK && req)		nm_request_set_data(req, conference);	if (req)		nm_release_request(req);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_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, callback, data, &req);	if (rc == NM_OK && req)		nm_request_set_data(req, conference);	if (req)		nm_release_request(req);	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_message(NMUser * user, NMMessage * message, nm_response_cb callback){	NMERR_T rc = NM_OK;	char *text, *rtfized;	NMField *fields = NULL, *tmp = NULL;	NMConference *conf;	NMUserRecord *user_record;	int count, i;	if (user == NULL || message == NULL) {		return NMERR_BAD_PARM;	}	conf = nm_message_get_conference(message);	if (!nm_conference_is_instantiated(conf)) {		rc = NMERR_CONFERENCE_NOT_INSTANTIATED;	} else {		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_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 = g_strdup(nm_message_get_text(message));		/* Truncate if necessary */		if (strlen(text) > NM_MAX_MESSAGE_SIZE)			text[NM_MAX_MESSAGE_SIZE] = 0;		rtfized = nm_rtfize_text(text);		purple_debug_info("novell", "message text is: %s\n", text);		purple_debug_info("novell", "message rtf is: %s\n", rtfized);		tmp = nm_field_add_pointer(tmp, NM_A_SZ_MESSAGE_BODY, 0, NMFIELD_METHOD_VALID, 0,								   rtfized, 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,								   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;		/* 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_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);			}		}		/* Send the request */		rc = nm_send_request(user->conn, "sendmessage", fields, callback, NULL, NULL);	}	nm_free_fields(&fields);	return rc;}NMERR_Tnm_send_typing(NMUser * user, NMConference * conf,			   gboolean typing, nm_response_cb callback){	NMERR_T rc = NM_OK;	char *str = NULL;	NMField *fields = NULL, *tmp = NULL;	if (user == NULL || conf == NULL) {		return NMERR_BAD_PARM;	}	if (!nm_conference_is_instantiated(conf)) {		rc = NMERR_CONFERENCE_NOT_INSTANTIATED;	} else {		/* Add 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(conf)),								   NMFIELD_TYPE_UTF8);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -