Mercurial > pidgin
annotate src/blist.c @ 8907:00138e366ef8
[gaim-migrate @ 9677]
" Fixes a few warnings on 64bit machines. Also fixes
yahoo auth on 64bit machines which would have taken me
awhile if marv didn't point me in the right direction.
I've applied to my local 32bit copy and everything
seems to be working fine." --Gary Kramlich
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sat, 08 May 2004 23:34:30 +0000 |
parents | c0f5132fd5a3 |
children | e3f4657fa555 |
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 |
1287 if (!name) | |
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 |
ccfdf9f2cdd1
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1405 if (chat->account == account && |
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 } | |
6956 | 1487 if(recompute) { |
1488 gaim_contact_compute_priority_buddy((GaimContact*)cnode); | |
1489 ops->update(gaimbuddylist, cnode); | |
1490 } | |
6695 | 1491 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1492 ((GaimChat*)cnode)->account == account) { |
6901 | 1493 ((GaimGroup *)gnode)->online++; |
1494 ((GaimGroup *)gnode)->currentsize++; | |
1495 ops->update(gaimbuddylist, cnode); | |
5234 | 1496 } |
1497 } | |
6695 | 1498 ops->update(gaimbuddylist, gnode); |
5234 | 1499 } |
1500 } | |
1501 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1502 void gaim_blist_remove_account(GaimAccount *account) |
5228 | 1503 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1504 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
6695 | 1505 GaimBlistNode *gnode, *cnode, *bnode; |
5234 | 1506 |
5228 | 1507 if (!gaimbuddylist) |
1508 return; | |
5234 | 1509 |
6695 | 1510 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
1511 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 1512 continue; |
6695 | 1513 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
1514 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6957 | 1515 gboolean recompute = FALSE; |
6695 | 1516 for(bnode = cnode->child; bnode; bnode = bnode->next) { |
1517 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
1518 continue; | |
1519 if(account == ((GaimBuddy *)bnode)->account) { | |
6957 | 1520 recompute = TRUE; |
6695 | 1521 if(((GaimBuddy*)bnode)->present == GAIM_BUDDY_ONLINE || |
1522 ((GaimBuddy*)bnode)->present == GAIM_BUDDY_SIGNING_ON) { | |
1523 ((GaimContact*)cnode)->online--; | |
1524 if(((GaimContact*)cnode)->online == 0) | |
1525 ((GaimGroup*)gnode)->online--; | |
1526 } | |
1527 ((GaimContact*)cnode)->currentsize--; | |
1528 if(((GaimContact*)cnode)->currentsize == 0) | |
1529 ((GaimGroup*)gnode)->currentsize--; | |
1530 | |
1531 ((GaimBuddy*)bnode)->present = GAIM_BUDDY_OFFLINE; | |
1532 | |
6803 | 1533 ((GaimBuddy*)bnode)->uc = 0; |
1534 ((GaimBuddy*)bnode)->idle = 0; | |
1535 ((GaimBuddy*)bnode)->evil = 0; | |
1536 | |
6945 | 1537 |
6695 | 1538 if(ops) |
1539 ops->remove(gaimbuddylist, bnode); | |
1540 } | |
5234 | 1541 } |
6983 | 1542 if(recompute) { |
6959 | 1543 gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
6983 | 1544 if(ops) |
1545 ops->update(gaimbuddylist, cnode); | |
1546 } | |
6695 | 1547 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode) && |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1548 ((GaimChat*)cnode)->account == account) { |
6695 | 1549 ((GaimGroup*)gnode)->currentsize--; |
1550 ((GaimGroup*)gnode)->online--; | |
1551 if(ops) | |
1552 ops->remove(gaimbuddylist, cnode); | |
5228 | 1553 } |
1554 } | |
1555 } | |
1556 } | |
1557 | |
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1558 void gaim_blist_parse_toc_buddy_list(GaimAccount *account, char *config) |
5228 | 1559 { |
1560 char *c; | |
1561 char current[256]; | |
1562 GList *bud = NULL; | |
1563 | |
1564 | |
1565 if (config != NULL) { | |
1566 | |
1567 /* skip "CONFIG:" (if it exists) */ | |
1568 c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
1569 strtok(config, "\n") : | |
1570 strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
1571 do { | |
1572 if (c == NULL) | |
1573 break; | |
1574 if (*c == 'g') { | |
1575 char *utf8 = NULL; | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1576 utf8 = gaim_utf8_try_convert(c + 2); |
5228 | 1577 if (utf8 == NULL) { |
1578 g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); | |
1579 } else { | |
1580 g_strlcpy(current, utf8, sizeof(current)); | |
1581 g_free(utf8); | |
1582 } | |
1583 if (!gaim_find_group(current)) { | |
6695 | 1584 GaimGroup *g = gaim_group_new(current); |
5634 | 1585 gaim_blist_add_group(g, |
1586 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
5228 | 1587 } |
1588 } else if (*c == 'b') { /*&& !gaim_find_buddy(user, c + 2)) {*/ | |
1589 char nm[80], sw[388], *a, *utf8 = NULL; | |
1590 | |
1591 if ((a = strchr(c + 2, ':')) != NULL) { | |
1592 *a++ = '\0'; /* nul the : */ | |
1593 } | |
1594 | |
1595 g_strlcpy(nm, c + 2, sizeof(nm)); | |
1596 if (a) { | |
7108
6faeeecab0dc
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1597 utf8 = gaim_utf8_try_convert(a); |
5228 | 1598 if (utf8 == NULL) { |
1599 gaim_debug(GAIM_DEBUG_ERROR, "toc blist", | |
1600 "Failed to convert alias for " | |
1601 "'%s' to UTF-8\n", nm); | |
1602 } | |
1603 } | |
1604 if (utf8 == NULL) { | |
1605 sw[0] = '\0'; | |
1606 } else { | |
1607 /* This can leave a partial sequence at the end, | |
1608 * but who cares? */ | |
1609 g_strlcpy(sw, utf8, sizeof(sw)); | |
1610 g_free(utf8); | |
1611 } | |
1612 | |
1613 if (!gaim_find_buddy(account, nm)) { | |
6695 | 1614 GaimBuddy *b = gaim_buddy_new(account, nm, sw); |
1615 GaimGroup *g = gaim_find_group(current); | |
1616 gaim_blist_add_buddy(b, NULL, g, | |
5634 | 1617 gaim_blist_get_last_child((GaimBlistNode*)g)); |
5228 | 1618 bud = g_list_append(bud, g_strdup(nm)); |
1619 } | |
1620 } else if (*c == 'p') { | |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1621 gaim_privacy_permit_add(account, c + 2, TRUE); |
5228 | 1622 } else if (*c == 'd') { |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1623 gaim_privacy_deny_add(account, c + 2, TRUE); |
5228 | 1624 } else if (!strncmp("toc", c, 3)) { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1625 sscanf(c + strlen(c) - 1, "%d", &account->perm_deny); |
5228 | 1626 gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1627 "permdeny: %d\n", account->perm_deny); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1628 if (account->perm_deny == 0) |
8175 | 1629 account->perm_deny = GAIM_PRIVACY_ALLOW_ALL; |
5228 | 1630 } else if (*c == 'm') { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1631 sscanf(c + 2, "%d", &account->perm_deny); |
5228 | 1632 gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1633 "permdeny: %d\n", account->perm_deny); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1634 if (account->perm_deny == 0) |
8175 | 1635 account->perm_deny = GAIM_PRIVACY_ALLOW_ALL; |
5228 | 1636 } |
1637 } while ((c = strtok(NULL, "\n"))); | |
1638 | |
1639 if(account->gc) { | |
1640 if(bud) { | |
1641 GList *node = bud; | |
1642 serv_add_buddies(account->gc, bud); | |
1643 while(node) { | |
1644 g_free(node->data); | |
1645 node = node->next; | |
1646 } | |
1647 } | |
1648 serv_set_permit_deny(account->gc); | |
1649 } | |
1650 g_list_free(bud); | |
1651 } | |
1652 } | |
1653 | |
1654 #if 0 | |
1655 /* translate an AIM 3 buddylist (*.lst) to a Gaim buddylist */ | |
1656 static GString *translate_lst(FILE *src_fp) | |
1657 { | |
1658 char line[BUF_LEN], *line2; | |
1659 char *name; | |
1660 int i; | |
1661 | |
1662 GString *dest = g_string_new("m 1\n"); | |
1663 | |
1664 while (fgets(line, BUF_LEN, src_fp)) { | |
1665 line2 = g_strchug(line); | |
1666 if (strstr(line2, "group") == line2) { | |
1667 name = strpbrk(line2, " \t\n\r\f") + 1; | |
1668 dest = g_string_append(dest, "g "); | |
1669 for (i = 0; i < strcspn(name, "\n\r"); i++) | |
1670 if (name[i] != '\"') | |
1671 dest = g_string_append_c(dest, name[i]); | |
1672 dest = g_string_append_c(dest, '\n'); | |
1673 } | |
1674 if (strstr(line2, "buddy") == line2) { | |
1675 name = strpbrk(line2, " \t\n\r\f") + 1; | |
1676 dest = g_string_append(dest, "b "); | |
1677 for (i = 0; i < strcspn(name, "\n\r"); i++) | |
1678 if (name[i] != '\"') | |
1679 dest = g_string_append_c(dest, name[i]); | |
1680 dest = g_string_append_c(dest, '\n'); | |
1681 } | |
1682 } | |
1683 | |
1684 return dest; | |
1685 } | |
1686 | |
1687 | |
1688 /* translate an AIM 4 buddylist (*.blt) to Gaim format */ | |
1689 static GString *translate_blt(FILE *src_fp) | |
1690 { | |
1691 int i; | |
1692 char line[BUF_LEN]; | |
1693 char *buddy; | |
1694 | |
1695 GString *dest = g_string_new("m 1\n"); | |
1696 | |
1697 while (strstr(fgets(line, BUF_LEN, src_fp), "Buddy") == NULL); | |
1698 while (strstr(fgets(line, BUF_LEN, src_fp), "list") == NULL); | |
1699 | |
1700 while (1) { | |
1701 fgets(line, BUF_LEN, src_fp); g_strchomp(line); | |
1702 if (strchr(line, '}') != NULL) | |
1703 break; | |
1704 | |
1705 if (strchr(line, '{') != NULL) { | |
1706 /* Syntax starting with "<group> {" */ | |
1707 | |
1708 dest = g_string_append(dest, "g "); | |
1709 buddy = g_strchug(strtok(line, "{")); | |
1710 for (i = 0; i < strlen(buddy); i++) | |
1711 if (buddy[i] != '\"') | |
1712 dest = g_string_append_c(dest, buddy[i]); | |
1713 dest = g_string_append_c(dest, '\n'); | |
1714 while (strchr(fgets(line, BUF_LEN, src_fp), '}') == NULL) { | |
1715 gboolean pounce = FALSE; | |
1716 char *e; | |
1717 g_strchomp(line); | |
1718 buddy = g_strchug(line); | |
1719 gaim_debug(GAIM_DEBUG_MISC, "AIM 4 blt import", | |
1720 "buddy: \"%s\"\n", buddy); | |
1721 dest = g_string_append(dest, "b "); | |
1722 if (strchr(buddy, '{') != NULL) { | |
1723 /* buddy pounce, etc */ | |
1724 char *pos = strchr(buddy, '{') - 1; | |
1725 *pos = 0; | |
1726 pounce = TRUE; | |
1727 } | |
1728 if ((e = strchr(buddy, '\"')) != NULL) { | |
1729 *e = '\0'; | |
1730 buddy++; | |
1731 } | |
1732 dest = g_string_append(dest, buddy); | |
1733 dest = g_string_append_c(dest, '\n'); | |
1734 if (pounce) | |
1735 do | |
1736 fgets(line, BUF_LEN, src_fp); | |
1737 while (!strchr(line, '}')); | |
1738 } | |
1739 } else { | |
1740 | |
1741 /* Syntax "group buddy buddy ..." */ | |
1742 buddy = g_strchug(strtok(line, " \n")); | |
1743 dest = g_string_append(dest, "g "); | |
1744 if (strchr(buddy, '\"') != NULL) { | |
1745 dest = g_string_append(dest, &buddy[1]); | |
1746 dest = g_string_append_c(dest, ' '); | |
1747 buddy = g_strchug(strtok(NULL, " \n")); | |
1748 while (strchr(buddy, '\"') == NULL) { | |
1749 dest = g_string_append(dest, buddy); | |
1750 dest = g_string_append_c(dest, ' '); | |
1751 buddy = g_strchug(strtok(NULL, " \n")); | |
1752 } | |
1753 buddy[strlen(buddy) - 1] = '\0'; | |
1754 dest = g_string_append(dest, buddy); | |
1755 } else { | |
1756 dest = g_string_append(dest, buddy); | |
1757 } | |
1758 dest = g_string_append_c(dest, '\n'); | |
1759 while ((buddy = g_strchug(strtok(NULL, " \n"))) != NULL) { | |
1760 dest = g_string_append(dest, "b "); | |
1761 if (strchr(buddy, '\"') != NULL) { | |
1762 dest = g_string_append(dest, &buddy[1]); | |
1763 dest = g_string_append_c(dest, ' '); | |
1764 buddy = g_strchug(strtok(NULL, " \n")); | |
1765 while (strchr(buddy, '\"') == NULL) { | |
1766 dest = g_string_append(dest, buddy); | |
1767 dest = g_string_append_c(dest, ' '); | |
1768 buddy = g_strchug(strtok(NULL, " \n")); | |
1769 } | |
1770 buddy[strlen(buddy) - 1] = '\0'; | |
1771 dest = g_string_append(dest, buddy); | |
1772 } else { | |
1773 dest = g_string_append(dest, buddy); | |
1774 } | |
1775 dest = g_string_append_c(dest, '\n'); | |
1776 } | |
1777 } | |
1778 } | |
1779 | |
1780 return dest; | |
1781 } | |
1782 | |
1783 static GString *translate_gnomeicu(FILE *src_fp) | |
1784 { | |
1785 char line[BUF_LEN]; | |
1786 GString *dest = g_string_new("m 1\ng Buddies\n"); | |
1787 | |
1788 while (strstr(fgets(line, BUF_LEN, src_fp), "NewContacts") == NULL); | |
1789 | |
1790 while (fgets(line, BUF_LEN, src_fp)) { | |
1791 char *eq; | |
1792 g_strchomp(line); | |
1793 if (line[0] == '\n' || line[0] == '[') | |
1794 break; | |
1795 eq = strchr(line, '='); | |
1796 if (!eq) | |
1797 break; | |
1798 *eq = ':'; | |
1799 eq = strchr(eq, ','); | |
1800 if (eq) | |
1801 *eq = '\0'; | |
1802 dest = g_string_append(dest, "b "); | |
1803 dest = g_string_append(dest, line); | |
1804 dest = g_string_append_c(dest, '\n'); | |
1805 } | |
1806 | |
1807 return dest; | |
1808 } | |
1809 #endif | |
1810 | |
1811 static gchar *get_screenname_filename(const char *name) | |
1812 { | |
1813 gchar **split; | |
1814 gchar *good; | |
1815 gchar *ret; | |
1816 | |
1817 split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
1818 good = g_strjoinv(NULL, split); | |
1819 g_strfreev(split); | |
1820 | |
1821 ret = g_utf8_strup(good, -1); | |
1822 | |
1823 g_free(good); | |
1824 | |
1825 return ret; | |
1826 } | |
1827 | |
1828 static gboolean gaim_blist_read(const char *filename); | |
1829 | |
1830 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1831 static void do_import(GaimAccount *account, const char *filename) |
5228 | 1832 { |
1833 GString *buf = NULL; | |
1834 char first[64]; | |
1835 char path[PATHSIZE]; | |
1836 int len; | |
1837 FILE *f; | |
1838 struct stat st; | |
1839 | |
1840 if (filename) { | |
1841 g_snprintf(path, sizeof(path), "%s", filename); | |
1842 } else { | |
1843 char *g_screenname = get_screenname_filename(account->username); | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1844 const char *username; |
5228 | 1845 char *file = gaim_user_dir(); |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1846 GaimProtocol prpl_num; |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1847 int protocol; |
6695 | 1848 |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1849 prpl_num = gaim_account_get_protocol(account); |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1850 |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1851 protocol = prpl_num; |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1852 |
6450
e7b87c8e8c0a
[gaim-migrate @ 6959]
Christian Hammond <chipx86@chipx86.com>
parents:
6392
diff
changeset
|
1853 /* TODO Somehow move this checking into prpls */ |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1854 if (prpl_num == GAIM_PROTO_OSCAR) { |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1855 if ((username = gaim_account_get_username(account)) != NULL) { |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1856 protocol = (isalpha(*username) |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1857 ? GAIM_PROTO_TOC : GAIM_PROTO_ICQ); |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1858 } |
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1859 } |
5228 | 1860 |
1861 if (file != (char *)NULL) { | |
5435 | 1862 snprintf(path, PATHSIZE, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
5228 | 1863 g_free(g_screenname); |
1864 } else { | |
1865 g_free(g_screenname); | |
1866 return; | |
1867 } | |
1868 } | |
1869 | |
1870 if (stat(path, &st)) { | |
1871 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to stat %s.\n", | |
1872 path); | |
1873 return; | |
1874 } | |
1875 | |
1876 if (!(f = fopen(path, "r"))) { | |
1877 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to open %s.\n", | |
1878 path); | |
1879 return; | |
1880 } | |
1881 | |
1882 fgets(first, 64, f); | |
1883 | |
1884 if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) | |
1885 fgets(first, 64, f); | |
1886 | |
1887 #if 0 | |
8430 | 1888 if (!g_ascii_strncasecmp(first, "<xml", strlen("<xml"))) { |
5228 | 1889 /* new gaim XML buddy list */ |
1890 gaim_blist_read(path); | |
1891 | |
1892 /* We really don't need to bother doing stuf like translating AIM 3 buddy lists anymore */ | |
1893 | |
8430 | 1894 } else if (!g_ascii_strncasecmp(first, "Config {", strlen("Config {"))) { |
5228 | 1895 /* AIM 4 buddy list */ |
1896 gaim_debug(GAIM_DEBUG_MISC, "blist import", "aim 4\n"); | |
1897 rewind(f); | |
1898 buf = translate_blt(f); | |
1899 } else if (strstr(first, "group") != NULL) { | |
1900 /* AIM 3 buddy list */ | |
1901 gaim_debug(GAIM_DEBUG_MISC, "blist import", "aim 3\n"); | |
1902 rewind(f); | |
1903 buf = translate_lst(f); | |
8430 | 1904 } else if (!g_ascii_strncasecmp(first, "[User]", strlen("[User]"))) { |
5228 | 1905 /* GnomeICU (hopefully) */ |
1906 gaim_debug(GAIM_DEBUG_MISC, "blist import", "gnomeicu\n"); | |
1907 rewind(f); | |
1908 buf = translate_gnomeicu(f); | |
1909 | |
1910 } else | |
1911 #endif | |
1912 if (first[0] == 'm') { | |
1913 /* Gaim buddy list - no translation */ | |
1914 char buf2[BUF_LONG * 2]; | |
1915 buf = g_string_new(""); | |
1916 rewind(f); | |
1917 while (1) { | |
1918 len = fread(buf2, 1, BUF_LONG * 2 - 1, f); | |
1919 if (len <= 0) | |
1920 break; | |
1921 buf2[len] = '\0'; | |
1922 buf = g_string_append(buf, buf2); | |
1923 if (len != BUF_LONG * 2 - 1) | |
1924 break; | |
1925 } | |
1926 } | |
1927 | |
1928 fclose(f); | |
1929 | |
1930 if (buf) { | |
1931 buf = g_string_prepend(buf, "toc_set_config {"); | |
1932 buf = g_string_append(buf, "}\n"); | |
7117
943085b0ff8b
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1933 gaim_blist_parse_toc_buddy_list(account, buf->str); |
5228 | 1934 g_string_free(buf, TRUE); |
1935 } | |
1936 } | |
1937 | |
6695 | 1938 gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) { |
1939 GaimBlistNode *cnode, *bnode; | |
1940 for(cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { | |
1941 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
1942 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
1943 if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
1944 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
1945 if((!account && gaim_account_is_connected(buddy->account)) | |
1946 || buddy->account == account) | |
1947 return TRUE; | |
1948 } | |
1949 } | |
1950 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1951 GaimChat *chat = (GaimChat *)cnode; |
6695 | 1952 if((!account && gaim_account_is_connected(chat->account)) |
1953 || chat->account == account) | |
1954 return TRUE; | |
1955 } | |
5228 | 1956 } |
1957 return FALSE; | |
1958 } | |
1959 | |
1960 static gboolean blist_safe_to_write = FALSE; | |
1961 | |
7132 | 1962 static void parse_setting(GaimBlistNode *node, xmlnode *setting) |
1963 { | |
1964 const char *name = xmlnode_get_attrib(setting, "name"); | |
7693 | 1965 const char *type = xmlnode_get_attrib(setting, "type"); |
7132 | 1966 char *value = xmlnode_get_data(setting); |
1967 | |
7693 | 1968 if(!value) |
1969 return; | |
1970 | |
1971 if(!type || !strcmp(type, "string")) | |
1972 gaim_blist_node_set_string(node, name, value); | |
1973 else if(!strcmp(type, "bool")) | |
1974 gaim_blist_node_set_bool(node, name, atoi(value)); | |
1975 else if(!strcmp(type, "int")) | |
1976 gaim_blist_node_set_int(node, name, atoi(value)); | |
7132 | 1977 |
1978 g_free(value); | |
1979 } | |
1980 | |
1981 static void parse_buddy(GaimGroup *group, GaimContact *contact, xmlnode *bnode) | |
1982 { | |
1983 GaimAccount *account; | |
1984 GaimBuddy *buddy; | |
7727 | 1985 char *name = NULL, *alias = NULL; |
7153 | 1986 const char *acct_name, *proto, *protocol; |
7132 | 1987 xmlnode *x; |
1988 | |
1989 acct_name = xmlnode_get_attrib(bnode, "account"); | |
7153 | 1990 protocol = xmlnode_get_attrib(bnode, "protocol"); |
1991 proto = xmlnode_get_attrib(bnode, "proto"); | |
1992 | |
1993 if(!acct_name || (!proto && !protocol)) | |
7132 | 1994 return; |
1995 | |
7153 | 1996 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 1997 |
1998 if(!account) | |
1999 return; | |
2000 | |
2001 if((x = xmlnode_get_child(bnode, "name"))) | |
2002 name = xmlnode_get_data(x); | |
2003 | |
2004 if(!name) | |
2005 return; | |
2006 | |
2007 if((x = xmlnode_get_child(bnode, "alias"))) | |
2008 alias = xmlnode_get_data(x); | |
2009 | |
2010 buddy = gaim_buddy_new(account, name, alias); | |
2011 gaim_blist_add_buddy(buddy, contact, group, | |
2012 gaim_blist_get_last_child((GaimBlistNode*)contact)); | |
2013 | |
8135 | 2014 for(x = xmlnode_get_child(bnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 2015 parse_setting((GaimBlistNode*)buddy, x); |
2016 } | |
2017 | |
2018 g_free(name); | |
2019 if(alias) | |
2020 g_free(alias); | |
2021 } | |
2022 | |
2023 static void parse_contact(GaimGroup *group, xmlnode *cnode) | |
2024 { | |
2025 GaimContact *contact = gaim_contact_new(); | |
2026 xmlnode *x; | |
7245 | 2027 const char *alias; |
7132 | 2028 |
2029 gaim_blist_add_contact(contact, group, | |
2030 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
2031 | |
7245 | 2032 if((alias = xmlnode_get_attrib(cnode, "alias"))) { |
7132 | 2033 gaim_contact_set_alias(contact, alias); |
2034 } | |
2035 | |
2036 for(x = cnode->child; x; x = x->next) { | |
8135 | 2037 if(x->type != XMLNODE_TYPE_TAG) |
7132 | 2038 continue; |
2039 if(!strcmp(x->name, "buddy")) | |
2040 parse_buddy(group, contact, x); | |
2041 else if(strcmp(x->name, "setting")) | |
2042 parse_setting((GaimBlistNode*)contact, x); | |
5228 | 2043 } |
7825 | 2044 |
2045 /* if the contact is empty, don't keep it around. it causes problems */ | |
2046 if(!((GaimBlistNode*)contact)->child) | |
2047 gaim_blist_remove_contact(contact); | |
5228 | 2048 } |
2049 | |
7132 | 2050 static void parse_chat(GaimGroup *group, xmlnode *cnode) |
2051 { | |
2052 GaimChat *chat; | |
2053 GaimAccount *account; | |
7153 | 2054 const char *acct_name, *proto, *protocol; |
7132 | 2055 xmlnode *x; |
2056 char *alias = NULL; | |
2057 GHashTable *components; | |
2058 | |
2059 acct_name = xmlnode_get_attrib(cnode, "account"); | |
7153 | 2060 protocol = xmlnode_get_attrib(cnode, "protocol"); |
2061 proto = xmlnode_get_attrib(cnode, "proto"); | |
2062 | |
2063 if(!acct_name || (!proto && !protocol)) | |
7132 | 2064 return; |
2065 | |
7153 | 2066 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 2067 |
2068 if(!account) | |
2069 return; | |
2070 | |
2071 if((x = xmlnode_get_child(cnode, "alias"))) | |
2072 alias = xmlnode_get_data(x); | |
2073 | |
2074 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
2075 | |
8135 | 2076 for(x = xmlnode_get_child(cnode, "component"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 2077 const char *name; |
2078 char *value; | |
2079 | |
2080 name = xmlnode_get_attrib(x, "name"); | |
2081 value = xmlnode_get_data(x); | |
2082 g_hash_table_replace(components, g_strdup(name), value); | |
2083 } | |
2084 | |
2085 chat = gaim_chat_new(account, alias, components); | |
7151 | 2086 gaim_blist_add_chat(chat, group, |
2087 gaim_blist_get_last_child((GaimBlistNode*)group)); | |
7132 | 2088 |
8135 | 2089 for(x = xmlnode_get_child(cnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
7132 | 2090 parse_setting((GaimBlistNode*)chat, x); |
2091 } | |
2092 | |
2093 if(alias) | |
2094 g_free(alias); | |
2095 } | |
2096 | |
2097 | |
2098 static void parse_group(xmlnode *groupnode) | |
2099 { | |
2100 const char *name = xmlnode_get_attrib(groupnode, "name"); | |
2101 GaimGroup *group; | |
2102 xmlnode *cnode; | |
2103 | |
2104 if(!name) | |
2105 name = _("Buddies"); | |
2106 | |
2107 group = gaim_group_new(name); | |
2108 gaim_blist_add_group(group, | |
2109 gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
2110 | |
2111 for(cnode = groupnode->child; cnode; cnode = cnode->next) { | |
8135 | 2112 if(cnode->type != XMLNODE_TYPE_TAG) |
7132 | 2113 continue; |
2114 if(!strcmp(cnode->name, "setting")) | |
2115 parse_setting((GaimBlistNode*)group, cnode); | |
2116 else if(!strcmp(cnode->name, "contact") || | |
2117 !strcmp(cnode->name, "person")) | |
2118 parse_contact(group, cnode); | |
2119 else if(!strcmp(cnode->name, "chat")) | |
2120 parse_chat(group, cnode); | |
5228 | 2121 } |
2122 } | |
2123 | |
2124 static gboolean gaim_blist_read(const char *filename) { | |
7132 | 2125 GError *error; |
5228 | 2126 gchar *contents = NULL; |
2127 gsize length; | |
7132 | 2128 xmlnode *gaim, *blist, *privacy; |
5228 | 2129 |
2130 gaim_debug(GAIM_DEBUG_INFO, "blist import", | |
2131 "Reading %s\n", filename); | |
2132 if(!g_file_get_contents(filename, &contents, &length, &error)) { | |
2133 gaim_debug(GAIM_DEBUG_ERROR, "blist import", | |
2134 "Error reading blist: %s\n", error->message); | |
2135 g_error_free(error); | |
2136 return FALSE; | |
2137 } | |
2138 | |
7132 | 2139 gaim = xmlnode_from_str(contents, length); |
8826 | 2140 |
7132 | 2141 if(!gaim) { |
8826 | 2142 FILE *backup; |
2143 char *name; | |
7132 | 2144 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Error parsing %s\n", |
2145 filename); | |
8826 | 2146 name = g_build_filename(gaim_user_dir(), "blist.xml~", NULL); |
2147 | |
2148 if((backup = fopen(name, "w"))) { | |
2149 fwrite(contents, length, 1, backup); | |
2150 fclose(backup); | |
2151 chmod(name, S_IRUSR | S_IWUSR); | |
2152 } else { | |
2153 gaim_debug(GAIM_DEBUG_ERROR, "blist load", "Unable to write backup %s\n", | |
2154 name); | |
2155 } | |
2156 g_free(name); | |
2157 g_free(contents); | |
5228 | 2158 return FALSE; |
2159 } | |
8826 | 2160 |
2161 g_free(contents); | |
2162 | |
7132 | 2163 blist = xmlnode_get_child(gaim, "blist"); |
2164 if(blist) { | |
2165 xmlnode *groupnode; | |
8135 | 2166 for(groupnode = xmlnode_get_child(blist, "group"); groupnode; |
2167 groupnode = xmlnode_get_next_twin(groupnode)) { | |
7132 | 2168 parse_group(groupnode); |
2169 } | |
5228 | 2170 } |
2171 | |
7132 | 2172 privacy = xmlnode_get_child(gaim, "privacy"); |
2173 if(privacy) { | |
2174 xmlnode *anode; | |
2175 for(anode = privacy->child; anode; anode = anode->next) { | |
2176 xmlnode *x; | |
2177 GaimAccount *account; | |
7153 | 2178 const char *acct_name, *proto, *mode, *protocol; |
7132 | 2179 |
2180 acct_name = xmlnode_get_attrib(anode, "name"); | |
7153 | 2181 protocol = xmlnode_get_attrib(anode, "protocol"); |
2182 proto = xmlnode_get_attrib(anode, "proto"); | |
7132 | 2183 mode = xmlnode_get_attrib(anode, "mode"); |
2184 | |
7153 | 2185 if(!acct_name || (!proto && !protocol) || !mode) |
7132 | 2186 continue; |
2187 | |
7153 | 2188 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 2189 |
2190 if(!account) | |
2191 continue; | |
2192 | |
2193 account->perm_deny = atoi(mode); | |
2194 | |
2195 for(x = anode->child; x; x = x->next) { | |
2196 char *name; | |
8135 | 2197 if(x->type != XMLNODE_TYPE_TAG) |
7132 | 2198 continue; |
2199 | |
2200 if(!strcmp(x->name, "permit")) { | |
2201 name = xmlnode_get_data(x); | |
2202 gaim_privacy_permit_add(account, name, TRUE); | |
2203 g_free(name); | |
2204 } else if(!strcmp(x->name, "block")) { | |
2205 name = xmlnode_get_data(x); | |
2206 gaim_privacy_deny_add(account, name, TRUE); | |
2207 g_free(name); | |
2208 } | |
2209 } | |
2210 } | |
2211 } | |
5228 | 2212 |
2213 gaim_debug(GAIM_DEBUG_INFO, "blist import", "Finished reading %s\n", | |
2214 filename); | |
2215 | |
8200 | 2216 xmlnode_free(gaim); |
5228 | 2217 return TRUE; |
2218 } | |
2219 | |
2220 void gaim_blist_load() { | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2221 GList *accts; |
5228 | 2222 char *user_dir = gaim_user_dir(); |
2223 char *filename; | |
2224 char *msg; | |
2225 | |
2226 blist_safe_to_write = TRUE; | |
2227 | |
2228 if(!user_dir) | |
2229 return; | |
2230 | |
2231 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
2232 | |
2233 if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
2234 if(!gaim_blist_read(filename)) { | |
2235 msg = g_strdup_printf(_("An error was encountered parsing your " | |
8826 | 2236 "buddy list. It has not been loaded, " |
2237 "and the old file has moved to blist.xml~.")); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2238 gaim_notify_error(NULL, NULL, _("Buddy List Error"), msg); |
5228 | 2239 g_free(msg); |
2240 } | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2241 } else if(g_list_length(gaim_accounts_get_all())) { |
5228 | 2242 /* 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
|
2243 for(accts = gaim_accounts_get_all(); accts; accts = accts->next) { |
5228 | 2244 do_import(accts->data, NULL); |
2245 } | |
2246 gaim_blist_save(); | |
2247 } | |
2248 | |
2249 g_free(filename); | |
2250 } | |
2251 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2252 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2253 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2254 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2255 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2256 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2257 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2258 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2259 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2260 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2261 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2262 } |
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 void |
7859 | 2265 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
|
2266 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2267 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2268 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2269 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2270 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2271 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
7859 | 2272 ui_ops->request_add_chat(account, group, alias); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2273 } |
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 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2276 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2277 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2278 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2279 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2280 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2281 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2282 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2283 ui_ops->request_add_group(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2284 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2285 |
7693 | 2286 static void blist_print_setting(const char *key, |
2287 struct gaim_blist_node_setting *setting, FILE *file, int indent) | |
2288 { | |
2289 char *key_val, *data_val = NULL; | |
2290 const char *type = NULL; | |
2291 int i; | |
2292 | |
2293 if(!key) | |
2294 return; | |
2295 | |
2296 switch(setting->type) { | |
2297 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2298 type = "bool"; | |
2299 data_val = g_strdup_printf("%d", setting->value.boolean); | |
2300 break; | |
2301 case GAIM_BLIST_NODE_SETTING_INT: | |
2302 type = "int"; | |
2303 data_val = g_strdup_printf("%d", setting->value.integer); | |
2304 break; | |
2305 case GAIM_BLIST_NODE_SETTING_STRING: | |
2306 if(!setting->value.string) | |
2307 return; | |
2308 | |
2309 type = "string"; | |
2310 data_val = g_markup_escape_text(setting->value.string, -1); | |
2311 break; | |
2312 } | |
2313 | |
2314 /* this can't happen */ | |
2315 if(!type || !data_val) | |
2316 return; | |
2317 | |
2318 for(i=0; i<indent; i++) fprintf(file, "\t"); | |
2319 | |
2320 key_val = g_markup_escape_text(key, -1); | |
2321 fprintf(file, "<setting name=\"%s\" type=\"%s\">%s</setting>\n", key_val, type, | |
2322 data_val); | |
2323 | |
2324 g_free(key_val); | |
2325 g_free(data_val); | |
2326 } | |
2327 | |
5228 | 2328 static void blist_print_group_settings(gpointer key, gpointer data, |
2329 gpointer user_data) { | |
7693 | 2330 blist_print_setting(key, data, user_data, 3); |
5228 | 2331 } |
2332 | |
2333 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
2334 gpointer user_data) { | |
7693 | 2335 blist_print_setting(key, data, user_data, 5); |
5228 | 2336 } |
2337 | |
6695 | 2338 static void blist_print_cnode_settings(gpointer key, gpointer data, |
2339 gpointer user_data) { | |
7693 | 2340 blist_print_setting(key, data, user_data, 4); |
6695 | 2341 } |
2342 | |
5234 | 2343 static void blist_print_chat_components(gpointer key, gpointer data, |
2344 gpointer user_data) { | |
2345 char *key_val; | |
2346 char *data_val; | |
2347 FILE *file = user_data; | |
2348 | |
2349 if(!key || !data) | |
2350 return; | |
2351 | |
2352 key_val = g_markup_escape_text(key, -1); | |
2353 data_val = g_markup_escape_text(data, -1); | |
2354 | |
2355 fprintf(file, "\t\t\t\t<component name=\"%s\">%s</component>\n", key_val, | |
2356 data_val); | |
2357 g_free(key_val); | |
2358 g_free(data_val); | |
2359 } | |
2360 | |
6695 | 2361 static void print_buddy(FILE *file, GaimBuddy *buddy) { |
2362 char *bud_name = g_markup_escape_text(buddy->name, -1); | |
2363 char *bud_alias = NULL; | |
2364 char *acct_name = g_markup_escape_text(buddy->account->username, -1); | |
7153 | 2365 int proto_num = gaim_account_get_protocol(buddy->account); |
6695 | 2366 if(buddy->alias) |
2367 bud_alias= g_markup_escape_text(buddy->alias, -1); | |
7153 | 2368 fprintf(file, "\t\t\t\t<buddy account=\"%s\" proto=\"%s\"", acct_name, |
2369 gaim_account_get_protocol_id(buddy->account)); | |
2370 if(proto_num != -1) | |
2371 fprintf(file, " protocol=\"%d\"", proto_num); | |
2372 fprintf(file, ">\n"); | |
2373 | |
6695 | 2374 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); |
2375 if(bud_alias) { | |
2376 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", bud_alias); | |
2377 } | |
7726 | 2378 g_hash_table_foreach(buddy->node.settings, blist_print_buddy_settings, file); |
6695 | 2379 fprintf(file, "\t\t\t\t</buddy>\n"); |
2380 g_free(bud_name); | |
2381 g_free(bud_alias); | |
2382 g_free(acct_name); | |
2383 } | |
2384 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2385 static void gaim_blist_write(FILE *file, GaimAccount *exp_acct) { |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2386 GList *accounts; |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2387 GSList *buds; |
6695 | 2388 GaimBlistNode *gnode, *cnode, *bnode; |
5228 | 2389 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
2390 fprintf(file, "<gaim version=\"1\">\n"); | |
2391 fprintf(file, "\t<blist>\n"); | |
2392 | |
2393 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
6695 | 2394 GaimGroup *group; |
2395 | |
5228 | 2396 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
2397 continue; | |
6695 | 2398 |
2399 group = (GaimGroup *)gnode; | |
5228 | 2400 if(!exp_acct || gaim_group_on_account(group, exp_acct)) { |
2401 char *group_name = g_markup_escape_text(group->name, -1); | |
2402 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
7693 | 2403 g_hash_table_foreach(group->node.settings, |
2404 blist_print_group_settings, file); | |
6695 | 2405 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
2406 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6755 | 2407 GaimContact *contact = (GaimContact*)cnode; |
2408 fprintf(file, "\t\t\t<contact"); | |
2409 if(contact->alias) { | |
2410 char *alias = g_markup_escape_text(contact->alias, -1); | |
2411 fprintf(file, " alias=\"%s\"", alias); | |
2412 g_free(alias); | |
2413 } | |
2414 fprintf(file, ">\n"); | |
6695 | 2415 |
2416 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
2417 if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2418 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
2419 if(!exp_acct || buddy->account == exp_acct) { | |
2420 print_buddy(file, buddy); | |
2421 } | |
5234 | 2422 } |
5228 | 2423 } |
6695 | 2424 |
2425 fprintf(file, "\t\t\t</contact>\n"); | |
2426 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2427 GaimChat *chat = (GaimChat *)cnode; |
5234 | 2428 if(!exp_acct || chat->account == exp_acct) { |
2429 char *acct_name = g_markup_escape_text(chat->account->username, -1); | |
7153 | 2430 int proto_num = gaim_account_get_protocol(chat->account); |
2431 fprintf(file, "\t\t\t<chat proto=\"%s\" account=\"%s\"", | |
7133 | 2432 gaim_account_get_protocol_id(chat->account), |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2433 acct_name); |
7153 | 2434 if(proto_num != -1) |
2435 fprintf(file, " protocol=\"%d\"", proto_num); | |
2436 fprintf(file, ">\n"); | |
2437 | |
5237 | 2438 if(chat->alias) { |
2439 char *chat_alias = g_markup_escape_text(chat->alias, -1); | |
2440 fprintf(file, "\t\t\t\t<alias>%s</alias>\n", chat_alias); | |
2441 g_free(chat_alias); | |
2442 } | |
5234 | 2443 g_hash_table_foreach(chat->components, |
2444 blist_print_chat_components, file); | |
7693 | 2445 g_hash_table_foreach(chat->node.settings, |
6695 | 2446 blist_print_cnode_settings, file); |
5234 | 2447 fprintf(file, "\t\t\t</chat>\n"); |
5237 | 2448 g_free(acct_name); |
5234 | 2449 } |
5228 | 2450 } |
2451 } | |
2452 fprintf(file, "\t\t</group>\n"); | |
2453 g_free(group_name); | |
2454 } | |
2455 } | |
2456 | |
2457 fprintf(file, "\t</blist>\n"); | |
2458 fprintf(file, "\t<privacy>\n"); | |
2459 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2460 for(accounts = gaim_accounts_get_all(); |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2461 accounts != NULL; |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2462 accounts = accounts->next) { |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2463 |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2464 GaimAccount *account = accounts->data; |
5228 | 2465 char *acct_name = g_markup_escape_text(account->username, -1); |
7153 | 2466 int proto_num = gaim_account_get_protocol(account); |
5228 | 2467 if(!exp_acct || account == exp_acct) { |
7153 | 2468 fprintf(file, "\t\t<account proto=\"%s\" name=\"%s\" " |
2469 "mode=\"%d\"", gaim_account_get_protocol_id(account), | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2470 acct_name, account->perm_deny); |
7153 | 2471 if(proto_num != -1) |
2472 fprintf(file, " protocol=\"%d\"", proto_num); | |
2473 fprintf(file, ">\n"); | |
2474 | |
5228 | 2475 for(buds = account->permit; buds; buds = buds->next) { |
2476 char *bud_name = g_markup_escape_text(buds->data, -1); | |
2477 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
2478 g_free(bud_name); | |
2479 } | |
2480 for(buds = account->deny; buds; buds = buds->next) { | |
2481 char *bud_name = g_markup_escape_text(buds->data, -1); | |
2482 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
2483 g_free(bud_name); | |
2484 } | |
2485 fprintf(file, "\t\t</account>\n"); | |
2486 } | |
2487 g_free(acct_name); | |
2488 } | |
2489 | |
2490 fprintf(file, "\t</privacy>\n"); | |
2491 fprintf(file, "</gaim>\n"); | |
2492 } | |
2493 | |
2494 void gaim_blist_save() { | |
2495 FILE *file; | |
2496 char *user_dir = gaim_user_dir(); | |
2497 char *filename; | |
2498 char *filename_real; | |
2499 | |
2500 if(!user_dir) | |
2501 return; | |
2502 if(!blist_safe_to_write) { | |
2503 gaim_debug(GAIM_DEBUG_WARNING, "blist save", | |
2504 "AHH!! Tried to write the blist before we read it!\n"); | |
2505 return; | |
2506 } | |
2507 | |
2508 file = fopen(user_dir, "r"); | |
2509 if(!file) | |
2510 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
2511 else | |
2512 fclose(file); | |
2513 | |
2514 filename = g_build_filename(user_dir, "blist.xml.save", NULL); | |
2515 | |
2516 if((file = fopen(filename, "w"))) { | |
2517 gaim_blist_write(file, NULL); | |
2518 fclose(file); | |
2519 chmod(filename, S_IRUSR | S_IWUSR); | |
2520 } else { | |
2521 gaim_debug(GAIM_DEBUG_ERROR, "blist save", "Unable to write %s\n", | |
2522 filename); | |
8549 | 2523 g_free(filename); |
2524 return; | |
5228 | 2525 } |
2526 | |
2527 filename_real = g_build_filename(user_dir, "blist.xml", NULL); | |
2528 | |
2529 if(rename(filename, filename_real) < 0) | |
2530 gaim_debug(GAIM_DEBUG_ERROR, "blist save", | |
2531 "Error renaming %s to %s\n", filename, filename_real); | |
2532 | |
2533 | |
2534 g_free(filename); | |
2535 g_free(filename_real); | |
2536 } | |
2537 | |
7693 | 2538 |
2539 static void gaim_blist_node_setting_free(struct gaim_blist_node_setting *setting) | |
2540 { | |
2541 switch(setting->type) { | |
2542 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2543 case GAIM_BLIST_NODE_SETTING_INT: | |
2544 break; | |
2545 case GAIM_BLIST_NODE_SETTING_STRING: | |
2546 g_free(setting->value.string); | |
2547 break; | |
2548 } | |
8020 | 2549 g_free(setting); |
7693 | 2550 } |
2551 | |
2552 static void gaim_blist_node_initialize_settings(GaimBlistNode* node) | |
2553 { | |
2554 if(node->settings) | |
5228 | 2555 return; |
7693 | 2556 |
2557 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2558 (GDestroyNotify)gaim_blist_node_setting_free); | |
2559 } | |
2560 | |
2561 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2562 { | |
2563 g_return_if_fail(node != NULL); | |
2564 g_return_if_fail(node->settings != NULL); | |
2565 g_return_if_fail(key != NULL); | |
2566 | |
2567 g_hash_table_remove(node->settings, key); | |
5228 | 2568 } |
2569 | |
7693 | 2570 |
2571 void gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean value) | |
2572 { | |
2573 struct gaim_blist_node_setting *setting; | |
2574 | |
2575 g_return_if_fail(node != NULL); | |
2576 g_return_if_fail(node->settings != NULL); | |
2577 g_return_if_fail(key != NULL); | |
2578 | |
2579 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2580 setting->type = GAIM_BLIST_NODE_SETTING_BOOL; | |
2581 setting->value.boolean = value; | |
2582 | |
2583 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
2584 } | |
2585 | |
2586 gboolean gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
2587 { | |
2588 struct gaim_blist_node_setting *setting; | |
2589 | |
2590 g_return_val_if_fail(node != NULL, FALSE); | |
2591 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2592 g_return_val_if_fail(key != NULL, FALSE); | |
2593 | |
2594 setting = g_hash_table_lookup(node->settings, key); | |
2595 | |
7849 | 2596 if(!setting) |
2597 return FALSE; | |
2598 | |
7848 | 2599 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_BOOL, FALSE); |
2600 | |
2601 return setting->value.boolean; | |
5228 | 2602 } |
2603 | |
7693 | 2604 void gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int value) |
2605 { | |
2606 struct gaim_blist_node_setting *setting; | |
2607 | |
2608 g_return_if_fail(node != NULL); | |
2609 g_return_if_fail(node->settings != NULL); | |
2610 g_return_if_fail(key != NULL); | |
2611 | |
2612 setting = g_new0(struct gaim_blist_node_setting, 1); | |
8071 | 2613 setting->type = GAIM_BLIST_NODE_SETTING_INT; |
7693 | 2614 setting->value.integer = value; |
2615 | |
2616 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
2617 } | |
2618 | |
2619 int gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
2620 { | |
2621 struct gaim_blist_node_setting *setting; | |
2622 | |
2623 g_return_val_if_fail(node != NULL, 0); | |
2624 g_return_val_if_fail(node->settings != NULL, 0); | |
2625 g_return_val_if_fail(key != NULL, 0); | |
2626 | |
2627 setting = g_hash_table_lookup(node->settings, key); | |
2628 | |
7849 | 2629 if(!setting) |
2630 return 0; | |
2631 | |
7848 | 2632 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_INT, 0); |
2633 | |
2634 return setting->value.integer; | |
7693 | 2635 } |
2636 | |
2637 void gaim_blist_node_set_string(GaimBlistNode* node, const char *key, | |
5906 | 2638 const char *value) |
2639 { | |
7693 | 2640 struct gaim_blist_node_setting *setting; |
2641 | |
2642 g_return_if_fail(node != NULL); | |
2643 g_return_if_fail(node->settings != NULL); | |
2644 g_return_if_fail(key != NULL); | |
2645 | |
2646 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2647 setting->type = GAIM_BLIST_NODE_SETTING_STRING; | |
2648 setting->value.string = g_strdup(value); | |
2649 | |
2650 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
2651 } | |
2652 | |
2653 const char *gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
2654 { | |
2655 struct gaim_blist_node_setting *setting; | |
2656 | |
2657 g_return_val_if_fail(node != NULL, NULL); | |
2658 g_return_val_if_fail(node->settings != NULL, NULL); | |
2659 g_return_val_if_fail(key != NULL, NULL); | |
2660 | |
2661 setting = g_hash_table_lookup(node->settings, key); | |
2662 | |
7849 | 2663 if(!setting) |
2664 return NULL; | |
2665 | |
7848 | 2666 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_STRING, NULL); |
2667 | |
2668 return setting->value.string; | |
7693 | 2669 } |
2670 | |
2671 | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8710
diff
changeset
|
2672 /* XXX: this is compatibility stuff. Remove after.... oh, I dunno... 0.77 or so */ |
7693 | 2673 |
2674 void gaim_group_set_setting(GaimGroup *g, const char *key, const char *value) | |
2675 { | |
2676 gaim_debug_warning("blist", "gaim_group_set_setting() is deprecated\n"); | |
2677 | |
2678 gaim_blist_node_set_string((GaimBlistNode*)g, key, value); | |
2679 } | |
2680 | |
2681 const char *gaim_group_get_setting(GaimGroup *g, const char *key) | |
2682 { | |
2683 gaim_debug_warning("blist", "gaim_group_get_setting() is deprecated\n"); | |
2684 | |
2685 return gaim_blist_node_get_string((GaimBlistNode*)g, key); | |
2686 } | |
2687 | |
2688 void gaim_chat_set_setting(GaimChat *c, const char *key, const char *value) | |
2689 { | |
2690 gaim_debug_warning("blist", "gaim_chat_set_setting() is deprecated\n"); | |
2691 | |
2692 gaim_blist_node_set_string((GaimBlistNode*)c, key, value); | |
5906 | 2693 } |
2694 | |
7125 | 2695 const char *gaim_chat_get_setting(GaimChat *c, const char *key) |
5906 | 2696 { |
7693 | 2697 gaim_debug_warning("blist", "gaim_chat_get_setting() is deprecated\n"); |
2698 | |
2699 return gaim_blist_node_get_string((GaimBlistNode*)c, key); | |
5906 | 2700 } |
2701 | |
7693 | 2702 void gaim_buddy_set_setting(GaimBuddy *b, const char *key, const char *value) |
2703 { | |
2704 gaim_debug_warning("blist", "gaim_buddy_set_setting() is deprecated\n"); | |
2705 | |
2706 gaim_blist_node_set_string((GaimBlistNode*)b, key, value); | |
5228 | 2707 } |
2708 | |
7693 | 2709 const char *gaim_buddy_get_setting(GaimBuddy *b, const char *key) |
2710 { | |
2711 gaim_debug_warning("blist", "gaim_buddy_get_setting() is deprecated\n"); | |
2712 | |
2713 return gaim_blist_node_get_string((GaimBlistNode*)b, key); | |
5228 | 2714 } |
2715 | |
7693 | 2716 /* XXX: end compat crap */ |
2717 | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2718 |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2719 GList *gaim_buddy_get_extended_menu(GaimBuddy *b) { |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2720 GList *menu = NULL; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2721 gaim_signal_emit(gaim_blist_get_handle(), "buddy-extended-menu", |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2722 b, &menu); |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2723 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2724 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2725 |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2726 |
6695 | 2727 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) { |
5228 | 2728 if(!group) |
2729 return 0; | |
2730 | |
5277 | 2731 return offline ? group->totalsize : group->currentsize; |
5228 | 2732 } |
2733 | |
6695 | 2734 int gaim_blist_get_group_online_count(GaimGroup *group) { |
5228 | 2735 if(!group) |
2736 return 0; | |
2737 | |
5277 | 2738 return group->online; |
5228 | 2739 } |
2740 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2741 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2742 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2743 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2744 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2745 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2746 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2747 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2748 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2749 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2750 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2751 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2752 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2753 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2754 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2755 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2756 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2757 static int handle; |
5228 | 2758 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2759 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2760 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2761 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2762 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2763 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2764 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2765 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2766 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2767 gaim_signal_register(handle, "buddy-away", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2768 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2769 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2770 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2771 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2772 gaim_signal_register(handle, "buddy-back", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2773 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2774 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2775 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2776 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2777 gaim_signal_register(handle, "buddy-idle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2778 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2779 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2780 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2781 gaim_signal_register(handle, "buddy-unidle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2782 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2783 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2784 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
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 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2787 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2788 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2789 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2790 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2791 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2792 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2793 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2794 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2795 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2796 gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2797 gaim_signal_register(handle, "buddy-extended-menu", |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2798 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2799 gaim_value_new(GAIM_TYPE_SUBTYPE, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2800 GAIM_SUBTYPE_BLIST_BUDDY), |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2801 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2802 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2803 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2804 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2805 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2806 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2807 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2808 } |