📄 switchboard.c
字号:
} else { str_reason = _("Message may have not been sent " "because an unknown error occurred:"); } body_str = msn_message_to_string(msg); body_enc = g_markup_escape_text(body_str, -1); g_free(body_str); format = msn_message_get_attr(msg, "X-MMS-IM-Format"); msn_parse_format(format, &pre, &post); body_str = g_strdup_printf("%s%s%s", pre ? pre : "", body_enc ? body_enc : "", post ? post : ""); g_free(body_enc); g_free(pre); g_free(post); msn_switchboard_report_user(swboard, PURPLE_MESSAGE_ERROR, str_reason); msn_switchboard_report_user(swboard, PURPLE_MESSAGE_RAW, body_str); g_free(body_str); } /* If a timeout occures we will want the msg around just in case we * receive the ACK after the timeout. */ if (msg->ack_ref && error != MSN_MSG_ERROR_TIMEOUT) { swboard->ack_list = g_list_remove(swboard->ack_list, msg); msn_message_unref(msg); }}/************************************************************************** * Message Stuff **************************************************************************//** Called when a message times out. */static voidmsg_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans){ MsnMessage *msg; msg = trans->data; msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_TIMEOUT);}/** Called when we receive an error of a message. */static voidmsg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error){ msg_error_helper(cmdproc, trans->data, MSN_MSG_ERROR_UNKNOWN);}#if 0/** Called when we receive an ack of a special message. */static voidmsg_ack(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnMessage *msg; msg = cmd->trans->data; if (msg->ack_cb != NULL) msg->ack_cb(msg->ack_data); msn_message_unref(msg);}/** Called when we receive a nak of a special message. */static voidmsg_nak(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnMessage *msg; msg = cmd->trans->data; msn_message_unref(msg);}#endifstatic voidrelease_msg(MsnSwitchBoard *swboard, MsnMessage *msg){ MsnCmdProc *cmdproc; MsnTransaction *trans; char *payload; gsize payload_len; g_return_if_fail(swboard != NULL); g_return_if_fail(msg != NULL); cmdproc = swboard->cmdproc; payload = msn_message_gen_payload(msg, &payload_len);#ifdef MSN_DEBUG_SB msn_message_show_readable(msg, "SB SEND", FALSE);#endif trans = msn_transaction_new(cmdproc, "MSG", "%c %d", msn_message_get_flag(msg), payload_len); /* Data for callbacks */ msn_transaction_set_data(trans, msg); if (msg->type == MSN_MSG_TEXT) { msg->ack_ref = TRUE; msn_message_ref(msg); swboard->ack_list = g_list_append(swboard->ack_list, msg); msn_transaction_set_timeout_cb(trans, msg_timeout); } else if (msg->type == MSN_MSG_SLP) { msg->ack_ref = TRUE; msn_message_ref(msg); swboard->ack_list = g_list_append(swboard->ack_list, msg); msn_transaction_set_timeout_cb(trans, msg_timeout);#if 0 if (msg->ack_cb != NULL) { msn_transaction_add_cb(trans, "ACK", msg_ack); msn_transaction_add_cb(trans, "NAK", msg_nak); }#endif } trans->payload = payload; trans->payload_len = payload_len; msg->trans = trans; msn_cmdproc_send_trans(cmdproc, trans);}static voidqueue_msg(MsnSwitchBoard *swboard, MsnMessage *msg){ g_return_if_fail(swboard != NULL); g_return_if_fail(msg != NULL); purple_debug_info("msn", "Appending message to queue.\n"); g_queue_push_tail(swboard->msg_queue, msg); msn_message_ref(msg);}static voidprocess_queue(MsnSwitchBoard *swboard){ MsnMessage *msg; g_return_if_fail(swboard != NULL); purple_debug_info("msn", "Processing queue\n"); while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL) { purple_debug_info("msn", "Sending message\n"); release_msg(swboard, msg); msn_message_unref(msg); }}gbooleanmsn_switchboard_can_send(MsnSwitchBoard *swboard){ g_return_val_if_fail(swboard != NULL, FALSE); if (swboard->empty || !g_queue_is_empty(swboard->msg_queue)) return FALSE; return TRUE;}voidmsn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg, gboolean queue){ g_return_if_fail(swboard != NULL); g_return_if_fail(msg != NULL); if (msn_switchboard_can_send(swboard)) release_msg(swboard, msg); else if (queue) queue_msg(swboard, msg);}/************************************************************************** * Switchboard Commands **************************************************************************/static voidans_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; swboard = cmdproc->data; swboard->ready = TRUE;}static voidbye_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; const char *user; swboard = cmdproc->data; user = cmd->params[0]; /* cmdproc->data is set to NULL when the switchboard is destroyed; * we may get a bye shortly thereafter. */ g_return_if_fail(swboard != NULL); if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) purple_debug_error("msn_switchboard", "bye_cmd: helper bug\n"); if (swboard->conv == NULL) { /* This is a helper switchboard */ msn_switchboard_destroy(swboard); } else if ((swboard->current_users > 1) || (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) { /* This is a switchboard used for a chat */ purple_conv_chat_remove_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL); swboard->current_users--; if (swboard->current_users == 0) msn_switchboard_destroy(swboard); } else { /* This is a switchboard used for a im session */ msn_switchboard_destroy(swboard); }}static voidiro_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ PurpleAccount *account; PurpleConnection *gc; MsnSwitchBoard *swboard; account = cmdproc->session->account; gc = account->gc; swboard = cmdproc->data; swboard->total_users = atoi(cmd->params[2]); msn_switchboard_add_user(swboard, cmd->params[3]);}static voidjoi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSession *session; PurpleAccount *account; PurpleConnection *gc; MsnSwitchBoard *swboard; const char *passport; passport = cmd->params[0]; session = cmdproc->session; account = session->account; gc = account->gc; swboard = cmdproc->data; msn_switchboard_add_user(swboard, passport); process_queue(swboard); if (!session->http_method) send_clientcaps(swboard); if (swboard->closed) msn_switchboard_close(swboard);}static voidmsg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len){ MsnMessage *msg; msg = msn_message_new_from_cmd(cmdproc->session, cmd); msn_message_parse_payload(msg, payload, len);#ifdef MSN_DEBUG_SB msn_message_show_readable(msg, "SB RECV", FALSE);#endif if (msg->remote_user != NULL) g_free (msg->remote_user); msg->remote_user = g_strdup(cmd->params[0]); msn_cmdproc_process_msg(cmdproc, msg); msn_message_destroy(msg);}static voidmsg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ cmdproc->servconn->payload_len = atoi(cmd->params[2]); cmdproc->last_cmd->payload_cb = msg_cmd_post;}static voidnak_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnMessage *msg; msg = cmd->trans->data; g_return_if_fail(msg != NULL); msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_NAK);}static voidack_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; MsnMessage *msg; msg = cmd->trans->data; if (msg->ack_cb != NULL) msg->ack_cb(msg, msg->ack_data); swboard = cmdproc->data; swboard->ack_list = g_list_remove(swboard->ack_list, msg); msn_message_unref(msg);}static voidout_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ PurpleConnection *gc; MsnSwitchBoard *swboard; gc = cmdproc->session->account->gc; swboard = cmdproc->data; if (swboard->current_users > 1) serv_got_chat_left(gc, swboard->chat_id); msn_switchboard_disconnect(swboard);}static voidusr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; swboard = cmdproc->data;#if 0 GList *l; for (l = swboard->users; l != NULL; l = l->next) { const char *user; user = l->data; msn_cmdproc_send(cmdproc, "CAL", "%s", user); }#endif swboard->ready = TRUE; msn_cmdproc_process_queue(cmdproc);}/************************************************************************** * Message Handlers **************************************************************************/static voidplain_msg(MsnCmdProc *cmdproc, MsnMessage *msg){ PurpleConnection *gc; MsnSwitchBoard *swboard; const char *body; char *body_str; char *body_enc; char *body_final; size_t body_len; const char *passport; const char *value; gc = cmdproc->session->account->gc; swboard = cmdproc->data; body = msn_message_get_bin_data(msg, &body_len); body_str = g_strndup(body, body_len); body_enc = g_markup_escape_text(body_str, -1); g_free(body_str); passport = msg->remote_user; if (!strcmp(passport, "messenger@microsoft.com") && strstr(body, "immediate security update")) { return; }#if 0 if ((value = msn_message_get_attr(msg, "User-Agent")) != NULL) { purple_debug_misc("msn", "User-Agent = '%s'\n", value); }#endif if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) { char *pre, *post; msn_parse_format(value, &pre, &post); body_final = g_strdup_printf("%s%s%s", pre ? pre : "", body_enc ? body_enc : "", post ? post : ""); g_free(pre); g_free(post); g_free(body_enc); } else { body_final = body_enc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -