1 /*
2  * Evolution integration plugin for Purple
3  *
4  * Copyright (C) 2003 Christian Hammond.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02111-1301, USA.
20  */
21 #include "internal.h"
22 #include "gtkblist.h"
23 #include "pidgin.h"
24 #include "gtkutils.h"
25 
26 #include "gevolution.h"
27 
28 void
gevo_add_buddy(PurpleAccount * account,const char * group_name,const char * buddy_name,const char * alias)29 gevo_add_buddy(PurpleAccount *account, const char *group_name,
30 			   const char *buddy_name, const char *alias)
31 {
32 	PurpleConversation *conv = NULL;
33 	PurpleBuddy *buddy;
34 	PurpleGroup *group;
35 
36 	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, buddy_name, account);
37 
38 	group = purple_find_group(group_name);
39 	if (group == NULL)
40 	{
41 		group = purple_group_new(group_name);
42 		purple_blist_add_group(group, NULL);
43 	}
44 
45 	buddy = purple_find_buddy_in_group(account, buddy_name, group);
46 	if (buddy == NULL)
47 	{
48 		buddy = purple_buddy_new(account, buddy_name, alias);
49 		purple_blist_add_buddy(buddy, NULL, group, NULL);
50 	}
51 
52 	purple_account_add_buddy(account, buddy);
53 
54 	if (conv != NULL)
55 	{
56 		purple_buddy_icon_update(purple_conv_im_get_icon(PURPLE_CONV_IM(conv)));
57 		purple_conversation_update(conv, PURPLE_CONV_UPDATE_ADD);
58 	}
59 }
60 
61 GList *
gevo_get_groups(void)62 gevo_get_groups(void)
63 {
64 	static GList *list = NULL;
65 	PurpleGroup *g;
66 	PurpleBlistNode *gnode;
67 
68 	g_list_free(list);
69 	list = NULL;
70 
71 	if (purple_get_blist()->root == NULL)
72 	{
73 		list  = g_list_append(list, (gpointer)_("Buddies"));
74 	}
75 	else
76 	{
77 		for (gnode = purple_get_blist()->root;
78 			 gnode != NULL;
79 			 gnode = gnode->next)
80 		{
81 			if (PURPLE_BLIST_NODE_IS_GROUP(gnode))
82 			{
83 				g = (PurpleGroup *)gnode;
84 				list = g_list_append(list, g->name);
85 			}
86 		}
87 	}
88 
89 	return list;
90 }
91 
92 EContactField
gevo_prpl_get_field(PurpleAccount * account,PurpleBuddy * buddy)93 gevo_prpl_get_field(PurpleAccount *account, PurpleBuddy *buddy)
94 {
95 	EContactField protocol_field = 0;
96 	const char *protocol_id;
97 
98 	g_return_val_if_fail(account != NULL, 0);
99 
100 	protocol_id = purple_account_get_protocol_id(account);
101 
102 	if (purple_strequal(protocol_id, "prpl-aim"))
103 		protocol_field = E_CONTACT_IM_AIM;
104 	else if (purple_strequal(protocol_id, "prpl-icq"))
105 		protocol_field = E_CONTACT_IM_ICQ;
106 	else if (purple_strequal(protocol_id, "prpl-jabber"))
107 		protocol_field = E_CONTACT_IM_JABBER;
108 	else if (purple_strequal(protocol_id, "prpl-novell"))
109 		protocol_field = E_CONTACT_IM_GROUPWISE;
110 	else if (purple_strequal(protocol_id, "prpl-gg"))
111 		protocol_field = E_CONTACT_IM_GADUGADU;
112 
113 	return protocol_field;
114 }
115 
116 gboolean
gevo_prpl_is_supported(PurpleAccount * account,PurpleBuddy * buddy)117 gevo_prpl_is_supported(PurpleAccount *account, PurpleBuddy *buddy)
118 {
119 	return (gevo_prpl_get_field(account, buddy) != 0);
120 }
121 
122 gboolean
gevo_load_addressbook(const gchar * uid,EBook ** book,GError ** error)123 gevo_load_addressbook(const gchar* uid, EBook **book, GError **error) {
124 	gboolean result = FALSE;
125 	ESourceRegistry *registry;
126 	ESource *source;
127 
128 	g_return_val_if_fail(book != NULL, FALSE);
129 
130 	registry = e_source_registry_new_sync(NULL, error);
131 
132 	if(!registry) {
133 	    return FALSE;
134 	}
135 
136 	if(uid == NULL) {
137 		source = e_source_registry_ref_default_address_book(registry);
138 	} else {
139 		source = e_source_registry_ref_source(registry, uid);
140 	}
141 
142 	g_object_unref(registry);
143 
144 	result = gevo_load_addressbook_from_source(source, book, error);
145 
146 	g_object_unref(source);
147 
148 	return result;
149 }
150 
151 gboolean
gevo_load_addressbook_from_source(ESource * source,EBook ** book,GError ** error)152 gevo_load_addressbook_from_source(ESource *source, EBook **book,
153                                   GError **error)
154 {
155 	gboolean result = FALSE;
156 
157 	*book = e_book_new(source, error);
158 
159 	if(*book == NULL) {
160 		return FALSE;
161 	}
162 
163 	*error = NULL;
164 
165 	result = e_book_open(*book, FALSE, error);
166 
167 	if(!result && *book != NULL) {
168 		g_object_unref(*book);
169 		*book = NULL;
170 	}
171 
172 	return result;
173 }
174 
175 char *
gevo_get_email_for_buddy(PurpleBuddy * buddy)176 gevo_get_email_for_buddy(PurpleBuddy *buddy)
177 {
178 	EContact *contact;
179 	char *mail = NULL;
180 
181 	contact = gevo_search_buddy_in_contacts(buddy, NULL);
182 
183 	if (contact != NULL)
184 	{
185 		mail = g_strdup(e_contact_get(contact, E_CONTACT_EMAIL_1));
186 		g_object_unref(contact);
187 	}
188 
189 	return mail;
190 }
191