Mercurial > pidgin
annotate src/protocols/msn/session.c @ 10284:f776e117c17b
[gaim-migrate @ 11454]
Several MSN memory leaks identified and fixed by Miah Gregory and Felipe
Contreras, plus my own fix for bug 1075347.
As normal, thank them for fixes, blame me for breakages.
Did I mention the new MSN icon? It rocks!
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Wed, 01 Dec 2004 02:30:47 +0000 |
parents | d9468bd22b7c |
children | a7b2fd5efcf2 |
rev | line source |
---|---|
5309 | 1 /** |
2 * @file session.c MSN session functions | |
3 * | |
4 * gaim | |
5 * | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
6 * Gaim is the legal property of its developers, whose names are too numerous |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
7 * to list here. Please refer to the COPYRIGHT file distributed with this |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
8 * source distribution. |
6701
b7e113a59b51
[gaim-migrate @ 7227]
Christian Hammond <chipx86@chipx86.com>
parents:
5564
diff
changeset
|
9 * |
5309 | 10 * This program is free software; you can redistribute it and/or modify |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
23 */ | |
24 #include "msn.h" | |
25 #include "session.h" | |
7288
ff9127038a5a
[gaim-migrate @ 7869]
Christian Hammond <chipx86@chipx86.com>
parents:
6827
diff
changeset
|
26 #include "notification.h" |
5309 | 27 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
28 #include "slplink.h" |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
29 |
10044 | 30 #include "dialog.h" |
31 | |
5309 | 32 MsnSession * |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
33 msn_session_new(GaimAccount *account, const char *host, int port, |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
34 gboolean http_method) |
5309 | 35 { |
36 MsnSession *session; | |
37 | |
38 g_return_val_if_fail(account != NULL, NULL); | |
39 | |
40 session = g_new0(MsnSession, 1); | |
41 | |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
42 session->account = account; |
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
43 session->dispatch_host = g_strdup(host); |
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
44 session->dispatch_port = port; |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
45 session->http_method = http_method; |
5309 | 46 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
47 session->notification = msn_notification_new(session); |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
48 session->userlist = msn_userlist_new(session); |
10044 | 49 session->sync_userlist = msn_userlist_new(session); |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
50 |
6701
b7e113a59b51
[gaim-migrate @ 7227]
Christian Hammond <chipx86@chipx86.com>
parents:
5564
diff
changeset
|
51 session->protocol_ver = 9; |
b7e113a59b51
[gaim-migrate @ 7227]
Christian Hammond <chipx86@chipx86.com>
parents:
5564
diff
changeset
|
52 |
5309 | 53 return session; |
54 } | |
55 | |
56 void | |
57 msn_session_destroy(MsnSession *session) | |
58 { | |
59 g_return_if_fail(session != NULL); | |
60 | |
61 if (session->connected) | |
62 msn_session_disconnect(session); | |
63 | |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
64 if (session->dispatch_host != NULL) |
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
65 g_free(session->dispatch_host); |
5309 | 66 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
67 if (session->notification != NULL) |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
68 msn_notification_destroy(session->notification); |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
69 |
5309 | 70 while (session->switches != NULL) |
71 msn_switchboard_destroy(session->switches->data); | |
72 | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
73 while (session->slplinks != NULL) |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
74 msn_slplink_destroy(session->slplinks->data); |
5309 | 75 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
76 msn_userlist_destroy(session->userlist); |
5309 | 77 |
10044 | 78 if (session->sync_userlist != NULL) |
79 msn_userlist_destroy(session->sync_userlist); | |
80 | |
6827
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
81 if (session->passport_info.kv != NULL) |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
82 g_free(session->passport_info.kv); |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
83 |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
84 if (session->passport_info.sid != NULL) |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
85 g_free(session->passport_info.sid); |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
86 |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
87 if (session->passport_info.mspauth != NULL) |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
88 g_free(session->passport_info.mspauth); |
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
89 |
10284 | 90 if (session->passport_info.client_ip != NULL) |
91 g_free(session->passport_info.client_ip); | |
92 | |
6827
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
93 if (session->passport_info.file != NULL) |
10275 | 94 { |
95 unlink(session->passport_info.file); | |
6827
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
96 g_free(session->passport_info.file); |
10275 | 97 } |
5427 | 98 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
99 if (session->sync != NULL) |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
100 msn_sync_destroy(session->sync); |
7590
3a48ade4f510
[gaim-migrate @ 8208]
Christian Hammond <chipx86@chipx86.com>
parents:
7288
diff
changeset
|
101 |
8171
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
102 if (session->nexus != NULL) |
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
103 msn_nexus_destroy(session->nexus); |
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
104 |
5309 | 105 g_free(session); |
106 } | |
107 | |
108 gboolean | |
109 msn_session_connect(MsnSession *session) | |
110 { | |
111 g_return_val_if_fail(session != NULL, FALSE); | |
112 g_return_val_if_fail(!session->connected, TRUE); | |
113 | |
114 session->connected = TRUE; | |
115 | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
116 if (msn_notification_connect(session->notification, |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
117 session->dispatch_host, |
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
118 session->dispatch_port)) |
8831
ffecda0c1f45
[gaim-migrate @ 9595]
Christian Hammond <chipx86@chipx86.com>
parents:
8808
diff
changeset
|
119 { |
ffecda0c1f45
[gaim-migrate @ 9595]
Christian Hammond <chipx86@chipx86.com>
parents:
8808
diff
changeset
|
120 return TRUE; |
7288
ff9127038a5a
[gaim-migrate @ 7869]
Christian Hammond <chipx86@chipx86.com>
parents:
6827
diff
changeset
|
121 } |
5309 | 122 |
123 return FALSE; | |
124 } | |
125 | |
126 void | |
127 msn_session_disconnect(MsnSession *session) | |
128 { | |
129 g_return_if_fail(session != NULL); | |
130 g_return_if_fail(session->connected); | |
131 | |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
132 while (session->switches != NULL) |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
133 msn_switchboard_destroy(session->switches->data); |
5309 | 134 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
135 if (session->notification != NULL) |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
136 msn_notification_disconnect(session->notification); |
5309 | 137 } |
138 | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
139 /* TODO: This must go away when conversation is redesigned */ |
5309 | 140 MsnSwitchBoard * |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
141 msn_session_find_swboard(MsnSession *session, const char *username) |
5309 | 142 { |
143 GList *l; | |
144 | |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
145 g_return_val_if_fail(session != NULL, NULL); |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
146 g_return_val_if_fail(username != NULL, NULL); |
5309 | 147 |
8499
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8475
diff
changeset
|
148 for (l = session->switches; l != NULL; l = l->next) |
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8475
diff
changeset
|
149 { |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
150 MsnSwitchBoard *swboard; |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
151 |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
152 swboard = l->data; |
5309 | 153 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
154 if (swboard->im_user != NULL) |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
155 if (!strcmp(username, swboard->im_user)) |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
156 return swboard; |
5309 | 157 } |
158 | |
159 return NULL; | |
160 } | |
161 | |
162 MsnSwitchBoard * | |
163 msn_session_find_switch_with_id(const MsnSession *session, int chat_id) | |
164 { | |
165 GList *l; | |
166 | |
167 g_return_val_if_fail(session != NULL, NULL); | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
168 g_return_val_if_fail(chat_id >= 0, NULL); |
5309 | 169 |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
170 for (l = session->switches; l != NULL; l = l->next) |
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
171 { |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
172 MsnSwitchBoard *swboard; |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
173 |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
174 swboard = l->data; |
5309 | 175 |
176 if (swboard->chat_id == chat_id) | |
177 return swboard; | |
178 } | |
179 | |
180 return NULL; | |
181 } | |
182 | |
183 MsnSwitchBoard * | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
184 msn_session_get_swboard(MsnSession *session, const char *username) |
5309 | 185 { |
186 MsnSwitchBoard *swboard; | |
187 | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
188 swboard = msn_session_find_swboard(session, username); |
5309 | 189 |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
190 if (swboard == NULL) |
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
191 { |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
192 swboard = msn_switchboard_new(session); |
10225 | 193 swboard->im_user = g_strdup(username); |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
194 msn_switchboard_request(swboard); |
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
195 msn_switchboard_request_add_user(swboard, username); |
5309 | 196 } |
197 | |
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
198 return swboard; |
5309 | 199 } |
10044 | 200 |
201 static void | |
202 msn_session_sync_users(MsnSession *session) | |
203 { | |
204 GList *l; | |
205 | |
206 l = session->sync_userlist->users; | |
207 | |
208 while (l != NULL) | |
209 { | |
210 MsnUser *local_user; | |
211 | |
212 local_user = (MsnUser *)l->data; | |
213 | |
214 if (local_user->passport != NULL) | |
215 { | |
216 MsnUser *remote_user; | |
217 | |
218 remote_user = msn_userlist_find_user(session->userlist, | |
219 local_user->passport); | |
220 | |
221 if (remote_user == NULL || | |
222 ((local_user->list_op & ( 1 << MSN_LIST_FL)) && | |
223 !(remote_user->list_op & ( 1 << MSN_LIST_FL)))) | |
224 { | |
225 /* The user was not on the server list */ | |
226 msn_show_sync_issue(session, local_user->passport, NULL); | |
227 } | |
228 else | |
229 { | |
230 GList *l; | |
231 | |
232 for (l = local_user->group_ids; l != NULL; l = l->next) | |
233 { | |
234 const char *group_name; | |
235 int gid; | |
236 gboolean found = FALSE; | |
237 GList *l2; | |
238 | |
239 group_name = | |
240 msn_userlist_find_group_name(local_user->userlist, | |
10112 | 241 GPOINTER_TO_INT(l->data)); |
10044 | 242 |
243 gid = msn_userlist_find_group_id(remote_user->userlist, | |
244 group_name); | |
245 | |
246 for (l2 = remote_user->group_ids; l2 != NULL; l2 = l2->next) | |
247 { | |
10112 | 248 if (GPOINTER_TO_INT(l2->data) == gid) |
10044 | 249 { |
250 found = TRUE; | |
251 break; | |
252 } | |
253 } | |
254 | |
255 if (!found) | |
256 { | |
257 /* The user was not on that group on the server list */ | |
258 msn_show_sync_issue(session, local_user->passport, | |
259 group_name); | |
260 } | |
261 } | |
262 } | |
263 } | |
264 | |
265 l = l->next; | |
266 } | |
267 | |
268 msn_userlist_destroy(session->sync_userlist); | |
269 session->sync_userlist = NULL; | |
270 } | |
271 | |
272 void | |
273 msn_session_finish_login(MsnSession *session) | |
274 { | |
275 GaimAccount *account; | |
276 GaimConnection *gc; | |
277 | |
278 account = session->account; | |
279 gc = gaim_account_get_connection(account); | |
280 | |
281 msn_user_set_buddy_icon(session->user, | |
282 gaim_account_get_buddy_icon(session->account)); | |
283 | |
284 msn_change_status(session, MSN_ONLINE); | |
285 | |
286 gaim_connection_set_state(gc, GAIM_CONNECTED); | |
287 session->logged_in = TRUE; | |
288 | |
289 /* Sync users */ | |
290 msn_session_sync_users(session); | |
291 | |
292 serv_finish_login(gc); | |
293 } |