📄 switchboard.c
字号:
swboard = cmdproc->servconn->swboard; clientcaps = msn_message_get_hashtable_from_body(msg);#endif}voidmsn_switchboard_send_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->servconn->cmdproc; payload = msn_message_gen_payload(msg, &payload_len); /* msn_message_show_readable(msg, "SB SEND", FALSE); */ trans = msn_transaction_new("MSG", "%c %d", msn_message_get_flag(msg), payload_len); if (msg->ack_cb != NULL) msn_transaction_add_cb(trans, "ACK", msg->ack_cb, msg->ack_data); trans->payload = payload; trans->payload_len = payload_len; msg->trans = trans; msn_cmdproc_send_trans(cmdproc, trans);}voidmsn_switchboard_queue_msg(MsnSwitchBoard *swboard, MsnMessage *msg){ g_return_if_fail(swboard != NULL); g_return_if_fail(msg != NULL); gaim_debug_info("msn", "Appending message to queue.\n"); g_queue_push_tail(swboard->im_queue, msg); msn_message_ref(msg);}voidmsn_switchboard_process_queue(MsnSwitchBoard *swboard){ MsnMessage *msg; g_return_if_fail(swboard != NULL); gaim_debug_info("msn", "Processing queue\n"); while ((msg = g_queue_pop_head(swboard->im_queue)) != NULL) { gaim_debug_info("msn", "Sending message\n"); msn_switchboard_send_msg(swboard, msg); msn_message_unref(msg); }}/************************************************************************** * Connect stuff **************************************************************************/static voidconnect_cb(MsnServConn *servconn){ MsnSwitchBoard *swboard; MsnCmdProc *cmdproc; GaimAccount *account; cmdproc = servconn->cmdproc; g_return_if_fail(cmdproc != NULL); cmdproc->ready = TRUE; account = servconn->session->account; swboard = servconn->data; g_return_if_fail(swboard != NULL); swboard->user_joined = TRUE; if (msn_switchboard_is_invited(swboard)) { msn_cmdproc_send(cmdproc, "ANS", "%s %s %s", gaim_account_get_username(account), swboard->auth_key, swboard->session_id); } else { msn_cmdproc_send(cmdproc, "USR", "%s %s", gaim_account_get_username(account), swboard->auth_key); }}static voiddisconnect_cb(MsnServConn *servconn){ MsnSwitchBoard *swboard; swboard = servconn->data; g_return_if_fail(swboard != NULL); msn_switchboard_destroy(swboard);}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", NULL); /* 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);#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);}MsnSwitchBoard *msn_switchboard_new(MsnSession *session){ MsnSwitchBoard *swboard; MsnServConn *servconn; MsnCmdProc *cmdproc; g_return_val_if_fail(session != NULL, NULL); swboard = g_new0(MsnSwitchBoard, 1); swboard->session = session; swboard->servconn = servconn = msn_servconn_new(session, MSN_SERVER_SB); cmdproc = servconn->cmdproc; swboard->im_queue = g_queue_new(); if (session->http_method) servconn->http_data->server_type = "SB"; else msn_servconn_set_connect_cb(servconn, connect_cb); msn_servconn_set_disconnect_cb(servconn, disconnect_cb); servconn->data = swboard; session->switches = g_list_append(session->switches, swboard); cmdproc->cbs_table = cbs_table; return swboard;}voidmsn_switchboard_destroy(MsnSwitchBoard *swboard){ MsnSession *session; MsnMessage *msg; GList *l; g_return_if_fail(swboard != NULL); if (swboard->destroying) return; swboard->destroying = TRUE; if (swboard->im_user != NULL) g_free(swboard->im_user); if (swboard->auth_key != NULL) g_free(swboard->auth_key); if (swboard->session_id != NULL) g_free(swboard->session_id); for (l = swboard->users; l != NULL; l = l->next) g_free(l->data); session = swboard->session; session->switches = g_list_remove(session->switches, swboard); if (swboard->servconn != NULL) msn_servconn_destroy(swboard->servconn); while ((msg = g_queue_pop_head(swboard->im_queue)) != NULL) msn_message_destroy(msg); g_queue_free(swboard->im_queue); g_free(swboard);}#if 0voidmsn_switchboard_set_user(MsnSwitchBoard *swboard, const char *user){ g_return_if_fail(swboard != NULL); if (swboard->user != NULL) g_free(swboard->user); swboard->user = g_strdup(user);}const char *msn_switchboard_get_user(MsnSwitchBoard *swboard){ g_return_val_if_fail(swboard != NULL, NULL); return swboard->user;}#endif#if 0static voidgot_cal(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; const char *user; swboard = cmdproc->servconn->data; user = cmd->params[0]; msn_switchboard_add_user(swboard, user);}#endifvoidmsn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user){ MsnTransaction *trans; MsnCmdProc *cmdproc; g_return_if_fail(swboard != NULL); cmdproc = swboard->servconn->cmdproc; trans = msn_transaction_new("CAL", "%s", user); /* msn_transaction_add_cb(trans, "CAL", got_cal, NULL); */ if (swboard->ready) msn_cmdproc_send_trans(cmdproc, trans); else msn_cmdproc_queue_trans(cmdproc, trans);}voidmsn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key){ g_return_if_fail(swboard != NULL); g_return_if_fail(key != NULL); swboard->auth_key = g_strdup(key);}const char *msn_switchboard_get_auth_key(MsnSwitchBoard *swboard){ g_return_val_if_fail(swboard != NULL, NULL); return swboard->auth_key;}voidmsn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id){ g_return_if_fail(swboard != NULL); g_return_if_fail(id != NULL); if (swboard->session_id != NULL) g_free(swboard->session_id); swboard->session_id = g_strdup(id);}const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard){ g_return_val_if_fail(swboard != NULL, NULL); return swboard->session_id;}voidmsn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited){ g_return_if_fail(swboard != NULL); swboard->invited = invited;}gbooleanmsn_switchboard_is_invited(MsnSwitchBoard *swboard){ g_return_val_if_fail(swboard != NULL, FALSE); return swboard->invited;}gbooleanmsn_switchboard_connect(MsnSwitchBoard *swboard, const char *host, int port){ g_return_val_if_fail(swboard != NULL, FALSE); return msn_servconn_connect(swboard->servconn, host, port);}voidmsn_switchboard_disconnect(MsnSwitchBoard *swboard){ g_return_if_fail(swboard != NULL); msn_servconn_disconnect(swboard->servconn);}static voidgot_swboard(MsnCmdProc *cmdproc, MsnCommand *cmd){ MsnSwitchBoard *swboard; char *host; int port; swboard = cmd->trans->data; msn_switchboard_set_auth_key(swboard, cmd->params[4]); msn_parse_socket(cmd->params[2], &host, &port); if (swboard->session->http_method) { GaimAccount *account; MsnSession *session; MsnServConn *servconn; port = 80; session = swboard->session; servconn = swboard->servconn; account = session->account; swboard->user_joined = TRUE; servconn->http_data->gateway_host = g_strdup(host);#if 0 servconn->connected = TRUE; servconn->cmdproc->ready = TRUE;#endif if (msn_switchboard_is_invited(swboard)) { msn_cmdproc_send(servconn->cmdproc, "ANS", "%s %s %s", gaim_account_get_username(account), swboard->auth_key, swboard->session_id); } else { msn_cmdproc_send(servconn->cmdproc, "USR", "%s %s", gaim_account_get_username(account), swboard->auth_key); } } msn_switchboard_connect(swboard, host, port); g_free(host);}voidmsn_switchboard_request(MsnSwitchBoard *swboard){ MsnCmdProc *cmdproc; MsnTransaction *trans; g_return_if_fail(swboard != NULL); cmdproc = swboard->session->notification->cmdproc; trans = msn_transaction_new("XFR", "%s", "SB"); msn_transaction_add_cb(trans, "XFR", got_swboard, swboard); msn_cmdproc_send_trans(cmdproc, trans);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -