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

📄 switchboard.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	}	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 + -