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

📄 msn.c

📁 msn message protocol stack
💻 C
📖 第 1 页 / 共 3 页
字号:
	gc->proto_data = session;	gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_FORMATTING_WBFO | GAIM_CONNECTION_NO_BGCOLOR | GAIM_CONNECTION_NO_FONTSIZE | GAIM_CONNECTION_NO_URLDESC;	gaim_connection_update_progress(gc, _("Connecting"), 0, MSN_CONNECT_STEPS);	/* Hmm, I don't like this. */	username = msn_normalize(account, gaim_account_get_username(account));	if (strcmp(username, gaim_account_get_username(account)))		gaim_account_set_username(account, username);	msn_session_connect(session);}static voidmsn_close(GaimConnection *gc){	MsnSession *session;	session = gc->proto_data;	g_return_if_fail(session != NULL);	if (session->http_method)		msn_http_session_uninit(session);	msn_session_destroy(session);	gc->proto_data = NULL;}static intmsn_send_im(GaimConnection *gc, const char *who, const char *message,			GaimConvImFlags flags){	GaimAccount *account;	account = gaim_connection_get_account(gc);	if (g_ascii_strcasecmp(who, gaim_account_get_username(account)))	{		MsnSession *session;		MsnSwitchBoard *swboard;		MsnMessage *msg;		char *msgformat;		char *msgtext;		session = gc->proto_data;		swboard = msn_session_get_swboard(session, who);		msn_import_html(message, &msgformat, &msgtext);		msg = msn_message_new_plain(msgtext);		msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);		g_free(msgformat);		g_free(msgtext);		swboard = msn_session_get_swboard(session, who);		if (!g_queue_is_empty(swboard->im_queue) ||			!swboard->user_joined)		{			msn_switchboard_queue_msg(swboard, msg);		}		else		{			msn_switchboard_send_msg(swboard, msg);		}		msn_message_destroy(msg);	}	else	{		/*		 * In MSN, you can't send messages to yourself, so		 * we'll fake like we received it ;)		 */		serv_got_typing_stopped(gc, who);		serv_got_im(gc, who, message, flags, time(NULL));	}	return 1;}static intmsn_send_typing(GaimConnection *gc, const char *who, int typing){	GaimAccount *account;	MsnSession *session;	MsnSwitchBoard *swboard;	MsnMessage *msg;	account = gaim_connection_get_account(gc);	session = gc->proto_data;	if (!typing)		return 0;	if (!g_ascii_strcasecmp(who, gaim_account_get_username(account)))	{		/* We'll just fake it, since we're sending to ourself. */		serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, GAIM_TYPING);		return MSN_TYPING_SEND_TIMEOUT;	}	swboard = msn_session_find_swboard(session, who);	if (swboard == NULL)		return 0;	if (!swboard->user_joined)		return 0;	msg = msn_message_new();	msn_message_set_content_type(msg, "text/x-msmsgscontrol");	msn_message_set_flag(msg, 'U');	msn_message_set_attr(msg, "TypingUser",						 gaim_account_get_username(account));	msn_message_set_bin_data(msg, "\r\n", 2);	msn_switchboard_send_msg(swboard, msg);	msn_message_destroy(msg);	return MSN_TYPING_SEND_TIMEOUT;}static voidmsn_set_away(GaimConnection *gc, const char *state, const char *msg){	MsnSession *session;	int status;	session = gc->proto_data;	if (gc->away != NULL)	{		g_free(gc->away);		gc->away = NULL;	}	if (msg != NULL)	{		gc->away = g_strdup("");		status = MSN_AWAY;	}	else if (state)	{		gc->away = g_strdup("");		if (!strcmp(state, _("Away From Computer")))			status = MSN_AWAY;		else if (!strcmp(state, _("Be Right Back")))			status = MSN_BRB;		else if (!strcmp(state, _("Busy")))			status = MSN_BUSY;		else if (!strcmp(state, _("On The Phone")))			status = MSN_PHONE;		else if (!strcmp(state, _("Out To Lunch")))			status = MSN_LUNCH;		else if (!strcmp(state, _("Hidden")))			status = MSN_HIDDEN;		else		{			g_free(gc->away);			gc->away = NULL;			status = MSN_ONLINE;		}	}	else if (gc->is_idle)		status = MSN_IDLE;	else		status = MSN_ONLINE;	msn_change_status(session, status);}static voidmsn_set_idle(GaimConnection *gc, int idle){	MsnSession *session;	session = gc->proto_data;	if (gc->away != NULL)		return;	msn_change_status(session, (idle ? MSN_IDLE : MSN_ONLINE));}static voidfake_userlist_add_buddy(MsnUserList *userlist,					   const char *who, int list_id,					   const char *group_name){	MsnUser *user;	static int group_id_c = 1;	int group_id;	group_id = -1;	if (group_name != NULL)	{		MsnGroup *group;		group = msn_group_new(userlist, group_id_c, group_name);		group_id = group_id_c++;	}	user = msn_userlist_find_user(userlist, who);	if (user == NULL)	{		user = msn_user_new(userlist, who, NULL);		msn_userlist_add_user(userlist, user);	}	else		if (user->list_op & (1 << list_id))		{			if (list_id == MSN_LIST_FL)			{				if (group_id >= 0)					if (g_list_find(user->group_ids,									GINT_TO_POINTER(group_id)))						return;			}			else				return;		}	if (group_id >= 0)	{		user->group_ids = g_list_append(user->group_ids,										GINT_TO_POINTER(group_id));	}	user->list_op |= (1 << list_id);}static voidmsn_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group){	MsnSession *session;	MsnUserList *userlist;	const char *who;	session = gc->proto_data;	userlist = session->userlist;	who = msn_normalize(gc->account, buddy->name);	if (!session->logged_in)	{		fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL,								group ? group->name : NULL);		return;	}#if 0	if (group != NULL && group->name != NULL)		gaim_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name);	else		gaim_debug_info("msn", "msn_add_buddy: %s\n", who);#endif#if 0	/* Which is the max? */	if (session->fl_users_count >= 150)	{		gaim_debug_info("msn", "Too many buddies\n");		/* Buddy list full */		/* TODO: gaim should be notified of this */		return;	}#endif	/* XXX - Would group ever be NULL here?  I don't think so...	 * shx: Yes it should; MSN handles non-grouped buddies, and this is only	 * internal. */	msn_userlist_add_buddy(userlist, who, MSN_LIST_FL,						   group ? group->name : NULL);}static voidmsn_rem_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group){	MsnSession *session;	MsnUserList *userlist;	session = gc->proto_data;	userlist = session->userlist;	if (!session->logged_in)		return;	/* XXX - Does buddy->name need to be msn_normalize'd here?  --KingAnt */	msn_userlist_rem_buddy(userlist, buddy->name, MSN_LIST_FL, group->name);}static voidmsn_add_permit(GaimConnection *gc, const char *who){	MsnSession *session;	MsnUserList *userlist;	MsnUser *user;	session = gc->proto_data;	userlist = session->userlist;	user = msn_userlist_find_user(userlist, who);	if (!session->logged_in)		return;	if (user != NULL && user->list_op & MSN_LIST_BL_OP)		msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL);	msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);}static voidmsn_add_deny(GaimConnection *gc, const char *who){	MsnSession *session;	MsnUserList *userlist;	MsnUser *user;	session = gc->proto_data;	userlist = session->userlist;	user = msn_userlist_find_user(userlist, who);	if (!session->logged_in)		return;	if (user != NULL && user->list_op & MSN_LIST_AL_OP)		msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL);	msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);}static voidmsn_rem_permit(GaimConnection *gc, const char *who){	MsnSession *session;	MsnUserList *userlist;	MsnUser *user;	session = gc->proto_data;	userlist = session->userlist;	if (!session->logged_in)		return;	user = msn_userlist_find_user(userlist, who);	msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL);	if (user != NULL && user->list_op & MSN_LIST_RL_OP)		msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);}voidmsn_rem_deny(GaimConnection *gc, const char *who){	MsnSession *session;	MsnUserList *userlist;	MsnUser *user;	session = gc->proto_data;	userlist = session->userlist;	if (!session->logged_in)		return;	user = msn_userlist_find_user(userlist, who);	msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL);	if (user != NULL && user->list_op & MSN_LIST_RL_OP)		msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);}static voidmsn_set_permit_deny(GaimConnection *gc){	GaimAccount *account;	MsnSession *session;	MsnCmdProc *cmdproc;	account = gaim_connection_get_account(gc);	session = gc->proto_data;	cmdproc = session->notification->cmdproc;	if (account->perm_deny == GAIM_PRIVACY_ALLOW_ALL ||		account->perm_deny == GAIM_PRIVACY_DENY_USERS)	{		msn_cmdproc_send(cmdproc, "BLP", "%s", "AL");	}	else	{		msn_cmdproc_send(cmdproc, "BLP", "%s", "BL");	}}static voidmsn_chat_invite(GaimConnection *gc, int id, const char *msg,				const char *who){	MsnSession *session;	MsnSwitchBoard *swboard;	MsnCmdProc *cmdproc;	session = gc->proto_data;	swboard = msn_session_find_switch_with_id(session, id);	g_return_if_fail(swboard != NULL);	cmdproc = swboard->servconn->cmdproc;	msn_cmdproc_send(cmdproc, "CAL", "%s", who);}static voidmsn_chat_leave(GaimConnection *gc, int id){	MsnSession *session;	MsnSwitchBoard *swboard;	MsnCmdProc *cmdproc;	session = gc->proto_data;	swboard = msn_session_find_switch_with_id(session, id);	g_return_if_fail(swboard != NULL);	cmdproc = swboard->servconn->cmdproc;	msn_cmdproc_send_quick(cmdproc, "OUT", NULL, NULL);	msn_switchboard_destroy(swboard);	/* serv_got_chat_left(gc, id); */}static intmsn_chat_send(GaimConnection *gc, int id, const char *message){	GaimAccount *account;	MsnSession *session;	MsnSwitchBoard *swboard;	MsnMessage *msg;	char *msgformat;	char *msgtext;	account = gaim_connection_get_account(gc);	session = gc->proto_data;	swboard = msn_session_find_switch_with_id(session, id);	if (swboard == NULL)		return -EINVAL;	if (swboard->ready)	{		msn_import_html(message, &msgformat, &msgtext);		msg = msn_message_new_plain(msgtext);		msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);		msn_switchboard_send_msg(swboard, msg);		msn_message_destroy(msg);		g_free(msgformat);		g_free(msgtext);		serv_got_chat_in(gc, id, gaim_account_get_username(account), 0,						 message, time(NULL));	}	return 0;}static voidmsn_keepalive(GaimConnection *gc){	MsnSession *session;	MsnCmdProc *cmdproc;	session = gc->proto_data;	cmdproc = session->notification->cmdproc;	if (!session->http_method)		msn_cmdproc_send_quick(cmdproc, "PNG", NULL, NULL);}static voidmsn_group_buddy(GaimConnection *gc, const char *who,				const char *old_group_name, const char *new_group_name){	MsnSession *session;	MsnUserList *userlist;	session = gc->proto_data;	userlist = session->userlist;	msn_userlist_move_buddy(userlist, who, old_group_name, new_group_name);}static voidmsn_rename_group(GaimConnection *gc, const char *old_name,				 GaimGroup *group, GList *moved_buddies){	MsnSession *session;	MsnCmdProc *cmdproc;	int old_gid;	const char *enc_new_group_name;	session = gc->proto_data;	cmdproc = session->notification->cmdproc;	enc_new_group_name = gaim_url_encode(group->name);	old_gid = msn_userlist_find_group_id(session->userlist, old_name);	if (old_gid >= 0)	{		msn_cmdproc_send(cmdproc, "REG", "%d %s 0", old_gid,						 enc_new_group_name);	}	else	{		msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name);	}}static voidmsn_convo_closed(GaimConnection *gc, const char *who){	MsnSession *session;	MsnSwitchBoard *swboard;	MsnCmdProc *cmdproc;	session = gc->proto_data;	swboard = msn_session_find_swboard(session, who);	/*	 * Don't perform an assertion here. It swboard is NULL, then the	 * switchboard was either closed by the other party, or the person	 * is talking to himself.	 */	if (swboard == NULL)		return;	cmdproc = swboard->servconn->cmdproc;	if (swboard->current_users == 1)	{		/* This must happen on both IM's and Chat's, right? */		GaimAccount *account;		account = gaim_connection_get_account(gc);		msn_cmdproc_send_quick(cmdproc, "BYE", "%s",							   gaim_account_get_username(account));		msn_switchboard_destroy(swboard);	}}static voidmsn_set_buddy_icon(GaimConnection *gc, const char *filename){	MsnSession *session;	MsnUser *user;	session = gc->proto_data;	user = session->user;	msn_user_set_buddy_icon(user, filename);	msn_change_status(session, session->state);}static voidmsn_remove_group(GaimConnection *gc, GaimGroup *group){	MsnSession *session;	MsnCmdProc *cmdproc;	int group_id;	session = gc->proto_data;	cmdproc = session->notification->cmdproc;	if ((group_id = msn_userlist_find_group_id(session->userlist, group->name)) >= 0)	{		msn_cmdproc_send(cmdproc, "RMG", "%d", group_id);	}}static char *msn_tooltip_info_text(MsnGetInfoData *info_data){	GString *s;	GString *name;	GaimBuddy *b;	const char *p;	s = g_string_sized_new(80); /* wild guess */	/* Try to not display the MSN screen name as an email address */	p = strrchr(info_data->name, '@');	if (p)	{		name = g_string_new_len(info_data->name, p - info_data->name);		g_string_append_printf(name, "&#64;%s", p + 1);	}	else	{		/* This should never happen */		name = g_string_new(info_data->name);	}	g_string_printf(s, "<span style=\"font-size: larger\"><b>%s</b></span><br>",					name->str);	g_string_free(name, TRUE);	b = gaim_find_buddy(gaim_connection_get_account(info_data->gc),						info_data->name);	if (b)	{		MsnUser *user;		char *statustext = msn_tooltip_text(b);		if (b->alias && b->alias[0])		{			char *aliastext = g_markup_escape_text(b->alias, -1);			g_string_append_printf(s, _("<b>Alias:</b> %s<br>"), aliastext);			g_free(aliastext);		}		if (b->server_alias)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -