亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? gevolution.c

?? Linux下的多協(xié)議即時(shí)通訊程序源代碼
?? C
字號:
/* * Evolution integration plugin for Purple * * Copyright (C) 2003 Christian Hammond. * * 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 "internal.h"#include "pidgin.h"#include "connection.h"#include "debug.h"#include "prefs.h"#include "notify.h"#include "signals.h"#include "util.h"#include "version.h"#include "gtkblist.h"#include "gtkconv.h"#include "gtkplugin.h"#include "gtkutils.h"#include "gevolution.h"#include <libedata-book/Evolution-DataServer-Addressbook.h>#include <libedata-book/e-data-book-factory.h>#include <bonobo/bonobo-main.h>#include <glib.h>#define GEVOLUTION_PLUGIN_ID "gtk-x11-gevolution"#define E_DATA_BOOK_FACTORY_OAF_ID \	"OAFIID:GNOME_Evolution_DataServer_BookFactory"enum{	COLUMN_AUTOADD,	COLUMN_ICON,	COLUMN_SCREENNAME,	COLUMN_DATA,	NUM_COLUMNS};static PurpleBlistUiOps *backup_blist_ui_ops = NULL;static PurpleBlistUiOps *blist_ui_ops = NULL;static EBook *book = NULL;static gulong timer = 0;static gulong book_view_tag = 0;static EBookView *book_view = NULL;static voidupdate_ims_from_contact(EContact *contact, const char *name,						const char *prpl_id, EContactField field){	GList *ims = e_contact_get(contact, field);	GList *l, *l2;	if (ims == NULL)		return;	for (l = purple_connections_get_all(); l != NULL; l = l->next)	{		PurpleConnection *gc = (PurpleConnection *)l->data;		PurpleAccount *account = purple_connection_get_account(gc);		char *me;		if (strcmp(purple_account_get_protocol_id(account), prpl_id))			continue;		if (!purple_account_get_bool(account, "gevo-autoadd", FALSE))			continue;		me = g_strdup(purple_normalize(account, purple_account_get_username(account)));		for (l2 = ims; l2 != NULL; l2 = l2->next)		{			if (purple_find_buddy(account, l2->data) != NULL ||				!strcmp(me, purple_normalize(account, l2->data)))				continue;			gevo_add_buddy(account, _("Buddies"), l2->data, name);		}		g_free(me);	}	g_list_foreach(ims, (GFunc)g_free, NULL);	g_list_free(ims);}static voidupdate_buddies_from_contact(EContact *contact){	const char *name;	name = e_contact_get_const(contact, E_CONTACT_FULL_NAME);	update_ims_from_contact(contact, name, "prpl-oscar",  E_CONTACT_IM_AIM);	update_ims_from_contact(contact, name, "prpl-jabber", E_CONTACT_IM_JABBER);	update_ims_from_contact(contact, name, "prpl-yahoo",  E_CONTACT_IM_YAHOO);	update_ims_from_contact(contact, name, "prpl-msn",    E_CONTACT_IM_MSN);	update_ims_from_contact(contact, name, "prpl-oscar",  E_CONTACT_IM_ICQ);	update_ims_from_contact(contact, name, "prpl-novell", E_CONTACT_IM_GROUPWISE);}static voidcontacts_changed_cb(EBookView *book_view, const GList *contacts){	const GList *l;	if (purple_connections_get_all() == NULL)		return;	for (l = contacts; l != NULL; l = l->next)	{		EContact *contact = (EContact *)l->data;		update_buddies_from_contact(contact);	}}static voidrequest_add_buddy(PurpleAccount *account, const char *username,				  const char *group, const char *alias){	if (book == NULL)	{		backup_blist_ui_ops->request_add_buddy(account, username, group,											   alias);	}	else	{		gevo_add_buddy_dialog_show(account, username, group, alias);	}}static voidgot_book_view_cb(EBook *book, EBookStatus status, EBookView *view,				 gpointer user_data){	book_view_tag = 0;	if (status != E_BOOK_ERROR_OK)	{		purple_debug_error("evolution", "Unable to retrieve book view! :(\n");		return;	}	book_view = view;	g_object_ref(book_view);	g_signal_connect(G_OBJECT(book_view), "contacts_changed",					 G_CALLBACK(contacts_changed_cb), book);	g_signal_connect(G_OBJECT(book_view), "contacts_added",					 G_CALLBACK(contacts_changed_cb), book);	e_book_view_start(view);}static voidsigned_on_cb(PurpleConnection *gc){	EBookQuery *query;	gboolean status;	GList *contacts;	GList *l;	if (book == NULL)		return;	query = e_book_query_any_field_contains("");	status = e_book_get_contacts(book, query, &contacts, NULL);	e_book_query_unref(query);	if (!status)		return;	for (l = contacts; l != NULL; l = l->next)	{		EContact *contact = E_CONTACT(l->data);		update_buddies_from_contact(contact);		g_object_unref(contact);	}	g_list_free(contacts);}static voidmenu_item_activate_cb(PurpleBlistNode *node, gpointer user_data){	PurpleBuddy *buddy = (PurpleBuddy *)node;	gevo_associate_buddy_dialog_new(buddy);}static voidmenu_item_send_mail_activate_cb(PurpleBlistNode *node, gpointer user_data){	PurpleBuddy *buddy = (PurpleBuddy *)node;	char *mail = NULL;	mail = gevo_get_email_for_buddy(buddy);	if (mail != NULL)	{		char *app = g_find_program_in_path("evolution");		if (app != NULL)		{			char *command_line = g_strdup_printf("%s mailto:%s", app, mail);			g_free(app);			g_free(mail);			g_spawn_command_line_async(command_line, NULL);			g_free(command_line);		}		else		{			purple_notify_error(NULL, NULL, _("Unable to send e-mail"),							  _("The evolution executable was not found in the PATH."));		}	}	else	{		purple_notify_error(NULL, NULL, _("Unable to send e-mail"),						  _("An e-mail address was not found for this buddy."));	}}static voidblist_node_extended_menu_cb(PurpleBlistNode *node, GList **menu){	PurpleMenuAction *act;	PurpleBuddy *buddy;	PurpleAccount *account;	EContact *contact;	char *mail;	if (!PURPLE_BLIST_NODE_IS_BUDDY(node))		return;	buddy = (PurpleBuddy *)node;	account = purple_buddy_get_account(buddy);	if (!gevo_prpl_is_supported(account, buddy))		return;	contact = gevo_search_buddy_in_contacts(buddy, NULL);	if (contact == NULL)	{		act = purple_menu_action_new(_("Add to Address Book"),		                           PURPLE_CALLBACK(menu_item_activate_cb),		                           NULL, NULL);		*menu = g_list_append(*menu, act);	}	else		g_object_unref(contact);	mail = gevo_get_email_for_buddy(buddy);	if (mail != NULL)	{		act = purple_menu_action_new(_("Send E-Mail"),			PURPLE_CALLBACK(menu_item_send_mail_activate_cb), NULL, NULL);		*menu = g_list_append(*menu, act);		g_free(mail);	}}/* TODO: Something in here leaks 1 reference to a bonobo object! */static gbooleanload_timeout(gpointer data){	PurplePlugin *plugin = (PurplePlugin *)data;	EBookQuery *query;	timer = 0;	/* Maybe this is it? */	if (!gevo_load_addressbook(NULL, &book, NULL))		return FALSE;	query = e_book_query_any_field_contains("");	/* Is it this? */	book_view_tag = e_book_async_get_book_view(book, query, NULL, -1,											   got_book_view_cb, NULL);	e_book_query_unref(query);	purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu",						plugin, PURPLE_CALLBACK(blist_node_extended_menu_cb), NULL);	return FALSE;}static gbooleanplugin_load(PurplePlugin *plugin){	bonobo_activate();	backup_blist_ui_ops = purple_blist_get_ui_ops();	blist_ui_ops = g_memdup(backup_blist_ui_ops, sizeof(PurpleBlistUiOps));	blist_ui_ops->request_add_buddy = request_add_buddy;	purple_blist_set_ui_ops(blist_ui_ops);	purple_signal_connect(purple_connections_get_handle(), "signed-on",						plugin, PURPLE_CALLBACK(signed_on_cb), NULL);	timer = g_timeout_add(1, load_timeout, plugin);	return TRUE;}static gbooleanplugin_unload(PurplePlugin *plugin){	purple_blist_set_ui_ops(backup_blist_ui_ops);	g_free(blist_ui_ops);	backup_blist_ui_ops = NULL;	blist_ui_ops = NULL;	if (book_view != NULL)	{		e_book_view_stop(book_view);		g_object_unref(book_view);		book_view = NULL;	}	if (book != NULL)	{		g_object_unref(book);		book = NULL;	}	return TRUE;}static voidplugin_destroy(PurplePlugin *plugin){	bonobo_debug_shutdown();}static voidautoadd_toggled_cb(GtkCellRendererToggle *renderer, gchar *path_str,				   gpointer data){	PurpleAccount *account;	GtkTreeModel *model = (GtkTreeModel *)data;	GtkTreeIter iter;	gboolean autoadd;	gtk_tree_model_get_iter_from_string(model, &iter, path_str);	gtk_tree_model_get(model, &iter,					   COLUMN_DATA, &account,					   COLUMN_AUTOADD, &autoadd,					   -1);	purple_account_set_bool(account, "gevo-autoadd", !autoadd);	gtk_list_store_set(GTK_LIST_STORE(model), &iter,					   COLUMN_AUTOADD, !autoadd,					   -1);}static GtkWidget *get_config_frame(PurplePlugin *plugin){	GtkWidget *ret;	GtkWidget *vbox;	GtkWidget *label;	GtkWidget *sw;	GtkWidget *treeview;	GtkTreeViewColumn *column;	GtkCellRenderer *renderer;	GdkPixbuf *pixbuf;	GtkListStore *model;	GList *l;	/* Outside container */	ret = gtk_vbox_new(FALSE, 18);	gtk_container_set_border_width(GTK_CONTAINER(ret), 12);	/* Configuration frame */	vbox = pidgin_make_frame(ret, _("Evolution Integration Configuration"));	/* Label */	label = gtk_label_new(_("Select all accounts that buddies should be "							"auto-added to."));	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);	gtk_widget_show(label);	/* Scrolled window */	sw = gtk_scrolled_window_new(0, 0);	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),								   GTK_POLICY_AUTOMATIC,								   GTK_POLICY_ALWAYS);	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),										GTK_SHADOW_IN);	gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);	gtk_widget_set_size_request(sw, 300, 300);	gtk_widget_show(sw);	/* Create the list model for the treeview. */	model = gtk_list_store_new(NUM_COLUMNS,							   G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,							   G_TYPE_STRING, G_TYPE_POINTER);	/* Setup the treeview */	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);	gtk_container_add(GTK_CONTAINER(sw), treeview);	gtk_widget_show(treeview);	/* Setup the column */	column = gtk_tree_view_column_new();	gtk_tree_view_column_set_title(column, _("Account"));	gtk_tree_view_insert_column(GTK_TREE_VIEW(treeview), column, -1);	/* Checkbox */	renderer = gtk_cell_renderer_toggle_new();	g_signal_connect(G_OBJECT(renderer), "toggled",					 G_CALLBACK(autoadd_toggled_cb), model);	gtk_tree_view_column_pack_start(column, renderer, FALSE);	gtk_tree_view_column_add_attribute(column, renderer,									   "active", COLUMN_AUTOADD);	/* Icon */	renderer = gtk_cell_renderer_pixbuf_new();	gtk_tree_view_column_pack_start(column, renderer, FALSE);	gtk_tree_view_column_add_attribute(column, renderer,									   "pixbuf", COLUMN_ICON);	/* Screenname */	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_column_pack_start(column, renderer, TRUE);	gtk_tree_view_column_add_attribute(column, renderer,									   "text", COLUMN_SCREENNAME);	/* Populate */	for (l = purple_accounts_get_all(); l != NULL; l = l->next)	{		PurpleAccount *account = (PurpleAccount *)l->data;		GtkTreeIter iter;		purple_debug_info("evolution", "Adding account\n");		gtk_list_store_append(model, &iter);		pixbuf = pidgin_create_prpl_icon(account, 0.5);		if ((pixbuf != NULL) && (!purple_account_is_connected(account)))			gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE);		gtk_list_store_set(model, &iter,						   COLUMN_AUTOADD,						   purple_account_get_bool(account, "gevo-autoadd",												 FALSE),						   COLUMN_ICON, pixbuf,						   COLUMN_SCREENNAME,						   purple_account_get_username(account),						   COLUMN_DATA, account,						   -1);		if (pixbuf != NULL)			g_object_unref(G_OBJECT(pixbuf));	}	gtk_widget_show_all(ret);	return ret;}static PidginPluginUiInfo ui_info ={	get_config_frame,	/**< get_config_frame */	0,			/**< page_num */	/* Padding */	NULL,	NULL,	NULL,	NULL};static PurplePluginInfo info ={	PURPLE_PLUGIN_MAGIC,	PURPLE_MAJOR_VERSION,	PURPLE_MINOR_VERSION,	PURPLE_PLUGIN_STANDARD,                             /**< type           */	PIDGIN_PLUGIN_TYPE,                             /**< ui_requirement */	0,                                                /**< flags          */	NULL,                                             /**< dependencies   */	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */	GEVOLUTION_PLUGIN_ID,                             /**< id             */	N_("Evolution Integration"),                      /**< name           */	VERSION,                                          /**< version        */	                                                  /**  summary        */	N_("Provides integration with Evolution."),	                                                  /**  description    */	N_("Provides integration with Evolution."),	"Christian Hammond <chipx86@chipx86.com>",        /**< author         */	PURPLE_WEBSITE,                                     /**< homepage       */	plugin_load,                                      /**< load           */	plugin_unload,                                    /**< unload         */	plugin_destroy,                                   /**< destroy        */	&ui_info,                                         /**< ui_info        */	NULL,                                             /**< extra_info     */	NULL,	NULL,	/* Padding */	NULL,	NULL,	NULL,	NULL};static voidinit_plugin(PurplePlugin *plugin){	/* TODO: Change to core-remote when possible. */	/* info.dependencies = g_list_append(info.dependencies, "gtk-remote"); */	/*	 * I'm going to rant a little bit here...	 *	 * For some reason, when we init bonobo from inside a plugin, it will	 * segfault when destroyed. The backtraces are within gmodule somewhere.	 * There's not much I can do, and I'm not sure where the bug lies.	 * However, plugins are only destroyed when Purple is shutting down. After	 * destroying the plugins, purple ends, and anything else is of course	 * freed. That includes this, if we make the module resident, which	 * prevents us from being able to actually unload it.	 *	 * So, in conclusion, this is an evil hack, but it doesn't harm anything	 * and it works.	 */	g_module_make_resident(plugin->handle);	if (!bonobo_init_full(NULL, NULL, bonobo_activation_orb_get(),						  CORBA_OBJECT_NIL, CORBA_OBJECT_NIL))	{		purple_debug_error("evolution", "Unable to initialize bonobo.\n");	}}PURPLE_INIT_PLUGIN(gevolution, init_plugin, info)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天综合色天天综合| 日本欧美一区二区| 久久久久久麻豆| 日韩一区二区三区免费看 | 久久人人爽爽爽人久久久| 美腿丝袜亚洲一区| 视频在线观看一区二区三区| 亚洲欧美另类小说视频| 亚洲欧美一区二区视频| 亚洲欧洲成人精品av97| 国产精品成人午夜| 亚洲色欲色欲www| 亚洲精品国产无套在线观| 亚洲日本在线看| 亚洲一区二区三区四区在线免费观看 | 国产精品 日产精品 欧美精品| 捆绑调教美女网站视频一区| 蜜乳av一区二区| 激情综合网av| 成人自拍视频在线观看| 波多野结衣一区二区三区| 91网站在线播放| 欧美专区日韩专区| 欧美欧美欧美欧美首页| 日韩欧美一区二区在线视频| 久久这里只有精品视频网| 欧美国产日本韩| 一区二区三区免费观看| 日本欧美大码aⅴ在线播放| 精东粉嫩av免费一区二区三区| 国产成人精品一区二区三区四区| www.爱久久.com| 欧美日本在线看| 精品国产乱码久久久久久老虎| 国产日韩av一区二区| 亚洲黄色在线视频| 久久精品国产亚洲5555| 成人av在线资源网| 欧美日韩你懂得| 久久综合狠狠综合久久综合88| 国产精品国产三级国产aⅴ原创| 一区二区三区四区在线免费观看| 日韩精品每日更新| 福利电影一区二区三区| 欧美日韩一卡二卡三卡| 久久久噜噜噜久噜久久综合| 成人欧美一区二区三区在线播放| 天天综合网天天综合色| 国产成a人亚洲| 欧美日韩一本到| 欧美国产激情一区二区三区蜜月| 一区二区三区在线播放| 在线观看精品一区| 精品国产sm最大网站| 亚洲精品日韩专区silk| 美腿丝袜在线亚洲一区| 91小视频在线观看| 精品国产1区2区3区| 亚洲精品成人a在线观看| 国产自产视频一区二区三区| 色婷婷综合久久久中文一区二区 | 亚洲国产综合视频在线观看| 九九精品一区二区| 欧美性xxxxxxxx| 中文字幕免费一区| 毛片一区二区三区| 91成人在线精品| 国产嫩草影院久久久久| 蜜桃av一区二区三区电影| 色欧美88888久久久久久影院| 精品国产不卡一区二区三区| 夜色激情一区二区| 99久久99久久精品免费看蜜桃| 日韩精品一区二区三区在线观看| 一区二区三区在线影院| 国产成人av一区二区三区在线 | 天天色综合天天| 91碰在线视频| 国产视频一区二区在线| 免费观看91视频大全| 色94色欧美sute亚洲线路二| 国产亚洲欧美中文| 国内外精品视频| 欧美一区二区三区的| 亚洲无人区一区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美精品一级二级| 亚洲天堂精品视频| 成人免费高清在线| 久久久五月婷婷| 国产一区在线观看麻豆| 日韩欧美一二区| 奇米影视一区二区三区| 欧美精品色综合| 天堂午夜影视日韩欧美一区二区| 91行情网站电视在线观看高清版| 国产精品久久久久婷婷| 成人美女视频在线观看18| 久久网站热最新地址| 激情深爱一区二区| 26uuu欧美| 国产乱子伦视频一区二区三区 | 国产成人精品免费| 国产午夜精品久久久久久久| 国产一区二区美女诱惑| 久久香蕉国产线看观看99| 精品亚洲国内自在自线福利| 欧美刺激脚交jootjob| 久久国产精品72免费观看| 日韩午夜三级在线| 老司机免费视频一区二区| 欧美xxxxx牲另类人与| 国产自产高清不卡| 欧美激情资源网| 成人国产免费视频| 亚洲人成亚洲人成在线观看图片 | 成人爱爱电影网址| 中文字幕不卡三区| 99久久精品国产观看| 亚洲免费在线观看视频| 欧美综合色免费| 天堂影院一区二区| 精品国产精品网麻豆系列| 国产精品影音先锋| 一区免费观看视频| 欧美最猛性xxxxx直播| 日韩高清国产一区在线| 日韩欧美亚洲一区二区| 国产成人福利片| 亚洲欧美日韩综合aⅴ视频| 在线精品视频免费播放| 日韩黄色免费电影| 久久亚洲综合色| 91香蕉国产在线观看软件| 亚洲高清不卡在线观看| 欧美成人女星排行榜| 风间由美中文字幕在线看视频国产欧美| 国产精品不卡视频| 欧美美女黄视频| 国产美女一区二区| 玖玖九九国产精品| 国产精品夜夜嗨| 国产精品视频看| 91福利社在线观看| 青娱乐精品视频| 国产欧美一区二区精品久导航| 91色九色蝌蚪| 麻豆91在线播放免费| 日本一区二区三区四区在线视频| 色综合天天在线| 蜜臀久久久久久久| 亚洲欧洲三级电影| 91.com视频| 99久久国产综合精品女不卡| 肉肉av福利一精品导航| 中文字幕av一区二区三区高| 在线免费不卡电影| 国产白丝精品91爽爽久久| 亚洲精品国产无天堂网2021| 精品国产91乱码一区二区三区 | 日韩一卡二卡三卡| 9i在线看片成人免费| 美女尤物国产一区| 一区二区三区免费网站| 久久久激情视频| 91麻豆精品国产91久久久久久久久 | 精品91自产拍在线观看一区| 色婷婷激情综合| 国产精品资源网| 日韩精品一级中文字幕精品视频免费观看| 欧美激情一区二区三区在线| 欧美丝袜丝交足nylons| 成人午夜激情影院| 美女网站视频久久| 一区二区理论电影在线观看| 国产亚洲成aⅴ人片在线观看| 欧美日韩国产天堂| 91香蕉视频黄| 丰满白嫩尤物一区二区| 免费观看91视频大全| 亚洲一级在线观看| 中文字幕亚洲成人| 国产片一区二区| 欧美va亚洲va| 日韩一级二级三级| 日本成人在线不卡视频| 欧美国产成人精品| 欧美成人精品高清在线播放| 欧美视频日韩视频在线观看| 成人性生交大片| 国产一区二区三区日韩| 日本亚洲三级在线| 亚洲第四色夜色| 一区二区三区国产精华| 国产精品欧美一区喷水| 久久综合九色综合欧美98| 欧美一区二区三区白人| 欧美精品在线视频| 欧美男生操女生| 欧美天堂亚洲电影院在线播放|