Mercurial > pidgin
annotate src/blist.c @ 10343:ee4f477fc8cf
[gaim-migrate @ 11553]
Minor tweaks to the blist and status xml reading code. These functions
don't expect the filename to be called "blist.xml" and "status.xml"
anymore. Some guy wanted this because he wants to try to add some
sort of AIM buddy list importing, or something. I think.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Fri, 10 Dec 2004 05:49:01 +0000 |
parents | 682201b69107 |
children | 655c48791b3c |
rev | line source |
---|---|
5228 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
5228 | 7 * |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
23 #include "internal.h" |
5228 | 24 #include "blist.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
25 #include "conversation.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
26 #include "debug.h" |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
27 #include "notify.h" |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
28 #include "prefs.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
29 #include "privacy.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
30 #include "prpl.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
31 #include "server.h" |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
32 #include "signals.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
33 #include "util.h" |
7132 | 34 #include "xmlnode.h" |
5228 | 35 |
36 #define PATHSIZE 1024 | |
37 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
38 GaimBuddyList *gaimbuddylist = NULL; |
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
39 static GaimBlistUiOps *blist_ui_ops = NULL; |
9285 | 40 static guint blist_save_timer = 0; |
5228 | 41 |
7693 | 42 struct gaim_blist_node_setting { |
43 enum { | |
44 GAIM_BLIST_NODE_SETTING_BOOL, | |
45 GAIM_BLIST_NODE_SETTING_INT, | |
46 GAIM_BLIST_NODE_SETTING_STRING | |
47 } type; | |
48 union { | |
49 gboolean boolean; | |
50 int integer; | |
51 char *string; | |
52 } value; | |
53 }; | |
54 | |
55 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
56 |
5228 | 57 /***************************************************************************** |
58 * Private Utility functions * | |
59 *****************************************************************************/ | |
60 static GaimBlistNode *gaim_blist_get_last_sibling(GaimBlistNode *node) | |
61 { | |
62 GaimBlistNode *n = node; | |
63 if (!n) | |
64 return NULL; | |
65 while (n->next) | |
66 n = n->next; | |
67 return n; | |
68 } | |
6695 | 69 |
5228 | 70 static GaimBlistNode *gaim_blist_get_last_child(GaimBlistNode *node) |
71 { | |
72 if (!node) | |
73 return NULL; | |
74 return gaim_blist_get_last_sibling(node->child); | |
75 } | |
76 | |
5247 | 77 struct _gaim_hbuddy { |
78 char *name; | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
79 GaimAccount *account; |
5758 | 80 GaimBlistNode *group; |
5247 | 81 }; |
82 | |
9285 | 83 static guint _gaim_blist_hbuddy_hash(struct _gaim_hbuddy *hb) |
5247 | 84 { |
85 return g_str_hash(hb->name); | |
86 } | |
87 | |
9285 | 88 static guint _gaim_blist_hbuddy_equal(struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) |
5247 | 89 { |
5758 | 90 return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); |
5247 | 91 } |
92 | |
6742 | 93 static void _gaim_blist_hbuddy_free_key(struct _gaim_hbuddy *hb) |
94 { | |
95 g_free(hb->name); | |
96 g_free(hb); | |
97 } | |
98 | |
9285 | 99 static void blist_pref_cb(const char *name, GaimPrefType type, gpointer value, gpointer data) |
6006 | 100 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
101 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 102 GaimBlistNode *gnode, *cnode, *bnode; |
6012 | 103 |
9285 | 104 if (!ops || !ops->update) |
6012 | 105 return; |
106 | |
9285 | 107 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
108 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
6012 | 109 continue; |
9285 | 110 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
111 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
112 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
113 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 114 continue; |
115 ops->update(gaimbuddylist, bnode); | |
116 } | |
9285 | 117 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
6695 | 118 ops->update(gaimbuddylist, cnode); |
119 } | |
6012 | 120 } |
121 } | |
6006 | 122 } |
123 | |
9949 | 124 void gaim_contact_compute_priority_buddy(GaimContact *contact) |
6843 | 125 { |
126 GaimBlistNode *bnode; | |
9949 | 127 GaimBuddy *new_priority = NULL; |
9285 | 128 |
129 g_return_if_fail(contact != NULL); | |
130 | |
6870 | 131 contact->priority = NULL; |
9949 | 132 for (bnode = ((GaimBlistNode*)contact)->child; |
133 bnode != NULL; | |
134 bnode = bnode->next) | |
135 { | |
6843 | 136 GaimBuddy *buddy; |
9949 | 137 GaimPresence *presence; |
7420 | 138 |
9285 | 139 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
6843 | 140 continue; |
9949 | 141 |
6843 | 142 buddy = (GaimBuddy*)bnode; |
9949 | 143 |
9285 | 144 if (!gaim_account_is_connected(buddy->account)) |
6843 | 145 continue; |
9949 | 146 if (new_priority == NULL) |
147 new_priority = buddy; | |
148 else | |
149 { | |
150 int cmp; | |
151 | |
152 presence = gaim_buddy_get_presence(buddy); | |
153 | |
154 cmp = gaim_presence_compare(gaim_buddy_get_presence(new_priority), | |
155 gaim_buddy_get_presence(buddy)); | |
156 | |
157 if (cmp > 0 || (cmp == 0 && | |
158 gaim_prefs_get_bool("/core/contact/last_match"))) | |
159 { | |
160 new_priority = buddy; | |
161 } | |
162 } | |
6843 | 163 } |
9949 | 164 |
165 contact->priority = new_priority; | |
6843 | 166 } |
167 | |
9285 | 168 static gboolean blist_save_callback(gpointer data) |
169 { | |
170 gaim_blist_sync(); | |
171 blist_save_timer = 0; | |
172 return FALSE; | |
173 } | |
174 | |
9741 | 175 static void schedule_blist_save() |
9285 | 176 { |
177 if (blist_save_timer != 0) | |
178 gaim_timeout_remove(blist_save_timer); | |
179 blist_save_timer = gaim_timeout_add(1000, blist_save_callback, NULL); | |
180 } | |
181 | |
6843 | 182 |
5228 | 183 /***************************************************************************** |
184 * Public API functions * | |
185 *****************************************************************************/ | |
186 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
187 GaimBuddyList *gaim_blist_new() |
5228 | 188 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
189 GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); |
5228 | 190 |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
191 gbl->ui_ops = gaim_blist_get_ui_ops(); |
5228 | 192 |
6742 | 193 gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, |
194 (GEqualFunc)_gaim_blist_hbuddy_equal, | |
195 (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); | |
5247 | 196 |
5228 | 197 if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
198 gbl->ui_ops->new_list(gbl); | |
199 | |
10087 | 200 gaim_prefs_connect_callback(gaim_blist_get_handle(), "/core/buddies/use_server_alias", |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
201 blist_pref_cb, NULL); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
202 |
5228 | 203 return gbl; |
204 } | |
205 | |
206 void | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
207 gaim_set_blist(GaimBuddyList *list) |
5228 | 208 { |
209 gaimbuddylist = list; | |
210 } | |
211 | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
212 GaimBuddyList * |
9285 | 213 gaim_get_blist() |
5228 | 214 { |
215 return gaimbuddylist; | |
216 } | |
217 | |
9285 | 218 void gaim_blist_show() |
5228 | 219 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
220 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 221 |
222 if (ops && ops->show) | |
5228 | 223 ops->show(gaimbuddylist); |
224 } | |
225 | |
226 void gaim_blist_destroy() | |
227 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
228 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 229 |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8200
diff
changeset
|
230 gaim_debug(GAIM_DEBUG_INFO, "blist", "Destroying\n"); |
9285 | 231 |
232 if (ops && ops->destroy) | |
5228 | 233 ops->destroy(gaimbuddylist); |
234 } | |
235 | |
9285 | 236 void gaim_blist_set_visible(gboolean show) |
5228 | 237 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
238 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 239 |
240 if (ops && ops->set_visible) | |
5228 | 241 ops->set_visible(gaimbuddylist, show); |
242 } | |
243 | |
9285 | 244 static gboolean presence_update_timeout_cb(GaimBuddy *buddy) |
245 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
246 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6640
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
247 GaimConversation *conv; |
314111e7b601
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
248 |
9285 | 249 g_return_val_if_fail(buddy != NULL, FALSE); |
250 | |
251 if (buddy->present == GAIM_BUDDY_SIGNING_ON) { | |
5228 | 252 buddy->present = GAIM_BUDDY_ONLINE; |
9285 | 253 } else if (buddy->present == GAIM_BUDDY_SIGNING_OFF) { |
5228 | 254 buddy->present = GAIM_BUDDY_OFFLINE; |
6860 | 255 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
9285 | 256 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) |
6860 | 257 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; |
5228 | 258 } |
259 | |
260 buddy->timer = 0; | |
261 | |
9285 | 262 if (ops && ops->update) |
5228 | 263 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
264 | |
10246 | 265 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, buddy->name, |
266 buddy->account); | |
6392
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
267 if (conv) { |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
268 if (buddy->present == GAIM_BUDDY_ONLINE) |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
269 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
270 else if (buddy->present == GAIM_BUDDY_OFFLINE) |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
271 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_OFFLINE); |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
272 } |
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
273 |
5228 | 274 return FALSE; |
275 } | |
276 | |
10052 | 277 void |
278 gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status) | |
9285 | 279 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
280 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
10052 | 281 GaimPresence *presence; |
282 GaimStatus *status; | |
9285 | 283 |
284 g_return_if_fail(buddy != NULL); | |
5228 | 285 |
10052 | 286 presence = gaim_buddy_get_presence(buddy); |
287 status = gaim_presence_get_active_status(presence); | |
288 | |
289 gaim_debug_info("blist", "Updating buddy status\n"); | |
290 | |
291 if (gaim_status_is_online(status) && | |
292 !gaim_status_is_online(old_status)) { | |
6901 | 293 int old_present = buddy->present; |
10052 | 294 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
295 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
9285 | 296 if (old_present != GAIM_BUDDY_SIGNING_OFF) { |
6901 | 297 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; |
9285 | 298 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) |
6901 | 299 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; |
300 } | |
10052 | 301 if (buddy->timer > 0) |
302 gaim_timeout_remove(buddy->timer); | |
303 buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); | |
304 | |
305 } else if (!gaim_status_is_online(status) && | |
306 gaim_status_is_online(old_status)) { | |
5228 | 307 buddy->present = GAIM_BUDDY_SIGNING_OFF; |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
308 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
10052 | 309 if (buddy->timer > 0) |
310 gaim_timeout_remove(buddy->timer); | |
311 buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); | |
312 | |
313 } else if (gaim_status_is_available(status) && | |
314 !gaim_status_is_available(old_status)) { | |
315 gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy); | |
316 | |
317 } else if (!gaim_status_is_available(status) && | |
318 gaim_status_is_available(old_status)) { | |
319 gaim_signal_emit(gaim_blist_get_handle(), "buddy-away", buddy); | |
320 | |
5228 | 321 } |
322 | |
10205 | 323 /* |
324 * This function used to only call the following two functions if one of | |
325 * the above signals had been triggered, but that's not good, because | |
326 * if someone's away message changes and they don't go from away to back | |
327 * to away then no signal is triggered. | |
328 * | |
329 * It's a safe assumption that SOMETHING called this function. PROBABLY | |
330 * because something, somewhere changed. Calling the stuff below | |
331 * certainly won't hurt anything. Unless you're on a K6-2 300. | |
332 */ | |
333 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); | |
334 if (ops && ops->update) | |
335 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 336 } |
337 | |
9285 | 338 void gaim_blist_update_buddy_signon(GaimBuddy *buddy, time_t signon) |
7950 | 339 { |
340 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
9285 | 341 |
342 g_return_if_fail(buddy != NULL); | |
343 | |
344 if (buddy->signon == signon) | |
7950 | 345 return; |
346 | |
347 buddy->signon = signon; | |
9285 | 348 |
349 if (ops && ops->update) | |
350 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
7950 | 351 } |
5228 | 352 |
9285 | 353 void gaim_blist_update_buddy_icon(GaimBuddy *buddy) |
5228 | 354 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
355 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 356 |
357 g_return_if_fail(buddy != NULL); | |
358 | |
359 if (ops && ops->update) | |
360 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
361 } | |
362 | |
363 /* | |
364 * XXX - Maybe remove the call to this from server.c and call it | |
365 * from oscar.c and toc.c instead? | |
366 */ | |
367 void gaim_blist_rename_buddy(GaimBuddy *buddy, const char *name) | |
368 { | |
369 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
370 struct _gaim_hbuddy *hb; | |
371 | |
372 g_return_if_fail(buddy != NULL); | |
373 | |
374 hb = g_new(struct _gaim_hbuddy, 1); | |
8675 | 375 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
376 hb->account = buddy->account; | |
377 hb->group = ((GaimBlistNode *)buddy)->parent->parent; | |
378 g_hash_table_remove(gaimbuddylist->buddies, hb); | |
379 | |
380 g_free(hb->name); | |
381 hb->name = g_strdup(gaim_normalize(buddy->account, name)); | |
382 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); | |
383 | |
5634 | 384 g_free(buddy->name); |
5228 | 385 buddy->name = g_strdup(name); |
9285 | 386 |
387 schedule_blist_save(); | |
388 | |
389 if (ops && ops->update) | |
390 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 391 } |
5234 | 392 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
393 void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
5234 | 394 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
395 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5234 | 396 |
9285 | 397 g_return_if_fail(chat != NULL); |
398 | |
5237 | 399 g_free(chat->alias); |
9285 | 400 if ((alias != NULL) && (*alias != '\0')) |
5237 | 401 chat->alias = g_strdup(alias); |
402 else | |
403 chat->alias = NULL; | |
404 | |
9285 | 405 schedule_blist_save(); |
406 | |
407 if (ops && ops->update) | |
408 ops->update(gaimbuddylist, (GaimBlistNode *)chat); | |
5234 | 409 } |
410 | |
9285 | 411 void gaim_blist_alias_buddy(GaimBuddy *buddy, const char *alias) |
5228 | 412 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
413 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
414 GaimConversation *conv; |
5228 | 415 |
9285 | 416 g_return_if_fail(buddy != NULL); |
417 | |
5228 | 418 g_free(buddy->alias); |
9285 | 419 if ((alias != NULL) && (*alias != '\0')) |
5228 | 420 buddy->alias = g_strdup(alias); |
421 else | |
422 buddy->alias = NULL; | |
423 | |
9285 | 424 schedule_blist_save(); |
425 | |
426 if (ops && ops->update) | |
427 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
5228 | 428 |
10246 | 429 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, buddy->name, |
430 buddy->account); | |
5228 | 431 if (conv) |
432 gaim_conversation_autoset_title(conv); | |
433 } | |
434 | |
9285 | 435 void gaim_blist_server_alias_buddy(GaimBuddy *buddy, const char *alias) |
6058 | 436 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
437 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6058 | 438 GaimConversation *conv; |
439 | |
9285 | 440 g_return_if_fail(buddy != NULL); |
441 | |
6058 | 442 g_free(buddy->server_alias); |
9285 | 443 if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL)) |
6058 | 444 buddy->server_alias = g_strdup(alias); |
445 else | |
446 buddy->server_alias = NULL; | |
447 | |
9285 | 448 schedule_blist_save(); |
449 | |
450 if (ops && ops->update) | |
451 ops->update(gaimbuddylist, (GaimBlistNode *)buddy); | |
6058 | 452 |
10246 | 453 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, buddy->name, |
454 buddy->account); | |
6058 | 455 if (conv) |
456 gaim_conversation_autoset_title(conv); | |
457 } | |
458 | |
9285 | 459 /* |
460 * XXX - If merging, prompt the user if they want to merge. | |
461 */ | |
462 void gaim_blist_rename_group(GaimGroup *source, const char *new_name) | |
5228 | 463 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
464 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 465 GaimGroup *dest; |
466 gchar *old_name; | |
467 GList *moved_buddies = NULL; | |
5346 | 468 GSList *accts; |
469 | |
9285 | 470 g_return_if_fail(source != NULL); |
471 g_return_if_fail(new_name != NULL); | |
472 | |
473 if (*new_name == '\0' || !strcmp(new_name, source->name)) | |
5346 | 474 return; |
9285 | 475 |
476 dest = gaim_find_group(new_name); | |
477 if (dest != NULL) { | |
478 /* We're merging two groups */ | |
479 GaimBlistNode *prev, *child, *next; | |
480 | |
481 prev = gaim_blist_get_last_child((GaimBlistNode*)dest); | |
482 child = ((GaimBlistNode*)source)->child; | |
483 | |
484 /* | |
485 * XXX - This seems like a dumb way to do this... why not just | |
486 * append all children from the old group to the end of the new | |
487 * one? PRPLs might be expecting to receive an add_buddy() for | |
488 * each moved buddy... | |
489 */ | |
490 while (child) | |
5346 | 491 { |
492 next = child->next; | |
9285 | 493 if (GAIM_BLIST_NODE_IS_CONTACT(child)) { |
6695 | 494 GaimBlistNode *bnode; |
9285 | 495 gaim_blist_add_contact((GaimContact *)child, dest, prev); |
496 for (bnode = child->child; bnode != NULL; bnode = bnode->next) { | |
497 gaim_blist_add_buddy((GaimBuddy *)bnode, (GaimContact *)child, | |
6695 | 498 NULL, bnode->prev); |
9285 | 499 moved_buddies = g_list_append(moved_buddies, bnode); |
500 } | |
5346 | 501 prev = child; |
9285 | 502 } else if (GAIM_BLIST_NODE_IS_CHAT(child)) { |
503 gaim_blist_add_chat((GaimChat *)child, dest, prev); | |
5346 | 504 prev = child; |
505 } else { | |
506 gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
9285 | 507 "Unknown child type in group %s\n", source->name); |
5346 | 508 } |
509 child = next; | |
510 } | |
9285 | 511 |
512 /* Make a copy of the old group name and then delete the old group */ | |
513 old_name = g_strdup(source->name); | |
514 gaim_blist_remove_group(source); | |
5346 | 515 } else { |
9285 | 516 /* A simple rename */ |
517 GaimBlistNode *cnode, *bnode; | |
518 | |
519 /* Build a GList of all buddies in this group */ | |
520 for (cnode = ((GaimBlistNode *)source)->child; cnode != NULL; cnode = cnode->next) { | |
521 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
522 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) | |
523 moved_buddies = g_list_append(moved_buddies, bnode); | |
5346 | 524 } |
9285 | 525 |
526 old_name = source->name; | |
527 source->name = g_strdup(new_name); | |
528 | |
5346 | 529 } |
9285 | 530 |
531 /* Save our changes */ | |
532 schedule_blist_save(); | |
533 | |
534 /* Update the UI */ | |
535 if (ops && ops->update) | |
536 ops->update(gaimbuddylist, (GaimBlistNode*)source); | |
537 | |
538 /* Notify all PRPLs */ | |
539 for (accts = gaim_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) { | |
540 GaimAccount *account = accts->data; | |
541 serv_rename_group(account->gc, old_name, source, moved_buddies); | |
542 } | |
543 g_list_free(moved_buddies); | |
544 g_free(old_name); | |
5228 | 545 } |
5234 | 546 |
9285 | 547 static void gaim_blist_node_initialize_settings(GaimBlistNode *node); |
7693 | 548 |
7125 | 549 GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
5234 | 550 { |
9285 | 551 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
552 GaimChat *chat; |
9285 | 553 |
554 g_return_val_if_fail(account != NULL, FALSE); | |
555 g_return_val_if_fail(components != NULL, FALSE); | |
5234 | 556 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
557 chat = g_new0(GaimChat, 1); |
5234 | 558 chat->account = account; |
9285 | 559 if ((alias != NULL) && (*alias != '\0')) |
5237 | 560 chat->alias = g_strdup(alias); |
5234 | 561 chat->components = components; |
9285 | 562 gaim_blist_node_initialize_settings((GaimBlistNode *)chat); |
563 ((GaimBlistNode *)chat)->type = GAIM_BLIST_CHAT_NODE; | |
5234 | 564 |
565 if (ops != NULL && ops->new_node != NULL) | |
566 ops->new_node((GaimBlistNode *)chat); | |
567 | |
568 return chat; | |
569 } | |
570 | |
7125 | 571 char *gaim_chat_get_display_name(GaimChat *chat) |
6034 | 572 { |
573 char *name; | |
574 | |
9285 | 575 g_return_val_if_fail(chat != NULL, FALSE); |
576 | |
577 if (chat->alias != NULL) { | |
6034 | 578 name = g_strdup(chat->alias); |
9285 | 579 } else { |
6034 | 580 GList *parts; |
581 GaimPlugin *prpl; | |
582 GaimPluginProtocolInfo *prpl_info; | |
583 struct proto_chat_entry *pce; | |
584 | |
7956 | 585 prpl = gaim_find_prpl(gaim_account_get_protocol_id(chat->account)); |
6034 | 586 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
587 | |
588 parts = prpl_info->chat_info(chat->account->gc); | |
589 | |
590 pce = parts->data; | |
591 name = g_markup_escape_text(g_hash_table_lookup(chat->components, | |
592 pce->identifier), -1); | |
593 g_list_free(parts); | |
594 } | |
595 | |
596 return name; | |
597 } | |
598 | |
6695 | 599 GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
5228 | 600 { |
9285 | 601 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
602 GaimBuddy *buddy; | |
603 | |
604 g_return_val_if_fail(account != NULL, FALSE); | |
605 g_return_val_if_fail(screenname != NULL, FALSE); | |
606 | |
607 buddy = g_new0(GaimBuddy, 1); | |
9949 | 608 buddy->account = account; |
609 buddy->name = g_strdup(screenname); | |
610 buddy->alias = g_strdup(alias); | |
611 buddy->presence = gaim_presence_new_for_buddy(buddy); | |
612 | |
10052 | 613 gaim_presence_set_status_active(buddy->presence, "offline", TRUE); |
614 | |
9285 | 615 gaim_blist_node_initialize_settings((GaimBlistNode *)buddy); |
616 ((GaimBlistNode *)buddy)->type = GAIM_BLIST_BUDDY_NODE; | |
617 | |
618 if (ops && ops->new_node) | |
619 ops->new_node((GaimBlistNode *)buddy); | |
620 | |
621 return buddy; | |
5228 | 622 } |
5634 | 623 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
624 void |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
625 gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
626 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
627 g_return_if_fail(buddy != NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
628 |
9261
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
629 if (buddy->icon != icon) |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
630 { |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
631 if (buddy->icon != NULL) |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
632 gaim_buddy_icon_unref(buddy->icon); |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
633 |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
634 buddy->icon = (icon == NULL ? NULL : gaim_buddy_icon_ref(icon)); |
77fdeb4c459f
[gaim-migrate @ 10060]
Christian Hammond <chipx86@chipx86.com>
parents:
9153
diff
changeset
|
635 } |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
636 |
9324 | 637 if (buddy->icon) |
638 gaim_buddy_icon_cache(icon, buddy); | |
639 else | |
640 gaim_blist_node_remove_setting((GaimBlistNode *)buddy, "buddy_icon"); | |
9299 | 641 |
642 schedule_blist_save(); | |
9926 | 643 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
644 gaim_blist_update_buddy_icon(buddy); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
645 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
646 |
10037
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
647 GaimAccount * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
648 gaim_buddy_get_account(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
649 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
650 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
651 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
652 return buddy->account; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
653 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
654 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
655 const char * |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
656 gaim_buddy_get_name(const GaimBuddy *buddy) |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
657 { |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
658 g_return_val_if_fail(buddy != NULL, NULL); |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
659 |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
660 return buddy->name; |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
661 } |
e6e68b9db19b
[gaim-migrate @ 10996]
Luke Schierer <lschiere@pidgin.im>
parents:
10001
diff
changeset
|
662 |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
663 GaimBuddyIcon * |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
664 gaim_buddy_get_icon(const GaimBuddy *buddy) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
665 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
666 g_return_val_if_fail(buddy != NULL, NULL); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
667 |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
668 return buddy->icon; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
669 } |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
670 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
671 void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
5234 | 672 { |
9285 | 673 GaimBlistNode *cnode = (GaimBlistNode*)chat; |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
674 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6774 | 675 |
676 g_return_if_fail(chat != NULL); | |
9285 | 677 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); |
678 | |
679 if (node == NULL) { | |
680 if (group == NULL) { | |
681 group = gaim_group_new(_("Chats")); | |
682 gaim_blist_add_group(group, | |
5634 | 683 gaim_blist_get_last_sibling(gaimbuddylist->root)); |
5234 | 684 } |
685 } else { | |
9285 | 686 group = (GaimGroup*)node->parent; |
5234 | 687 } |
688 | |
689 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 690 if (cnode == node) |
5234 | 691 return; |
692 | |
693 if (cnode->parent) { | |
694 /* This chat was already in the list and is | |
695 * being moved. | |
696 */ | |
6695 | 697 ((GaimGroup *)cnode->parent)->totalsize--; |
5855 | 698 if (gaim_account_is_connected(chat->account)) { |
6695 | 699 ((GaimGroup *)cnode->parent)->online--; |
700 ((GaimGroup *)cnode->parent)->currentsize--; | |
5287 | 701 } |
9285 | 702 if (cnode->next) |
5234 | 703 cnode->next->prev = cnode->prev; |
9285 | 704 if (cnode->prev) |
5234 | 705 cnode->prev->next = cnode->next; |
9285 | 706 if (cnode->parent->child == cnode) |
5234 | 707 cnode->parent->child = cnode->next; |
708 | |
709 ops->remove(gaimbuddylist, cnode); | |
710 | |
9285 | 711 schedule_blist_save(); |
5234 | 712 } |
713 | |
9285 | 714 if (node != NULL) { |
715 if (node->next) | |
716 node->next->prev = cnode; | |
717 cnode->next = node->next; | |
718 cnode->prev = node; | |
719 cnode->parent = node->parent; | |
720 node->next = cnode; | |
721 ((GaimGroup *)node->parent)->totalsize++; | |
5855 | 722 if (gaim_account_is_connected(chat->account)) { |
9285 | 723 ((GaimGroup *)node->parent)->online++; |
724 ((GaimGroup *)node->parent)->currentsize++; | |
5287 | 725 } |
5234 | 726 } else { |
9285 | 727 if (((GaimBlistNode *)group)->child) |
728 ((GaimBlistNode *)group)->child->prev = cnode; | |
729 cnode->next = ((GaimBlistNode *)group)->child; | |
5634 | 730 cnode->prev = NULL; |
9285 | 731 ((GaimBlistNode *)group)->child = cnode; |
732 cnode->parent = (GaimBlistNode *)group; | |
733 group->totalsize++; | |
5855 | 734 if (gaim_account_is_connected(chat->account)) { |
9285 | 735 group->online++; |
736 group->currentsize++; | |
5287 | 737 } |
5234 | 738 } |
739 | |
9285 | 740 schedule_blist_save(); |
741 | |
742 if (ops && ops->update) | |
743 ops->update(gaimbuddylist, (GaimBlistNode *)cnode); | |
5234 | 744 } |
745 | |
7879 | 746 void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
5228 | 747 { |
6695 | 748 GaimBlistNode *cnode, *bnode; |
749 GaimGroup *g; | |
750 GaimContact *c; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
751 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
5247 | 752 struct _gaim_hbuddy *hb; |
6695 | 753 |
754 g_return_if_fail(buddy != NULL); | |
6774 | 755 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
6695 | 756 |
757 bnode = (GaimBlistNode *)buddy; | |
5228 | 758 |
6695 | 759 /* if we're moving to overtop of ourselves, do nothing */ |
9285 | 760 if (bnode == node || (!node && bnode->parent && |
6695 | 761 contact && bnode->parent == (GaimBlistNode*)contact |
762 && bnode == bnode->parent->child)) | |
763 return; | |
764 | |
9285 | 765 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
6695 | 766 c = (GaimContact*)node->parent; |
767 g = (GaimGroup*)node->parent->parent; | |
9285 | 768 } else if (contact) { |
6695 | 769 c = contact; |
9285 | 770 g = (GaimGroup *)((GaimBlistNode *)c)->parent; |
771 } else { | |
772 if (group) { | |
6695 | 773 g = group; |
774 } else { | |
5228 | 775 g = gaim_group_new(_("Buddies")); |
5634 | 776 gaim_blist_add_group(g, |
777 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 778 } |
6695 | 779 c = gaim_contact_new(); |
780 gaim_blist_add_contact(c, g, | |
781 gaim_blist_get_last_child((GaimBlistNode*)g)); | |
5228 | 782 } |
783 | |
6695 | 784 cnode = (GaimBlistNode *)c; |
5228 | 785 |
9285 | 786 if (bnode->parent) { |
787 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
6695 | 788 ((GaimContact*)bnode->parent)->online--; |
9285 | 789 if (((GaimContact*)bnode->parent)->online == 0) |
6695 | 790 ((GaimGroup*)bnode->parent->parent)->online--; |
791 } | |
9285 | 792 if (gaim_account_is_connected(buddy->account)) { |
6695 | 793 ((GaimContact*)bnode->parent)->currentsize--; |
9285 | 794 if (((GaimContact*)bnode->parent)->currentsize == 0) |
6695 | 795 ((GaimGroup*)bnode->parent->parent)->currentsize--; |
796 } | |
797 ((GaimContact*)bnode->parent)->totalsize--; | |
798 /* the group totalsize will be taken care of by remove_contact below */ | |
799 | |
9285 | 800 if (bnode->parent->parent != (GaimBlistNode*)g) |
6695 | 801 serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); |
5277 | 802 |
9285 | 803 if (bnode->next) |
5228 | 804 bnode->next->prev = bnode->prev; |
9285 | 805 if (bnode->prev) |
5228 | 806 bnode->prev->next = bnode->next; |
9285 | 807 if (bnode->parent->child == bnode) |
5228 | 808 bnode->parent->child = bnode->next; |
809 | |
810 ops->remove(gaimbuddylist, bnode); | |
811 | |
9285 | 812 schedule_blist_save(); |
813 | |
814 if (bnode->parent->parent != (GaimBlistNode*)g) { | |
6742 | 815 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 816 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
6742 | 817 hb->account = buddy->account; |
818 hb->group = bnode->parent->parent; | |
6775 | 819 g_hash_table_remove(gaimbuddylist->buddies, hb); |
7162 | 820 g_free(hb->name); |
6742 | 821 g_free(hb); |
822 } | |
6794 | 823 |
9285 | 824 if (!bnode->parent->child) { |
6794 | 825 gaim_blist_remove_contact((GaimContact*)bnode->parent); |
7003 | 826 } else { |
827 gaim_contact_compute_priority_buddy((GaimContact*)bnode->parent); | |
828 ops->update(gaimbuddylist, bnode->parent); | |
829 } | |
5228 | 830 } |
831 | |
9285 | 832 if (node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
833 if (node->next) | |
6695 | 834 node->next->prev = bnode; |
835 bnode->next = node->next; | |
836 bnode->prev = node; | |
837 bnode->parent = node->parent; | |
838 node->next = bnode; | |
5228 | 839 } else { |
9285 | 840 if (cnode->child) |
6695 | 841 cnode->child->prev = bnode; |
842 bnode->prev = NULL; | |
843 bnode->next = cnode->child; | |
844 cnode->child = bnode; | |
845 bnode->parent = cnode; | |
5228 | 846 } |
847 | |
9285 | 848 if (GAIM_BUDDY_IS_ONLINE(buddy)) { |
6695 | 849 ((GaimContact*)bnode->parent)->online++; |
9285 | 850 if (((GaimContact*)bnode->parent)->online == 1) |
6695 | 851 ((GaimGroup*)bnode->parent->parent)->online++; |
852 } | |
9285 | 853 if (gaim_account_is_connected(buddy->account)) { |
6695 | 854 ((GaimContact*)bnode->parent)->currentsize++; |
9285 | 855 if (((GaimContact*)bnode->parent)->currentsize == 1) |
6695 | 856 ((GaimGroup*)bnode->parent->parent)->currentsize++; |
857 } | |
858 ((GaimContact*)bnode->parent)->totalsize++; | |
859 | |
6742 | 860 hb = g_new(struct _gaim_hbuddy, 1); |
7261 | 861 hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 862 hb->account = buddy->account; |
6695 | 863 hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
5247 | 864 |
6742 | 865 g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
5247 | 866 |
6843 | 867 gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
9285 | 868 |
869 schedule_blist_save(); | |
870 | |
871 if (ops && ops->update) | |
5228 | 872 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
873 } | |
874 | |
6695 | 875 GaimContact *gaim_contact_new() |
5228 | 876 { |
9285 | 877 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
878 | |
879 GaimContact *contact = g_new0(GaimContact, 1); | |
880 contact->totalsize = 0; | |
881 contact->currentsize = 0; | |
882 contact->online = 0; | |
883 gaim_blist_node_initialize_settings((GaimBlistNode *)contact); | |
884 ((GaimBlistNode *)contact)->type = GAIM_BLIST_CONTACT_NODE; | |
885 | |
886 if (ops && ops->new_node) | |
887 ops->new_node((GaimBlistNode *)contact); | |
888 | |
889 return contact; | |
6695 | 890 } |
891 | |
9285 | 892 void gaim_contact_set_alias(GaimContact *contact, const char *alias) |
6755 | 893 { |
7245 | 894 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
895 | |
6755 | 896 g_return_if_fail(contact != NULL); |
897 | |
9285 | 898 if (contact->alias != NULL) |
6755 | 899 g_free(contact->alias); |
900 | |
9285 | 901 if ((alias != NULL) && (*alias != '\0')) |
7245 | 902 contact->alias = g_strdup(alias); |
903 else | |
904 contact->alias = NULL; | |
905 | |
9285 | 906 schedule_blist_save(); |
907 | |
908 if (ops && ops->update) | |
7245 | 909 ops->update(gaimbuddylist, (GaimBlistNode*)contact); |
6755 | 910 } |
911 | |
912 const char *gaim_contact_get_alias(GaimContact* contact) | |
913 { | |
9285 | 914 g_return_val_if_fail(contact != NULL, NULL); |
915 | |
916 if (contact->alias) | |
7312 | 917 return contact->alias; |
918 | |
9620 | 919 return gaim_buddy_get_alias(contact->priority); |
6755 | 920 } |
921 | |
9787 | 922 gboolean gaim_contact_on_account(GaimContact *c, GaimAccount *account) |
923 { | |
924 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) c; | |
925 | |
926 g_return_val_if_fail(c != NULL, FALSE); | |
927 g_return_val_if_fail(account != NULL, FALSE); | |
928 | |
929 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
930 GaimBuddy *buddy; | |
931 | |
932 if (! GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
933 continue; | |
934 | |
935 buddy = (GaimBuddy *)bnode; | |
936 if (buddy->account == account) | |
937 return TRUE; | |
938 } | |
939 return FALSE; | |
940 } | |
941 | |
6695 | 942 GaimGroup *gaim_group_new(const char *name) |
943 { | |
9285 | 944 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); |
945 GaimGroup *group = gaim_find_group(name); | |
946 | |
947 if (group != NULL) | |
948 return group; | |
949 | |
950 group = g_new0(GaimGroup, 1); | |
951 group->name = g_strdup(name); | |
952 group->totalsize = 0; | |
953 group->currentsize = 0; | |
954 group->online = 0; | |
955 gaim_blist_node_initialize_settings((GaimBlistNode *)group); | |
956 ((GaimBlistNode *)group)->type = GAIM_BLIST_GROUP_NODE; | |
957 | |
958 if (ops && ops->new_node) | |
959 ops->new_node((GaimBlistNode *)group); | |
960 | |
961 return group; | |
5228 | 962 } |
963 | |
6695 | 964 void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
965 { | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
966 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 967 GaimGroup *g; |
6742 | 968 GaimBlistNode *gnode, *cnode, *bnode; |
6695 | 969 |
6774 | 970 g_return_if_fail(contact != NULL); |
971 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
6695 | 972 |
9285 | 973 if ((GaimBlistNode*)contact == node) |
6975 | 974 return; |
975 | |
9285 | 976 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 977 GAIM_BLIST_NODE_IS_CHAT(node))) |
978 g = (GaimGroup*)node->parent; | |
9285 | 979 else if (group) |
6695 | 980 g = group; |
981 else { | |
982 g = gaim_group_new(_("Buddies")); | |
983 gaim_blist_add_group(g, | |
984 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
985 } | |
986 | |
987 gnode = (GaimBlistNode*)g; | |
988 cnode = (GaimBlistNode*)contact; | |
989 | |
9285 | 990 if (cnode->parent) { |
991 if (cnode->parent->child == cnode) | |
6731 | 992 cnode->parent->child = cnode->next; |
9285 | 993 if (cnode->prev) |
6695 | 994 cnode->prev->next = cnode->next; |
9285 | 995 if (cnode->next) |
6695 | 996 cnode->next->prev = cnode->prev; |
997 | |
9285 | 998 if (cnode->parent != gnode) { |
9928 | 999 bnode = cnode->child; |
1000 while (bnode) { | |
1001 GaimBlistNode *next_bnode = bnode->next; | |
6742 | 1002 GaimBuddy *b = (GaimBuddy*)bnode; |
1003 | |
1004 struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
7261 | 1005 hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
6742 | 1006 hb->account = b->account; |
1007 hb->group = cnode->parent; | |
1008 | |
6776 | 1009 g_hash_table_remove(gaimbuddylist->buddies, hb); |
6742 | 1010 |
9285 | 1011 if (!gaim_find_buddy_in_group(b->account, b->name, g)) { |
8328 | 1012 hb->group = gnode; |
1013 g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
1014 | |
9285 | 1015 if (b->account->gc) |
1016 serv_move_buddy(b, (GaimGroup *)cnode->parent, g); | |
8328 | 1017 } else { |
9928 | 1018 gboolean empty_contact = FALSE; |
1019 | |
8328 | 1020 /* this buddy already exists in the group, so we're |
1021 * gonna delete it instead */ | |
1022 g_free(hb->name); | |
1023 g_free(hb); | |
9285 | 1024 if (b->account->gc) |
1025 serv_remove_buddy(b->account->gc, b, (GaimGroup *)cnode->parent); | |
1026 | |
1027 if (!cnode->child->next) | |
8328 | 1028 empty_contact = TRUE; |
1029 gaim_blist_remove_buddy(b); | |
9928 | 1030 |
1031 /** in gaim_blist_remove_buddy(), if the last buddy in a | |
1032 * contact is removed, the contact is cleaned up and | |
1033 * g_free'd, so we mustn't try to reference bnode->next */ | |
1034 if (empty_contact) | |
1035 return; | |
8328 | 1036 } |
9928 | 1037 bnode = next_bnode; |
6742 | 1038 } |
1039 } | |
9928 | 1040 |
1041 if (contact->online > 0) | |
1042 ((GaimGroup*)cnode->parent)->online--; | |
1043 if (contact->currentsize > 0) | |
1044 ((GaimGroup*)cnode->parent)->currentsize--; | |
1045 ((GaimGroup*)cnode->parent)->totalsize--; | |
1046 | |
1047 ops->remove(gaimbuddylist, cnode); | |
1048 | |
1049 schedule_blist_save(); | |
6695 | 1050 } |
1051 | |
9285 | 1052 if (node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
6695 | 1053 GAIM_BLIST_NODE_IS_CHAT(node))) { |
9285 | 1054 if (node->next) |
6695 | 1055 node->next->prev = cnode; |
1056 cnode->next = node->next; | |
1057 cnode->prev = node; | |
1058 cnode->parent = node->parent; | |
1059 node->next = cnode; | |
1060 } else { | |
9285 | 1061 if (gnode->child) |
6695 | 1062 gnode->child->prev = cnode; |
1063 cnode->prev = NULL; | |
1064 cnode->next = gnode->child; | |
1065 gnode->child = cnode; | |
1066 cnode->parent = gnode; | |
1067 } | |
1068 | |
9285 | 1069 if (contact->online > 0) |
6695 | 1070 g->online++; |
9285 | 1071 if (contact->currentsize > 0) |
6695 | 1072 g->currentsize++; |
1073 g->totalsize++; | |
1074 | |
9285 | 1075 schedule_blist_save(); |
1076 | |
1077 if (ops && cnode->child) | |
6695 | 1078 ops->update(gaimbuddylist, cnode); |
6775 | 1079 |
9285 | 1080 for (bnode = cnode->child; bnode; bnode = bnode->next) |
6775 | 1081 ops->update(gaimbuddylist, bnode); |
6695 | 1082 } |
1083 | |
7246 | 1084 void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
6965 | 1085 { |
1086 GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
7246 | 1087 GaimBlistNode *targetnode; |
1088 GaimBlistNode *prev, *cur, *next; | |
1089 GaimContact *target; | |
1090 | |
9285 | 1091 g_return_if_fail(source != NULL); |
1092 g_return_if_fail(node != NULL); | |
1093 | |
1094 if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1095 target = (GaimContact *)node; | |
7246 | 1096 prev = gaim_blist_get_last_child(node); |
9285 | 1097 } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1098 target = (GaimContact *)node->parent; | |
7246 | 1099 prev = node; |
1100 } else { | |
6965 | 1101 return; |
7246 | 1102 } |
1103 | |
9285 | 1104 if (source == target || !target) |
7246 | 1105 return; |
1106 | |
9285 | 1107 targetnode = (GaimBlistNode *)target; |
7246 | 1108 next = sourcenode->child; |
1109 | |
9285 | 1110 while (next) { |
7246 | 1111 cur = next; |
1112 next = cur->next; | |
9285 | 1113 if (GAIM_BLIST_NODE_IS_BUDDY(cur)) { |
1114 gaim_blist_add_buddy((GaimBuddy *)cur, target, NULL, prev); | |
7246 | 1115 prev = cur; |
1116 } | |
6965 | 1117 } |
1118 } | |
1119 | |
9285 | 1120 void gaim_blist_add_group(GaimGroup *group, GaimBlistNode *node) |
5228 | 1121 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1122 GaimBlistUiOps *ops; |
5228 | 1123 GaimBlistNode *gnode = (GaimBlistNode*)group; |
1124 | |
6774 | 1125 g_return_if_fail(group != NULL); |
9285 | 1126 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); |
1127 | |
5228 | 1128 ops = gaimbuddylist->ui_ops; |
1129 | |
1130 if (!gaimbuddylist->root) { | |
1131 gaimbuddylist->root = gnode; | |
1132 return; | |
1133 } | |
1134 | |
1135 /* if we're moving to overtop of ourselves, do nothing */ | |
9285 | 1136 if (gnode == node) |
5228 | 1137 return; |
1138 | |
1139 if (gaim_find_group(group->name)) { | |
1140 /* This is just being moved */ | |
1141 | |
9285 | 1142 ops->remove(gaimbuddylist, (GaimBlistNode *)group); |
1143 | |
1144 if (gnode == gaimbuddylist->root) | |
5228 | 1145 gaimbuddylist->root = gnode->next; |
9285 | 1146 if (gnode->prev) |
5228 | 1147 gnode->prev->next = gnode->next; |
9285 | 1148 if (gnode->next) |
5228 | 1149 gnode->next->prev = gnode->prev; |
1150 } | |
1151 | |
6695 | 1152 if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
5634 | 1153 gnode->next = node->next; |
1154 gnode->prev = node; | |
9285 | 1155 if (node->next) |
5634 | 1156 node->next->prev = gnode; |
1157 node->next = gnode; | |
1158 } else { | |
9285 | 1159 if (gaimbuddylist->root) |
6807 | 1160 gaimbuddylist->root->prev = gnode; |
5634 | 1161 gnode->next = gaimbuddylist->root; |
1162 gnode->prev = NULL; | |
1163 gaimbuddylist->root = gnode; | |
1164 } | |
1165 | |
9285 | 1166 schedule_blist_save(); |
1167 | |
1168 if (ops && ops->update) { | |
5228 | 1169 ops->update(gaimbuddylist, gnode); |
9285 | 1170 for (node = gnode->child; node; node = node->next) |
5228 | 1171 ops->update(gaimbuddylist, node); |
1172 } | |
1173 } | |
1174 | |
9285 | 1175 void gaim_blist_remove_contact(GaimContact *contact) |
5228 | 1176 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1177 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1178 GaimBlistNode *node, *gnode; |
1179 | |
1180 g_return_if_fail(contact != NULL); | |
1181 | |
1182 node = (GaimBlistNode *)contact; | |
1183 gnode = node->parent; | |
1184 | |
1185 if (node->child) { | |
1186 /* | |
1187 * If this contact has children then remove them. When the last | |
10166 | 1188 * buddy is removed from the contact, the contact is automatically |
1189 * deleted. | |
9285 | 1190 */ |
10166 | 1191 while (node->child->next) { |
9285 | 1192 gaim_blist_remove_buddy((GaimBuddy*)node->child); |
6695 | 1193 } |
10166 | 1194 /* |
1195 * Remove the last buddy and trigger the deletion of the contact. | |
1196 * It would probably be cleaner if contact-deletion was done after | |
1197 * a timeout? Or if it had to be done manually, like below? | |
1198 */ | |
1199 gaim_blist_remove_buddy((GaimBuddy*)node->child); | |
6695 | 1200 } else { |
9285 | 1201 /* Remove the node from its parent */ |
1202 if (gnode->child == node) | |
1203 gnode->child = node->next; | |
1204 if (node->prev) | |
1205 node->prev->next = node->next; | |
1206 if (node->next) | |
1207 node->next->prev = node->prev; | |
1208 | |
1209 schedule_blist_save(); | |
1210 | |
1211 /* Update the UI */ | |
1212 if (ops && ops->remove) | |
1213 ops->remove(gaimbuddylist, node); | |
1214 | |
1215 /* Delete the node */ | |
6695 | 1216 g_free(contact); |
1217 } | |
1218 } | |
1219 | |
9285 | 1220 void gaim_blist_remove_buddy(GaimBuddy *buddy) |
6695 | 1221 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1222 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1223 GaimBlistNode *node, *cnode, *gnode; |
1224 GaimContact *contact; | |
6695 | 1225 GaimGroup *group; |
6742 | 1226 struct _gaim_hbuddy hb; |
5228 | 1227 |
9285 | 1228 g_return_if_fail(buddy != NULL); |
1229 | |
1230 node = (GaimBlistNode *)buddy; | |
6695 | 1231 cnode = node->parent; |
9285 | 1232 gnode = cnode->parent; |
1233 contact = (GaimContact *)cnode; | |
1234 group = (GaimGroup *)gnode; | |
1235 | |
1236 /* Remove the node from its parent */ | |
5228 | 1237 if (node->prev) |
1238 node->prev->next = node->next; | |
1239 if (node->next) | |
1240 node->next->prev = node->prev; | |
9285 | 1241 if (cnode->child == node) |
6695 | 1242 cnode->child = node->next; |
9285 | 1243 |
1244 /* Adjust size counts */ | |
1245 if (GAIM_BUDDY_IS_ONLINE(buddy)) { | |
1246 contact->online--; | |
1247 if (contact->online == 0) | |
1248 group->online--; | |
6695 | 1249 } |
9285 | 1250 if (gaim_account_is_connected(buddy->account)) { |
1251 contact->currentsize--; | |
1252 if (contact->currentsize == 0) | |
1253 group->currentsize--; | |
8194 | 1254 } |
9285 | 1255 contact->totalsize--; |
1256 | |
1257 schedule_blist_save(); | |
1258 | |
1259 /* Re-sort the contact */ | |
1260 if (contact->priority == buddy) { | |
1261 gaim_contact_compute_priority_buddy(contact); | |
1262 if (ops && ops->update) | |
1263 ops->update(gaimbuddylist, cnode); | |
1264 } | |
1265 | |
1266 /* Remove this buddy from the buddies hash table */ | |
7261 | 1267 hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
5247 | 1268 hb.account = buddy->account; |
6695 | 1269 hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
6742 | 1270 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
7162 | 1271 g_free(hb.name); |
5247 | 1272 |
9285 | 1273 /* Update the UI */ |
1274 if (ops && ops->remove) | |
1275 ops->remove(gaimbuddylist, node); | |
1276 | |
1277 /* Delete the node */ | |
1278 if (buddy->timer > 0) | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
1279 gaim_timeout_remove(buddy->timer); |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1280 if (buddy->icon != NULL) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1281 gaim_buddy_icon_unref(buddy->icon); |
7693 | 1282 g_hash_table_destroy(buddy->node.settings); |
9944 | 1283 gaim_presence_remove_buddy(buddy->presence, buddy); |
1284 gaim_presence_destroy(buddy->presence); | |
5228 | 1285 g_free(buddy->name); |
1286 g_free(buddy->alias); | |
1287 g_free(buddy); | |
6755 | 1288 |
9285 | 1289 /* If the contact is empty then remove it */ |
1290 if (!cnode->child) | |
1291 gaim_blist_remove_contact(contact); | |
5228 | 1292 } |
1293 | |
9285 | 1294 void gaim_blist_remove_chat(GaimChat *chat) |
5234 | 1295 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1296 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1297 GaimBlistNode *node, *gnode; |
6695 | 1298 GaimGroup *group; |
5234 | 1299 |
9285 | 1300 g_return_if_fail(chat != NULL); |
1301 | |
1302 node = (GaimBlistNode *)chat; | |
5234 | 1303 gnode = node->parent; |
6695 | 1304 group = (GaimGroup *)gnode; |
5234 | 1305 |
9285 | 1306 /* Remove the node from its parent */ |
1307 if (gnode->child == node) | |
5234 | 1308 gnode->child = node->next; |
1309 if (node->prev) | |
1310 node->prev->next = node->next; | |
1311 if (node->next) | |
1312 node->next->prev = node->prev; | |
9285 | 1313 |
1314 /* Adjust size counts */ | |
5855 | 1315 if (gaim_account_is_connected(chat->account)) { |
5394 | 1316 group->online--; |
9285 | 1317 group->currentsize--; |
5394 | 1318 } |
9285 | 1319 group->totalsize--; |
1320 | |
1321 schedule_blist_save(); | |
1322 | |
1323 /* Update the UI */ | |
1324 if (ops && ops->remove) | |
1325 ops->remove(gaimbuddylist, node); | |
1326 | |
1327 /* Delete the node */ | |
5234 | 1328 g_hash_table_destroy(chat->components); |
1329 g_free(chat->alias); | |
1330 g_free(chat); | |
1331 } | |
1332 | |
9285 | 1333 void gaim_blist_remove_group(GaimGroup *group) |
5228 | 1334 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1335 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
9285 | 1336 GaimBlistNode *node; |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1337 GList *l; |
5228 | 1338 |
9285 | 1339 g_return_if_fail(group != NULL); |
1340 | |
1341 node = (GaimBlistNode *)group; | |
1342 | |
1343 /* Make sure the group is empty */ | |
1344 if (node->child) { | |
5228 | 1345 char *buf; |
1346 int count = 0; | |
9285 | 1347 GaimBlistNode *child; |
1348 | |
1349 for (child = node->child; child != NULL; child = child->next) | |
5228 | 1350 count++; |
1351 | |
6308 | 1352 buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
1353 "because its account was not logged in." | |
1354 " This buddy and the group were not " | |
1355 "removed.\n", | |
1356 "%d buddies from group %s were not " | |
1357 "removed because their accounts were " | |
6336 | 1358 "not logged in. These buddies and " |
1359 "the group were not removed.\n", count), | |
6308 | 1360 count, group->name); |
5541
aee0ee458974
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1361 gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
5228 | 1362 g_free(buf); |
1363 return; | |
1364 } | |
1365 | |
9285 | 1366 /* Remove the node from its parent */ |
1367 if (gaimbuddylist->root == node) | |
5228 | 1368 gaimbuddylist->root = node->next; |
1369 if (node->prev) | |
1370 node->prev->next = node->next; | |
1371 if (node->next) | |
1372 node->next->prev = node->prev; | |
1373 | |
9285 | 1374 schedule_blist_save(); |
1375 | |
1376 /* Update the UI */ | |
1377 if (ops && ops->remove) | |
1378 ops->remove(gaimbuddylist, node); | |
1379 | |
1380 /* Remove the group from all accounts that are online */ | |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1381 for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1382 { |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1383 GaimConnection *gc = (GaimConnection *)l->data; |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1384 |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1385 if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
9285 | 1386 serv_remove_group(gc, group); |
6885
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1387 } |
66dd420d3d23
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1388 |
9285 | 1389 /* Delete the node */ |
5228 | 1390 g_free(group->name); |
1391 g_free(group); | |
1392 } | |
1393 | |
9285 | 1394 GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) |
1395 { | |
1396 g_return_val_if_fail(contact != NULL, NULL); | |
1397 | |
6843 | 1398 return contact->priority; |
6695 | 1399 } |
1400 | |
9620 | 1401 const char *gaim_buddy_get_alias_only(GaimBuddy *buddy) |
9285 | 1402 { |
1403 g_return_val_if_fail(buddy != NULL, NULL); | |
1404 | |
1405 if ((buddy->alias != NULL) && (*buddy->alias != '\0')) { | |
1406 return buddy->alias; | |
1407 } else if ((buddy->server_alias != NULL) && | |
1408 (*buddy->server_alias != '\0') && | |
1409 (gaim_prefs_get_bool("/core/buddies/use_server_alias"))) { | |
1410 | |
1411 return buddy->server_alias; | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1412 } |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1413 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1414 return NULL; |
5228 | 1415 } |
1416 | |
9620 | 1417 |
1418 const char *gaim_buddy_get_contact_alias(GaimBuddy *buddy) | |
5228 | 1419 { |
9620 | 1420 GaimContact *c; |
1421 | |
1422 g_return_val_if_fail(buddy != NULL, NULL); | |
1423 | |
1424 /* Search for an alias for the buddy. In order of precedence: */ | |
1425 /* The buddy alias */ | |
1426 if (buddy->alias != NULL) | |
1427 return buddy->alias; | |
1428 | |
1429 /* The contact alias */ | |
1430 c = gaim_buddy_get_contact(buddy); | |
1431 if ((c != NULL) && (c->alias != NULL)) | |
1432 return c->alias; | |
1433 | |
1434 /* The server alias, if preferences say so */ | |
1435 if ((buddy->server_alias) && (*buddy->server_alias) && | |
1436 (gaim_prefs_get_bool("/core/buddies/use_server_alias"))) | |
1437 return buddy->server_alias; | |
1438 | |
1439 /* The buddy's user name (i.e. no alias) */ | |
1440 return buddy->name; | |
5228 | 1441 } |
1442 | |
9620 | 1443 |
1444 const char *gaim_buddy_get_alias(GaimBuddy *buddy) | |
1445 { | |
1446 g_return_val_if_fail(buddy != NULL, NULL); | |
1447 | |
1448 /* Search for an alias for the buddy. In order of precedence: */ | |
1449 /* The buddy alias */ | |
1450 if (buddy->alias != NULL) | |
1451 return buddy->alias; | |
1452 | |
1453 /* The server alias, if preferences say so */ | |
1454 if ((buddy->server_alias) && (*buddy->server_alias) && | |
1455 (gaim_prefs_get_bool("/core/buddies/use_server_alias"))) | |
1456 return buddy->server_alias; | |
1457 | |
1458 /* The buddy's user name (i.e. no alias) */ | |
1459 return buddy->name; | |
1460 } | |
1461 | |
1462 | |
7125 | 1463 const char *gaim_chat_get_name(GaimChat *chat) |
6744 | 1464 { |
9285 | 1465 struct proto_chat_entry *pce; |
1466 GList *parts, *tmp; | |
1467 char *ret; | |
1468 | |
1469 g_return_val_if_fail(chat != NULL, NULL); | |
1470 | |
1471 if ((chat->alias != NULL) && (*chat->alias != '\0')) | |
6744 | 1472 return chat->alias; |
9285 | 1473 |
1474 parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
1475 pce = parts->data; | |
1476 ret = g_hash_table_lookup(chat->components, pce->identifier); | |
1477 for (tmp = parts; tmp; tmp = tmp->next) | |
1478 g_free(tmp->data); | |
1479 g_list_free(parts); | |
1480 | |
1481 return ret; | |
6744 | 1482 } |
1483 | |
6695 | 1484 GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
5228 | 1485 { |
6695 | 1486 GaimBuddy *buddy; |
5247 | 1487 struct _gaim_hbuddy hb; |
5758 | 1488 GaimBlistNode *group; |
5228 | 1489 |
9285 | 1490 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1491 g_return_val_if_fail(account != NULL, NULL); | |
1492 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
5228 | 1493 |
7429 | 1494 hb.account = account; |
7261 | 1495 hb.name = g_strdup(gaim_normalize(account, name)); |
7429 | 1496 |
9285 | 1497 for (group = gaimbuddylist->root; group; group = group->next) { |
5758 | 1498 hb.group = group; |
7162 | 1499 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
1500 g_free(hb.name); | |
5758 | 1501 return buddy; |
7162 | 1502 } |
5758 | 1503 } |
7162 | 1504 g_free(hb.name); |
9285 | 1505 |
5758 | 1506 return NULL; |
5228 | 1507 } |
1508 | |
6872 | 1509 GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
1510 GaimGroup *group) | |
1511 { | |
1512 struct _gaim_hbuddy hb; | |
7162 | 1513 GaimBuddy *ret; |
6872 | 1514 |
9285 | 1515 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1516 g_return_val_if_fail(account != NULL, NULL); | |
1517 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6872 | 1518 |
7261 | 1519 hb.name = g_strdup(gaim_normalize(account, name)); |
6872 | 1520 hb.account = account; |
1521 hb.group = (GaimBlistNode*)group; | |
1522 | |
7162 | 1523 ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
1524 g_free(hb.name); | |
9285 | 1525 |
7162 | 1526 return ret; |
6872 | 1527 } |
1528 | |
6245 | 1529 GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
1530 { | |
1531 struct buddy *buddy; | |
1532 struct _gaim_hbuddy hb; | |
9285 | 1533 GaimBlistNode *node; |
6245 | 1534 GSList *ret = NULL; |
1535 | |
9285 | 1536 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1537 g_return_val_if_fail(account != NULL, NULL); | |
1538 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
6245 | 1539 |
7261 | 1540 hb.name = g_strdup(gaim_normalize(account, name)); |
6245 | 1541 hb.account = account; |
1542 | |
9285 | 1543 for (node = gaimbuddylist->root; node != NULL; node = node->next) { |
1544 hb.group = node; | |
6245 | 1545 if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) |
1546 ret = g_slist_append(ret, buddy); | |
1547 } | |
7162 | 1548 g_free(hb.name); |
9285 | 1549 |
6245 | 1550 return ret; |
1551 } | |
1552 | |
6695 | 1553 GaimGroup *gaim_find_group(const char *name) |
5228 | 1554 { |
1555 GaimBlistNode *node; | |
9285 | 1556 |
1557 g_return_val_if_fail(gaimbuddylist != NULL, NULL); | |
1558 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
1559 | |
1560 for (node = gaimbuddylist->root; node != NULL; node = node->next) { | |
6695 | 1561 if (!strcmp(((GaimGroup *)node)->name, name)) |
1562 return (GaimGroup *)node; | |
5228 | 1563 } |
9285 | 1564 |
5228 | 1565 return NULL; |
1566 } | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1567 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1568 GaimChat * |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1569 gaim_blist_find_chat(GaimAccount *account, const char *name) |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1570 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1571 char *chat_name; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1572 GaimChat *chat; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1573 GaimPlugin *prpl; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1574 GaimPluginProtocolInfo *prpl_info = NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1575 struct proto_chat_entry *pce; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1576 GaimBlistNode *node, *group; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1577 GList *parts; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1578 |
9285 | 1579 g_return_val_if_fail(gaimbuddylist != NULL, NULL); |
1580 g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); | |
1581 | |
1582 if (!gaim_account_is_connected(account)) | |
7970 | 1583 return NULL; |
1584 | |
7999 | 1585 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
1586 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
1587 | |
9285 | 1588 if (prpl_info->find_blist_chat != NULL) |
7999 | 1589 return prpl_info->find_blist_chat(account, name); |
1590 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1591 for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1592 for (node = group->child; node != NULL; node = node->next) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1593 if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1594 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1595 chat = (GaimChat*)node; |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1596 |
9285 | 1597 if (account != chat->account) |
7970 | 1598 continue; |
1599 | |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1600 parts = prpl_info->chat_info( |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1601 gaim_account_get_connection(chat->account)); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1602 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1603 pce = parts->data; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1604 chat_name = g_hash_table_lookup(chat->components, |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1605 pce->identifier); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1606 |
9153 | 1607 if (chat->account == account && chat_name != NULL && |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1608 name != NULL && !strcmp(chat_name, name)) { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1609 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1610 return chat; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1611 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1612 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1613 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1614 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1615 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1616 return NULL; |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1617 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1618 |
6695 | 1619 GaimGroup * |
7125 | 1620 gaim_chat_get_group(GaimChat *chat) |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1621 { |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1622 g_return_val_if_fail(chat != NULL, NULL); |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1623 |
6695 | 1624 return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
6456
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1625 } |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1626 |
9285 | 1627 GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
1628 { | |
1629 g_return_val_if_fail(buddy != NULL, NULL); | |
1630 | |
1631 return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
1632 } | |
1633 | |
9949 | 1634 GaimPresence *gaim_buddy_get_presence(const GaimBuddy *buddy) |
1635 { | |
1636 g_return_val_if_fail(buddy != NULL, NULL); | |
1637 return buddy->presence; | |
1638 } | |
1639 | |
1640 | |
6695 | 1641 GaimGroup *gaim_find_buddys_group(GaimBuddy *buddy) |
5228 | 1642 { |
9285 | 1643 g_return_val_if_fail(buddy != NULL, NULL); |
6706
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1644 |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1645 if (((GaimBlistNode *)buddy)->parent == NULL) |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1646 return NULL; |
854a435d2cc3
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1647 |
6695 | 1648 return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
5228 | 1649 } |
1650 | |
9285 | 1651 GSList *gaim_group_get_accounts(GaimGroup *group) |
5228 | 1652 { |
1653 GSList *l = NULL; | |
6695 | 1654 GaimBlistNode *gnode, *cnode, *bnode; |
1655 | |
9285 | 1656 gnode = (GaimBlistNode *)group; |
1657 | |
1658 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
6695 | 1659 if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
9285 | 1660 if (!g_slist_find(l, ((GaimChat *)cnode)->account)) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1661 l = g_slist_append(l, ((GaimChat *)cnode)->account); |
9285 | 1662 } else if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
1663 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
1664 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
1665 if (!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
6695 | 1666 l = g_slist_append(l, ((GaimBuddy *)bnode)->account); |
1667 } | |
1668 } | |
1669 } | |
5228 | 1670 } |
6695 | 1671 |
5228 | 1672 return l; |
1673 } | |
1674 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1675 void gaim_blist_add_account(GaimAccount *account) |
5234 | 1676 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1677 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1678 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 1679 |
9285 | 1680 g_return_if_fail(gaimbuddylist != NULL); |
1681 | |
1682 if (!ops || !ops->update) | |
6695 | 1683 return; |
1684 | |
9285 | 1685 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
1686 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 1687 continue; |
9285 | 1688 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
1689 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6956 | 1690 gboolean recompute = FALSE; |
9285 | 1691 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
1692 if (GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
6695 | 1693 ((GaimBuddy*)bnode)->account == account) { |
6956 | 1694 recompute = TRUE; |
6695 | 1695 ((GaimContact*)cnode)->currentsize++; |
9285 | 1696 if (((GaimContact*)cnode)->currentsize == 1) |
6695 | 1697 ((GaimGroup*)gnode)->currentsize++; |
1698 ops->update(gaimbuddylist, bnode); | |
1699 } | |
1700 } | |
9285 | 1701 if (recompute || |
8960 | 1702 gaim_blist_node_get_bool(cnode, "show_offline")) { |
6956 | 1703 gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
1704 ops->update(gaimbuddylist, cnode); | |
1705 } | |
9285 | 1706 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1707 ((GaimChat*)cnode)->account == account) { |
6901 | 1708 ((GaimGroup *)gnode)->online++; |
1709 ((GaimGroup *)gnode)->currentsize++; | |
1710 ops->update(gaimbuddylist, cnode); | |
5234 | 1711 } |
1712 } | |
6695 | 1713 ops->update(gaimbuddylist, gnode); |
5234 | 1714 } |
1715 } | |
1716 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1717 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 1718 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1719 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1720 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 1721 |
9285 | 1722 g_return_if_fail(gaimbuddylist != NULL); |
1723 | |
1724 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
1725 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 1726 continue; |
9285 | 1727 for (cnode = gnode->child; cnode; cnode = cnode->next) { |
1728 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6957 | 1729 gboolean recompute = FALSE; |
9285 | 1730 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
1731 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
6695 | 1732 continue; |
9285 | 1733 if (account == ((GaimBuddy *)bnode)->account) { |
6957 | 1734 recompute = TRUE; |
9285 | 1735 if (((GaimBuddy*)bnode)->present == GAIM_BUDDY_ONLINE || |
6695 | 1736 ((GaimBuddy*)bnode)->present == GAIM_BUDDY_SIGNING_ON) { |
1737 ((GaimContact*)cnode)->online--; | |
9285 | 1738 if (((GaimContact*)cnode)->online == 0) |
6695 | 1739 ((GaimGroup*)gnode)->online--; |
1740 } | |
1741 ((GaimContact*)cnode)->currentsize--; | |
9285 | 1742 if (((GaimContact*)cnode)->currentsize == 0) |
6695 | 1743 ((GaimGroup*)gnode)->currentsize--; |
1744 | |
1745 ((GaimBuddy*)bnode)->present = GAIM_BUDDY_OFFLINE; | |
1746 | |
6803 | 1747 ((GaimBuddy*)bnode)->uc = 0; |
9944 | 1748 /* XXX ((GaimBuddy*)bnode)->idle = 0; */ |
6803 | 1749 |
6945 | 1750 |
9285 | 1751 if (ops && ops->remove) |
6695 | 1752 ops->remove(gaimbuddylist, bnode); |
1753 } | |
5234 | 1754 } |
9285 | 1755 if (recompute) { |
6959 | 1756 gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
9285 | 1757 if (ops && ops->update) |
6983 | 1758 ops->update(gaimbuddylist, cnode); |
1759 } | |
9285 | 1760 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1761 ((GaimChat*)cnode)->account == account) { |
6695 | 1762 ((GaimGroup*)gnode)->currentsize--; |
1763 ((GaimGroup*)gnode)->online--; | |
9285 | 1764 if (ops && ops->remove) |
6695 | 1765 ops->remove(gaimbuddylist, cnode); |
5228 | 1766 } |
1767 } | |
1768 } | |
1769 } | |
1770 | |
9285 | 1771 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) |
1772 { | |
9787 | 1773 GaimBlistNode *cnode; |
9285 | 1774 for (cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { |
1775 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
9787 | 1776 if(gaim_contact_on_account((GaimContact *) cnode, account)) |
1777 return TRUE; | |
9285 | 1778 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1779 GaimChat *chat = (GaimChat *)cnode; |
9285 | 1780 if ((!account && gaim_account_is_connected(chat->account)) |
6695 | 1781 || chat->account == account) |
1782 return TRUE; | |
1783 } | |
5228 | 1784 } |
1785 return FALSE; | |
1786 } | |
1787 | |
1788 static gboolean blist_safe_to_write = FALSE; | |
1789 | |
7132 | 1790 static void parse_setting(GaimBlistNode *node, xmlnode *setting) |
1791 { | |
1792 const char *name = xmlnode_get_attrib(setting, "name"); | |
7693 | 1793 const char *type = xmlnode_get_attrib(setting, "type"); |
7132 | 1794 char *value = xmlnode_get_data(setting); |
1795 | |
9285 | 1796 if (!value) |
7693 | 1797 return; |
1798 | |
9285 | 1799 if (!type || !strcmp(type, "string")) |
7693 | 1800 gaim_blist_node_set_string(node, name, value); |
9285 | 1801 else if (!strcmp(type, "bool")) |
7693 | 1802 gaim_blist_node_set_bool(node, name, atoi(value)); |
9285 | 1803 else if (!strcmp(type, "int")) |
7693 | 1804 gaim_blist_node_set_int(node, name, atoi(value)); |
7132 | 1805 |
1806 g_free(value); | |
1807 } | |
1808 | |
1809 static void parse_buddy(GaimGroup *group, GaimContact *contact, xmlnode *bnode) | |
1810 { | |
1811 GaimAccount *account; | |
1812 GaimBuddy *buddy; | |
7727 | 1813 char *name = NULL, *alias = NULL; |
7153 | 1814 const char *acct_name, *proto, *protocol; |
7132 | 1815 xmlnode *x; |
1816 | |
1817 acct_name = xmlnode_get_attrib(bnode, "account"); | |
7153 | 1818 protocol = xmlnode_get_attrib(bnode, "protocol"); |
1819 proto = xmlnode_get_attrib(bnode, "proto"); | |
1820 | |
9285 | 1821 if (!acct_name || (!proto && !protocol)) |
7132 | 1822 return; |
1823 | |
7153 | 1824 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 1825 |
9285 | 1826 if (!account) |
7132 | 1827 return; |
1828 | |
9285 | 1829 if ((x = xmlnode_get_child(bnode, "name"))) |
7132 | 1830 name = xmlnode_get_data(x); |
1831 | |
9285 | 1832 if (!name) |
7132 | 1833 return; |
1834 | |
9285 | 1835 if ((x = xmlnode_get_child(bnode, "alias"))) |
7132 | 1836 alias = xmlnode_get_data(x); |
1837 | |
1838 buddy = gaim_buddy_new(account, name, alias); | |
1839 gaim_blist_add_buddy(buddy, contact, group, | |
1840 gaim_blist_get_last_child((GaimBlistNode*)contact)); | |
1841 | |
9285 | 1842 for (x = xmlnode_get_child(bnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 1843 parse_setting((GaimBlistNode*)buddy, x); |
1844 } | |
1845 | |
1846 g_free(name); | |
9285 | 1847 if (alias) |
7132 | 1848 g_free(alias); |
1849 } | |
1850 | |
1851 static void parse_contact(GaimGroup *group, xmlnode *cnode) | |
1852 { | |
1853 GaimContact *contact = gaim_contact_new(); | |
1854 xmlnode *x; | |
7245 | 1855 const char *alias; |
7132 | 1856 |
1857 gaim_blist_add_contact(contact, group, | |
1858 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
1859 | |
9285 | 1860 if ((alias = xmlnode_get_attrib(cnode, "alias"))) { |
7132 | 1861 gaim_contact_set_alias(contact, alias); |
1862 } | |
1863 | |
9285 | 1864 for (x = cnode->child; x; x = x->next) { |
1865 if (x->type != XMLNODE_TYPE_TAG) | |
7132 | 1866 continue; |
9285 | 1867 if (!strcmp(x->name, "buddy")) |
7132 | 1868 parse_buddy(group, contact, x); |
9285 | 1869 else if (!strcmp(x->name, "setting")) |
7132 | 1870 parse_setting((GaimBlistNode*)contact, x); |
5228 | 1871 } |
7825 | 1872 |
1873 /* if the contact is empty, don't keep it around. it causes problems */ | |
9285 | 1874 if (!((GaimBlistNode*)contact)->child) |
7825 | 1875 gaim_blist_remove_contact(contact); |
5228 | 1876 } |
1877 | |
7132 | 1878 static void parse_chat(GaimGroup *group, xmlnode *cnode) |
1879 { | |
1880 GaimChat *chat; | |
1881 GaimAccount *account; | |
7153 | 1882 const char *acct_name, *proto, *protocol; |
7132 | 1883 xmlnode *x; |
1884 char *alias = NULL; | |
1885 GHashTable *components; | |
1886 | |
1887 acct_name = xmlnode_get_attrib(cnode, "account"); | |
7153 | 1888 protocol = xmlnode_get_attrib(cnode, "protocol"); |
1889 proto = xmlnode_get_attrib(cnode, "proto"); | |
1890 | |
9285 | 1891 if (!acct_name || (!proto && !protocol)) |
7132 | 1892 return; |
1893 | |
7153 | 1894 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 1895 |
9285 | 1896 if (!account) |
7132 | 1897 return; |
1898 | |
9285 | 1899 if ((x = xmlnode_get_child(cnode, "alias"))) |
7132 | 1900 alias = xmlnode_get_data(x); |
1901 | |
1902 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
1903 | |
9285 | 1904 for (x = xmlnode_get_child(cnode, "component"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 1905 const char *name; |
1906 char *value; | |
1907 | |
1908 name = xmlnode_get_attrib(x, "name"); | |
1909 value = xmlnode_get_data(x); | |
1910 g_hash_table_replace(components, g_strdup(name), value); | |
1911 } | |
1912 | |
1913 chat = gaim_chat_new(account, alias, components); | |
7151 | 1914 gaim_blist_add_chat(chat, group, |
1915 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
7132 | 1916 |
9285 | 1917 for (x = xmlnode_get_child(cnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 1918 parse_setting((GaimBlistNode*)chat, x); |
1919 } | |
1920 | |
9285 | 1921 if (alias) |
7132 | 1922 g_free(alias); |
1923 } | |
1924 | |
1925 | |
1926 static void parse_group(xmlnode *groupnode) | |
1927 { | |
1928 const char *name = xmlnode_get_attrib(groupnode, "name"); | |
1929 GaimGroup *group; | |
1930 xmlnode *cnode; | |
1931 | |
9285 | 1932 if (!name) |
7132 | 1933 name = _("Buddies"); |
1934 | |
1935 group = gaim_group_new(name); | |
1936 gaim_blist_add_group(group, | |
1937 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
1938 | |
9285 | 1939 for (cnode = groupnode->child; cnode; cnode = cnode->next) { |
1940 if (cnode->type != XMLNODE_TYPE_TAG) | |
7132 | 1941 continue; |
9285 | 1942 if (!strcmp(cnode->name, "setting")) |
7132 | 1943 parse_setting((GaimBlistNode*)group, cnode); |
9285 | 1944 else if (!strcmp(cnode->name, "contact") || |
7132 | 1945 !strcmp(cnode->name, "person")) |
1946 parse_contact(group, cnode); | |
9285 | 1947 else if (!strcmp(cnode->name, "chat")) |
7132 | 1948 parse_chat(group, cnode); |
5228 | 1949 } |
1950 } | |
1951 | |
9285 | 1952 static gboolean gaim_blist_read(const char *filename) |
1953 { | |
7132 | 1954 GError *error; |
5228 | 1955 gchar *contents = NULL; |
1956 gsize length; | |
7132 | 1957 xmlnode *gaim, *blist, *privacy; |
5228 | 1958 |
10337 | 1959 gaim_debug_info("blist", "Reading %s\n", filename); |
1960 | |
9285 | 1961 if (!g_file_get_contents(filename, &contents, &length, &error)) { |
10343 | 1962 gaim_debug_error("blist", "Error reading buddy list: %s\n", |
10337 | 1963 error->message); |
5228 | 1964 g_error_free(error); |
1965 return FALSE; | |
1966 } | |
1967 | |
7132 | 1968 gaim = xmlnode_from_str(contents, length); |
10337 | 1969 |
1970 if (gaim == NULL) { | |
8826 | 1971 FILE *backup; |
1972 char *name; | |
10343 | 1973 gaim_debug_error("blist", "Error parsing buddy list\n"); |
1974 name = g_strdup_printf("%s~", filename); | |
9285 | 1975 if ((backup = fopen(name, "w"))) { |
8826 | 1976 fwrite(contents, length, 1, backup); |
1977 fclose(backup); | |
1978 chmod(name, S_IRUSR | S_IWUSR); | |
1979 } else { | |
10337 | 1980 gaim_debug_error("blist", "Unable to write backup %s\n", name); |
8826 | 1981 } |
1982 g_free(name); | |
1983 g_free(contents); | |
5228 | 1984 return FALSE; |
1985 } | |
10337 | 1986 |
8826 | 1987 g_free(contents); |
10337 | 1988 |
7132 | 1989 blist = xmlnode_get_child(gaim, "blist"); |
9285 | 1990 if (blist) { |
7132 | 1991 xmlnode *groupnode; |
10337 | 1992 for (groupnode = xmlnode_get_child(blist, "group"); groupnode != NULL; |
8135 | 1993 groupnode = xmlnode_get_next_twin(groupnode)) { |
7132 | 1994 parse_group(groupnode); |
1995 } | |
5228 | 1996 } |
1997 | |
7132 | 1998 privacy = xmlnode_get_child(gaim, "privacy"); |
9285 | 1999 if (privacy) { |
7132 | 2000 xmlnode *anode; |
9285 | 2001 for (anode = privacy->child; anode; anode = anode->next) { |
7132 | 2002 xmlnode *x; |
2003 GaimAccount *account; | |
7153 | 2004 const char *acct_name, *proto, *mode, *protocol; |
7132 | 2005 |
2006 acct_name = xmlnode_get_attrib(anode, "name"); | |
7153 | 2007 protocol = xmlnode_get_attrib(anode, "protocol"); |
2008 proto = xmlnode_get_attrib(anode, "proto"); | |
7132 | 2009 mode = xmlnode_get_attrib(anode, "mode"); |
2010 | |
9285 | 2011 if (!acct_name || (!proto && !protocol) || !mode) |
7132 | 2012 continue; |
2013 | |
7153 | 2014 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 2015 |
9285 | 2016 if (!account) |
7132 | 2017 continue; |
2018 | |
2019 account->perm_deny = atoi(mode); | |
2020 | |
9285 | 2021 for (x = anode->child; x; x = x->next) { |
7132 | 2022 char *name; |
9285 | 2023 if (x->type != XMLNODE_TYPE_TAG) |
7132 | 2024 continue; |
2025 | |
9285 | 2026 if (!strcmp(x->name, "permit")) { |
7132 | 2027 name = xmlnode_get_data(x); |
2028 gaim_privacy_permit_add(account, name, TRUE); | |
2029 g_free(name); | |
9285 | 2030 } else if (!strcmp(x->name, "block")) { |
7132 | 2031 name = xmlnode_get_data(x); |
2032 gaim_privacy_deny_add(account, name, TRUE); | |
2033 g_free(name); | |
2034 } | |
2035 } | |
2036 } | |
2037 } | |
5228 | 2038 |
10343 | 2039 gaim_debug_info("blist", "Finished reading buddy list\n"); |
5228 | 2040 |
8200 | 2041 xmlnode_free(gaim); |
10337 | 2042 |
5228 | 2043 return TRUE; |
2044 } | |
2045 | |
9285 | 2046 void gaim_blist_load() |
2047 { | |
10332 | 2048 const char *user_dir = gaim_user_dir(); |
10337 | 2049 gchar *filename; |
2050 gchar *msg; | |
5228 | 2051 |
2052 blist_safe_to_write = TRUE; | |
2053 | |
10337 | 2054 if (user_dir == NULL) |
5228 | 2055 return; |
2056 | |
2057 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
2058 | |
9285 | 2059 if (g_file_test(filename, G_FILE_TEST_EXISTS)) { |
2060 if (!gaim_blist_read(filename)) { | |
10337 | 2061 msg = g_strdup_printf(_("An error was encountered parsing the " |
2062 "file containing your buddy list (%s). It has not " | |
2063 "been loaded, and the old file has been renamed " | |
2064 "to blist.xml~."), filename); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2065 gaim_notify_error(NULL, NULL, _("Buddy List Error"), msg); |
5228 | 2066 g_free(msg); |
2067 } | |
2068 } | |
2069 | |
2070 g_free(filename); | |
2071 } | |
2072 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2073 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2074 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2075 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2076 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2077 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2078 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2079 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2080 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2081 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2082 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2083 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2084 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2085 void |
9754 | 2086 gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
2087 const char *alias, const char *name) | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2088 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2089 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2090 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2091 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2092 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2093 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
9754 | 2094 ui_ops->request_add_chat(account, group, alias, name); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2095 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2096 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2097 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2098 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2099 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2100 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2101 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2102 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2103 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2104 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2105 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2106 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2107 |
7693 | 2108 static void blist_print_setting(const char *key, |
2109 struct gaim_blist_node_setting *setting, FILE *file, int indent) | |
2110 { | |
2111 char *key_val, *data_val = NULL; | |
2112 const char *type = NULL; | |
2113 int i; | |
2114 | |
9285 | 2115 if (!key) |
7693 | 2116 return; |
2117 | |
2118 switch(setting->type) { | |
2119 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2120 type = "bool"; | |
2121 data_val = g_strdup_printf("%d", setting->value.boolean); | |
2122 break; | |
2123 case GAIM_BLIST_NODE_SETTING_INT: | |
2124 type = "int"; | |
2125 data_val = g_strdup_printf("%d", setting->value.integer); | |
2126 break; | |
2127 case GAIM_BLIST_NODE_SETTING_STRING: | |
9285 | 2128 if (!setting->value.string) |
7693 | 2129 return; |
2130 | |
2131 type = "string"; | |
2132 data_val = g_markup_escape_text(setting->value.string, -1); | |
2133 break; | |
2134 } | |
2135 | |
2136 /* this can't happen */ | |
9285 | 2137 if (!type || !data_val) |
7693 | 2138 return; |
2139 | |
9285 | 2140 for (i=0; i<indent; i++) fprintf(file, "\t"); |
7693 | 2141 |
2142 key_val = g_markup_escape_text(key, -1); | |
2143 fprintf(file, "<setting name=\"%s\" type=\"%s\">%s</setting>\n", key_val, type, | |
2144 data_val); | |
2145 | |
2146 g_free(key_val); | |
2147 g_free(data_val); | |
2148 } | |
2149 | |
5228 | 2150 static void blist_print_group_settings(gpointer key, gpointer data, |
9285 | 2151 gpointer user_data) |
2152 { | |
7693 | 2153 blist_print_setting(key, data, user_data, 3); |
5228 | 2154 } |
2155 | |
2156 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
9285 | 2157 gpointer user_data) |
2158 { | |
7693 | 2159 blist_print_setting(key, data, user_data, 5); |
5228 | 2160 } |
2161 | |
6695 | 2162 static void blist_print_cnode_settings(gpointer key, gpointer data, |
9285 | 2163 gpointer user_data) |
2164 { | |
7693 | 2165 blist_print_setting(key, data, user_data, 4); |
6695 | 2166 } |
2167 | |
5234 | 2168 static void blist_print_chat_components(gpointer key, gpointer data, |
2169 gpointer user_data) { | |
2170 char *key_val; | |
2171 char *data_val; | |
2172 FILE *file = user_data; | |
2173 | |
9285 | 2174 if (!key || !data) |
5234 | 2175 return; |
2176 | |
2177 key_val = g_markup_escape_text(key, -1); | |
2178 data_val = g_markup_escape_text(data, -1); | |
2179 | |
2180 fprintf(file, "\t\t\t\t<component name=\"%s\">%s</component>\n", key_val, | |
2181 data_val); | |
2182 g_free(key_val); | |
2183 g_free(data_val); | |
2184 } | |
2185 | |
9285 | 2186 static void print_buddy(FILE *file, GaimBuddy *buddy) |
2187 { | |
6695 | 2188 char *bud_name = g_markup_escape_text(buddy->name, -1); |
2189 char *bud_alias = NULL; | |
2190 char *acct_name = g_markup_escape_text(buddy->account->username, -1); | |
9285 | 2191 if (buddy->alias) |
6695 | 2192 bud_alias= g_markup_escape_text(buddy->alias, -1); |
9460 | 2193 fprintf(file, "\t\t\t\t<buddy account=\"%s\" proto=\"%s\">\n", acct_name, |
7153 | 2194 gaim_account_get_protocol_id(buddy->account)); |
2195 | |
6695 | 2196 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); |
9285 | 2197 if (bud_alias) { |
6695 | 2198 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", bud_alias); |
2199 } | |
7726 | 2200 g_hash_table_foreach(buddy->node.settings, blist_print_buddy_settings, file); |
6695 | 2201 fprintf(file, "\t\t\t\t</buddy>\n"); |
2202 g_free(bud_name); | |
2203 g_free(bud_alias); | |
2204 g_free(acct_name); | |
2205 } | |
2206 | |
9787 | 2207 |
2208 /* check for flagging and account exclusion on buddy */ | |
2209 static gboolean blist_buddy_should_save(GaimAccount *exp_acct, GaimBuddy *buddy) | |
2210 { | |
2211 if (! GAIM_BLIST_NODE_SHOULD_SAVE((GaimBlistNode *) buddy)) | |
2212 return FALSE; | |
2213 | |
2214 if (exp_acct && buddy->account != exp_acct) | |
2215 return FALSE; | |
2216 | |
2217 return TRUE; | |
2218 } | |
2219 | |
2220 | |
2221 static void blist_write_buddy(FILE *file, GaimAccount *exp_acct, GaimBuddy *buddy) | |
2222 { | |
2223 if (blist_buddy_should_save(exp_acct, buddy)) | |
2224 print_buddy(file, buddy); | |
2225 } | |
2226 | |
2227 | |
2228 /* check for flagging and account exclusion on contact and all members */ | |
2229 static gboolean blist_contact_should_save(GaimAccount *exp_acct, GaimContact *contact) | |
2230 { | |
2231 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) contact; | |
2232 | |
2233 if (! GAIM_BLIST_NODE_SHOULD_SAVE(cnode)) | |
2234 return FALSE; | |
2235 | |
2236 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
2237 if (! GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
2238 continue; | |
2239 | |
2240 if (blist_buddy_should_save(exp_acct, (GaimBuddy *) bnode)) | |
2241 return TRUE; | |
2242 } | |
2243 | |
2244 return FALSE; | |
2245 } | |
2246 | |
2247 | |
2248 static void blist_write_contact(FILE *file, GaimAccount *exp_acct, GaimContact *contact) | |
2249 { | |
2250 GaimBlistNode *bnode, *cnode = (GaimBlistNode *) contact; | |
2251 | |
2252 if (! blist_contact_should_save(exp_acct, contact)) | |
2253 return; | |
2254 | |
2255 fprintf(file, "\t\t\t<contact"); | |
2256 if (contact->alias) { | |
2257 char *alias = g_markup_escape_text(contact->alias, -1); | |
2258 fprintf(file, " alias=\"%s\"", alias); | |
2259 g_free(alias); | |
2260 } | |
2261 fprintf(file, ">\n"); | |
2262 | |
2263 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
2264 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2265 blist_write_buddy(file, exp_acct, (GaimBuddy *) bnode); | |
2266 } | |
2267 } | |
2268 | |
2269 g_hash_table_foreach(cnode->settings, blist_print_cnode_settings, file); | |
2270 fprintf(file, "\t\t\t</contact>\n"); | |
2271 } | |
2272 | |
2273 | |
2274 static void blist_write_chat(FILE *file, GaimAccount *exp_acct, GaimChat *chat) | |
2275 { | |
2276 char *acct_name; | |
2277 | |
2278 if (! GAIM_BLIST_NODE_SHOULD_SAVE((GaimBlistNode *) chat)) | |
2279 return; | |
2280 | |
2281 if (exp_acct && chat->account != exp_acct) | |
2282 return; | |
10343 | 2283 |
9787 | 2284 acct_name = g_markup_escape_text(chat->account->username, -1); |
2285 fprintf(file, "\t\t\t<chat proto=\"%s\" account=\"%s\">\n", | |
2286 gaim_account_get_protocol_id(chat->account), acct_name); | |
2287 g_free(acct_name); | |
2288 | |
2289 if (chat->alias) { | |
2290 char *chat_alias = g_markup_escape_text(chat->alias, -1); | |
2291 fprintf(file, "\t\t\t\t<alias>%s</alias>\n", chat_alias); | |
2292 g_free(chat_alias); | |
2293 } | |
2294 | |
2295 g_hash_table_foreach(chat->components, blist_print_chat_components, file); | |
2296 g_hash_table_foreach(chat->node.settings, blist_print_cnode_settings, file); | |
2297 | |
2298 fprintf(file, "\t\t\t</chat>\n"); | |
2299 } | |
2300 | |
2301 | |
2302 static void blist_write_group(FILE *file, GaimAccount *exp_acct, GaimGroup *group) | |
2303 { | |
2304 GaimBlistNode *cnode, *gnode = (GaimBlistNode *) group; | |
2305 char *group_name; | |
2306 | |
2307 if (! GAIM_BLIST_NODE_SHOULD_SAVE(gnode)) | |
2308 return; | |
2309 | |
2310 if (exp_acct && ! gaim_group_on_account(group, exp_acct)) | |
2311 return; | |
2312 | |
2313 group_name = g_markup_escape_text(group->name, -1); | |
2314 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
2315 g_free(group_name); | |
2316 | |
2317 g_hash_table_foreach(group->node.settings, | |
2318 blist_print_group_settings, file); | |
2319 | |
2320 for (cnode = gnode->child; cnode; cnode = cnode->next) { | |
2321 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
2322 blist_write_contact(file, exp_acct, (GaimContact *) cnode); | |
2323 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
2324 blist_write_chat(file, exp_acct, (GaimChat *) cnode); | |
2325 } | |
2326 } | |
2327 | |
2328 fprintf(file, "\t\t</group>\n"); | |
2329 } | |
2330 | |
2331 | |
2332 static void blist_write_privacy_account(FILE *file, GaimAccount *exp_acct, GaimAccount *account) | |
2333 { | |
2334 char *acct_name; | |
2335 GSList *buds; | |
2336 | |
2337 if(exp_acct && exp_acct != account) | |
2338 return; | |
2339 | |
2340 acct_name = g_markup_escape_text(account->username, -1); | |
2341 fprintf(file, "\t\t<account proto=\"%s\" name=\"%s\" mode=\"%d\">\n", | |
2342 gaim_account_get_protocol_id(account), | |
2343 acct_name, account->perm_deny); | |
2344 g_free(acct_name); | |
2345 | |
2346 for (buds = account->permit; buds; buds = buds->next) { | |
2347 char *bud_name = g_markup_escape_text(buds->data, -1); | |
2348 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
2349 g_free(bud_name); | |
2350 } | |
2351 | |
2352 for (buds = account->deny; buds; buds = buds->next) { | |
2353 char *bud_name = g_markup_escape_text(buds->data, -1); | |
2354 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
2355 g_free(bud_name); | |
2356 } | |
2357 | |
2358 fprintf(file, "\t\t</account>\n"); | |
2359 } | |
2360 | |
2361 | |
9285 | 2362 static void gaim_blist_write(FILE *file, GaimAccount *exp_acct) |
2363 { | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2364 GList *accounts; |
9787 | 2365 GaimBlistNode *gnode; |
2366 | |
5228 | 2367 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
2368 fprintf(file, "<gaim version=\"1\">\n"); | |
2369 fprintf(file, "\t<blist>\n"); | |
2370 | |
9285 | 2371 for (gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
9787 | 2372 if (GAIM_BLIST_NODE_IS_GROUP(gnode)) |
2373 blist_write_group(file, exp_acct, (GaimGroup *) gnode); | |
5228 | 2374 } |
2375 | |
2376 fprintf(file, "\t</blist>\n"); | |
2377 fprintf(file, "\t<privacy>\n"); | |
2378 | |
9787 | 2379 for (accounts = gaim_accounts_get_all(); accounts; accounts = accounts->next) { |
2380 blist_write_privacy_account(file, exp_acct, (GaimAccount *) accounts->data); | |
5228 | 2381 } |
2382 | |
2383 fprintf(file, "\t</privacy>\n"); | |
2384 fprintf(file, "</gaim>\n"); | |
2385 } | |
2386 | |
9787 | 2387 |
9285 | 2388 void gaim_blist_sync() |
2389 { | |
5228 | 2390 FILE *file; |
10332 | 2391 const char *user_dir = gaim_user_dir(); |
5228 | 2392 char *filename; |
2393 char *filename_real; | |
2394 | |
9285 | 2395 if (!user_dir) |
5228 | 2396 return; |
9285 | 2397 |
2398 if (!blist_safe_to_write) { | |
5228 | 2399 gaim_debug(GAIM_DEBUG_WARNING, "blist save", |
2400 "AHH!! Tried to write the blist before we read it!\n"); | |
2401 return; | |
2402 } | |
2403 | |
2404 file = fopen(user_dir, "r"); | |
9285 | 2405 if (!file) |
5228 | 2406 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); |
2407 else | |
2408 fclose(file); | |
2409 | |
2410 filename = g_build_filename(user_dir, "blist.xml.save", NULL); | |
2411 | |
9285 | 2412 if ((file = fopen(filename, "w"))) { |
5228 | 2413 gaim_blist_write(file, NULL); |
2414 fclose(file); | |
2415 chmod(filename, S_IRUSR | S_IWUSR); | |
2416 } else { | |
2417 gaim_debug(GAIM_DEBUG_ERROR, "blist save", "Unable to write %s\n", | |
2418 filename); | |
8549 | 2419 g_free(filename); |
2420 return; | |
5228 | 2421 } |
2422 | |
2423 filename_real = g_build_filename(user_dir, "blist.xml", NULL); | |
2424 | |
9285 | 2425 if (rename(filename, filename_real) < 0) |
5228 | 2426 gaim_debug(GAIM_DEBUG_ERROR, "blist save", |
2427 "Error renaming %s to %s\n", filename, filename_real); | |
2428 | |
2429 | |
2430 g_free(filename); | |
2431 g_free(filename_real); | |
2432 } | |
2433 | |
7693 | 2434 |
2435 static void gaim_blist_node_setting_free(struct gaim_blist_node_setting *setting) | |
2436 { | |
2437 switch(setting->type) { | |
2438 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2439 case GAIM_BLIST_NODE_SETTING_INT: | |
2440 break; | |
2441 case GAIM_BLIST_NODE_SETTING_STRING: | |
2442 g_free(setting->value.string); | |
2443 break; | |
2444 } | |
8020 | 2445 g_free(setting); |
7693 | 2446 } |
2447 | |
9285 | 2448 static void gaim_blist_node_initialize_settings(GaimBlistNode *node) |
7693 | 2449 { |
9285 | 2450 if (node->settings) |
5228 | 2451 return; |
7693 | 2452 |
2453 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2454 (GDestroyNotify)gaim_blist_node_setting_free); | |
2455 } | |
2456 | |
2457 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2458 { | |
2459 g_return_if_fail(node != NULL); | |
2460 g_return_if_fail(node->settings != NULL); | |
2461 g_return_if_fail(key != NULL); | |
2462 | |
2463 g_hash_table_remove(node->settings, key); | |
9285 | 2464 |
2465 schedule_blist_save(); | |
5228 | 2466 } |
2467 | |
7693 | 2468 |
2469 void gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean value) | |
2470 { | |
2471 struct gaim_blist_node_setting *setting; | |
2472 | |
2473 g_return_if_fail(node != NULL); | |
2474 g_return_if_fail(node->settings != NULL); | |
2475 g_return_if_fail(key != NULL); | |
2476 | |
2477 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2478 setting->type = GAIM_BLIST_NODE_SETTING_BOOL; | |
2479 setting->value.boolean = value; | |
2480 | |
2481 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
9285 | 2482 |
2483 schedule_blist_save(); | |
7693 | 2484 } |
2485 | |
2486 gboolean gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
2487 { | |
2488 struct gaim_blist_node_setting *setting; | |
2489 | |
2490 g_return_val_if_fail(node != NULL, FALSE); | |
2491 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2492 g_return_val_if_fail(key != NULL, FALSE); | |
2493 | |
2494 setting = g_hash_table_lookup(node->settings, key); | |
2495 | |
9285 | 2496 if (!setting) |
7849 | 2497 return FALSE; |
2498 | |
7848 | 2499 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_BOOL, FALSE); |
2500 | |
2501 return setting->value.boolean; | |
5228 | 2502 } |
2503 | |
7693 | 2504 void gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int value) |
2505 { | |
2506 struct gaim_blist_node_setting *setting; | |
2507 | |
2508 g_return_if_fail(node != NULL); | |
2509 g_return_if_fail(node->settings != NULL); | |
2510 g_return_if_fail(key != NULL); | |
2511 | |
2512 setting = g_new0(struct gaim_blist_node_setting, 1); | |
8071 | 2513 setting->type = GAIM_BLIST_NODE_SETTING_INT; |
7693 | 2514 setting->value.integer = value; |
2515 | |
2516 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
9285 | 2517 |
2518 schedule_blist_save(); | |
7693 | 2519 } |
2520 | |
2521 int gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
2522 { | |
2523 struct gaim_blist_node_setting *setting; | |
2524 | |
2525 g_return_val_if_fail(node != NULL, 0); | |
2526 g_return_val_if_fail(node->settings != NULL, 0); | |
2527 g_return_val_if_fail(key != NULL, 0); | |
2528 | |
2529 setting = g_hash_table_lookup(node->settings, key); | |
2530 | |
9285 | 2531 if (!setting) |
7849 | 2532 return 0; |
2533 | |
7848 | 2534 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_INT, 0); |
2535 | |
2536 return setting->value.integer; | |
7693 | 2537 } |
2538 | |
2539 void gaim_blist_node_set_string(GaimBlistNode* node, const char *key, | |
5906 | 2540 const char *value) |
2541 { | |
7693 | 2542 struct gaim_blist_node_setting *setting; |
2543 | |
2544 g_return_if_fail(node != NULL); | |
2545 g_return_if_fail(node->settings != NULL); | |
2546 g_return_if_fail(key != NULL); | |
2547 | |
2548 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2549 setting->type = GAIM_BLIST_NODE_SETTING_STRING; | |
2550 setting->value.string = g_strdup(value); | |
2551 | |
2552 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
9285 | 2553 |
2554 schedule_blist_save(); | |
7693 | 2555 } |
2556 | |
2557 const char *gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
2558 { | |
2559 struct gaim_blist_node_setting *setting; | |
2560 | |
2561 g_return_val_if_fail(node != NULL, NULL); | |
2562 g_return_val_if_fail(node->settings != NULL, NULL); | |
2563 g_return_val_if_fail(key != NULL, NULL); | |
2564 | |
2565 setting = g_hash_table_lookup(node->settings, key); | |
2566 | |
9285 | 2567 if (!setting) |
7849 | 2568 return NULL; |
2569 | |
7848 | 2570 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_STRING, NULL); |
2571 | |
2572 return setting->value.string; | |
7693 | 2573 } |
2574 | |
9285 | 2575 GList *gaim_blist_node_get_extended_menu(GaimBlistNode *n) |
7693 | 2576 { |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2577 GList *menu = NULL; |
9030 | 2578 |
2579 g_return_val_if_fail(n, NULL); | |
2580 | |
2581 gaim_signal_emit(gaim_blist_get_handle(), | |
2582 "blist-node-extended-menu", | |
2583 n, &menu); | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2584 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2585 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2586 |
9030 | 2587 |
2588 GaimBlistNodeAction * | |
2589 gaim_blist_node_action_new(char *label, | |
2590 void (*callback)(GaimBlistNode *, gpointer), | |
2591 gpointer data) | |
2592 { | |
2593 GaimBlistNodeAction *act = g_new0(GaimBlistNodeAction, 1); | |
2594 act->label = label; | |
2595 act->callback = callback; | |
2596 act->data = data; | |
2597 return act; | |
8952 | 2598 } |
2599 | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2600 |
9285 | 2601 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) |
2602 { | |
2603 if (!group) | |
5228 | 2604 return 0; |
2605 | |
5277 | 2606 return offline ? group->totalsize : group->currentsize; |
5228 | 2607 } |
2608 | |
9285 | 2609 int gaim_blist_get_group_online_count(GaimGroup *group) |
2610 { | |
2611 if (!group) | |
5228 | 2612 return 0; |
2613 | |
5277 | 2614 return group->online; |
5228 | 2615 } |
2616 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2617 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2618 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2619 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2620 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2621 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2622 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2623 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2624 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2625 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2626 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2627 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2628 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2629 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2630 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2631 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2632 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2633 static int handle; |
5228 | 2634 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2635 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2636 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2637 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2638 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2639 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2640 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2641 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2642 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2643 gaim_signal_register(handle, "buddy-away", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2644 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2645 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2646 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2647 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2648 gaim_signal_register(handle, "buddy-back", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2649 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2650 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2651 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2652 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2653 gaim_signal_register(handle, "buddy-idle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2654 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2655 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2656 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2657 gaim_signal_register(handle, "buddy-unidle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2658 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2659 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2660 GAIM_SUBTYPE_BLIST_BUDDY)); |
9109
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2661 gaim_signal_register(handle, "buddy-idle-updated", |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2662 gaim_marshal_VOID__POINTER, NULL, 1, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2663 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9f21659ecf11
[gaim-migrate @ 9886]
Christian Hammond <chipx86@chipx86.com>
parents:
9030
diff
changeset
|
2664 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2665 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2666 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2667 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2668 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2669 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2670 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2671 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2672 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2673 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2674 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2675 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2676 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
9030 | 2677 |
2678 gaim_signal_register(handle, "blist-node-extended-menu", | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2679 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2680 gaim_value_new(GAIM_TYPE_SUBTYPE, |
9030 | 2681 GAIM_SUBTYPE_BLIST_NODE), |
8952 | 2682 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2683 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2684 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2685 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2686 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2687 { |
9285 | 2688 if (blist_save_timer != 0) { |
2689 gaim_timeout_remove(blist_save_timer); | |
2690 blist_save_timer = 0; | |
2691 gaim_blist_sync(); | |
2692 } | |
2693 | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2694 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2695 } |