Mercurial > pidgin
annotate plugins/gevolution/gevolution.c @ 12919:248b8b39c671
[gaim-migrate @ 15272]
Replace GaimBlistNodeAction with the more generic GaimMenuAction, this is in
preparation for letting the chat room user list have extensible menus like the
blist entries do. (I know it's not exactly the prettiest, and the callback
isn't exactly type-safe, when we eventually gobjectify everything we can get
some safety back by using (GObject, gpointer) but that's for later.)
I'm planning to look into merging GaimPluginActions into GaimMenuActions as
well.
committer: Tailor Script <tailor@pidgin.im>
author | Etan Reisner <pidgin@unreliablesource.net> |
---|---|
date | Tue, 17 Jan 2006 23:22:19 +0000 |
parents | f23ebb7b2dfd |
children | 0aa231ebbfd5 |
rev | line source |
---|---|
8089 | 1 /* |
2 * Evolution integration plugin for Gaim | |
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., 59 Temple Place - Suite 330, Boston, MA | |
19 * 02111-1307, USA. | |
20 */ | |
21 #include "internal.h" | |
9821 | 22 #include "gtkgaim.h" |
8089 | 23 |
24 #include "connection.h" | |
25 #include "debug.h" | |
26 #include "prefs.h" | |
11117
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
27 #include "notify.h" |
8089 | 28 #include "signals.h" |
10831 | 29 #include "util.h" |
9954 | 30 #include "version.h" |
8089 | 31 |
9821 | 32 #include "gtkblist.h" |
8089 | 33 #include "gtkconv.h" |
34 #include "gtkplugin.h" | |
35 #include "gtkutils.h" | |
36 | |
37 #include "gevolution.h" | |
38 | |
39 #include <libedata-book/Evolution-DataServer-Addressbook.h> | |
40 | |
41 #include <libebook/e-book-listener.h> | |
42 #include <libedata-book/e-data-book-factory.h> | |
43 #include <bonobo/bonobo-main.h> | |
44 | |
11117
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
45 #include <glib.h> |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
46 |
8089 | 47 #define GEVOLUTION_PLUGIN_ID "gtk-x11-gevolution" |
48 | |
49 #define E_DATA_BOOK_FACTORY_OAF_ID \ | |
50 "OAFIID:GNOME_Evolution_DataServer_BookFactory" | |
51 | |
52 enum | |
53 { | |
54 COLUMN_AUTOADD, | |
55 COLUMN_ICON, | |
56 COLUMN_SCREENNAME, | |
57 COLUMN_DATA, | |
58 NUM_COLUMNS | |
59 }; | |
60 | |
61 static GaimBlistUiOps *backup_blist_ui_ops = NULL; | |
62 static GaimBlistUiOps *blist_ui_ops = NULL; | |
63 static EBook *book = NULL; | |
64 static gulong timer = 0; | |
65 static gulong book_view_tag = 0; | |
66 static EBookView *book_view = NULL; | |
67 | |
68 static void | |
69 update_ims_from_contact(EContact *contact, const char *name, | |
70 const char *prpl_id, EContactField field) | |
71 { | |
72 GList *ims = e_contact_get(contact, field); | |
73 GList *l, *l2; | |
74 | |
75 if (ims == NULL) | |
76 return; | |
77 | |
78 for (l = gaim_connections_get_all(); l != NULL; l = l->next) | |
79 { | |
80 GaimConnection *gc = (GaimConnection *)l->data; | |
81 GaimAccount *account = gaim_connection_get_account(gc); | |
10831 | 82 char *me = g_strdup(gaim_normalize(account, gaim_account_get_username(account))); |
8089 | 83 |
84 if (strcmp(gaim_account_get_protocol_id(account), prpl_id)) | |
85 continue; | |
86 | |
87 if (!gaim_account_get_bool(account, "gevo-autoadd", FALSE)) | |
88 continue; | |
89 | |
90 for (l2 = ims; l2 != NULL; l2 = l2->next) | |
91 { | |
10831 | 92 if (gaim_find_buddy(account, l2->data) != NULL || |
93 !strcmp(me, gaim_normalize(account, l2->data))) | |
8089 | 94 continue; |
95 | |
96 gevo_add_buddy(account, _("Buddies"), l2->data, name); | |
97 } | |
10831 | 98 g_free(me); |
8089 | 99 } |
100 | |
101 g_list_foreach(ims, (GFunc)g_free, NULL); | |
102 g_list_free(ims); | |
103 } | |
104 | |
105 static void | |
106 update_buddies_from_contact(EContact *contact) | |
107 { | |
108 const char *name; | |
109 | |
110 name = e_contact_get_const(contact, E_CONTACT_FULL_NAME); | |
111 | |
112 update_ims_from_contact(contact, name, "prpl-oscar", E_CONTACT_IM_AIM); | |
113 update_ims_from_contact(contact, name, "prpl-jabber", E_CONTACT_IM_JABBER); | |
114 update_ims_from_contact(contact, name, "prpl-yahoo", E_CONTACT_IM_YAHOO); | |
115 update_ims_from_contact(contact, name, "prpl-msn", E_CONTACT_IM_MSN); | |
116 update_ims_from_contact(contact, name, "prpl-oscar", E_CONTACT_IM_ICQ); | |
11054
bc700cc98b82
[gaim-migrate @ 12992]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
117 update_ims_from_contact(contact, name, "prpl-novell", E_CONTACT_IM_GROUPWISE); |
8089 | 118 } |
119 | |
120 static void | |
121 contacts_changed_cb(EBookView *book_view, const GList *contacts) | |
122 { | |
123 const GList *l; | |
124 | |
125 if (gaim_connections_get_all() == NULL) | |
126 return; | |
127 | |
128 for (l = contacts; l != NULL; l = l->next) | |
129 { | |
130 EContact *contact = (EContact *)l->data; | |
131 | |
132 update_buddies_from_contact(contact); | |
133 } | |
134 } | |
135 | |
136 static void | |
137 request_add_buddy(GaimAccount *account, const char *username, | |
138 const char *group, const char *alias) | |
139 { | |
140 if (book == NULL) | |
141 { | |
142 backup_blist_ui_ops->request_add_buddy(account, username, group, | |
143 alias); | |
144 } | |
145 else | |
146 { | |
147 gevo_add_buddy_dialog_show(account, username, group, alias); | |
148 } | |
149 } | |
150 | |
151 static void | |
152 got_book_view_cb(EBook *book, EBookStatus status, EBookView *view, | |
153 gpointer user_data) | |
154 { | |
155 book_view_tag = 0; | |
156 | |
157 if (status != E_BOOK_ERROR_OK) | |
158 { | |
159 gaim_debug_error("evolution", "Unable to retrieve book view! :(\n"); | |
160 | |
161 return; | |
162 } | |
163 | |
164 book_view = view; | |
165 | |
166 g_object_ref(book_view); | |
167 | |
168 g_signal_connect(G_OBJECT(book_view), "contacts_changed", | |
169 G_CALLBACK(contacts_changed_cb), book); | |
170 | |
171 g_signal_connect(G_OBJECT(book_view), "contacts_added", | |
172 G_CALLBACK(contacts_changed_cb), book); | |
173 | |
174 e_book_view_start(view); | |
175 } | |
176 | |
177 static void | |
178 signed_on_cb(GaimConnection *gc) | |
179 { | |
180 EBookQuery *query; | |
181 gboolean status; | |
182 GList *contacts; | |
183 GList *l; | |
184 | |
185 if (book == NULL) | |
186 return; | |
187 | |
188 query = e_book_query_any_field_contains(""); | |
189 | |
190 status = e_book_get_contacts(book, query, &contacts, NULL); | |
191 | |
192 e_book_query_unref(query); | |
193 | |
194 if (!status) | |
195 return; | |
196 | |
197 for (l = contacts; l != NULL; l = l->next) | |
198 { | |
199 EContact *contact = E_CONTACT(l->data); | |
200 | |
201 update_buddies_from_contact(contact); | |
202 | |
203 g_object_unref(contact); | |
204 } | |
205 | |
206 g_list_free(contacts); | |
207 } | |
208 | |
209 static void | |
9055
a243d688c93c
[gaim-migrate @ 9831]
Christian Hammond <chipx86@chipx86.com>
parents:
9051
diff
changeset
|
210 menu_item_activate_cb(GaimBlistNode *node, gpointer user_data) |
8089 | 211 { |
9051 | 212 GaimBuddy *buddy = (GaimBuddy *)node; |
8089 | 213 gevo_associate_buddy_dialog_new(buddy); |
214 } | |
215 | |
216 static void | |
11117
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
217 menu_item_send_mail_activate_cb(GaimBlistNode *node, gpointer user_data) |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
218 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
219 GaimBuddy *buddy = (GaimBuddy *)node; |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
220 EContact *contact; |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
221 char *mail = NULL; |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
222 |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
223 contact = gevo_search_buddy_in_contacts(buddy, NULL); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
224 |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
225 if (contact != NULL) |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
226 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
227 mail = g_strdup(e_contact_get(contact, E_CONTACT_EMAIL_1)); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
228 g_object_unref(contact); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
229 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
230 else |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
231 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
232 GaimAccount *account = gaim_buddy_get_account(buddy); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
233 const char *prpl_id = gaim_account_get_protocol_id(account); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
234 |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
235 if (!strcmp(prpl_id, "prpl-msn")) |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
236 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
237 mail = g_strdup(gaim_normalize(account, |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
238 gaim_buddy_get_name(buddy))); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
239 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
240 else if (!strcmp(prpl_id, "prpl-yahoo")) |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
241 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
242 mail = g_strdup_printf("%s@yahoo.com", |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
243 gaim_normalize(account, |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
244 gaim_buddy_get_name(buddy))); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
245 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
246 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
247 |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
248 if (mail != NULL) |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
249 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
250 char *app = g_find_program_in_path("evolution"); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
251 if (app != NULL) |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
252 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
253 char *command_line = g_strdup_printf("%s mailto:%s", app, mail); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
254 g_free(app); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
255 g_free(mail); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
256 |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
257 g_spawn_command_line_async(command_line, NULL); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
258 g_free(command_line); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
259 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
260 else |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
261 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
262 gaim_notify_error(NULL, NULL, _("Unable to send e-mail"), |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
263 _("The evolution executable was not found in the PATH.")); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
264 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
265 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
266 else |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
267 { |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
268 gaim_notify_error(NULL, NULL, _("Unable to send e-mail"), |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
269 _("The specified buddy was not found in the Evolution Contacts.")); |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
270 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
271 } |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
272 |
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
273 static void |
9051 | 274 blist_node_extended_menu_cb(GaimBlistNode *node, GList **menu) |
8089 | 275 { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
276 GaimMenuAction *act; |
9051 | 277 GaimBuddy *buddy; |
8089 | 278 |
9051 | 279 if (!GAIM_BLIST_NODE_IS_BUDDY(node)) |
280 return; | |
281 | |
282 buddy = (GaimBuddy *)node; | |
283 | |
8089 | 284 if (gevo_prpl_is_supported(buddy->account, buddy)) |
285 { | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
286 act = gaim_menu_action_new(_("Add to Address Book"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
287 GAIM_CALLBACK(menu_item_activate_cb), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
288 NULL, NULL); |
9051 | 289 *menu = g_list_append(*menu, act); |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
290 act = gaim_menu_action_new(_("Send E-Mail"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
291 GAIM_CALLBACK(menu_item_send_mail_activate_cb), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12219
diff
changeset
|
292 NULL, NULL); |
11117
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
293 *menu = g_list_append(*menu, act); |
8089 | 294 } |
295 } | |
296 | |
11919 | 297 /* TODO: Something in here leaks 1 reference to a bonobo object! */ |
8089 | 298 static gboolean |
299 load_timeout(gpointer data) | |
300 { | |
301 GaimPlugin *plugin = (GaimPlugin *)data; | |
8127
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
302 EBookQuery *query; |
8089 | 303 |
304 timer = 0; | |
305 | |
11919 | 306 /* Maybe this is it? */ |
10081
ff4be2d1401d
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
10055
diff
changeset
|
307 if (!gevo_load_addressbook(NULL, &book, NULL)) |
8089 | 308 return FALSE; |
309 | |
8127
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
310 query = e_book_query_any_field_contains(""); |
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
311 |
11919 | 312 /* Is it this? */ |
8127
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
313 book_view_tag = e_book_async_get_book_view(book, query, NULL, -1, |
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
314 got_book_view_cb, NULL); |
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
315 |
96ee7b21c1ae
[gaim-migrate @ 8832]
Christian Hammond <chipx86@chipx86.com>
parents:
8089
diff
changeset
|
316 e_book_query_unref(query); |
8089 | 317 |
9051 | 318 gaim_signal_connect(gaim_blist_get_handle(), "blist-node-extended-menu", |
319 plugin, GAIM_CALLBACK(blist_node_extended_menu_cb), NULL); | |
8089 | 320 |
321 return FALSE; | |
322 } | |
323 | |
324 static gboolean | |
325 plugin_load(GaimPlugin *plugin) | |
326 { | |
327 bonobo_activate(); | |
328 | |
329 backup_blist_ui_ops = gaim_blist_get_ui_ops(); | |
330 | |
331 blist_ui_ops = g_memdup(backup_blist_ui_ops, sizeof(GaimBlistUiOps)); | |
332 blist_ui_ops->request_add_buddy = request_add_buddy; | |
333 | |
334 gaim_blist_set_ui_ops(blist_ui_ops); | |
335 | |
336 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
337 plugin, GAIM_CALLBACK(signed_on_cb), NULL); | |
338 | |
339 timer = g_timeout_add(1, load_timeout, plugin); | |
340 | |
341 return TRUE; | |
342 } | |
343 | |
344 static gboolean | |
345 plugin_unload(GaimPlugin *plugin) | |
346 { | |
347 gaim_blist_set_ui_ops(backup_blist_ui_ops); | |
348 | |
349 g_free(blist_ui_ops); | |
350 | |
351 backup_blist_ui_ops = NULL; | |
352 blist_ui_ops = NULL; | |
353 | |
354 if (book_view != NULL) | |
355 { | |
356 e_book_view_stop(book_view); | |
357 g_object_unref(book_view); | |
358 book_view = NULL; | |
359 } | |
360 | |
361 if (book != NULL) | |
362 { | |
363 g_object_unref(book); | |
364 book = NULL; | |
365 } | |
366 | |
367 return TRUE; | |
368 } | |
369 | |
370 static void | |
371 plugin_destroy(GaimPlugin *plugin) | |
372 { | |
10055
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
373 bonobo_debug_shutdown(); |
8089 | 374 } |
375 | |
376 static void | |
377 autoadd_toggled_cb(GtkCellRendererToggle *renderer, gchar *path_str, | |
378 gpointer data) | |
379 { | |
380 GaimAccount *account; | |
381 GtkTreeModel *model = (GtkTreeModel *)data; | |
382 GtkTreeIter iter; | |
383 gboolean autoadd; | |
384 | |
385 gtk_tree_model_get_iter_from_string(model, &iter, path_str); | |
386 gtk_tree_model_get(model, &iter, | |
387 COLUMN_DATA, &account, | |
388 COLUMN_AUTOADD, &autoadd, | |
389 -1); | |
390 | |
391 gaim_account_set_bool(account, "gevo-autoadd", !autoadd); | |
392 | |
393 gtk_list_store_set(GTK_LIST_STORE(model), &iter, | |
394 COLUMN_AUTOADD, !autoadd, | |
395 -1); | |
396 } | |
397 | |
398 static GtkWidget * | |
399 get_config_frame(GaimPlugin *plugin) | |
400 { | |
401 GtkWidget *ret; | |
402 GtkWidget *vbox; | |
403 GtkWidget *label; | |
404 GtkWidget *sw; | |
405 GtkWidget *treeview; | |
406 GtkTreeViewColumn *column; | |
407 GtkCellRenderer *renderer; | |
408 GdkPixbuf *pixbuf, *scale = NULL; | |
409 GtkListStore *model; | |
410 GList *l; | |
411 | |
412 /* Outside container */ | |
413 ret = gtk_vbox_new(FALSE, 18); | |
414 gtk_container_set_border_width(GTK_CONTAINER(ret), 12); | |
415 | |
416 /* Configuration frame */ | |
417 vbox = gaim_gtk_make_frame(ret, _("Evolution Integration Configuration")); | |
418 | |
419 /* Label */ | |
420 label = gtk_label_new(_("Select all accounts that buddies should be " | |
421 "auto-added to.")); | |
422 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
423 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
424 gtk_widget_show(label); | |
425 | |
426 /* Scrolled window */ | |
427 sw = gtk_scrolled_window_new(0, 0); | |
428 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
429 GTK_POLICY_AUTOMATIC, | |
430 GTK_POLICY_ALWAYS); | |
431 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
432 GTK_SHADOW_IN); | |
433 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
434 gtk_widget_set_size_request(sw, 300, 300); | |
435 gtk_widget_show(sw); | |
436 | |
437 /* Create the list model for the treeview. */ | |
438 model = gtk_list_store_new(NUM_COLUMNS, | |
439 G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, | |
440 G_TYPE_STRING, G_TYPE_POINTER); | |
441 | |
442 /* Setup the treeview */ | |
443 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); | |
444 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); | |
445 gtk_container_add(GTK_CONTAINER(sw), treeview); | |
446 gtk_widget_show(treeview); | |
447 | |
448 /* Setup the column */ | |
449 column = gtk_tree_view_column_new(); | |
450 gtk_tree_view_column_set_title(column, _("Account")); | |
451 gtk_tree_view_insert_column(GTK_TREE_VIEW(treeview), column, -1); | |
452 | |
453 /* Checkbox */ | |
454 renderer = gtk_cell_renderer_toggle_new(); | |
455 | |
456 g_signal_connect(G_OBJECT(renderer), "toggled", | |
457 G_CALLBACK(autoadd_toggled_cb), model); | |
458 | |
459 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
460 gtk_tree_view_column_add_attribute(column, renderer, | |
461 "active", COLUMN_AUTOADD); | |
462 | |
463 /* Icon */ | |
464 renderer = gtk_cell_renderer_pixbuf_new(); | |
465 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
466 gtk_tree_view_column_add_attribute(column, renderer, | |
467 "pixbuf", COLUMN_ICON); | |
468 | |
469 /* Screenname */ | |
470 renderer = gtk_cell_renderer_text_new(); | |
471 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
472 gtk_tree_view_column_add_attribute(column, renderer, | |
473 "text", COLUMN_SCREENNAME); | |
474 | |
475 | |
476 /* Populate */ | |
477 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) | |
478 { | |
479 GaimAccount *account = (GaimAccount *)l->data; | |
480 GtkTreeIter iter; | |
481 | |
482 gaim_debug_info("evolution", "Adding account\n"); | |
483 | |
484 gtk_list_store_append(model, &iter); | |
485 | |
10884 | 486 pixbuf = gaim_gtk_create_prpl_icon(account); |
8089 | 487 |
488 if (pixbuf != NULL) | |
489 { | |
490 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, | |
491 GDK_INTERP_BILINEAR); | |
492 | |
493 if (!gaim_account_is_connected(account)) | |
494 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | |
495 } | |
496 | |
497 gtk_list_store_set(model, &iter, | |
498 COLUMN_AUTOADD, | |
499 gaim_account_get_bool(account, "gevo-autoadd", | |
500 FALSE), | |
501 COLUMN_ICON, scale, | |
502 COLUMN_SCREENNAME, | |
503 gaim_account_get_username(account), | |
504 COLUMN_DATA, account, | |
505 -1); | |
506 | |
507 if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); | |
508 if (scale != NULL) g_object_unref(G_OBJECT(scale)); | |
509 } | |
510 | |
511 gtk_widget_show_all(ret); | |
512 | |
513 return ret; | |
514 } | |
515 | |
516 static GaimGtkPluginUiInfo ui_info = | |
517 { | |
12219
f23ebb7b2dfd
[gaim-migrate @ 14521]
Richard Laager <rlaager@wiktel.com>
parents:
11919
diff
changeset
|
518 get_config_frame, /**< get_config_frame */ |
f23ebb7b2dfd
[gaim-migrate @ 14521]
Richard Laager <rlaager@wiktel.com>
parents:
11919
diff
changeset
|
519 0 /**< page_num */ |
8089 | 520 }; |
521 | |
522 static GaimPluginInfo info = | |
523 { | |
9954 | 524 GAIM_PLUGIN_MAGIC, |
525 GAIM_MAJOR_VERSION, | |
526 GAIM_MINOR_VERSION, | |
8089 | 527 GAIM_PLUGIN_STANDARD, /**< type */ |
528 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ | |
529 0, /**< flags */ | |
530 NULL, /**< dependencies */ | |
531 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
532 | |
533 GEVOLUTION_PLUGIN_ID, /**< id */ | |
534 N_("Evolution Integration"), /**< name */ | |
535 VERSION, /**< version */ | |
536 /** summary */ | |
11117
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
537 N_("Provides integration with Evolution."), |
8089 | 538 /** description */ |
11117
5a8bc4b1f5b6
[gaim-migrate @ 13173]
Richard Laager <rlaager@wiktel.com>
parents:
11054
diff
changeset
|
539 N_("Provides integration with Evolution."), |
8089 | 540 "Christian Hammond <chipx86@gnupdate.org>", /**< author */ |
541 GAIM_WEBSITE, /**< homepage */ | |
542 | |
543 plugin_load, /**< load */ | |
544 plugin_unload, /**< unload */ | |
545 plugin_destroy, /**< destroy */ | |
546 | |
547 &ui_info, /**< ui_info */ | |
8993 | 548 NULL, /**< extra_info */ |
549 NULL, | |
550 NULL | |
8089 | 551 }; |
552 | |
553 static void | |
554 init_plugin(GaimPlugin *plugin) | |
555 { | |
556 /* TODO: Change to core-remote when possible. */ | |
557 /* info.dependencies = g_list_append(info.dependencies, "gtk-remote"); */ | |
558 | |
559 /* | |
560 * I'm going to rant a little bit here... | |
561 * | |
562 * For some reason, when we init bonobo from inside a plugin, it will | |
563 * segfault when destroyed. The backtraces are within gmodule somewhere. | |
564 * There's not much I can do, and I'm not sure where the bug lies. | |
565 * However, plugins are only destroyed when Gaim is shutting down. After | |
566 * destroying the plugins, gaim ends, and anything else is of course | |
567 * freed. That includes this, if we make the module resident, which | |
568 * prevents us from being able to actually unload it. | |
569 * | |
570 * So, in conclusion, this is an evil hack, but it doesn't harm anything | |
571 * and it works. | |
572 */ | |
573 g_module_make_resident(plugin->handle); | |
10055
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
574 |
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
575 if (!bonobo_init_full(NULL, NULL, bonobo_activation_orb_get(), |
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
576 CORBA_OBJECT_NIL, CORBA_OBJECT_NIL)) |
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
577 { |
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
578 gaim_debug_error("evolution", "Unable to initialize bonobo.\n"); |
0436734708fa
[gaim-migrate @ 11020]
Christian Hammond <chipx86@chipx86.com>
parents:
9954
diff
changeset
|
579 } |
8089 | 580 } |
581 | |
582 GAIM_INIT_PLUGIN(gevolution, init_plugin, info) |