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