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

📄 userlist.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * @file userlist.c MSN user list support * * purple * * Purple is the legal property of its developers, whose names are too numerous * to list here.  Please refer to the COPYRIGHT file distributed with this * source distribution. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "msn.h"#include "userlist.h"const char *lists[] = { "FL", "AL", "BL", "RL" };typedef struct{	PurpleConnection *gc;	char *who;	char *friendly;} MsnPermitAdd;/************************************************************************** * Callbacks **************************************************************************/static voidmsn_accept_add_cb(MsnPermitAdd *pa){	MsnSession *session = pa->gc->proto_data;	MsnUserList *userlist = session->userlist;	msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL);	g_free(pa->who);	g_free(pa->friendly);	g_free(pa);}static voidmsn_cancel_add_cb(MsnPermitAdd *pa){	MsnSession *session = pa->gc->proto_data;	MsnUserList *userlist = session->userlist;	msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL);	g_free(pa->who);	g_free(pa->friendly);	g_free(pa);}static voidgot_new_entry(PurpleConnection *gc, const char *passport, const char *friendly){	MsnPermitAdd *pa;	pa = g_new0(MsnPermitAdd, 1);	pa->who = g_strdup(passport);	pa->friendly = g_strdup(friendly);	pa->gc = gc;		purple_account_request_authorization(purple_connection_get_account(gc), passport, NULL, friendly, NULL,					   purple_find_buddy(purple_connection_get_account(gc), passport) != NULL,					   G_CALLBACK(msn_accept_add_cb), G_CALLBACK(msn_cancel_add_cb), pa);}/************************************************************************** * Utility functions **************************************************************************/static gbooleanuser_is_in_group(MsnUser *user, int group_id){	if (user == NULL)		return FALSE;	if (group_id < 0)		return FALSE;	if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id)))		return TRUE;	return FALSE;}static gbooleanuser_is_there(MsnUser *user, int list_id, int group_id){	int list_op;	if (user == NULL)		return FALSE;	list_op = 1 << list_id;	if (!(user->list_op & list_op))		return FALSE;	if (list_id == MSN_LIST_FL)	{		if (group_id >= 0)			return user_is_in_group(user, group_id);	}	return TRUE;}static const char*get_store_name(MsnUser *user){	const char *store_name;	g_return_val_if_fail(user != NULL, NULL);	store_name = msn_user_get_store_name(user);	if (store_name != NULL)		store_name = purple_url_encode(store_name);	else		store_name = msn_user_get_passport(user);	/* this might be a bit of a hack, but it should prevent notification server	 * disconnections for people who have buddies with insane friendly names	 * who added you to their buddy list from being disconnected. Stu. */	/* Shx: What? Isn't the store_name obtained from the server, and hence it's	 * below the BUDDY_ALIAS_MAXLEN ? */	/* Stu: yeah, that's why it's a bit of a hack, as you pointed out, we're	 * probably decoding the incoming store_name wrong, or something. bleh. */	if (strlen(store_name) > BUDDY_ALIAS_MAXLEN)		store_name = msn_user_get_passport(user);	return store_name;}static voidmsn_request_add_group(MsnUserList *userlist, const char *who,					  const char *old_group_name, const char *new_group_name){	MsnCmdProc *cmdproc;	MsnTransaction *trans;	MsnMoveBuddy *data;	cmdproc = userlist->session->notification->cmdproc;	data = g_new0(MsnMoveBuddy, 1);	data->who = g_strdup(who);	if (old_group_name)		data->old_group_name = g_strdup(old_group_name);	trans = msn_transaction_new(cmdproc, "ADG", "%s %d",								purple_url_encode(new_group_name),								0);	msn_transaction_set_data(trans, data);	msn_cmdproc_send_trans(cmdproc, trans);}/************************************************************************** * Server functions **************************************************************************/MsnListIdmsn_get_list_id(const char *list){	if (list[0] == 'F')		return MSN_LIST_FL;	else if (list[0] == 'A')		return MSN_LIST_AL;	else if (list[0] == 'B')		return MSN_LIST_BL;	else if (list[0] == 'R')		return MSN_LIST_RL;	return -1;}voidmsn_got_add_user(MsnSession *session, MsnUser *user,				 MsnListId list_id, int group_id){	PurpleAccount *account;	const char *passport;	const char *friendly;	account = session->account;	passport = msn_user_get_passport(user);	friendly = msn_user_get_friendly_name(user);	if (list_id == MSN_LIST_FL)	{		PurpleConnection *gc;		gc = purple_account_get_connection(account);		serv_got_alias(gc, passport, friendly);		if (group_id >= 0)		{			msn_user_add_group_id(user, group_id);		}		else		{			/* session->sync->fl_users_count++; */		}	}	else if (list_id == MSN_LIST_AL)	{		purple_privacy_permit_add(account, passport, TRUE);	}	else if (list_id == MSN_LIST_BL)	{		purple_privacy_deny_add(account, passport, TRUE);	}	else if (list_id == MSN_LIST_RL)	{		PurpleConnection *gc;		PurpleConversation *convo;		gc = purple_account_get_connection(account);		purple_debug_info("msn",						"%s has added you to his or her buddy list.\n",						passport); 		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account); 		if (convo) { 			PurpleBuddy *buddy; 			char *msg;  			buddy = purple_find_buddy(account, passport); 			msg = g_strdup_printf( 				_("%s has added you to his or her buddy list."), 				buddy ? purple_buddy_get_contact_alias(buddy) : passport); 			purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg, 				PURPLE_MESSAGE_SYSTEM, time(NULL)); 			g_free(msg); 		} 		if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP)))		{			/*			 * TODO: The friendly name was NULL for me when I			 *       looked at this.  Maybe we should use the store			 *       name instead? --KingAnt			 */			got_new_entry(gc, passport, friendly);		}	}	user->list_op |= (1 << list_id);	/* purple_user_add_list_id (user, list_id); */}voidmsn_got_rem_user(MsnSession *session, MsnUser *user,				 MsnListId list_id, int group_id){	PurpleAccount *account;	const char *passport;	account = session->account;	passport = msn_user_get_passport(user);	if (list_id == MSN_LIST_FL)	{		/* TODO: When is the user totally removed? */		if (group_id >= 0)		{			msn_user_remove_group_id(user, group_id);			return;		}		else		{			/* session->sync->fl_users_count--; */		}	}	else if (list_id == MSN_LIST_AL)	{		purple_privacy_permit_remove(account, passport, TRUE);	}	else if (list_id == MSN_LIST_BL)	{		purple_privacy_deny_remove(account, passport, TRUE);	}	else if (list_id == MSN_LIST_RL)	{		PurpleConversation *convo;		purple_debug_info("msn",						"%s has removed you from his or her buddy list.\n",						passport);		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account);		if (convo) {			PurpleBuddy *buddy;			char *msg;			buddy = purple_find_buddy(account, passport);			msg = g_strdup_printf(				_("%s has removed you from his or her buddy list."),				buddy ? purple_buddy_get_contact_alias(buddy) : passport);			purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg,				PURPLE_MESSAGE_SYSTEM, time(NULL));			g_free(msg);		}	}	user->list_op &= ~(1 << list_id);	/* purple_user_remove_list_id (user, list_id); */	if (user->list_op == 0)	{		purple_debug_info("msn", "Buddy '%s' shall be deleted?.\n",						passport);	}}voidmsn_got_lst_user(MsnSession *session, MsnUser *user,				 int list_op, GSList *group_ids){	PurpleConnection *gc;	PurpleAccount *account;	const char *passport;	const char *store;	account = session->account;	gc = purple_account_get_connection(account);

⌨️ 快捷键说明

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