📄 switchboard.c
字号:
} swboard->flag |= MSN_SB_FLAG_IM; if (swboard->current_users > 1 || ((swboard->conv != NULL) && purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) { /* If current_users is always ok as it should then there is no need to * check if this is a chat. */ if (swboard->current_users <= 1) purple_debug_misc("msn", "plain_msg: current_users(%d)\n", swboard->current_users); serv_got_chat_in(gc, swboard->chat_id, passport, 0, body_final, time(NULL)); if (swboard->conv == NULL) { swboard->conv = purple_find_chat(gc, swboard->chat_id); swboard->flag |= MSN_SB_FLAG_IM; } } else { serv_got_im(gc, passport, body_final, 0, time(NULL)); if (swboard->conv == NULL) { swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, purple_connection_get_account(gc)); swboard->flag |= MSN_SB_FLAG_IM; } } g_free(body_final);}static voidcontrol_msg(MsnCmdProc *cmdproc, MsnMessage *msg){ PurpleConnection *gc; MsnSwitchBoard *swboard; char *passport; gc = cmdproc->session->account->gc; swboard = cmdproc->data; passport = msg->remote_user; if (swboard->current_users == 1 && msn_message_get_attr(msg, "TypingUser") != NULL) { serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT, PURPLE_TYPING); }}static voidclientcaps_msg(MsnCmdProc *cmdproc, MsnMessage *msg){#if 0 MsnSession *session; MsnSwitchBoard *swboard; MsnUser *user; GHashTable *clientcaps; const char *value; char *passport = msg->sender; session = cmdproc->session; swboard = cmdproc->servconn->swboard; clientcaps = msn_message_get_hashtable_from_body(msg);#endif}static voidnudge_msg(MsnCmdProc *cmdproc, MsnMessage *msg){ MsnSwitchBoard *swboard; char *username, *str; PurpleAccount *account; PurpleBuddy *buddy; const char *user; swboard = cmdproc->data; account = cmdproc->session->account; user = msg->remote_user; if ((buddy = purple_find_buddy(account, user)) != NULL) username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1); else username = g_markup_escape_text(user, -1); str = g_strdup_printf(_("%s just sent you a Nudge!"), username); g_free(username); msn_switchboard_report_user(swboard, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, str); g_free(str);}/************************************************************************** * Connect stuff **************************************************************************/static voidans_usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error);static voidconnect_cb(MsnServConn *servconn){ MsnSwitchBoard *swboard; MsnTransaction *trans; MsnCmdProc *cmdproc; PurpleAccount *account; cmdproc = servconn->cmdproc; g_return_if_fail(cmdproc != NULL); account = cmdproc->session->account; swboard = cmdproc->data; g_return_if_fail(swboard != NULL); if (msn_switchboard_is_invited(swboard)) { swboard->empty = FALSE; trans = msn_transaction_new(cmdproc, "ANS", "%s %s %s", purple_account_get_username(account), swboard->auth_key, swboard->session_id); } else { trans = msn_transaction_new(cmdproc, "USR", "%s %s", purple_account_get_username(account), swboard->auth_key); } msn_transaction_set_error_cb(trans, ans_usr_error); msn_transaction_set_data(trans, swboard); msn_cmdproc_send_trans(cmdproc, trans);}static voidans_usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error){ MsnSwitchBoard *swboard; char **params; char *passport; int reason = MSN_SB_ERROR_UNKNOWN; if (error == 911) { reason = MSN_SB_ERROR_AUTHFAILED; } purple_debug_warning("msn", "ans_usr_error: command %s gave error %i\n", trans->command, error); params = g_strsplit(trans->params, " ", 0); passport = params[0]; swboard = trans->data; swboard_error_helper(swboard, reason, passport); g_strfreev(params);}static voiddisconnect_cb(MsnServConn *servconn){ MsnSwitchBoard *swboard; swboard = servconn->cmdproc->data; g_return_if_fail(swboard != NULL); msn_servconn_set_disconnect_cb(swboard->servconn, NULL); msn_switchboard_destroy(swboard);}gbooleanmsn_switchboard_connect(MsnSwitchBoard *swboard, const char *host, int port){ g_return_val_if_fail(swboard != NULL, FALSE); msn_servconn_set_connect_cb(swboard->servconn, connect_cb); msn_servconn_set_disconnect_cb(swboard->servconn, disconnect_cb); return msn_servconn_connect(swboard->servconn, host, port);}voidmsn_switchboard_disconnect(MsnSwitchBoard *swboard){ g_return_if_fail(swboard != NULL); msn_servconn_disconnect(swboard->servconn);}/************************************************************************** * Call stuff **************************************************************************/static voidgot_cal(MsnCmdProc *cmdproc, MsnCommand *cmd){#if 0 MsnSwitchBoard *swboard; const char *user; swboard = cmdproc->data; user = cmd->params[0]; msn_switchboard_add_user(swboard, user);#endif}static voidcal_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans){ purple_debug_warning("msn", "cal_timeout: command %s timed out\n", trans->command); cal_error_helper(trans, MSN_SB_ERROR_UNKNOWN);}static voidcal_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error){ int reason = MSN_SB_ERROR_UNKNOWN; if (error == 215) { purple_debug_info("msn", "Invited user already in switchboard\n"); return; } else if (error == 217) { reason = MSN_SB_ERROR_USER_OFFLINE; } purple_debug_warning("msn", "cal_error: command %s gave error %i\n", trans->command, error); cal_error_helper(trans, reason);}voidmsn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user){ MsnTransaction *trans; MsnCmdProc *cmdproc; g_return_if_fail(swboard != NULL); cmdproc = swboard->cmdproc; trans = msn_transaction_new(cmdproc, "CAL", "%s", user); /* this doesn't do anything, but users seem to think that * 'Unhandled command' is some kind of error, so we don't report it */ msn_transaction_add_cb(trans, "CAL", got_cal); msn_transaction_set_data(trans, swboard); msn_transaction_set_timeout_cb(trans, cal_timeout); if (swboard->ready) msn_cmdproc_send_trans(cmdproc, trans); else msn_cmdproc_queue_trans(cmdproc, trans);}/************************************************************************** * Create & Transfer stuff **************************************************************************/static voidgot_swboard(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; char *host; int port; swboard = cmd->trans->data; if (g_list_find(cmdproc->session->switches, swboard) == NULL) /* The conversation window was closed. */ return; msn_switchboard_set_auth_key(swboard, cmd->params[4]); msn_parse_socket(cmd->params[2], &host, &port); if (!msn_switchboard_connect(swboard, host, port)) msn_switchboard_destroy(swboard); g_free(host);}static voidxfr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error){ MsnSwitchBoard *swboard; int reason = MSN_SB_ERROR_UNKNOWN; if (error == 913) reason = MSN_SB_ERROR_OFFLINE; else if (error == 800) reason = MSN_SB_ERROR_TOO_FAST; swboard = trans->data; purple_debug_info("msn", "xfr_error %i for %s: trans %x, command %s, reason %i\n", error, (swboard->im_user ? swboard->im_user : "(null)"), trans, (trans->command ? trans->command : "(null)"), reason); swboard_error_helper(swboard, reason, swboard->im_user);}voidmsn_switchboard_request(MsnSwitchBoard *swboard){ MsnCmdProc *cmdproc; MsnTransaction *trans; g_return_if_fail(swboard != NULL); cmdproc = swboard->session->notification->cmdproc; trans = msn_transaction_new(cmdproc, "XFR", "%s", "SB"); msn_transaction_add_cb(trans, "XFR", got_swboard); msn_transaction_set_data(trans, swboard); msn_transaction_set_error_cb(trans, xfr_error); msn_cmdproc_send_trans(cmdproc, trans);}voidmsn_switchboard_close(MsnSwitchBoard *swboard){ g_return_if_fail(swboard != NULL); if (swboard->error != MSN_SB_ERROR_NONE) { msn_switchboard_destroy(swboard); } else if (g_queue_is_empty(swboard->msg_queue) || !swboard->session->connected) { MsnCmdProc *cmdproc; cmdproc = swboard->cmdproc; msn_cmdproc_send_quick(cmdproc, "OUT", NULL, NULL); msn_switchboard_destroy(swboard); } else { swboard->closed = TRUE; }}gbooleanmsn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag){ g_return_val_if_fail(swboard != NULL, FALSE); swboard->flag &= ~flag; if (flag == MSN_SB_FLAG_IM) /* Forget any conversation that used to be associated with this * swboard. */ swboard->conv = NULL; if (swboard->flag == 0) { msn_switchboard_close(swboard); return TRUE; } return FALSE;}/************************************************************************** * Init stuff **************************************************************************/voidmsn_switchboard_init(void){ cbs_table = msn_table_new(); msn_table_add_cmd(cbs_table, "ANS", "ANS", ans_cmd); msn_table_add_cmd(cbs_table, "ANS", "IRO", iro_cmd); msn_table_add_cmd(cbs_table, "MSG", "ACK", ack_cmd); msn_table_add_cmd(cbs_table, "MSG", "NAK", nak_cmd); msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); msn_table_add_cmd(cbs_table, NULL, "JOI", joi_cmd); msn_table_add_cmd(cbs_table, NULL, "BYE", bye_cmd); msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd);#if 0 /* They might skip the history */ msn_table_add_cmd(cbs_table, NULL, "ACK", NULL);#endif msn_table_add_error(cbs_table, "MSG", msg_error); msn_table_add_error(cbs_table, "CAL", cal_error); /* Register the message type callbacks. */ msn_table_add_msg_type(cbs_table, "text/plain", plain_msg); msn_table_add_msg_type(cbs_table, "text/x-msmsgscontrol", control_msg); msn_table_add_msg_type(cbs_table, "text/x-clientcaps", clientcaps_msg); msn_table_add_msg_type(cbs_table, "text/x-clientinfo", clientcaps_msg); msn_table_add_msg_type(cbs_table, "application/x-msnmsgrp2p", msn_p2p_msg); msn_table_add_msg_type(cbs_table, "text/x-mms-emoticon", msn_emoticon_msg); msn_table_add_msg_type(cbs_table, "text/x-mms-animemoticon", msn_emoticon_msg); msn_table_add_msg_type(cbs_table, "text/x-msnmsgr-datacast", nudge_msg);#if 0 msn_table_add_msg_type(cbs_table, "text/x-msmmsginvite", msn_invite_msg);#endif}voidmsn_switchboard_end(void){ msn_table_destroy(cbs_table);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -