⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 switchboard.c

📁 msn message protocol stack
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -