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