📄 nmuser.c
字号:
/* * 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 + -