Mercurial > pidgin
annotate src/protocols/gg/buddylist.c @ 13967:99b9b58b19dd
[gaim-migrate @ 16523]
Fix a crazy MSN crash. Basically it's possible to have more than one
slplink associated with a given switchboard, but our code did not
allow for that. I think it happens when you're in a multi-user
chat and you do stuff with multiple users that involves slplinks.
Like maybe file transfer and buddy icon related stuff.
Tracking this down took an ungodly amount of time, but thanks to
Meebo for letting me do it :-)
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 20 Jul 2006 07:31:15 +0000 |
parents | fa7313d125ac |
children |
rev | line source |
---|---|
11414 | 1 /** |
2 * @file buddylist.c | |
3 * | |
4 * gaim | |
5 * | |
6 * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us> | |
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 | |
23 | |
13317
41747a38a1a8
[gaim-migrate @ 15686]
Richard Laager <rlaager@wiktel.com>
parents:
12007
diff
changeset
|
24 #include <libgadu.h> |
11414 | 25 |
26 #include "gg.h" | |
13626
fa7313d125ac
[gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13317
diff
changeset
|
27 #include "gg-utils.h" |
11414 | 28 #include "buddylist.h" |
29 | |
30 | |
31 /* void ggp_buddylist_send(GaimConnection *gc) {{{ */ | |
32 void ggp_buddylist_send(GaimConnection *gc) | |
33 { | |
34 GGPInfo *info = gc->proto_data; | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
35 GaimAccount *account = gaim_connection_get_account(gc); |
11414 | 36 |
37 GaimBuddyList *blist; | |
38 GaimBlistNode *gnode, *cnode, *bnode; | |
39 GaimBuddy *buddy; | |
40 uin_t *userlist = NULL; | |
41 gchar *types = NULL; | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
42 int size = 0; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
43 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
44 if ((blist = gaim_get_blist()) == NULL) |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
45 return; |
11414 | 46 |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
47 for (gnode = blist->root; gnode != NULL; gnode = gnode->next) { |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
48 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
49 continue; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
50 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
51 for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) { |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
52 if (!GAIM_BLIST_NODE_IS_CONTACT(cnode)) |
11414 | 53 continue; |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
54 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
55 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) { |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
56 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
11414 | 57 continue; |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
58 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
59 buddy = (GaimBuddy *)bnode; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
60 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
61 if (buddy->account != account) |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
62 continue; |
11414 | 63 |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
64 size++; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
65 userlist = (uin_t *) g_renew(uin_t, userlist, size); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
66 types = (gchar *) g_renew(gchar, types, size); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
67 userlist[size - 1] = ggp_str_to_uin(buddy->name); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
68 types[size - 1] = GG_USER_NORMAL; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
69 gaim_debug_info("gg", "ggp_buddylist_send: adding %d\n", |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
70 userlist[size - 1]); |
11414 | 71 } |
72 } | |
73 } | |
74 | |
75 if (userlist) { | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
76 int ret = gg_notify_ex(info->session, userlist, types, size); |
11414 | 77 g_free(userlist); |
78 g_free(types); | |
79 | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
80 gaim_debug_info("gg", "send: ret=%d; size=%d\n", ret, size); |
11414 | 81 } |
82 } | |
83 /* }}} */ | |
84 | |
85 /* void ggp_buddylist_load(GaimConnection *gc, char *buddylist) {{{ */ | |
86 void ggp_buddylist_load(GaimConnection *gc, char *buddylist) | |
87 { | |
88 GaimBuddy *buddy; | |
89 GaimGroup *group; | |
90 gchar **users_tbl; | |
91 int i; | |
92 | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
93 /* |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
94 * XXX: Limit of entries in a buddylist that will be imported. |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
95 */ |
11414 | 96 users_tbl = g_strsplit(buddylist, "\r\n", 200); |
97 | |
98 for (i = 0; users_tbl[i] != NULL; i++) { | |
99 gchar **data_tbl; | |
100 gchar *name, *show, *g; | |
101 | |
102 if (strlen(users_tbl[i]) == 0) | |
103 continue; | |
104 | |
105 data_tbl = g_strsplit(users_tbl[i], ";", 8); | |
106 | |
107 show = charset_convert(data_tbl[3], "CP1250", "UTF-8"); | |
108 name = data_tbl[6]; | |
109 | |
110 gaim_debug_info("gg", "got buddy: name=%s show=%s\n", name, show); | |
111 | |
112 if (gaim_find_buddy(gaim_connection_get_account(gc), name)) { | |
113 g_free(show); | |
114 g_strfreev(data_tbl); | |
115 continue; | |
116 } | |
117 | |
118 g = g_strdup("Gadu-Gadu"); | |
119 | |
120 if (strlen(data_tbl[5])) { | |
121 /* Hard limit to at most 50 groups */ | |
122 gchar **group_tbl = g_strsplit(data_tbl[5], ",", 50); | |
123 if (strlen(group_tbl[0]) > 0) { | |
124 g_free(g); | |
125 g = g_strdup(group_tbl[0]); | |
126 } | |
127 g_strfreev(group_tbl); | |
128 } | |
129 | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
130 buddy = gaim_buddy_new(gaim_connection_get_account(gc), name, |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
131 strlen(show) ? show : NULL); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
132 |
11414 | 133 if (!(group = gaim_find_group(g))) { |
134 group = gaim_group_new(g); | |
135 gaim_blist_add_group(group, NULL); | |
136 } | |
137 | |
138 gaim_blist_add_buddy(buddy, NULL, group, NULL); | |
139 g_free(g); | |
140 | |
141 g_free(show); | |
142 g_strfreev(data_tbl); | |
143 } | |
144 g_strfreev(users_tbl); | |
145 | |
146 ggp_buddylist_send(gc); | |
147 | |
148 } | |
149 /* }}} */ | |
150 | |
151 /* void ggp_buddylist_offline(GaimConnection *gc) {{{ */ | |
152 void ggp_buddylist_offline(GaimConnection *gc) | |
153 { | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
154 GaimAccount *account = gaim_connection_get_account(gc); |
11414 | 155 GaimBuddyList *blist; |
156 GaimBlistNode *gnode, *cnode, *bnode; | |
157 GaimBuddy *buddy; | |
158 | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
159 if ((blist = gaim_get_blist()) == NULL) |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
160 return; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
161 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
162 for (gnode = blist->root; gnode != NULL; gnode = gnode->next) { |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
163 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
164 continue; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
165 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
166 for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) { |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
167 if (!GAIM_BLIST_NODE_IS_CONTACT(cnode)) |
11414 | 168 continue; |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
169 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
170 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) { |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
171 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
11414 | 172 continue; |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
173 |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
174 buddy = (GaimBuddy *)bnode; |
11414 | 175 |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
176 if (buddy->account != account) |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
177 continue; |
11414 | 178 |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
179 gaim_prpl_got_user_status( |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
180 gaim_connection_get_account(gc), |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
181 buddy->name, "offline", NULL); |
11414 | 182 |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
183 gaim_debug_info("gg", |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
184 "ggp_buddylist_offline: gone: %s\n", |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
185 buddy->name); |
11414 | 186 } |
187 } | |
188 } | |
189 } | |
190 /* }}} */ | |
191 | |
192 /* char *ggp_buddylist_dump(GaimAccount *account) {{{ */ | |
193 char *ggp_buddylist_dump(GaimAccount *account) | |
194 { | |
195 GaimBuddyList *blist; | |
196 GaimBlistNode *gnode, *cnode, *bnode; | |
197 GaimGroup *group; | |
198 GaimBuddy *buddy; | |
199 | |
200 char *buddylist = g_strdup(""); | |
201 char *ptr; | |
202 | |
203 if ((blist = gaim_get_blist()) == NULL) | |
204 return NULL; | |
205 | |
206 for (gnode = blist->root; gnode != NULL; gnode = gnode->next) { | |
207 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
208 continue; | |
209 | |
210 group = (GaimGroup *)gnode; | |
211 | |
212 for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) { | |
213 if (!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
214 continue; | |
215 | |
216 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) { | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
217 gchar *newdata, *name, *alias, *gname; |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
218 gchar *cp_alias, *cp_gname; |
11414 | 219 |
220 if (!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
221 continue; | |
222 | |
223 buddy = (GaimBuddy *)bnode; | |
224 if (buddy->account != account) | |
225 continue; | |
226 | |
227 name = buddy->name; | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
228 alias = buddy->alias ? buddy->alias : buddy->name; |
11414 | 229 gname = group->name; |
230 | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
231 cp_gname = charset_convert(gname, "UTF-8", "CP1250"); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
232 cp_alias = charset_convert(alias, "UTF-8", "CP1250"); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
233 newdata = g_strdup_printf( |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
234 "%s;%s;%s;%s;%s;%s;%s;%s%s\r\n", |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
235 cp_alias, cp_alias, cp_alias, cp_alias, |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
236 "", cp_gname, name, "", ""); |
11414 | 237 |
238 ptr = buddylist; | |
239 buddylist = g_strconcat(ptr, newdata, NULL); | |
240 | |
241 g_free(newdata); | |
242 g_free(ptr); | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
243 g_free(cp_gname); |
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
244 g_free(cp_alias); |
11414 | 245 } |
246 } | |
247 } | |
248 | |
249 return buddylist; | |
250 } | |
251 /* }}} */ | |
252 | |
253 | |
12007
8724718d387f
[gaim-migrate @ 14300]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11414
diff
changeset
|
254 /* vim: set ts=8 sts=0 sw=8 noet: */ |