| |
1 /** |
| |
2 * @file account.c Account API |
| |
3 * @ingroup core |
| |
4 * |
| |
5 * purple |
| |
6 * |
| |
7 * Purple is the legal property of its developers, whose names are too numerous |
| |
8 * to list here. Please refer to the COPYRIGHT file distributed with this |
| |
9 * source distribution. |
| |
10 * |
| |
11 * This program is free software; you can redistribute it and/or modify |
| |
12 * it under the terms of the GNU General Public License as published by |
| |
13 * the Free Software Foundation; either version 2 of the License, or |
| |
14 * (at your option) any later version. |
| |
15 * |
| |
16 * This program is distributed in the hope that it will be useful, |
| |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| |
19 * GNU General Public License for more details. |
| |
20 * |
| |
21 * You should have received a copy of the GNU General Public License |
| |
22 * along with this program; if not, write to the Free Software |
| |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| |
24 */ |
| |
25 #include "internal.h" |
| |
26 #include "account.h" |
| |
27 #include "core.h" |
| |
28 #include "dbus-maybe.h" |
| |
29 #include "debug.h" |
| |
30 #include "network.h" |
| |
31 #include "notify.h" |
| |
32 #include "pounce.h" |
| |
33 #include "prefs.h" |
| |
34 #include "privacy.h" |
| |
35 #include "prpl.h" |
| |
36 #include "request.h" |
| |
37 #include "server.h" |
| |
38 #include "signals.h" |
| |
39 #include "status.h" |
| |
40 #include "util.h" |
| |
41 #include "xmlnode.h" |
| |
42 |
| |
43 /* TODO: Should use PurpleValue instead of this? What about "ui"? */ |
| |
44 typedef struct |
| |
45 { |
| |
46 PurplePrefType type; |
| |
47 |
| |
48 char *ui; |
| |
49 |
| |
50 union |
| |
51 { |
| |
52 int integer; |
| |
53 char *string; |
| |
54 gboolean bool; |
| |
55 |
| |
56 } value; |
| |
57 |
| |
58 } PurpleAccountSetting; |
| |
59 |
| |
60 typedef struct |
| |
61 { |
| |
62 PurpleAccountRequestType type; |
| |
63 PurpleAccount *account; |
| |
64 void *ui_handle; |
| |
65 |
| |
66 } PurpleAccountRequestInfo; |
| |
67 |
| |
68 static PurpleAccountUiOps *account_ui_ops = NULL; |
| |
69 |
| |
70 static GList *accounts = NULL; |
| |
71 static guint save_timer = 0; |
| |
72 static gboolean accounts_loaded = FALSE; |
| |
73 |
| |
74 static GList *handles = NULL; |
| |
75 |
| |
76 /********************************************************************* |
| |
77 * Writing to disk * |
| |
78 *********************************************************************/ |
| |
79 |
| |
80 static void |
| |
81 setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data) |
| |
82 { |
| |
83 const char *name; |
| |
84 PurpleAccountSetting *setting; |
| |
85 xmlnode *node, *child; |
| |
86 char buf[20]; |
| |
87 |
| |
88 name = (const char *)key; |
| |
89 setting = (PurpleAccountSetting *)value; |
| |
90 node = (xmlnode *)user_data; |
| |
91 |
| |
92 child = xmlnode_new_child(node, "setting"); |
| |
93 xmlnode_set_attrib(child, "name", name); |
| |
94 |
| |
95 if (setting->type == PURPLE_PREF_INT) { |
| |
96 xmlnode_set_attrib(child, "type", "int"); |
| |
97 snprintf(buf, sizeof(buf), "%d", setting->value.integer); |
| |
98 xmlnode_insert_data(child, buf, -1); |
| |
99 } |
| |
100 else if (setting->type == PURPLE_PREF_STRING && setting->value.string != NULL) { |
| |
101 xmlnode_set_attrib(child, "type", "string"); |
| |
102 xmlnode_insert_data(child, setting->value.string, -1); |
| |
103 } |
| |
104 else if (setting->type == PURPLE_PREF_BOOLEAN) { |
| |
105 xmlnode_set_attrib(child, "type", "bool"); |
| |
106 snprintf(buf, sizeof(buf), "%d", setting->value.bool); |
| |
107 xmlnode_insert_data(child, buf, -1); |
| |
108 } |
| |
109 } |
| |
110 |
| |
111 static void |
| |
112 ui_setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data) |
| |
113 { |
| |
114 const char *ui; |
| |
115 GHashTable *table; |
| |
116 xmlnode *node, *child; |
| |
117 |
| |
118 ui = (const char *)key; |
| |
119 table = (GHashTable *)value; |
| |
120 node = (xmlnode *)user_data; |
| |
121 |
| |
122 if (g_hash_table_size(table) > 0) |
| |
123 { |
| |
124 child = xmlnode_new_child(node, "settings"); |
| |
125 xmlnode_set_attrib(child, "ui", ui); |
| |
126 g_hash_table_foreach(table, setting_to_xmlnode, child); |
| |
127 } |
| |
128 } |
| |
129 |
| |
130 static xmlnode * |
| |
131 status_attr_to_xmlnode(const PurpleStatus *status, const PurpleStatusType *type, const PurpleStatusAttr *attr) |
| |
132 { |
| |
133 xmlnode *node; |
| |
134 const char *id; |
| |
135 char *value = NULL; |
| |
136 PurpleStatusAttr *default_attr; |
| |
137 PurpleValue *default_value; |
| |
138 PurpleType attr_type; |
| |
139 PurpleValue *attr_value; |
| |
140 |
| |
141 id = purple_status_attr_get_id(attr); |
| |
142 g_return_val_if_fail(id, NULL); |
| |
143 |
| |
144 attr_value = purple_status_get_attr_value(status, id); |
| |
145 g_return_val_if_fail(attr_value, NULL); |
| |
146 attr_type = purple_value_get_type(attr_value); |
| |
147 |
| |
148 /* |
| |
149 * If attr_value is a different type than it should be |
| |
150 * then don't write it to the file. |
| |
151 */ |
| |
152 default_attr = purple_status_type_get_attr(type, id); |
| |
153 default_value = purple_status_attr_get_value(default_attr); |
| |
154 if (attr_type != purple_value_get_type(default_value)) |
| |
155 return NULL; |
| |
156 |
| |
157 /* |
| |
158 * If attr_value is the same as the default for this status |
| |
159 * then there is no need to write it to the file. |
| |
160 */ |
| |
161 if (attr_type == PURPLE_TYPE_STRING) |
| |
162 { |
| |
163 const char *string_value = purple_value_get_string(attr_value); |
| |
164 const char *default_string_value = purple_value_get_string(default_value); |
| |
165 if (((string_value == NULL) && (default_string_value == NULL)) || |
| |
166 ((string_value != NULL) && (default_string_value != NULL) && |
| |
167 !strcmp(string_value, default_string_value))) |
| |
168 return NULL; |
| |
169 value = g_strdup(purple_value_get_string(attr_value)); |
| |
170 } |
| |
171 else if (attr_type == PURPLE_TYPE_INT) |
| |
172 { |
| |
173 int int_value = purple_value_get_int(attr_value); |
| |
174 if (int_value == purple_value_get_int(default_value)) |
| |
175 return NULL; |
| |
176 value = g_strdup_printf("%d", int_value); |
| |
177 } |
| |
178 else if (attr_type == PURPLE_TYPE_BOOLEAN) |
| |
179 { |
| |
180 gboolean boolean_value = purple_value_get_boolean(attr_value); |
| |
181 if (boolean_value == purple_value_get_boolean(default_value)) |
| |
182 return NULL; |
| |
183 value = g_strdup(boolean_value ? |
| |
184 "true" : "false"); |
| |
185 } |
| |
186 else |
| |
187 { |
| |
188 return NULL; |
| |
189 } |
| |
190 |
| |
191 g_return_val_if_fail(value, NULL); |
| |
192 |
| |
193 node = xmlnode_new("attribute"); |
| |
194 |
| |
195 xmlnode_set_attrib(node, "id", id); |
| |
196 xmlnode_set_attrib(node, "value", value); |
| |
197 |
| |
198 g_free(value); |
| |
199 |
| |
200 return node; |
| |
201 } |
| |
202 |
| |
203 static xmlnode * |
| |
204 status_attrs_to_xmlnode(const PurpleStatus *status) |
| |
205 { |
| |
206 PurpleStatusType *type = purple_status_get_type(status); |
| |
207 xmlnode *node, *child; |
| |
208 const GList *attrs, *attr; |
| |
209 |
| |
210 node = xmlnode_new("attributes"); |
| |
211 |
| |
212 attrs = purple_status_type_get_attrs(type); |
| |
213 for (attr = attrs; attr != NULL; attr = attr->next) |
| |
214 { |
| |
215 child = status_attr_to_xmlnode(status, type, (const PurpleStatusAttr *)attr->data); |
| |
216 if (child) |
| |
217 xmlnode_insert_child(node, child); |
| |
218 } |
| |
219 |
| |
220 return node; |
| |
221 } |
| |
222 |
| |
223 static xmlnode * |
| |
224 status_to_xmlnode(const PurpleStatus *status) |
| |
225 { |
| |
226 xmlnode *node, *child; |
| |
227 |
| |
228 node = xmlnode_new("status"); |
| |
229 xmlnode_set_attrib(node, "type", purple_status_get_id(status)); |
| |
230 if (purple_status_get_name(status) != NULL) |
| |
231 xmlnode_set_attrib(node, "name", purple_status_get_name(status)); |
| |
232 xmlnode_set_attrib(node, "active", purple_status_is_active(status) ? "true" : "false"); |
| |
233 |
| |
234 child = status_attrs_to_xmlnode(status); |
| |
235 xmlnode_insert_child(node, child); |
| |
236 |
| |
237 return node; |
| |
238 } |
| |
239 |
| |
240 static xmlnode * |
| |
241 statuses_to_xmlnode(const PurplePresence *presence) |
| |
242 { |
| |
243 xmlnode *node, *child; |
| |
244 const GList *statuses, *status; |
| |
245 |
| |
246 node = xmlnode_new("statuses"); |
| |
247 |
| |
248 statuses = purple_presence_get_statuses(presence); |
| |
249 for (status = statuses; status != NULL; status = status->next) |
| |
250 { |
| |
251 child = status_to_xmlnode((PurpleStatus *)status->data); |
| |
252 xmlnode_insert_child(node, child); |
| |
253 } |
| |
254 |
| |
255 return node; |
| |
256 } |
| |
257 |
| |
258 static xmlnode * |
| |
259 proxy_settings_to_xmlnode(PurpleProxyInfo *proxy_info) |
| |
260 { |
| |
261 xmlnode *node, *child; |
| |
262 PurpleProxyType proxy_type; |
| |
263 const char *value; |
| |
264 int int_value; |
| |
265 char buf[20]; |
| |
266 |
| |
267 proxy_type = purple_proxy_info_get_type(proxy_info); |
| |
268 |
| |
269 node = xmlnode_new("proxy"); |
| |
270 |
| |
271 child = xmlnode_new_child(node, "type"); |
| |
272 xmlnode_insert_data(child, |
| |
273 (proxy_type == PURPLE_PROXY_USE_GLOBAL ? "global" : |
| |
274 proxy_type == PURPLE_PROXY_NONE ? "none" : |
| |
275 proxy_type == PURPLE_PROXY_HTTP ? "http" : |
| |
276 proxy_type == PURPLE_PROXY_SOCKS4 ? "socks4" : |
| |
277 proxy_type == PURPLE_PROXY_SOCKS5 ? "socks5" : |
| |
278 proxy_type == PURPLE_PROXY_USE_ENVVAR ? "envvar" : "unknown"), -1); |
| |
279 |
| |
280 if ((value = purple_proxy_info_get_host(proxy_info)) != NULL) |
| |
281 { |
| |
282 child = xmlnode_new_child(node, "host"); |
| |
283 xmlnode_insert_data(child, value, -1); |
| |
284 } |
| |
285 |
| |
286 if ((int_value = purple_proxy_info_get_port(proxy_info)) != 0) |
| |
287 { |
| |
288 snprintf(buf, sizeof(buf), "%d", int_value); |
| |
289 child = xmlnode_new_child(node, "port"); |
| |
290 xmlnode_insert_data(child, buf, -1); |
| |
291 } |
| |
292 |
| |
293 if ((value = purple_proxy_info_get_username(proxy_info)) != NULL) |
| |
294 { |
| |
295 child = xmlnode_new_child(node, "username"); |
| |
296 xmlnode_insert_data(child, value, -1); |
| |
297 } |
| |
298 |
| |
299 if ((value = purple_proxy_info_get_password(proxy_info)) != NULL) |
| |
300 { |
| |
301 child = xmlnode_new_child(node, "password"); |
| |
302 xmlnode_insert_data(child, value, -1); |
| |
303 } |
| |
304 |
| |
305 return node; |
| |
306 } |
| |
307 |
| |
308 static xmlnode * |
| |
309 account_to_xmlnode(PurpleAccount *account) |
| |
310 { |
| |
311 xmlnode *node, *child; |
| |
312 const char *tmp; |
| |
313 PurplePresence *presence; |
| |
314 PurpleProxyInfo *proxy_info; |
| |
315 |
| |
316 node = xmlnode_new("account"); |
| |
317 |
| |
318 child = xmlnode_new_child(node, "protocol"); |
| |
319 xmlnode_insert_data(child, purple_account_get_protocol_id(account), -1); |
| |
320 |
| |
321 child = xmlnode_new_child(node, "name"); |
| |
322 xmlnode_insert_data(child, purple_account_get_username(account), -1); |
| |
323 |
| |
324 if (purple_account_get_remember_password(account) && |
| |
325 ((tmp = purple_account_get_password(account)) != NULL)) |
| |
326 { |
| |
327 child = xmlnode_new_child(node, "password"); |
| |
328 xmlnode_insert_data(child, tmp, -1); |
| |
329 } |
| |
330 |
| |
331 if ((tmp = purple_account_get_alias(account)) != NULL) |
| |
332 { |
| |
333 child = xmlnode_new_child(node, "alias"); |
| |
334 xmlnode_insert_data(child, tmp, -1); |
| |
335 } |
| |
336 |
| |
337 if ((presence = purple_account_get_presence(account)) != NULL) |
| |
338 { |
| |
339 child = statuses_to_xmlnode(presence); |
| |
340 xmlnode_insert_child(node, child); |
| |
341 } |
| |
342 |
| |
343 if ((tmp = purple_account_get_user_info(account)) != NULL) |
| |
344 { |
| |
345 /* TODO: Do we need to call purple_str_strip_char(tmp, '\r') here? */ |
| |
346 child = xmlnode_new_child(node, "userinfo"); |
| |
347 xmlnode_insert_data(child, tmp, -1); |
| |
348 } |
| |
349 |
| |
350 if ((tmp = purple_account_get_buddy_icon(account)) != NULL) |
| |
351 { |
| |
352 child = xmlnode_new_child(node, "buddyicon"); |
| |
353 xmlnode_insert_data(child, tmp, -1); |
| |
354 } |
| |
355 |
| |
356 if (g_hash_table_size(account->settings) > 0) |
| |
357 { |
| |
358 child = xmlnode_new_child(node, "settings"); |
| |
359 g_hash_table_foreach(account->settings, setting_to_xmlnode, child); |
| |
360 } |
| |
361 |
| |
362 if (g_hash_table_size(account->ui_settings) > 0) |
| |
363 { |
| |
364 g_hash_table_foreach(account->ui_settings, ui_setting_to_xmlnode, node); |
| |
365 } |
| |
366 |
| |
367 if ((proxy_info = purple_account_get_proxy_info(account)) != NULL) |
| |
368 { |
| |
369 child = proxy_settings_to_xmlnode(proxy_info); |
| |
370 xmlnode_insert_child(node, child); |
| |
371 } |
| |
372 |
| |
373 return node; |
| |
374 } |
| |
375 |
| |
376 static xmlnode * |
| |
377 accounts_to_xmlnode(void) |
| |
378 { |
| |
379 xmlnode *node, *child; |
| |
380 GList *cur; |
| |
381 |
| |
382 node = xmlnode_new("account"); |
| |
383 xmlnode_set_attrib(node, "version", "1.0"); |
| |
384 |
| |
385 for (cur = purple_accounts_get_all(); cur != NULL; cur = cur->next) |
| |
386 { |
| |
387 child = account_to_xmlnode(cur->data); |
| |
388 xmlnode_insert_child(node, child); |
| |
389 } |
| |
390 |
| |
391 return node; |
| |
392 } |
| |
393 |
| |
394 static void |
| |
395 sync_accounts(void) |
| |
396 { |
| |
397 xmlnode *node; |
| |
398 char *data; |
| |
399 |
| |
400 if (!accounts_loaded) |
| |
401 { |
| |
402 purple_debug_error("account", "Attempted to save accounts before " |
| |
403 "they were read!\n"); |
| |
404 return; |
| |
405 } |
| |
406 |
| |
407 node = accounts_to_xmlnode(); |
| |
408 data = xmlnode_to_formatted_str(node, NULL); |
| |
409 purple_util_write_data_to_file("accounts.xml", data, -1); |
| |
410 g_free(data); |
| |
411 xmlnode_free(node); |
| |
412 } |
| |
413 |
| |
414 static gboolean |
| |
415 save_cb(gpointer data) |
| |
416 { |
| |
417 sync_accounts(); |
| |
418 save_timer = 0; |
| |
419 return FALSE; |
| |
420 } |
| |
421 |
| |
422 static void |
| |
423 schedule_accounts_save() |
| |
424 { |
| |
425 if (save_timer == 0) |
| |
426 save_timer = purple_timeout_add(5000, save_cb, NULL); |
| |
427 } |
| |
428 |
| |
429 |
| |
430 /********************************************************************* |
| |
431 * Reading from disk * |
| |
432 *********************************************************************/ |
| |
433 |
| |
434 static void |
| |
435 parse_settings(xmlnode *node, PurpleAccount *account) |
| |
436 { |
| |
437 const char *ui; |
| |
438 xmlnode *child; |
| |
439 |
| |
440 /* Get the UI string, if these are UI settings */ |
| |
441 ui = xmlnode_get_attrib(node, "ui"); |
| |
442 |
| |
443 /* Read settings, one by one */ |
| |
444 for (child = xmlnode_get_child(node, "setting"); child != NULL; |
| |
445 child = xmlnode_get_next_twin(child)) |
| |
446 { |
| |
447 const char *name, *str_type; |
| |
448 PurplePrefType type; |
| |
449 char *data; |
| |
450 |
| |
451 name = xmlnode_get_attrib(child, "name"); |
| |
452 if (name == NULL) |
| |
453 /* Ignore this setting */ |
| |
454 continue; |
| |
455 |
| |
456 str_type = xmlnode_get_attrib(child, "type"); |
| |
457 if (str_type == NULL) |
| |
458 /* Ignore this setting */ |
| |
459 continue; |
| |
460 |
| |
461 if (!strcmp(str_type, "string")) |
| |
462 type = PURPLE_PREF_STRING; |
| |
463 else if (!strcmp(str_type, "int")) |
| |
464 type = PURPLE_PREF_INT; |
| |
465 else if (!strcmp(str_type, "bool")) |
| |
466 type = PURPLE_PREF_BOOLEAN; |
| |
467 else |
| |
468 /* Ignore this setting */ |
| |
469 continue; |
| |
470 |
| |
471 data = xmlnode_get_data(child); |
| |
472 if (data == NULL) |
| |
473 /* Ignore this setting */ |
| |
474 continue; |
| |
475 |
| |
476 if (ui == NULL) |
| |
477 { |
| |
478 if (type == PURPLE_PREF_STRING) |
| |
479 purple_account_set_string(account, name, data); |
| |
480 else if (type == PURPLE_PREF_INT) |
| |
481 purple_account_set_int(account, name, atoi(data)); |
| |
482 else if (type == PURPLE_PREF_BOOLEAN) |
| |
483 purple_account_set_bool(account, name, |
| |
484 (*data == '0' ? FALSE : TRUE)); |
| |
485 } else { |
| |
486 if (type == PURPLE_PREF_STRING) |
| |
487 purple_account_set_ui_string(account, ui, name, data); |
| |
488 else if (type == PURPLE_PREF_INT) |
| |
489 purple_account_set_ui_int(account, ui, name, atoi(data)); |
| |
490 else if (type == PURPLE_PREF_BOOLEAN) |
| |
491 purple_account_set_ui_bool(account, ui, name, |
| |
492 (*data == '0' ? FALSE : TRUE)); |
| |
493 } |
| |
494 |
| |
495 g_free(data); |
| |
496 } |
| |
497 } |
| |
498 |
| |
499 static GList * |
| |
500 parse_status_attrs(xmlnode *node, PurpleStatus *status) |
| |
501 { |
| |
502 GList *list = NULL; |
| |
503 xmlnode *child; |
| |
504 PurpleValue *attr_value; |
| |
505 |
| |
506 for (child = xmlnode_get_child(node, "attribute"); child != NULL; |
| |
507 child = xmlnode_get_next_twin(child)) |
| |
508 { |
| |
509 const char *id = xmlnode_get_attrib(child, "id"); |
| |
510 const char *value = xmlnode_get_attrib(child, "value"); |
| |
511 |
| |
512 if (!id || !*id || !value || !*value) |
| |
513 continue; |
| |
514 |
| |
515 attr_value = purple_status_get_attr_value(status, id); |
| |
516 if (!attr_value) |
| |
517 continue; |
| |
518 |
| |
519 list = g_list_append(list, (char *)id); |
| |
520 |
| |
521 switch (purple_value_get_type(attr_value)) |
| |
522 { |
| |
523 case PURPLE_TYPE_STRING: |
| |
524 list = g_list_append(list, (char *)value); |
| |
525 break; |
| |
526 case PURPLE_TYPE_INT: |
| |
527 case PURPLE_TYPE_BOOLEAN: |
| |
528 { |
| |
529 int v; |
| |
530 if (sscanf(value, "%d", &v) == 1) |
| |
531 list = g_list_append(list, GINT_TO_POINTER(v)); |
| |
532 else |
| |
533 list = g_list_remove(list, id); |
| |
534 break; |
| |
535 } |
| |
536 default: |
| |
537 break; |
| |
538 } |
| |
539 } |
| |
540 |
| |
541 return list; |
| |
542 } |
| |
543 |
| |
544 static void |
| |
545 parse_status(xmlnode *node, PurpleAccount *account) |
| |
546 { |
| |
547 gboolean active = FALSE; |
| |
548 const char *data; |
| |
549 const char *type; |
| |
550 xmlnode *child; |
| |
551 GList *attrs = NULL; |
| |
552 |
| |
553 /* Get the active/inactive state */ |
| |
554 data = xmlnode_get_attrib(node, "active"); |
| |
555 if (data == NULL) |
| |
556 return; |
| |
557 if (strcasecmp(data, "true") == 0) |
| |
558 active = TRUE; |
| |
559 else if (strcasecmp(data, "false") == 0) |
| |
560 active = FALSE; |
| |
561 else |
| |
562 return; |
| |
563 |
| |
564 /* Get the type of the status */ |
| |
565 type = xmlnode_get_attrib(node, "type"); |
| |
566 if (type == NULL) |
| |
567 return; |
| |
568 |
| |
569 /* Read attributes into a GList */ |
| |
570 child = xmlnode_get_child(node, "attributes"); |
| |
571 if (child != NULL) |
| |
572 { |
| |
573 attrs = parse_status_attrs(child, |
| |
574 purple_account_get_status(account, type)); |
| |
575 } |
| |
576 |
| |
577 purple_account_set_status_list(account, type, active, attrs); |
| |
578 |
| |
579 g_list_free(attrs); |
| |
580 } |
| |
581 |
| |
582 static void |
| |
583 parse_statuses(xmlnode *node, PurpleAccount *account) |
| |
584 { |
| |
585 xmlnode *child; |
| |
586 |
| |
587 for (child = xmlnode_get_child(node, "status"); child != NULL; |
| |
588 child = xmlnode_get_next_twin(child)) |
| |
589 { |
| |
590 parse_status(child, account); |
| |
591 } |
| |
592 } |
| |
593 |
| |
594 static void |
| |
595 parse_proxy_info(xmlnode *node, PurpleAccount *account) |
| |
596 { |
| |
597 PurpleProxyInfo *proxy_info; |
| |
598 xmlnode *child; |
| |
599 char *data; |
| |
600 |
| |
601 proxy_info = purple_proxy_info_new(); |
| |
602 |
| |
603 /* Use the global proxy settings, by default */ |
| |
604 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_GLOBAL); |
| |
605 |
| |
606 /* Read proxy type */ |
| |
607 child = xmlnode_get_child(node, "type"); |
| |
608 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
609 { |
| |
610 if (!strcmp(data, "global")) |
| |
611 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_GLOBAL); |
| |
612 else if (!strcmp(data, "none")) |
| |
613 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_NONE); |
| |
614 else if (!strcmp(data, "http")) |
| |
615 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_HTTP); |
| |
616 else if (!strcmp(data, "socks4")) |
| |
617 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_SOCKS4); |
| |
618 else if (!strcmp(data, "socks5")) |
| |
619 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_SOCKS5); |
| |
620 else if (!strcmp(data, "envvar")) |
| |
621 purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_ENVVAR); |
| |
622 else |
| |
623 { |
| |
624 purple_debug_error("account", "Invalid proxy type found when " |
| |
625 "loading account information for %s\n", |
| |
626 purple_account_get_username(account)); |
| |
627 } |
| |
628 g_free(data); |
| |
629 } |
| |
630 |
| |
631 /* Read proxy host */ |
| |
632 child = xmlnode_get_child(node, "host"); |
| |
633 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
634 { |
| |
635 purple_proxy_info_set_host(proxy_info, data); |
| |
636 g_free(data); |
| |
637 } |
| |
638 |
| |
639 /* Read proxy port */ |
| |
640 child = xmlnode_get_child(node, "port"); |
| |
641 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
642 { |
| |
643 purple_proxy_info_set_port(proxy_info, atoi(data)); |
| |
644 g_free(data); |
| |
645 } |
| |
646 |
| |
647 /* Read proxy username */ |
| |
648 child = xmlnode_get_child(node, "username"); |
| |
649 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
650 { |
| |
651 purple_proxy_info_set_username(proxy_info, data); |
| |
652 g_free(data); |
| |
653 } |
| |
654 |
| |
655 /* Read proxy password */ |
| |
656 child = xmlnode_get_child(node, "password"); |
| |
657 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
658 { |
| |
659 purple_proxy_info_set_password(proxy_info, data); |
| |
660 g_free(data); |
| |
661 } |
| |
662 |
| |
663 /* If there are no values set then proxy_info NULL */ |
| |
664 if ((purple_proxy_info_get_type(proxy_info) == PURPLE_PROXY_USE_GLOBAL) && |
| |
665 (purple_proxy_info_get_host(proxy_info) == NULL) && |
| |
666 (purple_proxy_info_get_port(proxy_info) == 0) && |
| |
667 (purple_proxy_info_get_username(proxy_info) == NULL) && |
| |
668 (purple_proxy_info_get_password(proxy_info) == NULL)) |
| |
669 { |
| |
670 purple_proxy_info_destroy(proxy_info); |
| |
671 return; |
| |
672 } |
| |
673 |
| |
674 purple_account_set_proxy_info(account, proxy_info); |
| |
675 } |
| |
676 |
| |
677 static PurpleAccount * |
| |
678 parse_account(xmlnode *node) |
| |
679 { |
| |
680 PurpleAccount *ret; |
| |
681 xmlnode *child; |
| |
682 char *protocol_id = NULL; |
| |
683 char *name = NULL; |
| |
684 char *data; |
| |
685 |
| |
686 child = xmlnode_get_child(node, "protocol"); |
| |
687 if (child != NULL) |
| |
688 protocol_id = xmlnode_get_data(child); |
| |
689 |
| |
690 child = xmlnode_get_child(node, "name"); |
| |
691 if (child != NULL) |
| |
692 name = xmlnode_get_data(child); |
| |
693 if (name == NULL) |
| |
694 { |
| |
695 /* Do we really need to do this? */ |
| |
696 child = xmlnode_get_child(node, "username"); |
| |
697 if (child != NULL) |
| |
698 name = xmlnode_get_data(child); |
| |
699 } |
| |
700 |
| |
701 if ((protocol_id == NULL) || (name == NULL)) |
| |
702 { |
| |
703 g_free(protocol_id); |
| |
704 g_free(name); |
| |
705 return NULL; |
| |
706 } |
| |
707 |
| |
708 ret = purple_account_new(name, _purple_oscar_convert(name, protocol_id)); /* XXX: */ |
| |
709 g_free(name); |
| |
710 g_free(protocol_id); |
| |
711 |
| |
712 /* Read the password */ |
| |
713 child = xmlnode_get_child(node, "password"); |
| |
714 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
715 { |
| |
716 purple_account_set_remember_password(ret, TRUE); |
| |
717 purple_account_set_password(ret, data); |
| |
718 g_free(data); |
| |
719 } |
| |
720 |
| |
721 /* Read the alias */ |
| |
722 child = xmlnode_get_child(node, "alias"); |
| |
723 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
724 { |
| |
725 if (*data != '\0') |
| |
726 purple_account_set_alias(ret, data); |
| |
727 g_free(data); |
| |
728 } |
| |
729 |
| |
730 /* Read the statuses */ |
| |
731 child = xmlnode_get_child(node, "statuses"); |
| |
732 if (child != NULL) |
| |
733 { |
| |
734 parse_statuses(child, ret); |
| |
735 } |
| |
736 |
| |
737 /* Read the userinfo */ |
| |
738 child = xmlnode_get_child(node, "userinfo"); |
| |
739 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
740 { |
| |
741 purple_account_set_user_info(ret, data); |
| |
742 g_free(data); |
| |
743 } |
| |
744 |
| |
745 /* Read the buddyicon */ |
| |
746 child = xmlnode_get_child(node, "buddyicon"); |
| |
747 if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) |
| |
748 { |
| |
749 purple_account_set_buddy_icon(ret, data); |
| |
750 g_free(data); |
| |
751 } |
| |
752 |
| |
753 /* Read settings (both core and UI) */ |
| |
754 for (child = xmlnode_get_child(node, "settings"); child != NULL; |
| |
755 child = xmlnode_get_next_twin(child)) |
| |
756 { |
| |
757 parse_settings(child, ret); |
| |
758 } |
| |
759 |
| |
760 /* Read proxy */ |
| |
761 child = xmlnode_get_child(node, "proxy"); |
| |
762 if (child != NULL) |
| |
763 { |
| |
764 parse_proxy_info(child, ret); |
| |
765 } |
| |
766 |
| |
767 return ret; |
| |
768 } |
| |
769 |
| |
770 static void |
| |
771 load_accounts(void) |
| |
772 { |
| |
773 xmlnode *node, *child; |
| |
774 |
| |
775 accounts_loaded = TRUE; |
| |
776 |
| |
777 node = purple_util_read_xml_from_file("accounts.xml", _("accounts")); |
| |
778 |
| |
779 if (node == NULL) |
| |
780 return; |
| |
781 |
| |
782 for (child = xmlnode_get_child(node, "account"); child != NULL; |
| |
783 child = xmlnode_get_next_twin(child)) |
| |
784 { |
| |
785 PurpleAccount *new_acct; |
| |
786 new_acct = parse_account(child); |
| |
787 purple_accounts_add(new_acct); |
| |
788 } |
| |
789 |
| |
790 xmlnode_free(node); |
| |
791 } |
| |
792 |
| |
793 |
| |
794 static void |
| |
795 delete_setting(void *data) |
| |
796 { |
| |
797 PurpleAccountSetting *setting = (PurpleAccountSetting *)data; |
| |
798 |
| |
799 g_free(setting->ui); |
| |
800 |
| |
801 if (setting->type == PURPLE_PREF_STRING) |
| |
802 g_free(setting->value.string); |
| |
803 |
| |
804 g_free(setting); |
| |
805 } |
| |
806 |
| |
807 PurpleAccount * |
| |
808 purple_account_new(const char *username, const char *protocol_id) |
| |
809 { |
| |
810 PurpleAccount *account = NULL; |
| |
811 PurplePlugin *prpl = NULL; |
| |
812 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
813 PurpleStatusType *status_type; |
| |
814 |
| |
815 g_return_val_if_fail(username != NULL, NULL); |
| |
816 g_return_val_if_fail(protocol_id != NULL, NULL); |
| |
817 |
| |
818 account = purple_accounts_find(username, protocol_id); |
| |
819 |
| |
820 if (account != NULL) |
| |
821 return account; |
| |
822 |
| |
823 account = g_new0(PurpleAccount, 1); |
| |
824 PURPLE_DBUS_REGISTER_POINTER(account, PurpleAccount); |
| |
825 |
| |
826 purple_account_set_username(account, username); |
| |
827 |
| |
828 purple_account_set_protocol_id(account, protocol_id); |
| |
829 |
| |
830 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| |
831 g_free, delete_setting); |
| |
832 account->ui_settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| |
833 g_free, (GDestroyNotify)g_hash_table_destroy); |
| |
834 account->system_log = NULL; |
| |
835 /* 0 is not a valid privacy setting */ |
| |
836 account->perm_deny = PURPLE_PRIVACY_ALLOW_ALL; |
| |
837 |
| |
838 prpl = purple_find_prpl(protocol_id); |
| |
839 |
| |
840 if (prpl == NULL) |
| |
841 return account; |
| |
842 |
| |
843 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); |
| |
844 if (prpl_info != NULL && prpl_info->status_types != NULL) |
| |
845 purple_account_set_status_types(account, prpl_info->status_types(account)); |
| |
846 |
| |
847 account->presence = purple_presence_new_for_account(account); |
| |
848 |
| |
849 status_type = purple_account_get_status_type_with_primitive(account, PURPLE_STATUS_AVAILABLE); |
| |
850 if (status_type != NULL) |
| |
851 purple_presence_set_status_active(account->presence, |
| |
852 purple_status_type_get_id(status_type), |
| |
853 TRUE); |
| |
854 else |
| |
855 purple_presence_set_status_active(account->presence, |
| |
856 "offline", |
| |
857 TRUE); |
| |
858 |
| |
859 return account; |
| |
860 } |
| |
861 |
| |
862 void |
| |
863 purple_account_destroy(PurpleAccount *account) |
| |
864 { |
| |
865 GList *l; |
| |
866 |
| |
867 g_return_if_fail(account != NULL); |
| |
868 |
| |
869 purple_debug_info("account", "Destroying account %p\n", account); |
| |
870 |
| |
871 for (l = purple_get_conversations(); l != NULL; l = l->next) |
| |
872 { |
| |
873 PurpleConversation *conv = (PurpleConversation *)l->data; |
| |
874 |
| |
875 if (purple_conversation_get_account(conv) == account) |
| |
876 purple_conversation_set_account(conv, NULL); |
| |
877 } |
| |
878 |
| |
879 g_free(account->username); |
| |
880 g_free(account->alias); |
| |
881 g_free(account->password); |
| |
882 g_free(account->user_info); |
| |
883 g_free(account->buddy_icon); |
| |
884 g_free(account->buddy_icon_path); |
| |
885 g_free(account->protocol_id); |
| |
886 |
| |
887 g_hash_table_destroy(account->settings); |
| |
888 g_hash_table_destroy(account->ui_settings); |
| |
889 |
| |
890 purple_account_set_status_types(account, NULL); |
| |
891 |
| |
892 purple_presence_destroy(account->presence); |
| |
893 |
| |
894 if(account->system_log) |
| |
895 purple_log_free(account->system_log); |
| |
896 |
| |
897 PURPLE_DBUS_UNREGISTER_POINTER(account); |
| |
898 g_free(account); |
| |
899 } |
| |
900 |
| |
901 void |
| |
902 purple_account_register(PurpleAccount *account) |
| |
903 { |
| |
904 g_return_if_fail(account != NULL); |
| |
905 |
| |
906 purple_debug_info("account", "Registering account %s\n", |
| |
907 purple_account_get_username(account)); |
| |
908 |
| |
909 purple_connection_new(account, TRUE, purple_account_get_password(account)); |
| |
910 } |
| |
911 |
| |
912 static void |
| |
913 request_password_ok_cb(PurpleAccount *account, PurpleRequestFields *fields) |
| |
914 { |
| |
915 const char *entry; |
| |
916 gboolean remember; |
| |
917 |
| |
918 entry = purple_request_fields_get_string(fields, "password"); |
| |
919 remember = purple_request_fields_get_bool(fields, "remember"); |
| |
920 |
| |
921 if (!entry || !*entry) |
| |
922 { |
| |
923 purple_notify_error(account, NULL, _("Password is required to sign on."), NULL); |
| |
924 return; |
| |
925 } |
| |
926 |
| |
927 if(remember) |
| |
928 purple_account_set_remember_password(account, TRUE); |
| |
929 |
| |
930 purple_account_set_password(account, entry); |
| |
931 |
| |
932 purple_connection_new(account, FALSE, entry); |
| |
933 } |
| |
934 |
| |
935 void |
| |
936 purple_account_request_password(PurpleAccount *account, GCallback ok_cb, |
| |
937 GCallback cancel_cb, void *user_data) |
| |
938 { |
| |
939 gchar *primary; |
| |
940 const gchar *username; |
| |
941 PurpleRequestFieldGroup *group; |
| |
942 PurpleRequestField *field; |
| |
943 PurpleRequestFields *fields; |
| |
944 |
| |
945 /* Close any previous password request windows */ |
| |
946 purple_request_close_with_handle(account); |
| |
947 |
| |
948 username = purple_account_get_username(account); |
| |
949 primary = g_strdup_printf(_("Enter password for %s (%s)"), username, |
| |
950 purple_account_get_protocol_name(account)); |
| |
951 |
| |
952 fields = purple_request_fields_new(); |
| |
953 group = purple_request_field_group_new(NULL); |
| |
954 purple_request_fields_add_group(fields, group); |
| |
955 |
| |
956 field = purple_request_field_string_new("password", _("Enter Password"), NULL, FALSE); |
| |
957 purple_request_field_string_set_masked(field, TRUE); |
| |
958 purple_request_field_set_required(field, TRUE); |
| |
959 purple_request_field_group_add_field(group, field); |
| |
960 |
| |
961 field = purple_request_field_bool_new("remember", _("Save password"), FALSE); |
| |
962 purple_request_field_group_add_field(group, field); |
| |
963 |
| |
964 purple_request_fields(account, |
| |
965 NULL, |
| |
966 primary, |
| |
967 NULL, |
| |
968 fields, |
| |
969 _("OK"), ok_cb, |
| |
970 _("Cancel"), cancel_cb, |
| |
971 user_data); |
| |
972 g_free(primary); |
| |
973 } |
| |
974 |
| |
975 void |
| |
976 purple_account_connect(PurpleAccount *account) |
| |
977 { |
| |
978 PurplePlugin *prpl; |
| |
979 PurplePluginProtocolInfo *prpl_info; |
| |
980 const char *password; |
| |
981 |
| |
982 g_return_if_fail(account != NULL); |
| |
983 |
| |
984 purple_debug_info("account", "Connecting to account %s\n", |
| |
985 purple_account_get_username(account)); |
| |
986 |
| |
987 if (!purple_account_get_enabled(account, purple_core_get_ui())) |
| |
988 return; |
| |
989 |
| |
990 prpl = purple_find_prpl(purple_account_get_protocol_id(account)); |
| |
991 if (prpl == NULL) |
| |
992 { |
| |
993 gchar *message; |
| |
994 |
| |
995 message = g_strdup_printf(_("Missing protocol plugin for %s"), |
| |
996 purple_account_get_username(account)); |
| |
997 purple_notify_error(account, _("Connection Error"), message, NULL); |
| |
998 g_free(message); |
| |
999 return; |
| |
1000 } |
| |
1001 |
| |
1002 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); |
| |
1003 password = purple_account_get_password(account); |
| |
1004 if ((password == NULL) && |
| |
1005 !(prpl_info->options & OPT_PROTO_NO_PASSWORD) && |
| |
1006 !(prpl_info->options & OPT_PROTO_PASSWORD_OPTIONAL)) |
| |
1007 purple_account_request_password(account, G_CALLBACK(request_password_ok_cb), NULL, account); |
| |
1008 else |
| |
1009 purple_connection_new(account, FALSE, password); |
| |
1010 } |
| |
1011 |
| |
1012 void |
| |
1013 purple_account_disconnect(PurpleAccount *account) |
| |
1014 { |
| |
1015 PurpleConnection *gc; |
| |
1016 |
| |
1017 g_return_if_fail(account != NULL); |
| |
1018 g_return_if_fail(!purple_account_is_disconnected(account)); |
| |
1019 |
| |
1020 purple_debug_info("account", "Disconnecting account %p\n", account); |
| |
1021 |
| |
1022 account->disconnecting = TRUE; |
| |
1023 |
| |
1024 gc = purple_account_get_connection(account); |
| |
1025 purple_connection_destroy(gc); |
| |
1026 if (!purple_account_get_remember_password(account)) |
| |
1027 purple_account_set_password(account, NULL); |
| |
1028 purple_account_set_connection(account, NULL); |
| |
1029 |
| |
1030 account->disconnecting = FALSE; |
| |
1031 } |
| |
1032 |
| |
1033 void |
| |
1034 purple_account_notify_added(PurpleAccount *account, const char *remote_user, |
| |
1035 const char *id, const char *alias, |
| |
1036 const char *message) |
| |
1037 { |
| |
1038 PurpleAccountUiOps *ui_ops; |
| |
1039 |
| |
1040 g_return_if_fail(account != NULL); |
| |
1041 g_return_if_fail(remote_user != NULL); |
| |
1042 |
| |
1043 ui_ops = purple_accounts_get_ui_ops(); |
| |
1044 |
| |
1045 if (ui_ops != NULL && ui_ops->notify_added != NULL) |
| |
1046 ui_ops->notify_added(account, remote_user, id, alias, message); |
| |
1047 } |
| |
1048 |
| |
1049 void |
| |
1050 purple_account_request_add(PurpleAccount *account, const char *remote_user, |
| |
1051 const char *id, const char *alias, |
| |
1052 const char *message) |
| |
1053 { |
| |
1054 PurpleAccountUiOps *ui_ops; |
| |
1055 |
| |
1056 g_return_if_fail(account != NULL); |
| |
1057 g_return_if_fail(remote_user != NULL); |
| |
1058 |
| |
1059 ui_ops = purple_accounts_get_ui_ops(); |
| |
1060 |
| |
1061 if (ui_ops != NULL && ui_ops->request_add != NULL) |
| |
1062 ui_ops->request_add(account, remote_user, id, alias, message); |
| |
1063 } |
| |
1064 |
| |
1065 static void |
| |
1066 purple_account_request_close_info(PurpleAccountRequestInfo *info) |
| |
1067 { |
| |
1068 PurpleAccountUiOps *ops; |
| |
1069 |
| |
1070 ops = purple_accounts_get_ui_ops(); |
| |
1071 |
| |
1072 if (ops != NULL && ops->close_account_request != NULL) |
| |
1073 ops->close_account_request(info->ui_handle); |
| |
1074 |
| |
1075 g_free(info); |
| |
1076 } |
| |
1077 |
| |
1078 void |
| |
1079 purple_account_request_close_with_account(PurpleAccount *account) |
| |
1080 { |
| |
1081 GList *l, *l_next; |
| |
1082 |
| |
1083 g_return_if_fail(account != NULL); |
| |
1084 |
| |
1085 for (l = handles; l != NULL; l = l_next) { |
| |
1086 PurpleAccountRequestInfo *info = l->data; |
| |
1087 |
| |
1088 l_next = l->next; |
| |
1089 |
| |
1090 if (info->account == account) { |
| |
1091 handles = g_list_remove(handles, info); |
| |
1092 purple_account_request_close_info(info); |
| |
1093 } |
| |
1094 } |
| |
1095 } |
| |
1096 |
| |
1097 void |
| |
1098 purple_account_request_close(void *ui_handle) |
| |
1099 { |
| |
1100 GList *l, *l_next; |
| |
1101 |
| |
1102 g_return_if_fail(ui_handle != NULL); |
| |
1103 |
| |
1104 for (l = handles; l != NULL; l = l_next) { |
| |
1105 PurpleAccountRequestInfo *info = l->data; |
| |
1106 |
| |
1107 l_next = l->next; |
| |
1108 |
| |
1109 if (info->ui_handle == ui_handle) { |
| |
1110 handles = g_list_remove(handles, info); |
| |
1111 purple_account_request_close_info(info); |
| |
1112 } |
| |
1113 } |
| |
1114 } |
| |
1115 |
| |
1116 void * |
| |
1117 purple_account_request_authorization(PurpleAccount *account, const char *remote_user, |
| |
1118 const char *id, const char *alias, const char *message, gboolean on_list, |
| |
1119 GCallback auth_cb, GCallback deny_cb, void *user_data) |
| |
1120 { |
| |
1121 PurpleAccountUiOps *ui_ops; |
| |
1122 PurpleAccountRequestInfo *info; |
| |
1123 |
| |
1124 g_return_val_if_fail(account != NULL, NULL); |
| |
1125 g_return_val_if_fail(remote_user != NULL, NULL); |
| |
1126 |
| |
1127 ui_ops = purple_accounts_get_ui_ops(); |
| |
1128 |
| |
1129 if (ui_ops != NULL && ui_ops->request_authorize != NULL) { |
| |
1130 info = g_new0(PurpleAccountRequestInfo, 1); |
| |
1131 info->type = PURPLE_ACCOUNT_REQUEST_AUTHORIZATION; |
| |
1132 info->account = account; |
| |
1133 info->ui_handle = ui_ops->request_authorize(account, remote_user, id, alias, message, |
| |
1134 on_list, auth_cb, deny_cb, user_data); |
| |
1135 |
| |
1136 handles = g_list_append(handles, info); |
| |
1137 return info->ui_handle; |
| |
1138 } |
| |
1139 |
| |
1140 return NULL; |
| |
1141 } |
| |
1142 |
| |
1143 static void |
| |
1144 change_password_cb(PurpleAccount *account, PurpleRequestFields *fields) |
| |
1145 { |
| |
1146 const char *orig_pass, *new_pass_1, *new_pass_2; |
| |
1147 |
| |
1148 orig_pass = purple_request_fields_get_string(fields, "password"); |
| |
1149 new_pass_1 = purple_request_fields_get_string(fields, "new_password_1"); |
| |
1150 new_pass_2 = purple_request_fields_get_string(fields, "new_password_2"); |
| |
1151 |
| |
1152 if (g_utf8_collate(new_pass_1, new_pass_2)) |
| |
1153 { |
| |
1154 purple_notify_error(account, NULL, |
| |
1155 _("New passwords do not match."), NULL); |
| |
1156 |
| |
1157 return; |
| |
1158 } |
| |
1159 |
| |
1160 if (orig_pass == NULL || new_pass_1 == NULL || new_pass_2 == NULL || |
| |
1161 *orig_pass == '\0' || *new_pass_1 == '\0' || *new_pass_2 == '\0') |
| |
1162 { |
| |
1163 purple_notify_error(account, NULL, |
| |
1164 _("Fill out all fields completely."), NULL); |
| |
1165 return; |
| |
1166 } |
| |
1167 |
| |
1168 purple_account_change_password(account, orig_pass, new_pass_1); |
| |
1169 } |
| |
1170 |
| |
1171 void |
| |
1172 purple_account_request_change_password(PurpleAccount *account) |
| |
1173 { |
| |
1174 PurpleRequestFields *fields; |
| |
1175 PurpleRequestFieldGroup *group; |
| |
1176 PurpleRequestField *field; |
| |
1177 char primary[256]; |
| |
1178 |
| |
1179 g_return_if_fail(account != NULL); |
| |
1180 g_return_if_fail(purple_account_is_connected(account)); |
| |
1181 |
| |
1182 fields = purple_request_fields_new(); |
| |
1183 |
| |
1184 group = purple_request_field_group_new(NULL); |
| |
1185 purple_request_fields_add_group(fields, group); |
| |
1186 |
| |
1187 field = purple_request_field_string_new("password", _("Original password"), |
| |
1188 NULL, FALSE); |
| |
1189 purple_request_field_string_set_masked(field, TRUE); |
| |
1190 purple_request_field_set_required(field, TRUE); |
| |
1191 purple_request_field_group_add_field(group, field); |
| |
1192 |
| |
1193 field = purple_request_field_string_new("new_password_1", |
| |
1194 _("New password"), |
| |
1195 NULL, FALSE); |
| |
1196 purple_request_field_string_set_masked(field, TRUE); |
| |
1197 purple_request_field_set_required(field, TRUE); |
| |
1198 purple_request_field_group_add_field(group, field); |
| |
1199 |
| |
1200 field = purple_request_field_string_new("new_password_2", |
| |
1201 _("New password (again)"), |
| |
1202 NULL, FALSE); |
| |
1203 purple_request_field_string_set_masked(field, TRUE); |
| |
1204 purple_request_field_set_required(field, TRUE); |
| |
1205 purple_request_field_group_add_field(group, field); |
| |
1206 |
| |
1207 g_snprintf(primary, sizeof(primary), _("Change password for %s"), |
| |
1208 purple_account_get_username(account)); |
| |
1209 |
| |
1210 /* I'm sticking this somewhere in the code: bologna */ |
| |
1211 |
| |
1212 purple_request_fields(purple_account_get_connection(account), |
| |
1213 NULL, |
| |
1214 primary, |
| |
1215 _("Please enter your current password and your " |
| |
1216 "new password."), |
| |
1217 fields, |
| |
1218 _("OK"), G_CALLBACK(change_password_cb), |
| |
1219 _("Cancel"), NULL, |
| |
1220 account); |
| |
1221 } |
| |
1222 |
| |
1223 static void |
| |
1224 set_user_info_cb(PurpleAccount *account, const char *user_info) |
| |
1225 { |
| |
1226 PurpleConnection *gc; |
| |
1227 |
| |
1228 purple_account_set_user_info(account, user_info); |
| |
1229 gc = purple_account_get_connection(account); |
| |
1230 serv_set_info(gc, user_info); |
| |
1231 } |
| |
1232 |
| |
1233 void |
| |
1234 purple_account_request_change_user_info(PurpleAccount *account) |
| |
1235 { |
| |
1236 PurpleConnection *gc; |
| |
1237 char primary[256]; |
| |
1238 |
| |
1239 g_return_if_fail(account != NULL); |
| |
1240 g_return_if_fail(purple_account_is_connected(account)); |
| |
1241 |
| |
1242 gc = purple_account_get_connection(account); |
| |
1243 |
| |
1244 g_snprintf(primary, sizeof(primary), |
| |
1245 _("Change user information for %s"), |
| |
1246 purple_account_get_username(account)); |
| |
1247 |
| |
1248 purple_request_input(gc, _("Set User Info"), primary, NULL, |
| |
1249 purple_account_get_user_info(account), |
| |
1250 TRUE, FALSE, ((gc != NULL) && |
| |
1251 (gc->flags & PURPLE_CONNECTION_HTML) ? "html" : NULL), |
| |
1252 _("Save"), G_CALLBACK(set_user_info_cb), |
| |
1253 _("Cancel"), NULL, account); |
| |
1254 } |
| |
1255 |
| |
1256 void |
| |
1257 purple_account_set_username(PurpleAccount *account, const char *username) |
| |
1258 { |
| |
1259 g_return_if_fail(account != NULL); |
| |
1260 |
| |
1261 g_free(account->username); |
| |
1262 account->username = g_strdup(username); |
| |
1263 |
| |
1264 schedule_accounts_save(); |
| |
1265 |
| |
1266 /* if the name changes, we should re-write the buddy list |
| |
1267 * to disk with the new name */ |
| |
1268 purple_blist_schedule_save(); |
| |
1269 } |
| |
1270 |
| |
1271 void |
| |
1272 purple_account_set_password(PurpleAccount *account, const char *password) |
| |
1273 { |
| |
1274 g_return_if_fail(account != NULL); |
| |
1275 |
| |
1276 g_free(account->password); |
| |
1277 account->password = g_strdup(password); |
| |
1278 |
| |
1279 schedule_accounts_save(); |
| |
1280 } |
| |
1281 |
| |
1282 void |
| |
1283 purple_account_set_alias(PurpleAccount *account, const char *alias) |
| |
1284 { |
| |
1285 g_return_if_fail(account != NULL); |
| |
1286 |
| |
1287 /* |
| |
1288 * Do nothing if alias and account->alias are both NULL. Or if |
| |
1289 * they're the exact same string. |
| |
1290 */ |
| |
1291 if (alias == account->alias) |
| |
1292 return; |
| |
1293 |
| |
1294 if ((!alias && account->alias) || (alias && !account->alias) || |
| |
1295 g_utf8_collate(account->alias, alias)) |
| |
1296 { |
| |
1297 char *old = account->alias; |
| |
1298 |
| |
1299 account->alias = g_strdup(alias); |
| |
1300 purple_signal_emit(purple_accounts_get_handle(), "account-alias-changed", |
| |
1301 account, old); |
| |
1302 g_free(old); |
| |
1303 |
| |
1304 schedule_accounts_save(); |
| |
1305 } |
| |
1306 } |
| |
1307 |
| |
1308 void |
| |
1309 purple_account_set_user_info(PurpleAccount *account, const char *user_info) |
| |
1310 { |
| |
1311 g_return_if_fail(account != NULL); |
| |
1312 |
| |
1313 g_free(account->user_info); |
| |
1314 account->user_info = g_strdup(user_info); |
| |
1315 |
| |
1316 schedule_accounts_save(); |
| |
1317 } |
| |
1318 |
| |
1319 void |
| |
1320 purple_account_set_buddy_icon(PurpleAccount *account, const char *icon) |
| |
1321 { |
| |
1322 g_return_if_fail(account != NULL); |
| |
1323 |
| |
1324 /* Delete an existing icon from the cache. */ |
| |
1325 if (account->buddy_icon != NULL && (icon == NULL || strcmp(account->buddy_icon, icon))) |
| |
1326 { |
| |
1327 const char *dirname = purple_buddy_icons_get_cache_dir(); |
| |
1328 |
| |
1329 if (g_file_test(account->buddy_icon, G_FILE_TEST_IS_REGULAR)) |
| |
1330 { |
| |
1331 /* The file exists. This is a full path. */ |
| |
1332 |
| |
1333 /* XXX: This is a hack so we only delete the file if it's |
| |
1334 * in the cache dir. Otherwise, people who upgrade (who |
| |
1335 * may have buddy icon filenames set outside of the cache |
| |
1336 * dir) could lose files. */ |
| |
1337 if (!strncmp(dirname, account->buddy_icon, strlen(dirname))) |
| |
1338 g_unlink(account->buddy_icon); |
| |
1339 } |
| |
1340 else |
| |
1341 { |
| |
1342 char *filename = g_build_filename(dirname, account->buddy_icon, NULL); |
| |
1343 g_unlink(filename); |
| |
1344 g_free(filename); |
| |
1345 } |
| |
1346 } |
| |
1347 |
| |
1348 g_free(account->buddy_icon); |
| |
1349 account->buddy_icon = g_strdup(icon); |
| |
1350 if (purple_account_is_connected(account)) |
| |
1351 { |
| |
1352 PurpleConnection *gc; |
| |
1353 PurplePluginProtocolInfo *prpl_info; |
| |
1354 |
| |
1355 gc = purple_account_get_connection(account); |
| |
1356 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
1357 |
| |
1358 if (prpl_info && prpl_info->set_buddy_icon) |
| |
1359 { |
| |
1360 char *cached_path = purple_buddy_icons_get_full_path(icon); |
| |
1361 prpl_info->set_buddy_icon(gc, cached_path); |
| |
1362 g_free(cached_path); |
| |
1363 } |
| |
1364 } |
| |
1365 |
| |
1366 schedule_accounts_save(); |
| |
1367 } |
| |
1368 |
| |
1369 void purple_account_set_buddy_icon_path(PurpleAccount *account, const char *path) |
| |
1370 { |
| |
1371 g_return_if_fail(account != NULL); |
| |
1372 |
| |
1373 g_free(account->buddy_icon_path); |
| |
1374 account->buddy_icon_path = g_strdup(path); |
| |
1375 |
| |
1376 schedule_accounts_save(); |
| |
1377 } |
| |
1378 |
| |
1379 void |
| |
1380 purple_account_set_protocol_id(PurpleAccount *account, const char *protocol_id) |
| |
1381 { |
| |
1382 g_return_if_fail(account != NULL); |
| |
1383 g_return_if_fail(protocol_id != NULL); |
| |
1384 |
| |
1385 g_free(account->protocol_id); |
| |
1386 account->protocol_id = g_strdup(protocol_id); |
| |
1387 |
| |
1388 schedule_accounts_save(); |
| |
1389 } |
| |
1390 |
| |
1391 void |
| |
1392 purple_account_set_connection(PurpleAccount *account, PurpleConnection *gc) |
| |
1393 { |
| |
1394 g_return_if_fail(account != NULL); |
| |
1395 |
| |
1396 account->gc = gc; |
| |
1397 } |
| |
1398 |
| |
1399 void |
| |
1400 purple_account_set_remember_password(PurpleAccount *account, gboolean value) |
| |
1401 { |
| |
1402 g_return_if_fail(account != NULL); |
| |
1403 |
| |
1404 account->remember_pass = value; |
| |
1405 |
| |
1406 schedule_accounts_save(); |
| |
1407 } |
| |
1408 |
| |
1409 void |
| |
1410 purple_account_set_check_mail(PurpleAccount *account, gboolean value) |
| |
1411 { |
| |
1412 g_return_if_fail(account != NULL); |
| |
1413 |
| |
1414 purple_account_set_bool(account, "check-mail", value); |
| |
1415 } |
| |
1416 |
| |
1417 void |
| |
1418 purple_account_set_enabled(PurpleAccount *account, const char *ui, |
| |
1419 gboolean value) |
| |
1420 { |
| |
1421 PurpleConnection *gc; |
| |
1422 gboolean was_enabled = FALSE; |
| |
1423 |
| |
1424 g_return_if_fail(account != NULL); |
| |
1425 g_return_if_fail(ui != NULL); |
| |
1426 |
| |
1427 was_enabled = purple_account_get_enabled(account, ui); |
| |
1428 |
| |
1429 purple_account_set_ui_bool(account, ui, "auto-login", value); |
| |
1430 gc = purple_account_get_connection(account); |
| |
1431 |
| |
1432 if(was_enabled && !value) |
| |
1433 purple_signal_emit(purple_accounts_get_handle(), "account-disabled", account); |
| |
1434 else if(!was_enabled && value) |
| |
1435 purple_signal_emit(purple_accounts_get_handle(), "account-enabled", account); |
| |
1436 |
| |
1437 if ((gc != NULL) && (gc->wants_to_die == TRUE)) |
| |
1438 return; |
| |
1439 |
| |
1440 if (value && purple_presence_is_online(account->presence)) |
| |
1441 purple_account_connect(account); |
| |
1442 else if (!value && !purple_account_is_disconnected(account)) |
| |
1443 purple_account_disconnect(account); |
| |
1444 } |
| |
1445 |
| |
1446 void |
| |
1447 purple_account_set_proxy_info(PurpleAccount *account, PurpleProxyInfo *info) |
| |
1448 { |
| |
1449 g_return_if_fail(account != NULL); |
| |
1450 |
| |
1451 if (account->proxy_info != NULL) |
| |
1452 purple_proxy_info_destroy(account->proxy_info); |
| |
1453 |
| |
1454 account->proxy_info = info; |
| |
1455 |
| |
1456 schedule_accounts_save(); |
| |
1457 } |
| |
1458 |
| |
1459 void |
| |
1460 purple_account_set_status_types(PurpleAccount *account, GList *status_types) |
| |
1461 { |
| |
1462 g_return_if_fail(account != NULL); |
| |
1463 |
| |
1464 /* Out with the old... */ |
| |
1465 if (account->status_types != NULL) |
| |
1466 { |
| |
1467 g_list_foreach(account->status_types, (GFunc)purple_status_type_destroy, NULL); |
| |
1468 g_list_free(account->status_types); |
| |
1469 } |
| |
1470 |
| |
1471 /* In with the new... */ |
| |
1472 account->status_types = status_types; |
| |
1473 } |
| |
1474 |
| |
1475 void |
| |
1476 purple_account_set_status(PurpleAccount *account, const char *status_id, |
| |
1477 gboolean active, ...) |
| |
1478 { |
| |
1479 GList *attrs = NULL; |
| |
1480 const gchar *id; |
| |
1481 gpointer data; |
| |
1482 va_list args; |
| |
1483 |
| |
1484 va_start(args, active); |
| |
1485 while ((id = va_arg(args, const char *)) != NULL) |
| |
1486 { |
| |
1487 attrs = g_list_append(attrs, (char *)id); |
| |
1488 data = va_arg(args, void *); |
| |
1489 attrs = g_list_append(attrs, data); |
| |
1490 } |
| |
1491 purple_account_set_status_list(account, status_id, active, attrs); |
| |
1492 g_list_free(attrs); |
| |
1493 va_end(args); |
| |
1494 } |
| |
1495 |
| |
1496 void |
| |
1497 purple_account_set_status_list(PurpleAccount *account, const char *status_id, |
| |
1498 gboolean active, GList *attrs) |
| |
1499 { |
| |
1500 PurpleStatus *status; |
| |
1501 |
| |
1502 g_return_if_fail(account != NULL); |
| |
1503 g_return_if_fail(status_id != NULL); |
| |
1504 |
| |
1505 status = purple_account_get_status(account, status_id); |
| |
1506 if (status == NULL) |
| |
1507 { |
| |
1508 purple_debug_error("account", |
| |
1509 "Invalid status ID %s for account %s (%s)\n", |
| |
1510 status_id, purple_account_get_username(account), |
| |
1511 purple_account_get_protocol_id(account)); |
| |
1512 return; |
| |
1513 } |
| |
1514 |
| |
1515 if (active || purple_status_is_independent(status)) |
| |
1516 purple_status_set_active_with_attrs_list(status, active, attrs); |
| |
1517 |
| |
1518 /* |
| |
1519 * Our current statuses are saved to accounts.xml (so that when we |
| |
1520 * reconnect, we go back to the previous status). |
| |
1521 */ |
| |
1522 schedule_accounts_save(); |
| |
1523 } |
| |
1524 |
| |
1525 void |
| |
1526 purple_account_clear_settings(PurpleAccount *account) |
| |
1527 { |
| |
1528 g_return_if_fail(account != NULL); |
| |
1529 |
| |
1530 g_hash_table_destroy(account->settings); |
| |
1531 |
| |
1532 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| |
1533 g_free, delete_setting); |
| |
1534 } |
| |
1535 |
| |
1536 void |
| |
1537 purple_account_set_int(PurpleAccount *account, const char *name, int value) |
| |
1538 { |
| |
1539 PurpleAccountSetting *setting; |
| |
1540 |
| |
1541 g_return_if_fail(account != NULL); |
| |
1542 g_return_if_fail(name != NULL); |
| |
1543 |
| |
1544 setting = g_new0(PurpleAccountSetting, 1); |
| |
1545 |
| |
1546 setting->type = PURPLE_PREF_INT; |
| |
1547 setting->value.integer = value; |
| |
1548 |
| |
1549 g_hash_table_insert(account->settings, g_strdup(name), setting); |
| |
1550 |
| |
1551 schedule_accounts_save(); |
| |
1552 } |
| |
1553 |
| |
1554 void |
| |
1555 purple_account_set_string(PurpleAccount *account, const char *name, |
| |
1556 const char *value) |
| |
1557 { |
| |
1558 PurpleAccountSetting *setting; |
| |
1559 |
| |
1560 g_return_if_fail(account != NULL); |
| |
1561 g_return_if_fail(name != NULL); |
| |
1562 |
| |
1563 setting = g_new0(PurpleAccountSetting, 1); |
| |
1564 |
| |
1565 setting->type = PURPLE_PREF_STRING; |
| |
1566 setting->value.string = g_strdup(value); |
| |
1567 |
| |
1568 g_hash_table_insert(account->settings, g_strdup(name), setting); |
| |
1569 |
| |
1570 schedule_accounts_save(); |
| |
1571 } |
| |
1572 |
| |
1573 void |
| |
1574 purple_account_set_bool(PurpleAccount *account, const char *name, gboolean value) |
| |
1575 { |
| |
1576 PurpleAccountSetting *setting; |
| |
1577 |
| |
1578 g_return_if_fail(account != NULL); |
| |
1579 g_return_if_fail(name != NULL); |
| |
1580 |
| |
1581 setting = g_new0(PurpleAccountSetting, 1); |
| |
1582 |
| |
1583 setting->type = PURPLE_PREF_BOOLEAN; |
| |
1584 setting->value.bool = value; |
| |
1585 |
| |
1586 g_hash_table_insert(account->settings, g_strdup(name), setting); |
| |
1587 |
| |
1588 schedule_accounts_save(); |
| |
1589 } |
| |
1590 |
| |
1591 static GHashTable * |
| |
1592 get_ui_settings_table(PurpleAccount *account, const char *ui) |
| |
1593 { |
| |
1594 GHashTable *table; |
| |
1595 |
| |
1596 table = g_hash_table_lookup(account->ui_settings, ui); |
| |
1597 |
| |
1598 if (table == NULL) { |
| |
1599 table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
| |
1600 delete_setting); |
| |
1601 g_hash_table_insert(account->ui_settings, g_strdup(ui), table); |
| |
1602 } |
| |
1603 |
| |
1604 return table; |
| |
1605 } |
| |
1606 |
| |
1607 void |
| |
1608 purple_account_set_ui_int(PurpleAccount *account, const char *ui, |
| |
1609 const char *name, int value) |
| |
1610 { |
| |
1611 PurpleAccountSetting *setting; |
| |
1612 GHashTable *table; |
| |
1613 |
| |
1614 g_return_if_fail(account != NULL); |
| |
1615 g_return_if_fail(ui != NULL); |
| |
1616 g_return_if_fail(name != NULL); |
| |
1617 |
| |
1618 setting = g_new0(PurpleAccountSetting, 1); |
| |
1619 |
| |
1620 setting->type = PURPLE_PREF_INT; |
| |
1621 setting->ui = g_strdup(ui); |
| |
1622 setting->value.integer = value; |
| |
1623 |
| |
1624 table = get_ui_settings_table(account, ui); |
| |
1625 |
| |
1626 g_hash_table_insert(table, g_strdup(name), setting); |
| |
1627 |
| |
1628 schedule_accounts_save(); |
| |
1629 } |
| |
1630 |
| |
1631 void |
| |
1632 purple_account_set_ui_string(PurpleAccount *account, const char *ui, |
| |
1633 const char *name, const char *value) |
| |
1634 { |
| |
1635 PurpleAccountSetting *setting; |
| |
1636 GHashTable *table; |
| |
1637 |
| |
1638 g_return_if_fail(account != NULL); |
| |
1639 g_return_if_fail(ui != NULL); |
| |
1640 g_return_if_fail(name != NULL); |
| |
1641 |
| |
1642 setting = g_new0(PurpleAccountSetting, 1); |
| |
1643 |
| |
1644 setting->type = PURPLE_PREF_STRING; |
| |
1645 setting->ui = g_strdup(ui); |
| |
1646 setting->value.string = g_strdup(value); |
| |
1647 |
| |
1648 table = get_ui_settings_table(account, ui); |
| |
1649 |
| |
1650 g_hash_table_insert(table, g_strdup(name), setting); |
| |
1651 |
| |
1652 schedule_accounts_save(); |
| |
1653 } |
| |
1654 |
| |
1655 void |
| |
1656 purple_account_set_ui_bool(PurpleAccount *account, const char *ui, |
| |
1657 const char *name, gboolean value) |
| |
1658 { |
| |
1659 PurpleAccountSetting *setting; |
| |
1660 GHashTable *table; |
| |
1661 |
| |
1662 g_return_if_fail(account != NULL); |
| |
1663 g_return_if_fail(ui != NULL); |
| |
1664 g_return_if_fail(name != NULL); |
| |
1665 |
| |
1666 setting = g_new0(PurpleAccountSetting, 1); |
| |
1667 |
| |
1668 setting->type = PURPLE_PREF_BOOLEAN; |
| |
1669 setting->ui = g_strdup(ui); |
| |
1670 setting->value.bool = value; |
| |
1671 |
| |
1672 table = get_ui_settings_table(account, ui); |
| |
1673 |
| |
1674 g_hash_table_insert(table, g_strdup(name), setting); |
| |
1675 |
| |
1676 schedule_accounts_save(); |
| |
1677 } |
| |
1678 |
| |
1679 static PurpleConnectionState |
| |
1680 purple_account_get_state(const PurpleAccount *account) |
| |
1681 { |
| |
1682 PurpleConnection *gc; |
| |
1683 |
| |
1684 g_return_val_if_fail(account != NULL, PURPLE_DISCONNECTED); |
| |
1685 |
| |
1686 gc = purple_account_get_connection(account); |
| |
1687 if (!gc) |
| |
1688 return PURPLE_DISCONNECTED; |
| |
1689 |
| |
1690 return purple_connection_get_state(gc); |
| |
1691 } |
| |
1692 |
| |
1693 gboolean |
| |
1694 purple_account_is_connected(const PurpleAccount *account) |
| |
1695 { |
| |
1696 return (purple_account_get_state(account) == PURPLE_CONNECTED); |
| |
1697 } |
| |
1698 |
| |
1699 gboolean |
| |
1700 purple_account_is_connecting(const PurpleAccount *account) |
| |
1701 { |
| |
1702 return (purple_account_get_state(account) == PURPLE_CONNECTING); |
| |
1703 } |
| |
1704 |
| |
1705 gboolean |
| |
1706 purple_account_is_disconnected(const PurpleAccount *account) |
| |
1707 { |
| |
1708 return (purple_account_get_state(account) == PURPLE_DISCONNECTED); |
| |
1709 } |
| |
1710 |
| |
1711 const char * |
| |
1712 purple_account_get_username(const PurpleAccount *account) |
| |
1713 { |
| |
1714 g_return_val_if_fail(account != NULL, NULL); |
| |
1715 |
| |
1716 return account->username; |
| |
1717 } |
| |
1718 |
| |
1719 const char * |
| |
1720 purple_account_get_password(const PurpleAccount *account) |
| |
1721 { |
| |
1722 g_return_val_if_fail(account != NULL, NULL); |
| |
1723 |
| |
1724 return account->password; |
| |
1725 } |
| |
1726 |
| |
1727 const char * |
| |
1728 purple_account_get_alias(const PurpleAccount *account) |
| |
1729 { |
| |
1730 g_return_val_if_fail(account != NULL, NULL); |
| |
1731 |
| |
1732 return account->alias; |
| |
1733 } |
| |
1734 |
| |
1735 const char * |
| |
1736 purple_account_get_user_info(const PurpleAccount *account) |
| |
1737 { |
| |
1738 g_return_val_if_fail(account != NULL, NULL); |
| |
1739 |
| |
1740 return account->user_info; |
| |
1741 } |
| |
1742 |
| |
1743 const char * |
| |
1744 purple_account_get_buddy_icon(const PurpleAccount *account) |
| |
1745 { |
| |
1746 g_return_val_if_fail(account != NULL, NULL); |
| |
1747 |
| |
1748 return account->buddy_icon; |
| |
1749 } |
| |
1750 |
| |
1751 const char * |
| |
1752 purple_account_get_buddy_icon_path(const PurpleAccount *account) |
| |
1753 { |
| |
1754 g_return_val_if_fail(account != NULL, NULL); |
| |
1755 |
| |
1756 return account->buddy_icon_path; |
| |
1757 } |
| |
1758 |
| |
1759 const char * |
| |
1760 purple_account_get_protocol_id(const PurpleAccount *account) |
| |
1761 { |
| |
1762 g_return_val_if_fail(account != NULL, NULL); |
| |
1763 /* |
| |
1764 * HACK by Seanegan |
| |
1765 */ |
| |
1766 if (!strcmp(account->protocol_id, "prpl-oscar")) { |
| |
1767 if (isdigit(account->username[0])) |
| |
1768 return "prpl-icq"; |
| |
1769 else |
| |
1770 return "prpl-aim"; |
| |
1771 } |
| |
1772 return account->protocol_id; |
| |
1773 } |
| |
1774 |
| |
1775 const char * |
| |
1776 purple_account_get_protocol_name(const PurpleAccount *account) |
| |
1777 { |
| |
1778 PurplePlugin *p; |
| |
1779 |
| |
1780 g_return_val_if_fail(account != NULL, NULL); |
| |
1781 |
| |
1782 p = purple_find_prpl(purple_account_get_protocol_id(account)); |
| |
1783 |
| |
1784 return ((p && p->info->name) ? _(p->info->name) : _("Unknown")); |
| |
1785 } |
| |
1786 |
| |
1787 PurpleConnection * |
| |
1788 purple_account_get_connection(const PurpleAccount *account) |
| |
1789 { |
| |
1790 g_return_val_if_fail(account != NULL, NULL); |
| |
1791 |
| |
1792 return account->gc; |
| |
1793 } |
| |
1794 |
| |
1795 gboolean |
| |
1796 purple_account_get_remember_password(const PurpleAccount *account) |
| |
1797 { |
| |
1798 g_return_val_if_fail(account != NULL, FALSE); |
| |
1799 |
| |
1800 return account->remember_pass; |
| |
1801 } |
| |
1802 |
| |
1803 gboolean |
| |
1804 purple_account_get_check_mail(const PurpleAccount *account) |
| |
1805 { |
| |
1806 g_return_val_if_fail(account != NULL, FALSE); |
| |
1807 |
| |
1808 return purple_account_get_bool(account, "check-mail", FALSE); |
| |
1809 } |
| |
1810 |
| |
1811 gboolean |
| |
1812 purple_account_get_enabled(const PurpleAccount *account, const char *ui) |
| |
1813 { |
| |
1814 g_return_val_if_fail(account != NULL, FALSE); |
| |
1815 g_return_val_if_fail(ui != NULL, FALSE); |
| |
1816 |
| |
1817 return purple_account_get_ui_bool(account, ui, "auto-login", FALSE); |
| |
1818 } |
| |
1819 |
| |
1820 PurpleProxyInfo * |
| |
1821 purple_account_get_proxy_info(const PurpleAccount *account) |
| |
1822 { |
| |
1823 g_return_val_if_fail(account != NULL, NULL); |
| |
1824 |
| |
1825 return account->proxy_info; |
| |
1826 } |
| |
1827 |
| |
1828 PurpleStatus * |
| |
1829 purple_account_get_active_status(const PurpleAccount *account) |
| |
1830 { |
| |
1831 g_return_val_if_fail(account != NULL, NULL); |
| |
1832 |
| |
1833 return purple_presence_get_active_status(account->presence); |
| |
1834 } |
| |
1835 |
| |
1836 PurpleStatus * |
| |
1837 purple_account_get_status(const PurpleAccount *account, const char *status_id) |
| |
1838 { |
| |
1839 g_return_val_if_fail(account != NULL, NULL); |
| |
1840 g_return_val_if_fail(status_id != NULL, NULL); |
| |
1841 |
| |
1842 return purple_presence_get_status(account->presence, status_id); |
| |
1843 } |
| |
1844 |
| |
1845 PurpleStatusType * |
| |
1846 purple_account_get_status_type(const PurpleAccount *account, const char *id) |
| |
1847 { |
| |
1848 const GList *l; |
| |
1849 |
| |
1850 g_return_val_if_fail(account != NULL, NULL); |
| |
1851 g_return_val_if_fail(id != NULL, NULL); |
| |
1852 |
| |
1853 for (l = purple_account_get_status_types(account); l != NULL; l = l->next) |
| |
1854 { |
| |
1855 PurpleStatusType *status_type = (PurpleStatusType *)l->data; |
| |
1856 |
| |
1857 if (!strcmp(purple_status_type_get_id(status_type), id)) |
| |
1858 return status_type; |
| |
1859 } |
| |
1860 |
| |
1861 return NULL; |
| |
1862 } |
| |
1863 |
| |
1864 PurpleStatusType * |
| |
1865 purple_account_get_status_type_with_primitive(const PurpleAccount *account, PurpleStatusPrimitive primitive) |
| |
1866 { |
| |
1867 const GList *l; |
| |
1868 |
| |
1869 g_return_val_if_fail(account != NULL, NULL); |
| |
1870 |
| |
1871 for (l = purple_account_get_status_types(account); l != NULL; l = l->next) |
| |
1872 { |
| |
1873 PurpleStatusType *status_type = (PurpleStatusType *)l->data; |
| |
1874 |
| |
1875 if (purple_status_type_get_primitive(status_type) == primitive) |
| |
1876 return status_type; |
| |
1877 } |
| |
1878 |
| |
1879 return NULL; |
| |
1880 } |
| |
1881 |
| |
1882 PurplePresence * |
| |
1883 purple_account_get_presence(const PurpleAccount *account) |
| |
1884 { |
| |
1885 g_return_val_if_fail(account != NULL, NULL); |
| |
1886 |
| |
1887 return account->presence; |
| |
1888 } |
| |
1889 |
| |
1890 gboolean |
| |
1891 purple_account_is_status_active(const PurpleAccount *account, |
| |
1892 const char *status_id) |
| |
1893 { |
| |
1894 g_return_val_if_fail(account != NULL, FALSE); |
| |
1895 g_return_val_if_fail(status_id != NULL, FALSE); |
| |
1896 |
| |
1897 return purple_presence_is_status_active(account->presence, status_id); |
| |
1898 } |
| |
1899 |
| |
1900 const GList * |
| |
1901 purple_account_get_status_types(const PurpleAccount *account) |
| |
1902 { |
| |
1903 g_return_val_if_fail(account != NULL, NULL); |
| |
1904 |
| |
1905 return account->status_types; |
| |
1906 } |
| |
1907 |
| |
1908 int |
| |
1909 purple_account_get_int(const PurpleAccount *account, const char *name, |
| |
1910 int default_value) |
| |
1911 { |
| |
1912 PurpleAccountSetting *setting; |
| |
1913 |
| |
1914 g_return_val_if_fail(account != NULL, default_value); |
| |
1915 g_return_val_if_fail(name != NULL, default_value); |
| |
1916 |
| |
1917 setting = g_hash_table_lookup(account->settings, name); |
| |
1918 |
| |
1919 if (setting == NULL) |
| |
1920 return default_value; |
| |
1921 |
| |
1922 g_return_val_if_fail(setting->type == PURPLE_PREF_INT, default_value); |
| |
1923 |
| |
1924 return setting->value.integer; |
| |
1925 } |
| |
1926 |
| |
1927 const char * |
| |
1928 purple_account_get_string(const PurpleAccount *account, const char *name, |
| |
1929 const char *default_value) |
| |
1930 { |
| |
1931 PurpleAccountSetting *setting; |
| |
1932 |
| |
1933 g_return_val_if_fail(account != NULL, default_value); |
| |
1934 g_return_val_if_fail(name != NULL, default_value); |
| |
1935 |
| |
1936 setting = g_hash_table_lookup(account->settings, name); |
| |
1937 |
| |
1938 if (setting == NULL) |
| |
1939 return default_value; |
| |
1940 |
| |
1941 g_return_val_if_fail(setting->type == PURPLE_PREF_STRING, default_value); |
| |
1942 |
| |
1943 return setting->value.string; |
| |
1944 } |
| |
1945 |
| |
1946 gboolean |
| |
1947 purple_account_get_bool(const PurpleAccount *account, const char *name, |
| |
1948 gboolean default_value) |
| |
1949 { |
| |
1950 PurpleAccountSetting *setting; |
| |
1951 |
| |
1952 g_return_val_if_fail(account != NULL, default_value); |
| |
1953 g_return_val_if_fail(name != NULL, default_value); |
| |
1954 |
| |
1955 setting = g_hash_table_lookup(account->settings, name); |
| |
1956 |
| |
1957 if (setting == NULL) |
| |
1958 return default_value; |
| |
1959 |
| |
1960 g_return_val_if_fail(setting->type == PURPLE_PREF_BOOLEAN, default_value); |
| |
1961 |
| |
1962 return setting->value.bool; |
| |
1963 } |
| |
1964 |
| |
1965 int |
| |
1966 purple_account_get_ui_int(const PurpleAccount *account, const char *ui, |
| |
1967 const char *name, int default_value) |
| |
1968 { |
| |
1969 PurpleAccountSetting *setting; |
| |
1970 GHashTable *table; |
| |
1971 |
| |
1972 g_return_val_if_fail(account != NULL, default_value); |
| |
1973 g_return_val_if_fail(ui != NULL, default_value); |
| |
1974 g_return_val_if_fail(name != NULL, default_value); |
| |
1975 |
| |
1976 if ((table = g_hash_table_lookup(account->ui_settings, ui)) == NULL) |
| |
1977 return default_value; |
| |
1978 |
| |
1979 if ((setting = g_hash_table_lookup(table, name)) == NULL) |
| |
1980 return default_value; |
| |
1981 |
| |
1982 g_return_val_if_fail(setting->type == PURPLE_PREF_INT, default_value); |
| |
1983 |
| |
1984 return setting->value.integer; |
| |
1985 } |
| |
1986 |
| |
1987 const char * |
| |
1988 purple_account_get_ui_string(const PurpleAccount *account, const char *ui, |
| |
1989 const char *name, const char *default_value) |
| |
1990 { |
| |
1991 PurpleAccountSetting *setting; |
| |
1992 GHashTable *table; |
| |
1993 |
| |
1994 g_return_val_if_fail(account != NULL, default_value); |
| |
1995 g_return_val_if_fail(ui != NULL, default_value); |
| |
1996 g_return_val_if_fail(name != NULL, default_value); |
| |
1997 |
| |
1998 if ((table = g_hash_table_lookup(account->ui_settings, ui)) == NULL) |
| |
1999 return default_value; |
| |
2000 |
| |
2001 if ((setting = g_hash_table_lookup(table, name)) == NULL) |
| |
2002 return default_value; |
| |
2003 |
| |
2004 g_return_val_if_fail(setting->type == PURPLE_PREF_STRING, default_value); |
| |
2005 |
| |
2006 return setting->value.string; |
| |
2007 } |
| |
2008 |
| |
2009 gboolean |
| |
2010 purple_account_get_ui_bool(const PurpleAccount *account, const char *ui, |
| |
2011 const char *name, gboolean default_value) |
| |
2012 { |
| |
2013 PurpleAccountSetting *setting; |
| |
2014 GHashTable *table; |
| |
2015 |
| |
2016 g_return_val_if_fail(account != NULL, default_value); |
| |
2017 g_return_val_if_fail(ui != NULL, default_value); |
| |
2018 g_return_val_if_fail(name != NULL, default_value); |
| |
2019 |
| |
2020 if ((table = g_hash_table_lookup(account->ui_settings, ui)) == NULL) |
| |
2021 return default_value; |
| |
2022 |
| |
2023 if ((setting = g_hash_table_lookup(table, name)) == NULL) |
| |
2024 return default_value; |
| |
2025 |
| |
2026 g_return_val_if_fail(setting->type == PURPLE_PREF_BOOLEAN, default_value); |
| |
2027 |
| |
2028 return setting->value.bool; |
| |
2029 } |
| |
2030 |
| |
2031 PurpleLog * |
| |
2032 purple_account_get_log(PurpleAccount *account, gboolean create) |
| |
2033 { |
| |
2034 g_return_val_if_fail(account != NULL, NULL); |
| |
2035 |
| |
2036 if(!account->system_log && create){ |
| |
2037 PurplePresence *presence; |
| |
2038 int login_time; |
| |
2039 |
| |
2040 presence = purple_account_get_presence(account); |
| |
2041 login_time = purple_presence_get_login_time(presence); |
| |
2042 |
| |
2043 account->system_log = purple_log_new(PURPLE_LOG_SYSTEM, |
| |
2044 purple_account_get_username(account), account, NULL, |
| |
2045 (login_time != 0) ? login_time : time(NULL), NULL); |
| |
2046 } |
| |
2047 |
| |
2048 return account->system_log; |
| |
2049 } |
| |
2050 |
| |
2051 void |
| |
2052 purple_account_destroy_log(PurpleAccount *account) |
| |
2053 { |
| |
2054 g_return_if_fail(account != NULL); |
| |
2055 |
| |
2056 if(account->system_log){ |
| |
2057 purple_log_free(account->system_log); |
| |
2058 account->system_log = NULL; |
| |
2059 } |
| |
2060 } |
| |
2061 |
| |
2062 void |
| |
2063 purple_account_add_buddy(PurpleAccount *account, PurpleBuddy *buddy) |
| |
2064 { |
| |
2065 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
2066 PurpleConnection *gc = purple_account_get_connection(account); |
| |
2067 |
| |
2068 if (gc != NULL && gc->prpl != NULL) |
| |
2069 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2070 |
| |
2071 if (prpl_info != NULL && prpl_info->add_buddy != NULL) |
| |
2072 prpl_info->add_buddy(gc, buddy, purple_buddy_get_group(buddy)); |
| |
2073 } |
| |
2074 |
| |
2075 void |
| |
2076 purple_account_add_buddies(PurpleAccount *account, GList *buddies) |
| |
2077 { |
| |
2078 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
2079 PurpleConnection *gc = purple_account_get_connection(account); |
| |
2080 |
| |
2081 if (gc != NULL && gc->prpl != NULL) |
| |
2082 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2083 |
| |
2084 if (prpl_info) { |
| |
2085 GList *cur, *groups = NULL; |
| |
2086 |
| |
2087 /* Make a list of what group each buddy is in */ |
| |
2088 for (cur = buddies; cur != NULL; cur = cur->next) { |
| |
2089 PurpleBlistNode *node = cur->data; |
| |
2090 groups = g_list_append(groups, node->parent->parent); |
| |
2091 } |
| |
2092 |
| |
2093 if (prpl_info->add_buddies != NULL) |
| |
2094 prpl_info->add_buddies(gc, buddies, groups); |
| |
2095 else if (prpl_info->add_buddy != NULL) { |
| |
2096 GList *curb = buddies, *curg = groups; |
| |
2097 |
| |
2098 while ((curb != NULL) && (curg != NULL)) { |
| |
2099 prpl_info->add_buddy(gc, curb->data, curg->data); |
| |
2100 curb = curb->next; |
| |
2101 curg = curg->next; |
| |
2102 } |
| |
2103 } |
| |
2104 |
| |
2105 g_list_free(groups); |
| |
2106 } |
| |
2107 } |
| |
2108 |
| |
2109 void |
| |
2110 purple_account_remove_buddy(PurpleAccount *account, PurpleBuddy *buddy, |
| |
2111 PurpleGroup *group) |
| |
2112 { |
| |
2113 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
2114 PurpleConnection *gc = purple_account_get_connection(account); |
| |
2115 |
| |
2116 if (gc != NULL && gc->prpl != NULL) |
| |
2117 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2118 |
| |
2119 if (prpl_info && prpl_info->remove_buddy) |
| |
2120 prpl_info->remove_buddy(gc, buddy, group); |
| |
2121 } |
| |
2122 |
| |
2123 void |
| |
2124 purple_account_remove_buddies(PurpleAccount *account, GList *buddies, GList *groups) |
| |
2125 { |
| |
2126 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
2127 PurpleConnection *gc = purple_account_get_connection(account); |
| |
2128 |
| |
2129 if (gc != NULL && gc->prpl != NULL) |
| |
2130 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2131 |
| |
2132 if (prpl_info) { |
| |
2133 if (prpl_info->remove_buddies) |
| |
2134 prpl_info->remove_buddies(gc, buddies, groups); |
| |
2135 else { |
| |
2136 GList *curb = buddies; |
| |
2137 GList *curg = groups; |
| |
2138 while ((curb != NULL) && (curg != NULL)) { |
| |
2139 purple_account_remove_buddy(account, curb->data, curg->data); |
| |
2140 curb = curb->next; |
| |
2141 curg = curg->next; |
| |
2142 } |
| |
2143 } |
| |
2144 } |
| |
2145 } |
| |
2146 |
| |
2147 void |
| |
2148 purple_account_remove_group(PurpleAccount *account, PurpleGroup *group) |
| |
2149 { |
| |
2150 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
2151 PurpleConnection *gc = purple_account_get_connection(account); |
| |
2152 |
| |
2153 if (gc != NULL && gc->prpl != NULL) |
| |
2154 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2155 |
| |
2156 if (prpl_info && prpl_info->remove_group) |
| |
2157 prpl_info->remove_group(gc, group); |
| |
2158 } |
| |
2159 |
| |
2160 void |
| |
2161 purple_account_change_password(PurpleAccount *account, const char *orig_pw, |
| |
2162 const char *new_pw) |
| |
2163 { |
| |
2164 PurplePluginProtocolInfo *prpl_info = NULL; |
| |
2165 PurpleConnection *gc = purple_account_get_connection(account); |
| |
2166 |
| |
2167 purple_account_set_password(account, new_pw); |
| |
2168 |
| |
2169 if (gc != NULL && gc->prpl != NULL) |
| |
2170 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2171 |
| |
2172 if (prpl_info && prpl_info->change_passwd) |
| |
2173 prpl_info->change_passwd(gc, orig_pw, new_pw); |
| |
2174 } |
| |
2175 |
| |
2176 gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy) |
| |
2177 { |
| |
2178 PurpleConnection *gc; |
| |
2179 PurplePluginProtocolInfo *prpl_info; |
| |
2180 |
| |
2181 g_return_val_if_fail(account, FALSE); |
| |
2182 g_return_val_if_fail(buddy, FALSE); |
| |
2183 |
| |
2184 gc = purple_account_get_connection(account); |
| |
2185 if (gc == NULL) |
| |
2186 return FALSE; |
| |
2187 |
| |
2188 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
| |
2189 |
| |
2190 if (!prpl_info || !prpl_info->offline_message) |
| |
2191 return FALSE; |
| |
2192 return prpl_info->offline_message(buddy); |
| |
2193 } |
| |
2194 |
| |
2195 void |
| |
2196 purple_accounts_add(PurpleAccount *account) |
| |
2197 { |
| |
2198 g_return_if_fail(account != NULL); |
| |
2199 |
| |
2200 if (g_list_find(accounts, account) != NULL) |
| |
2201 return; |
| |
2202 |
| |
2203 accounts = g_list_append(accounts, account); |
| |
2204 |
| |
2205 schedule_accounts_save(); |
| |
2206 |
| |
2207 purple_signal_emit(purple_accounts_get_handle(), "account-added", account); |
| |
2208 } |
| |
2209 |
| |
2210 void |
| |
2211 purple_accounts_remove(PurpleAccount *account) |
| |
2212 { |
| |
2213 g_return_if_fail(account != NULL); |
| |
2214 |
| |
2215 accounts = g_list_remove(accounts, account); |
| |
2216 |
| |
2217 schedule_accounts_save(); |
| |
2218 |
| |
2219 purple_signal_emit(purple_accounts_get_handle(), "account-removed", account); |
| |
2220 } |
| |
2221 |
| |
2222 void |
| |
2223 purple_accounts_delete(PurpleAccount *account) |
| |
2224 { |
| |
2225 PurpleBlistNode *gnode, *cnode, *bnode; |
| |
2226 |
| |
2227 g_return_if_fail(account != NULL); |
| |
2228 |
| |
2229 /* |
| |
2230 * Disable the account before blowing it out of the water. |
| |
2231 * Conceptually it probably makes more sense to disable the |
| |
2232 * account for all UIs rather than the just the current UI, |
| |
2233 * but it doesn't really matter. |
| |
2234 */ |
| |
2235 purple_account_set_enabled(account, purple_core_get_ui(), FALSE); |
| |
2236 |
| |
2237 purple_notify_close_with_handle(account); |
| |
2238 purple_request_close_with_handle(account); |
| |
2239 |
| |
2240 purple_accounts_remove(account); |
| |
2241 |
| |
2242 /* Remove this account's buddies */ |
| |
2243 for (gnode = purple_get_blist()->root; gnode != NULL; gnode = gnode->next) { |
| |
2244 if (!PURPLE_BLIST_NODE_IS_GROUP(gnode)) |
| |
2245 continue; |
| |
2246 |
| |
2247 cnode = gnode->child; |
| |
2248 while (cnode) { |
| |
2249 PurpleBlistNode *cnode_next = cnode->next; |
| |
2250 |
| |
2251 if(PURPLE_BLIST_NODE_IS_CONTACT(cnode)) { |
| |
2252 bnode = cnode->child; |
| |
2253 while (bnode) { |
| |
2254 PurpleBlistNode *bnode_next = bnode->next; |
| |
2255 |
| |
2256 if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) { |
| |
2257 PurpleBuddy *b = (PurpleBuddy *)bnode; |
| |
2258 |
| |
2259 if (b->account == account) |
| |
2260 purple_blist_remove_buddy(b); |
| |
2261 } |
| |
2262 bnode = bnode_next; |
| |
2263 } |
| |
2264 } else if (PURPLE_BLIST_NODE_IS_CHAT(cnode)) { |
| |
2265 PurpleChat *c = (PurpleChat *)cnode; |
| |
2266 |
| |
2267 if (c->account == account) |
| |
2268 purple_blist_remove_chat(c); |
| |
2269 } |
| |
2270 cnode = cnode_next; |
| |
2271 } |
| |
2272 } |
| |
2273 |
| |
2274 /* Remove this account's pounces */ |
| |
2275 purple_pounce_destroy_all_by_account(account); |
| |
2276 |
| |
2277 /* This will cause the deletion of an old buddy icon. */ |
| |
2278 purple_account_set_buddy_icon(account, NULL); |
| |
2279 |
| |
2280 purple_account_destroy(account); |
| |
2281 } |
| |
2282 |
| |
2283 void |
| |
2284 purple_accounts_reorder(PurpleAccount *account, gint new_index) |
| |
2285 { |
| |
2286 gint index; |
| |
2287 GList *l; |
| |
2288 |
| |
2289 g_return_if_fail(account != NULL); |
| |
2290 g_return_if_fail(new_index <= g_list_length(accounts)); |
| |
2291 |
| |
2292 index = g_list_index(accounts, account); |
| |
2293 |
| |
2294 if (index == -1) { |
| |
2295 purple_debug_error("account", |
| |
2296 "Unregistered account (%s) discovered during reorder!\n", |
| |
2297 purple_account_get_username(account)); |
| |
2298 return; |
| |
2299 } |
| |
2300 |
| |
2301 l = g_list_nth(accounts, index); |
| |
2302 |
| |
2303 if (new_index > index) |
| |
2304 new_index--; |
| |
2305 |
| |
2306 /* Remove the old one. */ |
| |
2307 accounts = g_list_delete_link(accounts, l); |
| |
2308 |
| |
2309 /* Insert it where it should go. */ |
| |
2310 accounts = g_list_insert(accounts, account, new_index); |
| |
2311 |
| |
2312 schedule_accounts_save(); |
| |
2313 } |
| |
2314 |
| |
2315 GList * |
| |
2316 purple_accounts_get_all(void) |
| |
2317 { |
| |
2318 return accounts; |
| |
2319 } |
| |
2320 |
| |
2321 GList * |
| |
2322 purple_accounts_get_all_active(void) |
| |
2323 { |
| |
2324 GList *list = NULL; |
| |
2325 GList *all = purple_accounts_get_all(); |
| |
2326 |
| |
2327 while (all != NULL) { |
| |
2328 PurpleAccount *account = all->data; |
| |
2329 |
| |
2330 if (purple_account_get_enabled(account, purple_core_get_ui())) |
| |
2331 list = g_list_append(list, account); |
| |
2332 |
| |
2333 all = all->next; |
| |
2334 } |
| |
2335 |
| |
2336 return list; |
| |
2337 } |
| |
2338 |
| |
2339 PurpleAccount * |
| |
2340 purple_accounts_find(const char *name, const char *protocol_id) |
| |
2341 { |
| |
2342 PurpleAccount *account = NULL; |
| |
2343 GList *l; |
| |
2344 char *who; |
| |
2345 |
| |
2346 g_return_val_if_fail(name != NULL, NULL); |
| |
2347 |
| |
2348 who = g_strdup(purple_normalize(NULL, name)); |
| |
2349 |
| |
2350 for (l = purple_accounts_get_all(); l != NULL; l = l->next) { |
| |
2351 account = (PurpleAccount *)l->data; |
| |
2352 |
| |
2353 if (!strcmp(purple_normalize(NULL, purple_account_get_username(account)), who) && |
| |
2354 (!protocol_id || !strcmp(account->protocol_id, protocol_id))) { |
| |
2355 |
| |
2356 break; |
| |
2357 } |
| |
2358 |
| |
2359 account = NULL; |
| |
2360 } |
| |
2361 |
| |
2362 g_free(who); |
| |
2363 |
| |
2364 return account; |
| |
2365 } |
| |
2366 |
| |
2367 void |
| |
2368 purple_accounts_restore_current_statuses() |
| |
2369 { |
| |
2370 GList *l; |
| |
2371 PurpleAccount *account; |
| |
2372 |
| |
2373 /* If we're not connected to the Internet right now, we bail on this */ |
| |
2374 if (!purple_network_is_available()) |
| |
2375 { |
| |
2376 purple_debug_info("account", "Network not connected; skipping reconnect\n"); |
| |
2377 return; |
| |
2378 } |
| |
2379 |
| |
2380 for (l = purple_accounts_get_all(); l != NULL; l = l->next) |
| |
2381 { |
| |
2382 account = (PurpleAccount *)l->data; |
| |
2383 if (purple_account_get_enabled(account, purple_core_get_ui()) && |
| |
2384 (purple_presence_is_online(account->presence))) |
| |
2385 { |
| |
2386 purple_account_connect(account); |
| |
2387 } |
| |
2388 } |
| |
2389 } |
| |
2390 |
| |
2391 void |
| |
2392 purple_accounts_set_ui_ops(PurpleAccountUiOps *ops) |
| |
2393 { |
| |
2394 account_ui_ops = ops; |
| |
2395 } |
| |
2396 |
| |
2397 PurpleAccountUiOps * |
| |
2398 purple_accounts_get_ui_ops(void) |
| |
2399 { |
| |
2400 return account_ui_ops; |
| |
2401 } |
| |
2402 |
| |
2403 void * |
| |
2404 purple_accounts_get_handle(void) |
| |
2405 { |
| |
2406 static int handle; |
| |
2407 |
| |
2408 return &handle; |
| |
2409 } |
| |
2410 |
| |
2411 void |
| |
2412 purple_accounts_init(void) |
| |
2413 { |
| |
2414 void *handle = purple_accounts_get_handle(); |
| |
2415 |
| |
2416 purple_signal_register(handle, "account-connecting", |
| |
2417 purple_marshal_VOID__POINTER, NULL, 1, |
| |
2418 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2419 PURPLE_SUBTYPE_ACCOUNT)); |
| |
2420 |
| |
2421 purple_signal_register(handle, "account-disabled", |
| |
2422 purple_marshal_VOID__POINTER, NULL, 1, |
| |
2423 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2424 PURPLE_SUBTYPE_ACCOUNT)); |
| |
2425 |
| |
2426 purple_signal_register(handle, "account-enabled", |
| |
2427 purple_marshal_VOID__POINTER, NULL, 1, |
| |
2428 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2429 PURPLE_SUBTYPE_ACCOUNT)); |
| |
2430 |
| |
2431 purple_signal_register(handle, "account-setting-info", |
| |
2432 purple_marshal_VOID__POINTER_POINTER, NULL, 2, |
| |
2433 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2434 PURPLE_SUBTYPE_ACCOUNT), |
| |
2435 purple_value_new(PURPLE_TYPE_STRING)); |
| |
2436 |
| |
2437 purple_signal_register(handle, "account-set-info", |
| |
2438 purple_marshal_VOID__POINTER_POINTER, NULL, 2, |
| |
2439 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2440 PURPLE_SUBTYPE_ACCOUNT), |
| |
2441 purple_value_new(PURPLE_TYPE_STRING)); |
| |
2442 |
| |
2443 purple_signal_register(handle, "account-added", |
| |
2444 purple_marshal_VOID__POINTER, NULL, 1, |
| |
2445 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_ACCOUNT)); |
| |
2446 |
| |
2447 purple_signal_register(handle, "account-removed", |
| |
2448 purple_marshal_VOID__POINTER, NULL, 1, |
| |
2449 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_ACCOUNT)); |
| |
2450 |
| |
2451 purple_signal_register(handle, "account-status-changed", |
| |
2452 purple_marshal_VOID__POINTER_POINTER_POINTER, NULL, 3, |
| |
2453 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2454 PURPLE_SUBTYPE_ACCOUNT), |
| |
2455 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2456 PURPLE_SUBTYPE_STATUS), |
| |
2457 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2458 PURPLE_SUBTYPE_STATUS)); |
| |
2459 |
| |
2460 purple_signal_register(handle, "account-alias-changed", |
| |
2461 purple_marshal_VOID__POINTER_POINTER, NULL, 2, |
| |
2462 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| |
2463 PURPLE_SUBTYPE_ACCOUNT), |
| |
2464 purple_value_new(PURPLE_TYPE_STRING)); |
| |
2465 |
| |
2466 load_accounts(); |
| |
2467 |
| |
2468 } |
| |
2469 |
| |
2470 void |
| |
2471 purple_accounts_uninit(void) |
| |
2472 { |
| |
2473 if (save_timer != 0) |
| |
2474 { |
| |
2475 purple_timeout_remove(save_timer); |
| |
2476 save_timer = 0; |
| |
2477 sync_accounts(); |
| |
2478 } |
| |
2479 |
| |
2480 purple_signals_unregister_by_instance(purple_accounts_get_handle()); |
| |
2481 } |