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