Mercurial > pidgin
annotate src/protocols/msn/session.c @ 10108:f0100b414d98
[gaim-migrate @ 11141]
Two things:
a. Added Enter as a gtk_binding to GtkIMHtml. This fixes everything.
Input methods now work. The "Enter sends" and "Ctrl-Enter sends" preferences
were removed and defaulted to yes and no respectively, BUT, in a very super-cool
turn of events, you can now add your own bindings to .gtkrc to make WHATEVER
YOU WANT send. Awesome. Someone should use g_signal_accumulator_true_handled
or something to make profiles and away messages able to insert newlines.
b. Removed "Use multi-colored screennames in chats," defaulted to yes, and
wrote a nifty algorithm to automatically adjust the colors to accomodate the
background (see http://gaim.sf.net/sean/porn-chat.png). People should play
around and tweak it a bit. The algorithm takes into consideration the
luminosity of the current background and the base hue to use for the screenname
in generating the new colors. Note that it does this while maintaining the hues.
Someone should optimize this so it skips over the floating point arithmatic when
the background color is white.
committer: Tailor Script <tailor@pidgin.im>
| author | Sean Egan <seanegan@gmail.com> |
|---|---|
| date | Sun, 17 Oct 2004 23:55:49 +0000 |
| parents | 86a6d78b070b |
| children | 1a91e814e9d8 |
| 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 |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
90 if (session->passport_info.file != NULL) |
|
1cfbb731aa1f
[gaim-migrate @ 7372]
Christian Hammond <chipx86@chipx86.com>
parents:
6779
diff
changeset
|
91 g_free(session->passport_info.file); |
| 5427 | 92 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
93 if (session->sync != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
94 msn_sync_destroy(session->sync); |
|
7590
3a48ade4f510
[gaim-migrate @ 8208]
Christian Hammond <chipx86@chipx86.com>
parents:
7288
diff
changeset
|
95 |
|
8171
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
96 if (session->nexus != NULL) |
|
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
97 msn_nexus_destroy(session->nexus); |
|
d0ba2f7b40e7
[gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
7590
diff
changeset
|
98 |
| 5309 | 99 g_free(session); |
| 100 } | |
| 101 | |
| 102 gboolean | |
| 103 msn_session_connect(MsnSession *session) | |
| 104 { | |
| 105 g_return_val_if_fail(session != NULL, FALSE); | |
| 106 g_return_val_if_fail(!session->connected, TRUE); | |
| 107 | |
| 108 session->connected = TRUE; | |
| 109 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
110 if (msn_notification_connect(session->notification, |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
111 session->dispatch_host, |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
112 session->dispatch_port)) |
|
8831
ffecda0c1f45
[gaim-migrate @ 9595]
Christian Hammond <chipx86@chipx86.com>
parents:
8808
diff
changeset
|
113 { |
|
ffecda0c1f45
[gaim-migrate @ 9595]
Christian Hammond <chipx86@chipx86.com>
parents:
8808
diff
changeset
|
114 return TRUE; |
|
7288
ff9127038a5a
[gaim-migrate @ 7869]
Christian Hammond <chipx86@chipx86.com>
parents:
6827
diff
changeset
|
115 } |
| 5309 | 116 |
| 117 return FALSE; | |
| 118 } | |
| 119 | |
| 120 void | |
| 121 msn_session_disconnect(MsnSession *session) | |
| 122 { | |
| 123 g_return_if_fail(session != NULL); | |
| 124 g_return_if_fail(session->connected); | |
| 125 | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
126 while (session->switches != NULL) |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
127 msn_switchboard_destroy(session->switches->data); |
| 5309 | 128 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
129 if (session->notification != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
130 msn_notification_disconnect(session->notification); |
| 5309 | 131 } |
| 132 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
133 /* TODO: This must go away when conversation is redesigned */ |
|
7590
3a48ade4f510
[gaim-migrate @ 8208]
Christian Hammond <chipx86@chipx86.com>
parents:
7288
diff
changeset
|
134 |
| 5309 | 135 MsnSwitchBoard * |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
136 msn_session_find_swboard(MsnSession *session, const char *username) |
| 5309 | 137 { |
| 138 GList *l; | |
| 139 | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
140 g_return_val_if_fail(session != NULL, NULL); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
141 g_return_val_if_fail(username != NULL, NULL); |
| 5309 | 142 |
|
8499
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8475
diff
changeset
|
143 for (l = session->switches; l != NULL; l = l->next) |
|
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8475
diff
changeset
|
144 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
145 MsnSwitchBoard *swboard; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
146 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
147 swboard = l->data; |
| 5309 | 148 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
149 if (swboard->im_user != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
150 if (!strcmp(username, swboard->im_user)) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
151 return swboard; |
| 5309 | 152 } |
| 153 | |
| 154 return NULL; | |
| 155 } | |
| 156 | |
| 157 MsnSwitchBoard * | |
| 158 msn_session_find_switch_with_id(const MsnSession *session, int chat_id) | |
| 159 { | |
| 160 GList *l; | |
| 161 | |
| 162 g_return_val_if_fail(session != NULL, NULL); | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
163 g_return_val_if_fail(chat_id >= 0, NULL); |
| 5309 | 164 |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
165 for (l = session->switches; l != NULL; l = l->next) |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
166 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
167 MsnSwitchBoard *swboard; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
168 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
169 swboard = l->data; |
| 5309 | 170 |
| 171 if (swboard->chat_id == chat_id) | |
| 172 return swboard; | |
| 173 } | |
| 174 | |
| 175 return NULL; | |
| 176 } | |
| 177 | |
| 178 MsnSwitchBoard * | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
179 msn_session_get_swboard(MsnSession *session, const char *username) |
| 5309 | 180 { |
| 181 MsnSwitchBoard *swboard; | |
| 182 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
183 swboard = msn_session_find_swboard(session, username); |
| 5309 | 184 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
185 if (swboard == NULL) |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
8831
diff
changeset
|
186 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
187 swboard = msn_switchboard_new(session); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
188 msn_switchboard_request(swboard); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
189 msn_switchboard_request_add_user(swboard, username); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
190 swboard->im_user = g_strdup(username); |
| 5309 | 191 } |
| 192 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
193 return swboard; |
| 5309 | 194 } |
| 10044 | 195 |
| 196 static void | |
| 197 msn_session_sync_users(MsnSession *session) | |
| 198 { | |
| 199 GList *l; | |
| 200 | |
| 201 l = session->sync_userlist->users; | |
| 202 | |
| 203 while (l != NULL) | |
| 204 { | |
| 205 MsnUser *local_user; | |
| 206 | |
| 207 local_user = (MsnUser *)l->data; | |
| 208 | |
| 209 if (local_user->passport != NULL) | |
| 210 { | |
| 211 MsnUser *remote_user; | |
| 212 | |
| 213 remote_user = msn_userlist_find_user(session->userlist, | |
| 214 local_user->passport); | |
| 215 | |
| 216 if (remote_user == NULL || | |
| 217 ((local_user->list_op & ( 1 << MSN_LIST_FL)) && | |
| 218 !(remote_user->list_op & ( 1 << MSN_LIST_FL)))) | |
| 219 { | |
| 220 /* The user was not on the server list */ | |
| 221 msn_show_sync_issue(session, local_user->passport, NULL); | |
| 222 } | |
| 223 else | |
| 224 { | |
| 225 GList *l; | |
| 226 | |
| 227 for (l = local_user->group_ids; l != NULL; l = l->next) | |
| 228 { | |
| 229 const char *group_name; | |
| 230 int gid; | |
| 231 gboolean found = FALSE; | |
| 232 GList *l2; | |
| 233 | |
| 234 group_name = | |
| 235 msn_userlist_find_group_name(local_user->userlist, | |
| 236 (int)l->data); | |
| 237 | |
| 238 gid = msn_userlist_find_group_id(remote_user->userlist, | |
| 239 group_name); | |
| 240 | |
| 241 for (l2 = remote_user->group_ids; l2 != NULL; l2 = l2->next) | |
| 242 { | |
| 243 if ((int)l2->data == gid) | |
| 244 { | |
| 245 found = TRUE; | |
| 246 break; | |
| 247 } | |
| 248 } | |
| 249 | |
| 250 if (!found) | |
| 251 { | |
| 252 /* The user was not on that group on the server list */ | |
| 253 msn_show_sync_issue(session, local_user->passport, | |
| 254 group_name); | |
| 255 } | |
| 256 } | |
| 257 } | |
| 258 } | |
| 259 | |
| 260 l = l->next; | |
| 261 } | |
| 262 | |
| 263 msn_userlist_destroy(session->sync_userlist); | |
| 264 session->sync_userlist = NULL; | |
| 265 } | |
| 266 | |
| 267 void | |
| 268 msn_session_finish_login(MsnSession *session) | |
| 269 { | |
| 270 GaimAccount *account; | |
| 271 GaimConnection *gc; | |
| 272 | |
| 273 account = session->account; | |
| 274 gc = gaim_account_get_connection(account); | |
| 275 | |
| 276 msn_user_set_buddy_icon(session->user, | |
| 277 gaim_account_get_buddy_icon(session->account)); | |
| 278 | |
| 279 msn_change_status(session, MSN_ONLINE); | |
| 280 | |
| 281 gaim_connection_set_state(gc, GAIM_CONNECTED); | |
| 282 session->logged_in = TRUE; | |
| 283 | |
| 284 /* Sync users */ | |
| 285 msn_session_sync_users(session); | |
| 286 | |
| 287 serv_finish_login(gc); | |
| 288 } |
