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