Mercurial > pidgin.yaz
annotate src/blist.c @ 8713:7024b595b6ae
[gaim-migrate @ 9467]
" Expansion from my original protocol prefs to plugin prefs.
Things are handled a bit different in this iteration of
it, but I have already modified msn and jabber to use
it, and included an example plugin to show how to use
it. It will also generate pages with doxygen. The
example plugin doesn't not contain any translatable
strings seeing as we're in the string freeze. And it's
an example, whats the point of translating it..?
Also, I tweaked the documentation for 2 functions in
gtkprefs, gaim_gtk_prefs_dropdown and
gaim_gtk_prefs_dropdown_from_list. Nothing major in
that, just made it say that the list should be a list
of pairs label/value.
Also there's 5 new files that will need to be added to cvs:
src/pluginpref.h
src/pluginpref.c
src/gtkpluginpref.h
src/gtkpluginpref.c
plugins/pluginpref_example.c
the tarball already has them structured correctly and
contains the diff" --Gary Kramlich - amc_grim
and the german translator pointed out that sean missed the novell file for POTFILES.in
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Mon, 19 Apr 2004 21:12:45 +0000 |
parents | 36b043fe2740 |
children | 92cbf9713795 |
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); |
2140 g_free(contents); | |
2141 | |
2142 if(!gaim) { | |
2143 gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Error parsing %s\n", | |
2144 filename); | |
5228 | 2145 return FALSE; |
2146 } | |
2147 | |
7132 | 2148 blist = xmlnode_get_child(gaim, "blist"); |
2149 if(blist) { | |
2150 xmlnode *groupnode; | |
8135 | 2151 for(groupnode = xmlnode_get_child(blist, "group"); groupnode; |
2152 groupnode = xmlnode_get_next_twin(groupnode)) { | |
7132 | 2153 parse_group(groupnode); |
2154 } | |
5228 | 2155 } |
2156 | |
7132 | 2157 privacy = xmlnode_get_child(gaim, "privacy"); |
2158 if(privacy) { | |
2159 xmlnode *anode; | |
2160 for(anode = privacy->child; anode; anode = anode->next) { | |
2161 xmlnode *x; | |
2162 GaimAccount *account; | |
7153 | 2163 const char *acct_name, *proto, *mode, *protocol; |
7132 | 2164 |
2165 acct_name = xmlnode_get_attrib(anode, "name"); | |
7153 | 2166 protocol = xmlnode_get_attrib(anode, "protocol"); |
2167 proto = xmlnode_get_attrib(anode, "proto"); | |
7132 | 2168 mode = xmlnode_get_attrib(anode, "mode"); |
2169 | |
7153 | 2170 if(!acct_name || (!proto && !protocol) || !mode) |
7132 | 2171 continue; |
2172 | |
7153 | 2173 account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
7132 | 2174 |
2175 if(!account) | |
2176 continue; | |
2177 | |
2178 account->perm_deny = atoi(mode); | |
2179 | |
2180 for(x = anode->child; x; x = x->next) { | |
2181 char *name; | |
8135 | 2182 if(x->type != XMLNODE_TYPE_TAG) |
7132 | 2183 continue; |
2184 | |
2185 if(!strcmp(x->name, "permit")) { | |
2186 name = xmlnode_get_data(x); | |
2187 gaim_privacy_permit_add(account, name, TRUE); | |
2188 g_free(name); | |
2189 } else if(!strcmp(x->name, "block")) { | |
2190 name = xmlnode_get_data(x); | |
2191 gaim_privacy_deny_add(account, name, TRUE); | |
2192 g_free(name); | |
2193 } | |
2194 } | |
2195 } | |
2196 } | |
5228 | 2197 |
2198 gaim_debug(GAIM_DEBUG_INFO, "blist import", "Finished reading %s\n", | |
2199 filename); | |
2200 | |
8200 | 2201 xmlnode_free(gaim); |
5228 | 2202 return TRUE; |
2203 } | |
2204 | |
2205 void gaim_blist_load() { | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2206 GList *accts; |
5228 | 2207 char *user_dir = gaim_user_dir(); |
2208 char *filename; | |
2209 char *msg; | |
2210 | |
2211 blist_safe_to_write = TRUE; | |
2212 | |
2213 if(!user_dir) | |
2214 return; | |
2215 | |
2216 filename = g_build_filename(user_dir, "blist.xml", NULL); | |
2217 | |
2218 if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
2219 if(!gaim_blist_read(filename)) { | |
2220 msg = g_strdup_printf(_("An error was encountered parsing your " | |
2221 "buddy list. It has not been loaded.")); | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2222 gaim_notify_error(NULL, NULL, _("Buddy List Error"), msg); |
5228 | 2223 g_free(msg); |
2224 } | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2225 } else if(g_list_length(gaim_accounts_get_all())) { |
5228 | 2226 /* 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
|
2227 for(accts = gaim_accounts_get_all(); accts; accts = accts->next) { |
5228 | 2228 do_import(accts->data, NULL); |
2229 } | |
2230 gaim_blist_save(); | |
2231 } | |
2232 | |
2233 g_free(filename); | |
2234 } | |
2235 | |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2236 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2237 gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2238 const char *group, const char *alias) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2239 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2240 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2241 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2242 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2243 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2244 if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2245 ui_ops->request_add_buddy(account, username, group, alias); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2246 } |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2247 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2248 void |
7859 | 2249 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
|
2250 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2251 GaimBlistUiOps *ui_ops; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2252 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2253 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2254 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2255 if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
7859 | 2256 ui_ops->request_add_chat(account, group, alias); |
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 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2259 void |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2260 gaim_blist_request_add_group(void) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2261 { |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2262 GaimBlistUiOps *ui_ops; |
7060
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 ui_ops = gaim_blist_get_ui_ops(); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2265 |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2266 if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2267 ui_ops->request_add_group(); |
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 |
7693 | 2270 static void blist_print_setting(const char *key, |
2271 struct gaim_blist_node_setting *setting, FILE *file, int indent) | |
2272 { | |
2273 char *key_val, *data_val = NULL; | |
2274 const char *type = NULL; | |
2275 int i; | |
2276 | |
2277 if(!key) | |
2278 return; | |
2279 | |
2280 switch(setting->type) { | |
2281 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2282 type = "bool"; | |
2283 data_val = g_strdup_printf("%d", setting->value.boolean); | |
2284 break; | |
2285 case GAIM_BLIST_NODE_SETTING_INT: | |
2286 type = "int"; | |
2287 data_val = g_strdup_printf("%d", setting->value.integer); | |
2288 break; | |
2289 case GAIM_BLIST_NODE_SETTING_STRING: | |
2290 if(!setting->value.string) | |
2291 return; | |
2292 | |
2293 type = "string"; | |
2294 data_val = g_markup_escape_text(setting->value.string, -1); | |
2295 break; | |
2296 } | |
2297 | |
2298 /* this can't happen */ | |
2299 if(!type || !data_val) | |
2300 return; | |
2301 | |
2302 for(i=0; i<indent; i++) fprintf(file, "\t"); | |
2303 | |
2304 key_val = g_markup_escape_text(key, -1); | |
2305 fprintf(file, "<setting name=\"%s\" type=\"%s\">%s</setting>\n", key_val, type, | |
2306 data_val); | |
2307 | |
2308 g_free(key_val); | |
2309 g_free(data_val); | |
2310 } | |
2311 | |
5228 | 2312 static void blist_print_group_settings(gpointer key, gpointer data, |
2313 gpointer user_data) { | |
7693 | 2314 blist_print_setting(key, data, user_data, 3); |
5228 | 2315 } |
2316 | |
2317 static void blist_print_buddy_settings(gpointer key, gpointer data, | |
2318 gpointer user_data) { | |
7693 | 2319 blist_print_setting(key, data, user_data, 5); |
5228 | 2320 } |
2321 | |
6695 | 2322 static void blist_print_cnode_settings(gpointer key, gpointer data, |
2323 gpointer user_data) { | |
7693 | 2324 blist_print_setting(key, data, user_data, 4); |
6695 | 2325 } |
2326 | |
5234 | 2327 static void blist_print_chat_components(gpointer key, gpointer data, |
2328 gpointer user_data) { | |
2329 char *key_val; | |
2330 char *data_val; | |
2331 FILE *file = user_data; | |
2332 | |
2333 if(!key || !data) | |
2334 return; | |
2335 | |
2336 key_val = g_markup_escape_text(key, -1); | |
2337 data_val = g_markup_escape_text(data, -1); | |
2338 | |
2339 fprintf(file, "\t\t\t\t<component name=\"%s\">%s</component>\n", key_val, | |
2340 data_val); | |
2341 g_free(key_val); | |
2342 g_free(data_val); | |
2343 } | |
2344 | |
6695 | 2345 static void print_buddy(FILE *file, GaimBuddy *buddy) { |
2346 char *bud_name = g_markup_escape_text(buddy->name, -1); | |
2347 char *bud_alias = NULL; | |
2348 char *acct_name = g_markup_escape_text(buddy->account->username, -1); | |
7153 | 2349 int proto_num = gaim_account_get_protocol(buddy->account); |
6695 | 2350 if(buddy->alias) |
2351 bud_alias= g_markup_escape_text(buddy->alias, -1); | |
7153 | 2352 fprintf(file, "\t\t\t\t<buddy account=\"%s\" proto=\"%s\"", acct_name, |
2353 gaim_account_get_protocol_id(buddy->account)); | |
2354 if(proto_num != -1) | |
2355 fprintf(file, " protocol=\"%d\"", proto_num); | |
2356 fprintf(file, ">\n"); | |
2357 | |
6695 | 2358 fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); |
2359 if(bud_alias) { | |
2360 fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", bud_alias); | |
2361 } | |
7726 | 2362 g_hash_table_foreach(buddy->node.settings, blist_print_buddy_settings, file); |
6695 | 2363 fprintf(file, "\t\t\t\t</buddy>\n"); |
2364 g_free(bud_name); | |
2365 g_free(bud_alias); | |
2366 g_free(acct_name); | |
2367 } | |
2368 | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2369 static void gaim_blist_write(FILE *file, GaimAccount *exp_acct) { |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2370 GList *accounts; |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2371 GSList *buds; |
6695 | 2372 GaimBlistNode *gnode, *cnode, *bnode; |
5228 | 2373 fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
2374 fprintf(file, "<gaim version=\"1\">\n"); | |
2375 fprintf(file, "\t<blist>\n"); | |
2376 | |
2377 for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
6695 | 2378 GaimGroup *group; |
2379 | |
5228 | 2380 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
2381 continue; | |
6695 | 2382 |
2383 group = (GaimGroup *)gnode; | |
5228 | 2384 if(!exp_acct || gaim_group_on_account(group, exp_acct)) { |
2385 char *group_name = g_markup_escape_text(group->name, -1); | |
2386 fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
7693 | 2387 g_hash_table_foreach(group->node.settings, |
2388 blist_print_group_settings, file); | |
6695 | 2389 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
2390 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
6755 | 2391 GaimContact *contact = (GaimContact*)cnode; |
2392 fprintf(file, "\t\t\t<contact"); | |
2393 if(contact->alias) { | |
2394 char *alias = g_markup_escape_text(contact->alias, -1); | |
2395 fprintf(file, " alias=\"%s\"", alias); | |
2396 g_free(alias); | |
2397 } | |
2398 fprintf(file, ">\n"); | |
6695 | 2399 |
2400 for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
2401 if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
2402 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
2403 if(!exp_acct || buddy->account == exp_acct) { | |
2404 print_buddy(file, buddy); | |
2405 } | |
5234 | 2406 } |
5228 | 2407 } |
6695 | 2408 |
2409 fprintf(file, "\t\t\t</contact>\n"); | |
2410 } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2411 GaimChat *chat = (GaimChat *)cnode; |
5234 | 2412 if(!exp_acct || chat->account == exp_acct) { |
2413 char *acct_name = g_markup_escape_text(chat->account->username, -1); | |
7153 | 2414 int proto_num = gaim_account_get_protocol(chat->account); |
2415 fprintf(file, "\t\t\t<chat proto=\"%s\" account=\"%s\"", | |
7133 | 2416 gaim_account_get_protocol_id(chat->account), |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2417 acct_name); |
7153 | 2418 if(proto_num != -1) |
2419 fprintf(file, " protocol=\"%d\"", proto_num); | |
2420 fprintf(file, ">\n"); | |
2421 | |
5237 | 2422 if(chat->alias) { |
2423 char *chat_alias = g_markup_escape_text(chat->alias, -1); | |
2424 fprintf(file, "\t\t\t\t<alias>%s</alias>\n", chat_alias); | |
2425 g_free(chat_alias); | |
2426 } | |
5234 | 2427 g_hash_table_foreach(chat->components, |
2428 blist_print_chat_components, file); | |
7693 | 2429 g_hash_table_foreach(chat->node.settings, |
6695 | 2430 blist_print_cnode_settings, file); |
5234 | 2431 fprintf(file, "\t\t\t</chat>\n"); |
5237 | 2432 g_free(acct_name); |
5234 | 2433 } |
5228 | 2434 } |
2435 } | |
2436 fprintf(file, "\t\t</group>\n"); | |
2437 g_free(group_name); | |
2438 } | |
2439 } | |
2440 | |
2441 fprintf(file, "\t</blist>\n"); | |
2442 fprintf(file, "\t<privacy>\n"); | |
2443 | |
5580
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2444 for(accounts = gaim_accounts_get_all(); |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2445 accounts != NULL; |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2446 accounts = accounts->next) { |
86456ec3ca25
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2447 |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2448 GaimAccount *account = accounts->data; |
5228 | 2449 char *acct_name = g_markup_escape_text(account->username, -1); |
7153 | 2450 int proto_num = gaim_account_get_protocol(account); |
5228 | 2451 if(!exp_acct || account == exp_acct) { |
7153 | 2452 fprintf(file, "\t\t<account proto=\"%s\" name=\"%s\" " |
2453 "mode=\"%d\"", gaim_account_get_protocol_id(account), | |
5943
a4f2aba0848d
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2454 acct_name, account->perm_deny); |
7153 | 2455 if(proto_num != -1) |
2456 fprintf(file, " protocol=\"%d\"", proto_num); | |
2457 fprintf(file, ">\n"); | |
2458 | |
5228 | 2459 for(buds = account->permit; buds; buds = buds->next) { |
2460 char *bud_name = g_markup_escape_text(buds->data, -1); | |
2461 fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
2462 g_free(bud_name); | |
2463 } | |
2464 for(buds = account->deny; buds; buds = buds->next) { | |
2465 char *bud_name = g_markup_escape_text(buds->data, -1); | |
2466 fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
2467 g_free(bud_name); | |
2468 } | |
2469 fprintf(file, "\t\t</account>\n"); | |
2470 } | |
2471 g_free(acct_name); | |
2472 } | |
2473 | |
2474 fprintf(file, "\t</privacy>\n"); | |
2475 fprintf(file, "</gaim>\n"); | |
2476 } | |
2477 | |
2478 void gaim_blist_save() { | |
2479 FILE *file; | |
2480 char *user_dir = gaim_user_dir(); | |
2481 char *filename; | |
2482 char *filename_real; | |
2483 | |
2484 if(!user_dir) | |
2485 return; | |
2486 if(!blist_safe_to_write) { | |
2487 gaim_debug(GAIM_DEBUG_WARNING, "blist save", | |
2488 "AHH!! Tried to write the blist before we read it!\n"); | |
2489 return; | |
2490 } | |
2491 | |
2492 file = fopen(user_dir, "r"); | |
2493 if(!file) | |
2494 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
2495 else | |
2496 fclose(file); | |
2497 | |
2498 filename = g_build_filename(user_dir, "blist.xml.save", NULL); | |
2499 | |
2500 if((file = fopen(filename, "w"))) { | |
2501 gaim_blist_write(file, NULL); | |
2502 fclose(file); | |
2503 chmod(filename, S_IRUSR | S_IWUSR); | |
2504 } else { | |
2505 gaim_debug(GAIM_DEBUG_ERROR, "blist save", "Unable to write %s\n", | |
2506 filename); | |
8549 | 2507 g_free(filename); |
2508 return; | |
5228 | 2509 } |
2510 | |
2511 filename_real = g_build_filename(user_dir, "blist.xml", NULL); | |
2512 | |
2513 if(rename(filename, filename_real) < 0) | |
2514 gaim_debug(GAIM_DEBUG_ERROR, "blist save", | |
2515 "Error renaming %s to %s\n", filename, filename_real); | |
2516 | |
2517 | |
2518 g_free(filename); | |
2519 g_free(filename_real); | |
2520 } | |
2521 | |
7693 | 2522 |
2523 static void gaim_blist_node_setting_free(struct gaim_blist_node_setting *setting) | |
2524 { | |
2525 switch(setting->type) { | |
2526 case GAIM_BLIST_NODE_SETTING_BOOL: | |
2527 case GAIM_BLIST_NODE_SETTING_INT: | |
2528 break; | |
2529 case GAIM_BLIST_NODE_SETTING_STRING: | |
2530 g_free(setting->value.string); | |
2531 break; | |
2532 } | |
8020 | 2533 g_free(setting); |
7693 | 2534 } |
2535 | |
2536 static void gaim_blist_node_initialize_settings(GaimBlistNode* node) | |
2537 { | |
2538 if(node->settings) | |
5228 | 2539 return; |
7693 | 2540 |
2541 node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
2542 (GDestroyNotify)gaim_blist_node_setting_free); | |
2543 } | |
2544 | |
2545 void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
2546 { | |
2547 g_return_if_fail(node != NULL); | |
2548 g_return_if_fail(node->settings != NULL); | |
2549 g_return_if_fail(key != NULL); | |
2550 | |
2551 g_hash_table_remove(node->settings, key); | |
5228 | 2552 } |
2553 | |
7693 | 2554 |
2555 void gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean value) | |
2556 { | |
2557 struct gaim_blist_node_setting *setting; | |
2558 | |
2559 g_return_if_fail(node != NULL); | |
2560 g_return_if_fail(node->settings != NULL); | |
2561 g_return_if_fail(key != NULL); | |
2562 | |
2563 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2564 setting->type = GAIM_BLIST_NODE_SETTING_BOOL; | |
2565 setting->value.boolean = value; | |
2566 | |
2567 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
2568 } | |
2569 | |
2570 gboolean gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
2571 { | |
2572 struct gaim_blist_node_setting *setting; | |
2573 | |
2574 g_return_val_if_fail(node != NULL, FALSE); | |
2575 g_return_val_if_fail(node->settings != NULL, FALSE); | |
2576 g_return_val_if_fail(key != NULL, FALSE); | |
2577 | |
2578 setting = g_hash_table_lookup(node->settings, key); | |
2579 | |
7849 | 2580 if(!setting) |
2581 return FALSE; | |
2582 | |
7848 | 2583 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_BOOL, FALSE); |
2584 | |
2585 return setting->value.boolean; | |
5228 | 2586 } |
2587 | |
7693 | 2588 void gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int value) |
2589 { | |
2590 struct gaim_blist_node_setting *setting; | |
2591 | |
2592 g_return_if_fail(node != NULL); | |
2593 g_return_if_fail(node->settings != NULL); | |
2594 g_return_if_fail(key != NULL); | |
2595 | |
2596 setting = g_new0(struct gaim_blist_node_setting, 1); | |
8071 | 2597 setting->type = GAIM_BLIST_NODE_SETTING_INT; |
7693 | 2598 setting->value.integer = value; |
2599 | |
2600 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
2601 } | |
2602 | |
2603 int gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
2604 { | |
2605 struct gaim_blist_node_setting *setting; | |
2606 | |
2607 g_return_val_if_fail(node != NULL, 0); | |
2608 g_return_val_if_fail(node->settings != NULL, 0); | |
2609 g_return_val_if_fail(key != NULL, 0); | |
2610 | |
2611 setting = g_hash_table_lookup(node->settings, key); | |
2612 | |
7849 | 2613 if(!setting) |
2614 return 0; | |
2615 | |
7848 | 2616 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_INT, 0); |
2617 | |
2618 return setting->value.integer; | |
7693 | 2619 } |
2620 | |
2621 void gaim_blist_node_set_string(GaimBlistNode* node, const char *key, | |
5906 | 2622 const char *value) |
2623 { | |
7693 | 2624 struct gaim_blist_node_setting *setting; |
2625 | |
2626 g_return_if_fail(node != NULL); | |
2627 g_return_if_fail(node->settings != NULL); | |
2628 g_return_if_fail(key != NULL); | |
2629 | |
2630 setting = g_new0(struct gaim_blist_node_setting, 1); | |
2631 setting->type = GAIM_BLIST_NODE_SETTING_STRING; | |
2632 setting->value.string = g_strdup(value); | |
2633 | |
2634 g_hash_table_replace(node->settings, g_strdup(key), setting); | |
2635 } | |
2636 | |
2637 const char *gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
2638 { | |
2639 struct gaim_blist_node_setting *setting; | |
2640 | |
2641 g_return_val_if_fail(node != NULL, NULL); | |
2642 g_return_val_if_fail(node->settings != NULL, NULL); | |
2643 g_return_val_if_fail(key != NULL, NULL); | |
2644 | |
2645 setting = g_hash_table_lookup(node->settings, key); | |
2646 | |
7849 | 2647 if(!setting) |
2648 return NULL; | |
2649 | |
7848 | 2650 g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_STRING, NULL); |
2651 | |
2652 return setting->value.string; | |
7693 | 2653 } |
2654 | |
2655 | |
2656 /* XXX: this is compatability stuff. Remove after.... oh, I dunno... 0.77 or so */ | |
2657 | |
2658 void gaim_group_set_setting(GaimGroup *g, const char *key, const char *value) | |
2659 { | |
2660 gaim_debug_warning("blist", "gaim_group_set_setting() is deprecated\n"); | |
2661 | |
2662 gaim_blist_node_set_string((GaimBlistNode*)g, key, value); | |
2663 } | |
2664 | |
2665 const char *gaim_group_get_setting(GaimGroup *g, const char *key) | |
2666 { | |
2667 gaim_debug_warning("blist", "gaim_group_get_setting() is deprecated\n"); | |
2668 | |
2669 return gaim_blist_node_get_string((GaimBlistNode*)g, key); | |
2670 } | |
2671 | |
2672 void gaim_chat_set_setting(GaimChat *c, const char *key, const char *value) | |
2673 { | |
2674 gaim_debug_warning("blist", "gaim_chat_set_setting() is deprecated\n"); | |
2675 | |
2676 gaim_blist_node_set_string((GaimBlistNode*)c, key, value); | |
5906 | 2677 } |
2678 | |
7125 | 2679 const char *gaim_chat_get_setting(GaimChat *c, const char *key) |
5906 | 2680 { |
7693 | 2681 gaim_debug_warning("blist", "gaim_chat_get_setting() is deprecated\n"); |
2682 | |
2683 return gaim_blist_node_get_string((GaimBlistNode*)c, key); | |
5906 | 2684 } |
2685 | |
7693 | 2686 void gaim_buddy_set_setting(GaimBuddy *b, const char *key, const char *value) |
2687 { | |
2688 gaim_debug_warning("blist", "gaim_buddy_set_setting() is deprecated\n"); | |
2689 | |
2690 gaim_blist_node_set_string((GaimBlistNode*)b, key, value); | |
5228 | 2691 } |
2692 | |
7693 | 2693 const char *gaim_buddy_get_setting(GaimBuddy *b, const char *key) |
2694 { | |
2695 gaim_debug_warning("blist", "gaim_buddy_get_setting() is deprecated\n"); | |
2696 | |
2697 return gaim_blist_node_get_string((GaimBlistNode*)b, key); | |
5228 | 2698 } |
2699 | |
7693 | 2700 /* XXX: end compat crap */ |
2701 | |
8710
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2702 |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2703 GList *gaim_buddy_get_extended_menu(GaimBuddy *b) { |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2704 GList *menu = NULL; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2705 gaim_signal_emit(gaim_blist_get_handle(), "buddy-extended-menu", |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2706 b, &menu); |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2707 return menu; |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2708 } |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2709 |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2710 |
6695 | 2711 int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) { |
5228 | 2712 if(!group) |
2713 return 0; | |
2714 | |
5277 | 2715 return offline ? group->totalsize : group->currentsize; |
5228 | 2716 } |
2717 | |
6695 | 2718 int gaim_blist_get_group_online_count(GaimGroup *group) { |
5228 | 2719 if(!group) |
2720 return 0; | |
2721 | |
5277 | 2722 return group->online; |
5228 | 2723 } |
2724 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2725 void |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2726 gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2727 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2728 blist_ui_ops = ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2729 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2730 |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2731 GaimBlistUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2732 gaim_blist_get_ui_ops(void) |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2733 { |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2734 return blist_ui_ops; |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2735 } |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2736 |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2737 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2738 void * |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2739 gaim_blist_get_handle(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2740 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2741 static int handle; |
5228 | 2742 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2743 return &handle; |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2744 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2745 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2746 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2747 gaim_blist_init(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2748 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2749 void *handle = gaim_blist_get_handle(); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2750 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2751 gaim_signal_register(handle, "buddy-away", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2752 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2753 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2754 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2755 |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2756 gaim_signal_register(handle, "buddy-back", |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2757 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2758 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2759 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
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 gaim_signal_register(handle, "buddy-idle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2762 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2763 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2764 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2765 gaim_signal_register(handle, "buddy-unidle", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2766 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2767 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2768 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2769 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2770 gaim_signal_register(handle, "buddy-signed-on", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2771 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2772 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2773 GAIM_SUBTYPE_BLIST_BUDDY)); |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2774 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2775 gaim_signal_register(handle, "buddy-signed-off", |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2776 gaim_marshal_VOID__POINTER, NULL, 1, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2777 gaim_value_new(GAIM_TYPE_SUBTYPE, |
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2778 GAIM_SUBTYPE_BLIST_BUDDY)); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2779 |
6564
800ef4a51096
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2780 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
|
2781 gaim_signal_register(handle, "buddy-extended-menu", |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2782 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2783 gaim_value_new(GAIM_TYPE_SUBTYPE, |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2784 GAIM_SUBTYPE_BLIST_BUDDY), |
36b043fe2740
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2785 gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2786 } |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2787 |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2788 void |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2789 gaim_blist_uninit(void) |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2790 { |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2791 gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2792 } |