Mercurial > pidgin
annotate src/protocols/msn/session.c @ 10343:ee4f477fc8cf
[gaim-migrate @ 11553]
Minor tweaks to the blist and status xml reading code. These functions
don't expect the filename to be called "blist.xml" and "status.xml"
anymore. Some guy wanted this because he wants to try to add some
sort of AIM buddy list importing, or something. I think.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Fri, 10 Dec 2004 05:49:01 +0000 |
| parents | a7b2fd5efcf2 |
| children | 2e01c503aa4f |
| 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 | |
| 10296 | 61 session->destroying = TRUE; |
| 62 | |
| 5309 | 63 if (session->connected) |
| 64 msn_session_disconnect(session); | |
| 65 | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
66 if (session->dispatch_host != NULL) |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
67 g_free(session->dispatch_host); |
| 5309 | 68 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
69 if (session->notification != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
70 msn_notification_destroy(session->notification); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
71 |
| 5309 | 72 while (session->switches != NULL) |
| 73 msn_switchboard_destroy(session->switches->data); | |
| 74 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
75 while (session->slplinks != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
76 msn_slplink_destroy(session->slplinks->data); |
| 5309 | 77 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
78 msn_userlist_destroy(session->userlist); |
| 5309 | 79 |
| 10044 | 80 if (session->sync_userlist != NULL) |
| 81 msn_userlist_destroy(session->sync_userlist); | |
| 82 | |
|
6827
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
83 if (session->passport_info.kv != NULL) |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
84 g_free(session->passport_info.kv); |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
85 |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
86 if (session->passport_info.sid != NULL) |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
87 g_free(session->passport_info.sid); |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
88 |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
89 if (session->passport_info.mspauth != NULL) |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
90 g_free(session->passport_info.mspauth); |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
91 |
| 10284 | 92 if (session->passport_info.client_ip != NULL) |
| 93 g_free(session->passport_info.client_ip); | |
| 94 | |
|
6827
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
95 if (session->passport_info.file != NULL) |
| 10275 | 96 { |
| 97 unlink(session->passport_info.file); | |
|
6827
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
98 g_free(session->passport_info.file); |
| 10275 | 99 } |
| 5427 | 100 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
101 if (session->sync != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
102 msn_sync_destroy(session->sync); |
|
7590
3a48ade4f510
[gaim-migrate @ 8208]
Christian Hammond <chipx86@chipx86.com>
parents:
7288
diff
changeset
|
103 |
|
8171
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
104 if (session->nexus != NULL) |
|
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
105 msn_nexus_destroy(session->nexus); |
|
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
106 |
| 5309 | 107 g_free(session); |
| 108 } | |
| 109 | |
| 110 gboolean | |
| 111 msn_session_connect(MsnSession *session) | |
| 112 { | |
| 113 g_return_val_if_fail(session != NULL, FALSE); | |
| 114 g_return_val_if_fail(!session->connected, TRUE); | |
| 115 | |
| 116 session->connected = TRUE; | |
| 117 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
118 if (msn_notification_connect(session->notification, |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
119 session->dispatch_host, |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
120 session->dispatch_port)) |
|
8831
ffecda0c1f45
[gaim-migrate @ 9595]
Christian Hammond <chipx86@chipx86.com>
parents:
8808
diff
changeset
|
121 { |
|
ffecda0c1f45
[gaim-migrate @ 9595]
Christian Hammond <chipx86@chipx86.com>
parents:
8808
diff
changeset
|
122 return TRUE; |
|
7288
ff9127038a5a
[gaim-migrate @ 7869]
Christian Hammond <chipx86@chipx86.com>
parents:
6827
diff
changeset
|
123 } |
| 5309 | 124 |
| 125 return FALSE; | |
| 126 } | |
| 127 | |
| 128 void | |
| 129 msn_session_disconnect(MsnSession *session) | |
| 130 { | |
| 131 g_return_if_fail(session != NULL); | |
| 132 g_return_if_fail(session->connected); | |
| 133 | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
134 while (session->switches != NULL) |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
135 msn_switchboard_destroy(session->switches->data); |
| 5309 | 136 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
137 if (session->notification != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
138 msn_notification_disconnect(session->notification); |
| 5309 | 139 } |
| 140 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
141 /* TODO: This must go away when conversation is redesigned */ |
| 5309 | 142 MsnSwitchBoard * |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
143 msn_session_find_swboard(MsnSession *session, const char *username) |
| 5309 | 144 { |
| 145 GList *l; | |
| 146 | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
147 g_return_val_if_fail(session != NULL, NULL); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
148 g_return_val_if_fail(username != NULL, NULL); |
| 5309 | 149 |
|
8499
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8475
diff
changeset
|
150 for (l = session->switches; l != NULL; l = l->next) |
|
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8475
diff
changeset
|
151 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
152 MsnSwitchBoard *swboard; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
153 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
154 swboard = l->data; |
| 5309 | 155 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
156 if (swboard->im_user != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
157 if (!strcmp(username, swboard->im_user)) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
158 return swboard; |
| 5309 | 159 } |
| 160 | |
| 161 return NULL; | |
| 162 } | |
| 163 | |
| 164 MsnSwitchBoard * | |
| 165 msn_session_find_switch_with_id(const MsnSession *session, int chat_id) | |
| 166 { | |
| 167 GList *l; | |
| 168 | |
| 169 g_return_val_if_fail(session != NULL, NULL); | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
170 g_return_val_if_fail(chat_id >= 0, NULL); |
| 5309 | 171 |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
172 for (l = session->switches; l != NULL; l = l->next) |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
173 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
174 MsnSwitchBoard *swboard; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
175 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
176 swboard = l->data; |
| 5309 | 177 |
| 178 if (swboard->chat_id == chat_id) | |
| 179 return swboard; | |
| 180 } | |
| 181 | |
| 182 return NULL; | |
| 183 } | |
| 184 | |
| 185 MsnSwitchBoard * | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
186 msn_session_get_swboard(MsnSession *session, const char *username) |
| 5309 | 187 { |
| 188 MsnSwitchBoard *swboard; | |
| 189 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
190 swboard = msn_session_find_swboard(session, username); |
| 5309 | 191 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
192 if (swboard == NULL) |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
193 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
194 swboard = msn_switchboard_new(session); |
| 10225 | 195 swboard->im_user = g_strdup(username); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
196 msn_switchboard_request(swboard); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
197 msn_switchboard_request_add_user(swboard, username); |
| 5309 | 198 } |
| 199 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
200 return swboard; |
| 5309 | 201 } |
| 10044 | 202 |
| 203 static void | |
| 204 msn_session_sync_users(MsnSession *session) | |
| 205 { | |
| 206 GList *l; | |
| 207 | |
| 208 l = session->sync_userlist->users; | |
| 209 | |
| 210 while (l != NULL) | |
| 211 { | |
| 212 MsnUser *local_user; | |
| 213 | |
| 214 local_user = (MsnUser *)l->data; | |
| 215 | |
| 216 if (local_user->passport != NULL) | |
| 217 { | |
| 218 MsnUser *remote_user; | |
| 219 | |
| 220 remote_user = msn_userlist_find_user(session->userlist, | |
| 221 local_user->passport); | |
| 222 | |
| 223 if (remote_user == NULL || | |
| 224 ((local_user->list_op & ( 1 << MSN_LIST_FL)) && | |
| 225 !(remote_user->list_op & ( 1 << MSN_LIST_FL)))) | |
| 226 { | |
| 227 /* The user was not on the server list */ | |
| 228 msn_show_sync_issue(session, local_user->passport, NULL); | |
| 229 } | |
| 230 else | |
| 231 { | |
| 232 GList *l; | |
| 233 | |
| 234 for (l = local_user->group_ids; l != NULL; l = l->next) | |
| 235 { | |
| 236 const char *group_name; | |
| 237 int gid; | |
| 238 gboolean found = FALSE; | |
| 239 GList *l2; | |
| 240 | |
| 241 group_name = | |
| 242 msn_userlist_find_group_name(local_user->userlist, | |
| 10112 | 243 GPOINTER_TO_INT(l->data)); |
| 10044 | 244 |
| 245 gid = msn_userlist_find_group_id(remote_user->userlist, | |
| 246 group_name); | |
| 247 | |
| 248 for (l2 = remote_user->group_ids; l2 != NULL; l2 = l2->next) | |
| 249 { | |
| 10112 | 250 if (GPOINTER_TO_INT(l2->data) == gid) |
| 10044 | 251 { |
| 252 found = TRUE; | |
| 253 break; | |
| 254 } | |
| 255 } | |
| 256 | |
| 257 if (!found) | |
| 258 { | |
| 259 /* The user was not on that group on the server list */ | |
| 260 msn_show_sync_issue(session, local_user->passport, | |
| 261 group_name); | |
| 262 } | |
| 263 } | |
| 264 } | |
| 265 } | |
| 266 | |
| 267 l = l->next; | |
| 268 } | |
| 269 | |
| 270 msn_userlist_destroy(session->sync_userlist); | |
| 271 session->sync_userlist = NULL; | |
| 272 } | |
| 273 | |
| 274 void | |
| 275 msn_session_finish_login(MsnSession *session) | |
| 276 { | |
| 277 GaimAccount *account; | |
| 278 GaimConnection *gc; | |
| 279 | |
| 280 account = session->account; | |
| 281 gc = gaim_account_get_connection(account); | |
| 282 | |
| 283 msn_user_set_buddy_icon(session->user, | |
| 284 gaim_account_get_buddy_icon(session->account)); | |
| 285 | |
| 286 msn_change_status(session, MSN_ONLINE); | |
| 287 | |
| 288 gaim_connection_set_state(gc, GAIM_CONNECTED); | |
| 289 session->logged_in = TRUE; | |
| 290 | |
| 291 /* Sync users */ | |
| 292 msn_session_sync_users(session); | |
| 293 | |
| 294 serv_finish_login(gc); | |
| 295 } |
