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