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