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