📄 novell.c
字号:
{ NMUser *user; NMConference *conference; NMERR_T rc = NM_OK; if (parms == NULL || g_slist_length(parms) != 2) return; user = g_slist_nth_data(parms, 0); conference = g_slist_nth_data(parms, 1); if (user && conference) { rc = nm_send_reject_conference(user, conference, NULL, NULL); _check_for_disconnect(user, rc); } g_slist_free(parms);}static void_initiate_conference_cb(PurpleBlistNode *node, gpointer ignored){ PurpleBuddy *buddy; PurpleConnection *gc; NMUser *user; const char *conf_name; PurpleConversation *chat = NULL; NMUserRecord *user_record; NMConference *conference; g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); buddy = (PurpleBuddy *) node; gc = purple_account_get_connection(buddy->account); user = gc->proto_data; if (user == NULL) return; /* We should already have a userrecord for the buddy */ user_record = nm_find_user_record(user, buddy->name); if (user_record == NULL) return; conf_name = _get_conference_name(++user->conference_count); chat = serv_got_joined_chat(gc, user->conference_count, conf_name); if (chat) { conference = nm_create_conference(NULL); nm_conference_set_data(conference, (gpointer) chat); nm_send_create_conference(user, conference, _createconf_resp_send_invite, user_record); nm_release_conference(conference); }}const char *_get_conference_name(int id){ static char *name = NULL; if (name) g_free(name); name = g_strdup_printf(_("GroupWise Conference %d"), id); return name;}static void_show_privacy_locked_error(PurpleConnection *gc, NMUser *user){ char *err; err = g_strdup_printf(_("Unable to change server side privacy settings (%s)."), nm_error_to_string(NMERR_ADMIN_LOCKED)); purple_notify_error(gc, NULL, err, NULL); g_free(err);}/******************************************************************************* * Connect and recv callbacks ******************************************************************************/static voidnovell_ssl_connect_error(PurpleSslConnection * gsc, PurpleSslErrorType error, gpointer data){ PurpleConnection *gc; NMUser *user; gc = data; user = gc->proto_data; user->conn->ssl_conn->data = NULL; purple_connection_error(gc, _("Unable to make SSL connection to server."));}static voidnovell_ssl_recv_cb(gpointer data, PurpleSslConnection * gsc, PurpleInputCondition condition){ PurpleConnection *gc = data; NMUser *user; NMERR_T rc; if (gc == NULL) return; user = gc->proto_data; if (user == NULL) return; rc = nm_process_new_data(user); if (rc != NM_OK) { if (_is_disconnect_error(rc)) { purple_connection_error(gc, _("Error communicating with server." " Closing connection.")); } else { purple_debug(PURPLE_DEBUG_INFO, "novell", "Error processing event or response (%d).\n", rc); } }}static voidnovell_ssl_connected_cb(gpointer data, PurpleSslConnection * gsc, PurpleInputCondition cond){ PurpleConnection *gc = data; NMUser *user; NMConn *conn; NMERR_T rc = 0; const char *pwd = NULL; const char *my_addr = NULL; char *ua = NULL; if (gc == NULL || gsc == NULL) return; user = gc->proto_data; if ((user == NULL) || (conn = user->conn) == NULL) return; purple_connection_update_progress(gc, _("Authenticating..."), 2, NOVELL_CONNECT_STEPS); my_addr = purple_network_get_my_ip(gsc->fd); pwd = purple_connection_get_password(gc); ua = _user_agent_string(); rc = nm_send_login(user, pwd, my_addr, ua, _login_resp_cb, NULL); if (rc == NM_OK) { conn->connected = TRUE; purple_ssl_input_add(gsc, novell_ssl_recv_cb, gc); } else { purple_connection_error(gc, _("Unable to connect to server.")); } purple_connection_update_progress(gc, _("Waiting for response..."), 3, NOVELL_CONNECT_STEPS); g_free(ua);}/******************************************************************************* * Event callback and event handlers ******************************************************************************/static void_evt_receive_message(NMUser * user, NMEvent * event){ NMUserRecord *user_record = NULL; NMContact *contact = NULL; PurpleConversation *gconv; NMConference *conference; PurpleMessageFlags flags; char *text = NULL; text = g_markup_escape_text(nm_event_get_text(event), -1); conference = nm_event_get_conference(event); if (conference) { PurpleConversation *chat = nm_conference_get_data(conference); /* Is this a single person 'conversation' or a conference? */ if (chat == NULL && nm_conference_get_participant_count(conference) == 1) { user_record = nm_find_user_record(user, nm_event_get_source(event)); if (user_record) { flags = 0; if (nm_event_get_type(event) == NMEVT_RECEIVE_AUTOREPLY) flags |= PURPLE_MESSAGE_AUTO_RESP; serv_got_im(purple_account_get_connection(user->client_data), nm_user_record_get_display_id(user_record), text, flags, nm_event_get_gmt(event)); gconv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, nm_user_record_get_display_id(user_record), (PurpleAccount *) user->client_data); if (gconv) { contact = nm_find_contact(user, nm_event_get_source(event)); if (contact) { purple_conversation_set_title( gconv, nm_contact_get_display_name(contact)); } else { const char *name = nm_user_record_get_full_name(user_record); if (name == NULL) name = nm_user_record_get_userid(user_record); purple_conversation_set_title(gconv, name); } } } else { /* this should not happen, see the event code. * the event code will get the contact details from * the server if it does not have them before calling * the event callback. */ } } else if (chat) { /* get the contact for send if we have one */ NMContact *contact = nm_find_contact(user, nm_event_get_source(event)); /* get the user record for the sender */ user_record = nm_find_user_record(user, nm_event_get_source(event)); if (user_record) { const char *name = nm_contact_get_display_name(contact); if (name == NULL) { name = nm_user_record_get_full_name(user_record); if (name == NULL) name = nm_user_record_get_display_id(user_record); } serv_got_chat_in(purple_account_get_connection(user->client_data), purple_conv_chat_get_id(PURPLE_CONV_CHAT(chat)), name, 0, text, nm_event_get_gmt(event)); } } } g_free(text);}static void_evt_conference_left(NMUser * user, NMEvent * event){ PurpleConversation *chat; NMConference *conference; conference = nm_event_get_conference(event); if (conference) { chat = nm_conference_get_data(conference); if (chat) { NMUserRecord *ur = nm_find_user_record(user, nm_event_get_source(event)); if (ur) purple_conv_chat_remove_user(PURPLE_CONV_CHAT(chat), nm_user_record_get_display_id(ur), NULL); } }}static void_evt_conference_invite_notify(NMUser * user, NMEvent * event){ PurpleConversation *gconv; NMConference *conference; NMUserRecord *user_record = NULL; char *str = NULL; user_record = nm_find_user_record(user, nm_event_get_source(event)); conference = nm_event_get_conference(event); if (user_record && conference) { gconv = nm_conference_get_data(conference); str = g_strdup_printf(_("%s has been invited to this conversation."), nm_user_record_get_display_id(user_record)); purple_conversation_write(gconv, NULL, str, PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(str); }}static void_evt_conference_invite(NMUser * user, NMEvent * event){ NMUserRecord *ur; PurpleConnection *gc; GSList *parms = NULL; const char *title = NULL; const char *secondary = NULL; const char *name = NULL; char *primary = NULL; time_t gmt; ur = nm_find_user_record(user, nm_event_get_source(event)); if (ur) name = nm_user_record_get_full_name(ur); if (name == NULL) name = nm_event_get_source(event); gmt = nm_event_get_gmt(event); title = _("Invitation to Conversation"); primary = g_strdup_printf(_("Invitation from: %s\n\nSent: %s"), name, purple_date_format_full(localtime(&gmt))); secondary = _("Would you like to join the conversation?"); /* Set up parms list for the callbacks * We need to send the NMUser object and * the NMConference object to the callbacks */ parms = NULL; parms = g_slist_append(parms, user); parms = g_slist_append(parms, nm_event_get_conference(event)); /* Prompt the user */ gc = purple_account_get_connection(user->client_data); purple_request_action(gc, title, primary, secondary, PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), name, NULL, parms, 2, _("Yes"), G_CALLBACK(_join_conference_cb), _("No"), G_CALLBACK(_reject_conference_cb)); g_free(primary);}static void_evt_conference_joined(NMUser * user, NMEvent * event){ PurpleConversation *chat = NULL; PurpleConnection *gc; NMConference *conference = NULL; NMUserRecord *ur = NULL; const char *name; const char *conf_name; gc = purple_account_get_connection(user->client_data); if (gc == NULL) return; conference = nm_event_get_conference(event); if (conference) { chat = nm_conference_get_data(conference); if (nm_conference_get_participant_count(conference) == 2 && chat == NULL) { ur = nm_conference_get_participant(conference, 0); if (ur) { conf_name = _get_conference_name(++user->conference_count); chat = serv_got_joined_chat(gc, user->conference_count, conf_name); if (chat) { nm_conference_set_data(conference, (gpointer) chat); name = nm_user_record_get_display_id(ur); purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, PURPLE_CBFLAGS_NONE, TRUE); } } } if (chat != NULL) { ur = nm_find_user_record(user, nm_event_get_source(event)); if (ur) { name = nm_user_record_get_display_id(ur); if (!purple_conv_chat_find_user(PURPLE_CONV_CHAT(chat), name)) { purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, PURPLE_CBFLAGS_NONE, TRUE); } } } }}static void_evt_status_change(NMUser * user, NMEvent * event){ PurpleBuddy *buddy = NULL; GSList *buddies; GSList *bnode; NMUserRecord *user_record; const char *display_id; int status; user_record = nm_event_get_user_record(event); if (user_record) { /* Retrieve new status */ status = nm_user_record_get_status(user_record); /* Update status for buddy in all folders */ display_id = nm_user_record_get_display_id(user_record); buddies = purple_find_buddies(user->client_data, display_id); for (bnode = buddies; bnode; bnode = bnode->next) { buddy = (PurpleBuddy *) bnode->data; if (buddy) { _update_buddy_status(user, buddy, status, nm_event_get_gmt(event)); } } g_slist_free(buddies); }}static void_evt_user_disconnect(NMUser * user, NMEvent * event){ PurpleConnection *gc; gc = purple_account_get_connection((PurpleAccount *) user->client_data); if (gc) { gc->wants_to_die = TRUE; /* we don't want to reconnect in this case */ purple_connection_error(gc, _("You have been logged out because you" " logged in at another workstation.")); }}static void_evt_user_typing(NMUser * user, NMEvent * event){ PurpleConnection *gc; NMUserRecord *user_record = NULL; gc = purple_account_get_connection((PurpleAccount *) user->client_data); if (gc) { user_record = nm_find_user_record(user, nm_event_get_source(event)); if (user_record) { serv_got_typing(gc, nm_user_record_get_display_id(user_record), 30, PURPLE_TYPING); } }}static void_evt_user_not_typing(NMUser * user, NMEvent * event){ PurpleConnection *gc; NMUserRecord *user_record; gc = purple_account_get_connection((PurpleAccount *) user->client_data); if (gc) { user_record = nm_find_user_record(user, nm_event_get_source(event)); if (user_record) { serv_got_typing_stopped(gc, nm_user_record_get_display_id(user_record)); } }}static void_evt_undeliverable_status(NMUser * user, NMEvent * event){ NMUserRecord *ur; PurpleConversation *gconv; char *str; ur = nm_find_user_record(user, nm_event_get_source(event)); if (ur) { /* XXX - Should this be PURPLE_CONV_TYPE_IM? */ gconv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, nm_user_record_get_display_id(ur), user->client_data); if (gconv) { const char *name = nm_user_record_get_full_name(ur); if (name == NULL) { name = nm_user_record_get_display_id(ur); } str = g_strdup_printf(_("%s appears to be offline and did not receive" " the message that you just sent."), name); purple_conversation_write(gconv, NULL, str, PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(str); } }}static void_event_callback(NMUser * user, NMEvent * event){ if (user == NULL || event == NULL) return; switch (nm_event_get_type(event)) { case NMEVT_STATUS_CHANGE: _evt_status_change(user, event); break; case NMEVT_RECEIVE_AUTOREPLY: case NMEVT_RECEIVE_MESSAGE: _evt_receive_message(user, event); break; case NMEVT_USER_DISCONNECT: _evt_user_disconnect(user, event); break; case NMEVT_USER_TYPING: _evt_user_typing(user, event);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -