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

📄 switchboard.c

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