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

📄 msn.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	types = g_list_append(types, status);	status = purple_status_type_new_full(PURPLE_STATUS_AWAY,			"brb", _("Be Right Back"), FALSE, TRUE, FALSE);	types = g_list_append(types, status);	status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE,			"busy", _("Busy"), FALSE, TRUE, FALSE);	types = g_list_append(types, status);	status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE,			"phone", _("On the Phone"), FALSE, TRUE, FALSE);	types = g_list_append(types, status);	status = purple_status_type_new_full(PURPLE_STATUS_AWAY,			"lunch", _("Out to Lunch"), FALSE, TRUE, FALSE);	types = g_list_append(types, status);	status = purple_status_type_new_full(PURPLE_STATUS_INVISIBLE,			NULL, NULL, FALSE, TRUE, FALSE);	types = g_list_append(types, status);	status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE,			NULL, NULL, FALSE, TRUE, FALSE);	types = g_list_append(types, status);		status = purple_status_type_new_full(PURPLE_STATUS_MOBILE,			"mobile", NULL, FALSE, FALSE, TRUE);	types = g_list_append(types, status);		return types;}static GList *msn_actions(PurplePlugin *plugin, gpointer context){	PurpleConnection *gc = (PurpleConnection *)context;	PurpleAccount *account;	const char *user;	GList *m = NULL;	PurplePluginAction *act;	act = purple_plugin_action_new(_("Set Friendly Name..."),								 msn_show_set_friendly_name);	m = g_list_append(m, act);	m = g_list_append(m, NULL);	act = purple_plugin_action_new(_("Set Home Phone Number..."),								 msn_show_set_home_phone);	m = g_list_append(m, act);	act = purple_plugin_action_new(_("Set Work Phone Number..."),			msn_show_set_work_phone);	m = g_list_append(m, act);	act = purple_plugin_action_new(_("Set Mobile Phone Number..."),			msn_show_set_mobile_phone);	m = g_list_append(m, act);	m = g_list_append(m, NULL);#if 0	act = purple_plugin_action_new(_("Enable/Disable Mobile Devices..."),			msn_show_set_mobile_support);	m = g_list_append(m, act);#endif	act = purple_plugin_action_new(_("Allow/Disallow Mobile Pages..."),			msn_show_set_mobile_pages);	m = g_list_append(m, act);	account = purple_connection_get_account(gc);	user = msn_normalize(account, purple_account_get_username(account));	if ((strstr(user, "@hotmail.") != NULL) ||		(strstr(user, "@msn.com") != NULL))	{		m = g_list_append(m, NULL);		act = purple_plugin_action_new(_("Open Hotmail Inbox"),				msn_show_hotmail_inbox);		m = g_list_append(m, act);	}	return m;}static GList *msn_buddy_menu(PurpleBuddy *buddy){	MsnUser *user;	GList *m = NULL;	PurpleMenuAction *act;	g_return_val_if_fail(buddy != NULL, NULL);	user = buddy->proto_data;	if (user != NULL)	{		if (user->mobile)		{			act = purple_menu_action_new(_("Send to Mobile"),			                           PURPLE_CALLBACK(show_send_to_mobile_cb),			                           NULL, NULL);			m = g_list_append(m, act);		}	}	if (g_ascii_strcasecmp(buddy->name,	                       purple_account_get_username(buddy->account)))	{		act = purple_menu_action_new(_("Initiate _Chat"),		                           PURPLE_CALLBACK(initiate_chat_cb),		                           NULL, NULL);		m = g_list_append(m, act);	}	return m;}static GList *msn_blist_node_menu(PurpleBlistNode *node){	if(PURPLE_BLIST_NODE_IS_BUDDY(node))	{		return msn_buddy_menu((PurpleBuddy *) node);	}	else	{		return NULL;	}}static voidmsn_login(PurpleAccount *account){	PurpleConnection *gc;	MsnSession *session;	const char *username;	const char *host;	gboolean http_method = FALSE;	int port;	gc = purple_account_get_connection(account);	if (!purple_ssl_is_supported())	{		gc->wants_to_die = TRUE;		purple_connection_error(gc,			_("SSL support is needed for MSN. Please install a supported "			  "SSL library."));		return;	}	http_method = purple_account_get_bool(account, "http_method", FALSE);	host = purple_account_get_string(account, "server", MSN_SERVER);	port = purple_account_get_int(account, "port", MSN_PORT);	session = msn_session_new(account);	gc->proto_data = session;	gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_FORMATTING_WBFO | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_FONTSIZE | PURPLE_CONNECTION_NO_URLDESC;	msn_session_set_login_step(session, MSN_LOGIN_STEP_START);	/* Hmm, I don't like this. */	/* XXX shx: Me neither */	username = msn_normalize(account, purple_account_get_username(account));	if (strcmp(username, purple_account_get_username(account)))		purple_account_set_username(account, username);	if (!msn_session_connect(session, host, port, http_method))		purple_connection_error(gc, _("Failed to connect to server."));}static voidmsn_close(PurpleConnection *gc){	MsnSession *session;	session = gc->proto_data;	g_return_if_fail(session != NULL);	msn_session_destroy(session);	gc->proto_data = NULL;}static gbooleanmsn_send_me_im(gpointer data){	MsnIMData *imdata = data;	serv_got_im(imdata->gc, imdata->who, imdata->msg, imdata->flags, imdata->when);	g_free(imdata->msg);	g_free(imdata);	return FALSE;}static intmsn_send_im(PurpleConnection *gc, const char *who, const char *message,			PurpleMessageFlags flags){	PurpleAccount *account;	PurpleBuddy *buddy = purple_find_buddy(gc->account, who);	MsnMessage *msg;	char *msgformat;	char *msgtext;	account = purple_connection_get_account(gc);	if (buddy) {		PurplePresence *p = purple_buddy_get_presence(buddy);		if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) {			char *text = purple_markup_strip_html(message);			send_to_mobile(gc, who, text);			g_free(text);			return 1;		}	}	msn_import_html(message, &msgformat, &msgtext);	if (strlen(msgtext) + strlen(msgformat) + strlen(VERSION) > 1564)	{		g_free(msgformat);		g_free(msgtext);		return -E2BIG;	}	msg = msn_message_new_plain(msgtext);	msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);	g_free(msgformat);	g_free(msgtext);	if (g_ascii_strcasecmp(who, purple_account_get_username(account)))	{		MsnSession *session;		MsnSwitchBoard *swboard;		session = gc->proto_data;		swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM);		msn_switchboard_send_msg(swboard, msg, TRUE);	}	else	{		char *body_str, *body_enc, *pre, *post;		const char *format;		MsnIMData *imdata = g_new0(MsnIMData, 1);		/*		 * In MSN, you can't send messages to yourself, so		 * we'll fake like we received it ;)		 */		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);		serv_got_typing_stopped(gc, who);		imdata->gc = gc;		imdata->who = who;		imdata->msg = body_str;		imdata->flags = flags;		imdata->when = time(NULL);		g_idle_add(msn_send_me_im, imdata);	}	msn_message_destroy(msg);	return 1;}static unsigned intmsn_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state){	PurpleAccount *account;	MsnSession *session;	MsnSwitchBoard *swboard;	MsnMessage *msg;	account = purple_connection_get_account(gc);	session = gc->proto_data;	/*	 * TODO: I feel like this should be "if (state != PURPLE_TYPING)"	 *       but this is how it was before, and I don't want to break	 *       anything. --KingAnt	 */	if (state == PURPLE_NOT_TYPING)		return 0;	if (!g_ascii_strcasecmp(who, purple_account_get_username(account)))	{		/* We'll just fake it, since we're sending to ourself. */		serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, PURPLE_TYPING);		return MSN_TYPING_SEND_TIMEOUT;	}	swboard = msn_session_find_swboard(session, who);	if (swboard == NULL || !msn_switchboard_can_send(swboard))		return 0;	swboard->flag |= MSN_SB_FLAG_IM;	msg = msn_message_new(MSN_MSG_TYPING);	msn_message_set_content_type(msg, "text/x-msmsgscontrol");	msn_message_set_flag(msg, 'U');	msn_message_set_attr(msg, "TypingUser",						 purple_account_get_username(account));	msn_message_set_bin_data(msg, "\r\n", 2);	msn_switchboard_send_msg(swboard, msg, FALSE);	msn_message_destroy(msg);	return MSN_TYPING_SEND_TIMEOUT;}static voidmsn_set_status(PurpleAccount *account, PurpleStatus *status){	PurpleConnection *gc;	MsnSession *session;	gc = purple_account_get_connection(account);	if (gc != NULL)	{		session = gc->proto_data;		msn_change_status(session);	}}static voidmsn_set_idle(PurpleConnection *gc, int idle){	MsnSession *session;	session = gc->proto_data;	msn_change_status(session);}#if 0static 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);}#endifstatic voidmsn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *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)	{#if 0		fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL,								group ? group->name : NULL);#else		purple_debug_error("msn", "msn_add_buddy called before connected\n");#endif		return;	}#if 0	if (group != NULL && group->name != NULL)		purple_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name);	else		purple_debug_info("msn", "msn_add_buddy: %s\n", who);#endif#if 0	/* Which is the max? */	if (session->fl_users_count >= 150)	{		purple_debug_info("msn", "Too many buddies\n");		/* Buddy list full */		/* TODO: purple 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(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *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(PurpleConnection *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(PurpleConnection *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(PurpleConnection *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);}static voidmsn_rem_deny(PurpleConnection *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);

⌨️ 快捷键说明

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