Mercurial > pidgin
annotate src/protocols/msn/switchboard.c @ 13131:47ecef83e2e1
[gaim-migrate @ 15493]
A lot of our conversation code assumes that conv->account != NULL.
This is a completely invalid assumption. If you have a conversation
open on an account, and you delete the account, Gaim should leave the
conversation window open and set the account to NULL and handle
everything appropriately. Currently it does not, and that makes me
a little unhappy.
To reproduce this:
1. Open a conversation with someone
2. Delete the account that you're sending messages from
3. Watch the assertion failures scroll by in the debug window
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Mon, 06 Feb 2006 05:43:09 +0000 |
| parents | 442b23efba54 |
| children | 70809b5c5f86 |
| rev | line source |
|---|---|
| 4542 | 1 /** |
| 2 * @file switchboard.c MSN switchboard functions | |
| 3 * | |
| 4 * gaim | |
| 5 * | |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9194
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:
9194
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:
9194
diff
changeset
|
8 * source distribution. |
|
6668
7e8a70c531a7
[gaim-migrate @ 7193]
Christian Hammond <chipx86@chipx86.com>
parents:
6640
diff
changeset
|
9 * |
| 4542 | 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 | |
|
8207
aa44049e8891
[gaim-migrate @ 8930]
Christian Hammond <chipx86@chipx86.com>
parents:
7639
diff
changeset
|
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 4542 | 23 */ |
| 24 #include "msn.h" | |
|
5626
6275ac113622
[gaim-migrate @ 6033]
Christian Hammond <chipx86@chipx86.com>
parents:
5566
diff
changeset
|
25 #include "prefs.h" |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
26 #include "switchboard.h" |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
27 #include "notification.h" |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
28 #include "utils.h" |
| 4542 | 29 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
30 #include "error.h" |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
31 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
32 static MsnTable *cbs_table; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
33 |
| 10345 | 34 static void msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, |
| 35 MsnMsgErrorType error); | |
| 36 | |
| 37 /************************************************************************** | |
| 10481 | 38 * Main |
| 10345 | 39 **************************************************************************/ |
| 10481 | 40 |
| 10345 | 41 MsnSwitchBoard * |
| 42 msn_switchboard_new(MsnSession *session) | |
| 43 { | |
| 44 MsnSwitchBoard *swboard; | |
| 45 MsnServConn *servconn; | |
| 46 | |
| 47 g_return_val_if_fail(session != NULL, NULL); | |
| 48 | |
| 49 swboard = g_new0(MsnSwitchBoard, 1); | |
| 50 | |
| 51 swboard->session = session; | |
| 10481 | 52 swboard->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_SB); |
| 10463 | 53 swboard->cmdproc = servconn->cmdproc; |
| 10345 | 54 |
| 10481 | 55 swboard->msg_queue = g_queue_new(); |
| 10345 | 56 swboard->empty = TRUE; |
| 57 | |
| 10463 | 58 swboard->cmdproc->data = swboard; |
| 59 swboard->cmdproc->cbs_table = cbs_table; | |
| 10345 | 60 |
| 61 session->switches = g_list_append(session->switches, swboard); | |
| 62 | |
| 63 return swboard; | |
| 64 } | |
| 65 | |
| 66 void | |
| 67 msn_switchboard_destroy(MsnSwitchBoard *swboard) | |
| 68 { | |
| 69 MsnSession *session; | |
| 70 MsnMessage *msg; | |
| 71 GList *l; | |
| 72 | |
| 11321 | 73 #ifdef MSN_DEBUG_SB |
| 10773 | 74 gaim_debug_info("msn", "switchboard_destroy: swboard(%p)\n", swboard); |
| 75 #endif | |
| 76 | |
| 10345 | 77 g_return_if_fail(swboard != NULL); |
| 78 | |
| 10773 | 79 if (swboard->destroying) |
| 80 return; | |
| 81 | |
| 82 swboard->destroying = TRUE; | |
| 83 | |
| 10345 | 84 /* If it linked us is because its looking for trouble */ |
| 85 if (swboard->slplink != NULL) | |
| 86 msn_slplink_destroy(swboard->slplink); | |
| 87 | |
| 88 /* Destroy the message queue */ | |
| 10481 | 89 while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL) |
| 10345 | 90 { |
| 91 if (swboard->error != MSN_SB_ERROR_NONE) | |
| 92 { | |
| 93 /* The messages could not be sent due to a switchboard error */ | |
| 10463 | 94 msg_error_helper(swboard->cmdproc, msg, |
| 10345 | 95 MSN_MSG_ERROR_SB); |
| 96 } | |
| 10403 | 97 msn_message_unref(msg); |
| 10345 | 98 } |
| 99 | |
| 10481 | 100 g_queue_free(swboard->msg_queue); |
| 10345 | 101 |
| 12236 | 102 /* msg_error_helper will both remove the msg from ack_list and |
| 103 unref it, so we don't need to do either here */ | |
| 104 while ((l = swboard->ack_list) != NULL) | |
| 105 msg_error_helper(swboard->cmdproc, l->data, MSN_MSG_ERROR_SB); | |
| 10403 | 106 |
| 10345 | 107 if (swboard->im_user != NULL) |
| 108 g_free(swboard->im_user); | |
| 109 | |
| 110 if (swboard->auth_key != NULL) | |
| 111 g_free(swboard->auth_key); | |
| 112 | |
| 113 if (swboard->session_id != NULL) | |
| 114 g_free(swboard->session_id); | |
| 115 | |
| 116 for (l = swboard->users; l != NULL; l = l->next) | |
| 117 g_free(l->data); | |
| 118 | |
| 119 session = swboard->session; | |
| 120 session->switches = g_list_remove(session->switches, swboard); | |
| 121 | |
| 10481 | 122 #if 0 |
| 123 /* This should never happen or we are in trouble. */ | |
| 10345 | 124 if (swboard->servconn != NULL) |
| 125 msn_servconn_destroy(swboard->servconn); | |
| 10481 | 126 #endif |
| 127 | |
| 128 swboard->cmdproc->data = NULL; | |
| 129 | |
| 130 msn_servconn_set_disconnect_cb(swboard->servconn, NULL); | |
| 131 | |
| 132 msn_servconn_destroy(swboard->servconn); | |
| 10345 | 133 |
| 134 g_free(swboard); | |
| 135 } | |
| 136 | |
| 137 void | |
| 138 msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key) | |
| 139 { | |
| 140 g_return_if_fail(swboard != NULL); | |
| 141 g_return_if_fail(key != NULL); | |
| 142 | |
| 143 swboard->auth_key = g_strdup(key); | |
| 144 } | |
| 145 | |
| 146 const char * | |
| 147 msn_switchboard_get_auth_key(MsnSwitchBoard *swboard) | |
| 148 { | |
| 149 g_return_val_if_fail(swboard != NULL, NULL); | |
| 150 | |
| 151 return swboard->auth_key; | |
| 152 } | |
| 153 | |
| 154 void | |
| 155 msn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id) | |
| 156 { | |
| 157 g_return_if_fail(swboard != NULL); | |
| 158 g_return_if_fail(id != NULL); | |
| 159 | |
| 160 if (swboard->session_id != NULL) | |
| 161 g_free(swboard->session_id); | |
| 162 | |
| 163 swboard->session_id = g_strdup(id); | |
| 164 } | |
| 165 | |
| 166 const char * | |
| 167 msn_switchboard_get_session_id(MsnSwitchBoard *swboard) | |
| 168 { | |
| 169 g_return_val_if_fail(swboard != NULL, NULL); | |
| 170 | |
| 171 return swboard->session_id; | |
| 172 } | |
| 173 | |
| 174 void | |
| 175 msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited) | |
| 176 { | |
| 177 g_return_if_fail(swboard != NULL); | |
| 178 | |
| 179 swboard->invited = invited; | |
| 180 } | |
| 181 | |
| 182 gboolean | |
| 183 msn_switchboard_is_invited(MsnSwitchBoard *swboard) | |
| 184 { | |
| 185 g_return_val_if_fail(swboard != NULL, FALSE); | |
| 186 | |
| 187 return swboard->invited; | |
| 188 } | |
| 10225 | 189 |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
190 /************************************************************************** |
| 10481 | 191 * Utility |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
192 **************************************************************************/ |
| 10481 | 193 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
194 static void |
|
5793
952710ac6635
[gaim-migrate @ 6218]
Christian Hammond <chipx86@chipx86.com>
parents:
5679
diff
changeset
|
195 send_clientcaps(MsnSwitchBoard *swboard) |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
196 { |
|
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
197 MsnMessage *msg; |
|
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
198 |
| 10225 | 199 msg = msn_message_new(MSN_MSG_CAPS); |
|
5475
ad9887c91a59
[gaim-migrate @ 5871]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
200 msn_message_set_content_type(msg, "text/x-clientcaps"); |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
201 msn_message_set_flag(msg, 'U'); |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
202 msn_message_set_bin_data(msg, MSN_CLIENTINFO, strlen(MSN_CLIENTINFO)); |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
203 |
| 10481 | 204 msn_switchboard_send_msg(swboard, msg, TRUE); |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
205 |
|
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
206 msn_message_destroy(msg); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
207 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
208 |
|
12323
fc464a0abccc
[gaim-migrate @ 14627]
Richard Laager <rlaager@wiktel.com>
parents:
12236
diff
changeset
|
209 static void |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
210 msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
211 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
212 MsnCmdProc *cmdproc; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
213 GaimAccount *account; |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9194
diff
changeset
|
214 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
215 g_return_if_fail(swboard != NULL); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
216 |
| 10463 | 217 cmdproc = swboard->cmdproc; |
| 218 account = cmdproc->session->account; | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
219 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
220 swboard->users = g_list_prepend(swboard->users, g_strdup(user)); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
221 swboard->current_users++; |
| 10346 | 222 swboard->empty = FALSE; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
223 |
| 10773 | 224 #ifdef MSN_DEBUG_CHAT |
| 225 gaim_debug_info("msn", "user=[%s], total=%d\n", user, | |
| 226 swboard->current_users); | |
| 227 #endif | |
| 228 | |
| 10806 | 229 if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) |
| 10773 | 230 { |
| 231 /* This is a helper switchboard. */ | |
| 10806 | 232 gaim_debug_error("msn", "switchboard_add_user: conv != NULL\n"); |
| 10773 | 233 return; |
| 234 } | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
235 |
| 10345 | 236 if ((swboard->conv != NULL) && |
| 11338 | 237 (gaim_conversation_get_type(swboard->conv) == GAIM_CONV_TYPE_CHAT)) |
|
9363
997c28571364
[gaim-migrate @ 10171]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
238 { |
| 10345 | 239 gaim_conv_chat_add_user(GAIM_CONV_CHAT(swboard->conv), user, NULL, |
| 240 GAIM_CBFLAGS_NONE, TRUE); | |
|
9363
997c28571364
[gaim-migrate @ 10171]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
241 } |
|
997c28571364
[gaim-migrate @ 10171]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
242 else if (swboard->current_users > 1 || swboard->total_users > 1) |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
243 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
244 if (swboard->conv == NULL || |
| 11338 | 245 gaim_conversation_get_type(swboard->conv) != GAIM_CONV_TYPE_CHAT) |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
246 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
247 GList *l; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
248 |
| 10773 | 249 #ifdef MSN_DEBUG_CHAT |
| 250 gaim_debug_info("msn", "[chat] Switching to chat.\n"); | |
| 251 #endif | |
| 252 | |
| 10533 | 253 #if 0 |
| 254 /* this is bad - it causes msn_switchboard_close to be called on the | |
| 255 * switchboard we're in the middle of using :( */ | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
256 if (swboard->conv != NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
257 gaim_conversation_destroy(swboard->conv); |
| 10533 | 258 #endif |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
259 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
260 cmdproc->session->conv_seq++; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
261 swboard->chat_id = cmdproc->session->conv_seq; |
| 10806 | 262 swboard->flag |= MSN_SB_FLAG_IM; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
263 swboard->conv = serv_got_joined_chat(account->gc, |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
264 swboard->chat_id, |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
265 "MSN Chat"); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
266 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
267 for (l = swboard->users; l != NULL; l = l->next) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
268 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
269 const char *tmp_user; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
270 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
271 tmp_user = l->data; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
272 |
| 10773 | 273 #ifdef MSN_DEBUG_CHAT |
| 274 gaim_debug_info("msn", "[chat] Adding [%s].\n", tmp_user); | |
| 275 #endif | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
276 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
277 gaim_conv_chat_add_user(GAIM_CONV_CHAT(swboard->conv), |
| 9846 | 278 tmp_user, NULL, GAIM_CBFLAGS_NONE, TRUE); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
279 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
280 |
| 10773 | 281 #ifdef MSN_DEBUG_CHAT |
| 282 gaim_debug_info("msn", "[chat] We add ourselves.\n"); | |
| 283 #endif | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
284 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
285 gaim_conv_chat_add_user(GAIM_CONV_CHAT(swboard->conv), |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
286 gaim_account_get_username(account), |
| 9846 | 287 NULL, GAIM_CBFLAGS_NONE, TRUE); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
288 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
289 g_free(swboard->im_user); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
290 swboard->im_user = NULL; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
291 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
292 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
293 else if (swboard->conv == NULL) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
294 { |
| 11338 | 295 /* XXX - I think this should probably be GAIM_CONV_TYPE_CHAT, but I'm hedging */ |
| 296 swboard->conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, | |
| 10246 | 297 user, account); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
298 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
299 else |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
300 { |
| 10773 | 301 gaim_debug_warning("msn", "switchboard_add_user: This should not happen!\n"); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
302 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
303 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
304 |
|
12323
fc464a0abccc
[gaim-migrate @ 14627]
Richard Laager <rlaager@wiktel.com>
parents:
12236
diff
changeset
|
305 static GaimConversation * |
| 10225 | 306 msn_switchboard_get_conv(MsnSwitchBoard *swboard) |
| 307 { | |
| 308 GaimAccount *account; | |
| 309 | |
| 310 g_return_val_if_fail(swboard != NULL, NULL); | |
| 311 | |
| 312 if (swboard->conv != NULL) | |
| 313 return swboard->conv; | |
| 314 | |
| 10346 | 315 gaim_debug_error("msn", "Switchboard with unassigned conversation\n"); |
| 10345 | 316 |
| 10225 | 317 account = swboard->session->account; |
| 318 | |
| 11338 | 319 /* XXX - I think this should probably be GAIM_CONV_TYPE_IM, but I'm hedging */ |
| 320 return gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, | |
| 10246 | 321 swboard->im_user, account); |
| 10225 | 322 } |
| 323 | |
|
12323
fc464a0abccc
[gaim-migrate @ 14627]
Richard Laager <rlaager@wiktel.com>
parents:
12236
diff
changeset
|
324 static void |
| 10225 | 325 msn_switchboard_report_user(MsnSwitchBoard *swboard, GaimMessageFlags flags, const char *msg) |
| 326 { | |
| 327 GaimConversation *conv; | |
| 328 | |
| 329 g_return_if_fail(swboard != NULL); | |
| 330 g_return_if_fail(msg != NULL); | |
| 331 | |
| 332 if ((conv = msn_switchboard_get_conv(swboard)) != NULL) | |
| 333 { | |
| 334 gaim_conversation_write(conv, NULL, msg, flags, time(NULL)); | |
| 335 } | |
| 336 } | |
| 337 | |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
338 static void |
| 10345 | 339 swboard_error_helper(MsnSwitchBoard *swboard, int reason, const char *passport) |
| 340 { | |
| 10451 | 341 g_return_if_fail(swboard != NULL); |
| 342 | |
| 13125 | 343 gaim_debug_warning("msg", "Error: Unable to call the user %s for reason %i\n", passport, reason); |
| 10345 | 344 |
| 10533 | 345 /* TODO: if current_users > 0, this is probably a chat and an invite failed, |
| 346 * we should report that in the chat or something */ | |
| 347 if (swboard->current_users == 0) | |
| 10345 | 348 { |
| 349 swboard->error = reason; | |
| 10463 | 350 msn_switchboard_close(swboard); |
| 10345 | 351 } |
| 352 } | |
| 353 | |
| 354 static void | |
| 355 cal_error_helper(MsnTransaction *trans, int reason) | |
| 356 { | |
| 357 MsnSwitchBoard *swboard; | |
| 358 const char *passport; | |
| 359 char **params; | |
| 360 | |
| 361 params = g_strsplit(trans->params, " ", 0); | |
| 362 | |
| 363 passport = params[0]; | |
| 364 | |
| 365 swboard = trans->data; | |
| 366 | |
| 13125 | 367 gaim_debug_warning("msn", "cal_error_helper: command %s failed for reason %i\n",trans->command,reason); |
| 368 | |
| 10345 | 369 swboard_error_helper(swboard, reason, passport); |
| 370 | |
| 371 g_strfreev(params); | |
| 372 } | |
| 373 | |
| 374 static void | |
| 375 msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, MsnMsgErrorType error) | |
| 376 { | |
| 10403 | 377 MsnSwitchBoard *swboard; |
| 378 | |
| 10345 | 379 g_return_if_fail(cmdproc != NULL); |
| 380 g_return_if_fail(msg != NULL); | |
| 381 | |
| 10403 | 382 if ((error != MSN_MSG_ERROR_SB) && (msg->nak_cb != NULL)) |
| 10345 | 383 msg->nak_cb(msg, msg->ack_data); |
| 384 | |
| 10463 | 385 swboard = cmdproc->data; |
| 10403 | 386 |
| 10773 | 387 /* This is not good, and should be fixed somewhere else. */ |
| 388 g_return_if_fail(swboard != NULL); | |
| 389 | |
| 10345 | 390 if (msg->type == MSN_MSG_TEXT) |
| 391 { | |
| 10504 | 392 const char *format, *str_reason; |
| 10346 | 393 char *body_str, *body_enc, *pre, *post; |
| 10345 | 394 |
| 395 #if 0 | |
| 396 if (swboard->conv == NULL) | |
| 397 { | |
| 10346 | 398 if (msg->ack_ref) |
| 10403 | 399 msn_message_unref(msg); |
| 10346 | 400 |
| 10345 | 401 return; |
| 402 } | |
| 403 #endif | |
| 404 | |
| 10346 | 405 if (error == MSN_MSG_ERROR_TIMEOUT) |
| 10345 | 406 { |
| 407 str_reason = _("Message may have not been sent " | |
| 10451 | 408 "because a timeout occurred:"); |
| 10345 | 409 } |
| 10346 | 410 else if (error == MSN_MSG_ERROR_SB) |
| 10345 | 411 { |
| 412 switch (swboard->error) | |
| 413 { | |
| 414 case MSN_SB_ERROR_OFFLINE: | |
| 415 str_reason = _("Message could not be sent, " | |
| 10346 | 416 "not allowed while invisible:"); |
| 10345 | 417 break; |
| 418 case MSN_SB_ERROR_USER_OFFLINE: | |
| 419 str_reason = _("Message could not be sent " | |
| 10346 | 420 "because the user is offline:"); |
| 10345 | 421 break; |
| 422 case MSN_SB_ERROR_CONNECTION: | |
| 423 str_reason = _("Message could not be sent " | |
| 10391 | 424 "because a connection error occurred:"); |
| 10345 | 425 break; |
| 13125 | 426 case MSN_SB_ERROR_TOO_FAST: |
| 427 str_reason = _("Message could not be sent " | |
| 428 "because we are sending too quickly:"); | |
| 429 break; | |
| 10345 | 430 default: |
| 431 str_reason = _("Message could not be sent " | |
| 432 "because an error with " | |
| 10391 | 433 "the switchboard occurred:"); |
| 10345 | 434 break; |
| 435 } | |
| 436 } | |
| 437 else | |
| 438 { | |
| 439 str_reason = _("Message may have not been sent " | |
| 10391 | 440 "because an unknown error occurred:"); |
| 10345 | 441 } |
| 442 | |
| 10346 | 443 body_str = msn_message_to_string(msg); |
|
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10621
diff
changeset
|
444 body_enc = g_markup_escape_text(body_str, -1); |
| 10346 | 445 g_free(body_str); |
| 446 | |
| 447 format = msn_message_get_attr(msg, "X-MMS-IM-Format"); | |
| 448 msn_parse_format(format, &pre, &post); | |
| 10568 | 449 body_str = g_strdup_printf("%s%s%s", pre ? pre : "", |
| 450 body_enc ? body_enc : "", post ? post : ""); | |
| 10346 | 451 g_free(body_enc); |
| 452 g_free(pre); | |
| 453 g_free(post); | |
| 10345 | 454 |
| 10403 | 455 msn_switchboard_report_user(swboard, GAIM_MESSAGE_ERROR, |
| 456 str_reason); | |
| 457 msn_switchboard_report_user(swboard, GAIM_MESSAGE_RAW, | |
| 458 body_str); | |
| 10345 | 459 |
| 10346 | 460 g_free(body_str); |
| 10345 | 461 } |
| 462 | |
| 10403 | 463 /* If a timeout occures we will want the msg around just in case we |
| 464 * receive the ACK after the timeout. */ | |
| 465 if (msg->ack_ref && error != MSN_MSG_ERROR_TIMEOUT) | |
| 466 { | |
| 467 swboard->ack_list = g_list_remove(swboard->ack_list, msg); | |
| 10346 | 468 msn_message_unref(msg); |
| 10403 | 469 } |
| 10345 | 470 } |
| 471 | |
| 472 /************************************************************************** | |
| 10481 | 473 * Message Stuff |
| 474 **************************************************************************/ | |
| 475 | |
| 476 /** Called when a message times out. */ | |
| 477 static void | |
| 478 msg_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans) | |
| 479 { | |
| 480 MsnMessage *msg; | |
| 481 | |
| 482 msg = trans->data; | |
| 483 | |
| 484 msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_TIMEOUT); | |
| 485 } | |
| 486 | |
| 487 /** Called when we receive an error of a message. */ | |
| 488 static void | |
| 489 msg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) | |
| 490 { | |
| 491 msg_error_helper(cmdproc, trans->data, MSN_MSG_ERROR_UNKNOWN); | |
| 492 } | |
| 493 | |
| 494 #if 0 | |
| 495 /** Called when we receive an ack of a special message. */ | |
| 496 static void | |
| 497 msg_ack(MsnCmdProc *cmdproc, MsnCommand *cmd) | |
| 498 { | |
| 499 MsnMessage *msg; | |
| 500 | |
| 501 msg = cmd->trans->data; | |
| 502 | |
| 503 if (msg->ack_cb != NULL) | |
| 504 msg->ack_cb(msg->ack_data); | |
| 505 | |
| 506 msn_message_unref(msg); | |
| 507 } | |
| 508 | |
| 509 /** Called when we receive a nak of a special message. */ | |
| 510 static void | |
| 511 msg_nak(MsnCmdProc *cmdproc, MsnCommand *cmd) | |
| 512 { | |
| 513 MsnMessage *msg; | |
| 514 | |
| 515 msg = cmd->trans->data; | |
| 516 | |
| 517 msn_message_unref(msg); | |
| 518 } | |
| 519 #endif | |
| 520 | |
| 521 static void | |
| 522 release_msg(MsnSwitchBoard *swboard, MsnMessage *msg) | |
| 523 { | |
| 524 MsnCmdProc *cmdproc; | |
| 525 MsnTransaction *trans; | |
| 526 char *payload; | |
| 527 gsize payload_len; | |
| 528 | |
| 529 g_return_if_fail(swboard != NULL); | |
| 530 g_return_if_fail(msg != NULL); | |
| 531 | |
| 532 cmdproc = swboard->cmdproc; | |
| 533 | |
| 534 payload = msn_message_gen_payload(msg, &payload_len); | |
| 535 | |
| 11321 | 536 #ifdef MSN_DEBUG_SB |
| 537 msn_message_show_readable(msg, "SB SEND", FALSE); | |
| 538 #endif | |
| 10481 | 539 |
| 540 trans = msn_transaction_new(cmdproc, "MSG", "%c %d", | |
| 541 msn_message_get_flag(msg), payload_len); | |
| 542 | |
| 543 /* Data for callbacks */ | |
| 544 msn_transaction_set_data(trans, msg); | |
| 545 | |
| 546 if (msg->type == MSN_MSG_TEXT) | |
| 547 { | |
| 548 msg->ack_ref = TRUE; | |
| 549 msn_message_ref(msg); | |
| 550 swboard->ack_list = g_list_append(swboard->ack_list, msg); | |
| 551 msn_transaction_set_timeout_cb(trans, msg_timeout); | |
| 552 } | |
| 553 else if (msg->type == MSN_MSG_SLP) | |
| 554 { | |
| 555 msg->ack_ref = TRUE; | |
| 556 msn_message_ref(msg); | |
| 557 swboard->ack_list = g_list_append(swboard->ack_list, msg); | |
| 558 msn_transaction_set_timeout_cb(trans, msg_timeout); | |
| 559 #if 0 | |
| 560 if (msg->ack_cb != NULL) | |
| 561 { | |
| 562 msn_transaction_add_cb(trans, "ACK", msg_ack); | |
| 563 msn_transaction_add_cb(trans, "NAK", msg_nak); | |
| 564 } | |
| 565 #endif | |
| 566 } | |
| 567 | |
| 568 trans->payload = payload; | |
| 569 trans->payload_len = payload_len; | |
| 570 | |
| 571 msg->trans = trans; | |
| 572 | |
| 573 msn_cmdproc_send_trans(cmdproc, trans); | |
| 574 } | |
| 575 | |
| 576 static void | |
| 577 queue_msg(MsnSwitchBoard *swboard, MsnMessage *msg) | |
| 578 { | |
| 579 g_return_if_fail(swboard != NULL); | |
| 580 g_return_if_fail(msg != NULL); | |
| 581 | |
| 582 gaim_debug_info("msn", "Appending message to queue.\n"); | |
| 583 | |
| 584 g_queue_push_tail(swboard->msg_queue, msg); | |
| 585 | |
| 586 msn_message_ref(msg); | |
| 587 } | |
| 588 | |
| 589 static void | |
| 590 process_queue(MsnSwitchBoard *swboard) | |
| 591 { | |
| 592 MsnMessage *msg; | |
| 593 | |
| 594 g_return_if_fail(swboard != NULL); | |
| 595 | |
| 596 gaim_debug_info("msn", "Processing queue\n"); | |
| 597 | |
| 598 while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL) | |
| 599 { | |
| 600 gaim_debug_info("msn", "Sending message\n"); | |
| 601 release_msg(swboard, msg); | |
| 602 msn_message_unref(msg); | |
| 603 } | |
| 604 } | |
| 605 | |
| 606 gboolean | |
| 607 msn_switchboard_can_send(MsnSwitchBoard *swboard) | |
| 608 { | |
| 609 g_return_val_if_fail(swboard != NULL, FALSE); | |
| 610 | |
| 611 if (swboard->empty || !g_queue_is_empty(swboard->msg_queue)) | |
| 612 return FALSE; | |
| 613 | |
| 614 return TRUE; | |
| 615 } | |
| 616 | |
| 617 void | |
| 618 msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg, | |
| 619 gboolean queue) | |
| 620 { | |
| 621 g_return_if_fail(swboard != NULL); | |
| 622 g_return_if_fail(msg != NULL); | |
| 623 | |
| 624 if (msn_switchboard_can_send(swboard)) | |
| 625 release_msg(swboard, msg); | |
| 626 else if (queue) | |
| 627 queue_msg(swboard, msg); | |
| 628 } | |
| 629 | |
| 630 /************************************************************************** | |
| 10345 | 631 * Switchboard Commands |
| 632 **************************************************************************/ | |
| 10481 | 633 |
| 10345 | 634 static void |
| 635 ans_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) | |
| 636 { | |
| 637 MsnSwitchBoard *swboard; | |
| 638 | |
| 10463 | 639 swboard = cmdproc->data; |
| 10345 | 640 swboard->ready = TRUE; |
| 641 } | |
| 642 | |
| 643 static void | |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
644 bye_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
645 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
646 MsnSwitchBoard *swboard; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
647 const char *user; |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
648 |
| 10463 | 649 swboard = cmdproc->data; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
650 user = cmd->params[0]; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
651 |
| 11321 | 652 if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) |
| 10773 | 653 gaim_debug_error("msn_switchboard", "bye_cmd: helper bug\n"); |
| 654 | |
| 10345 | 655 if (swboard->conv == NULL) |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
656 { |
| 10345 | 657 /* This is a helper switchboard */ |
| 10434 | 658 msn_switchboard_destroy(swboard); |
| 10345 | 659 } |
| 10533 | 660 else if ((swboard->current_users > 1) || |
| 11338 | 661 (gaim_conversation_get_type(swboard->conv) == GAIM_CONV_TYPE_CHAT)) |
| 10345 | 662 { |
| 663 /* This is a switchboard used for a chat */ | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
664 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(swboard->conv), user, NULL); |
| 10533 | 665 swboard->current_users--; |
| 666 if (swboard->current_users == 0) | |
| 667 msn_switchboard_destroy(swboard); | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
668 } |
|
8372
bd16ed85cfc2
[gaim-migrate @ 9099]
Christian Hammond <chipx86@chipx86.com>
parents:
8207
diff
changeset
|
669 else |
|
bd16ed85cfc2
[gaim-migrate @ 9099]
Christian Hammond <chipx86@chipx86.com>
parents:
8207
diff
changeset
|
670 { |
| 10345 | 671 /* This is a switchboard used for a im session */ |
| 10434 | 672 msn_switchboard_destroy(swboard); |
| 4542 | 673 } |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
674 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
675 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
676 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
677 iro_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
678 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
679 GaimAccount *account; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
680 GaimConnection *gc; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
681 MsnSwitchBoard *swboard; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
682 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
683 account = cmdproc->session->account; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
684 gc = account->gc; |
| 10463 | 685 swboard = cmdproc->data; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
686 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
687 swboard->total_users = atoi(cmd->params[2]); |
|
6026
01dd6b652c22
[gaim-migrate @ 6476]
Christian Hammond <chipx86@chipx86.com>
parents:
6025
diff
changeset
|
688 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
689 msn_switchboard_add_user(swboard, cmd->params[3]); |
| 4542 | 690 } |
| 691 | |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
692 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
693 joi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
| 4542 | 694 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
695 MsnSession *session; |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
696 GaimAccount *account; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
697 GaimConnection *gc; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
698 MsnSwitchBoard *swboard; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
699 const char *passport; |
| 4542 | 700 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
701 passport = cmd->params[0]; |
| 4542 | 702 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
703 session = cmdproc->session; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
704 account = session->account; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
705 gc = account->gc; |
| 10463 | 706 swboard = cmdproc->data; |
|
6026
01dd6b652c22
[gaim-migrate @ 6476]
Christian Hammond <chipx86@chipx86.com>
parents:
6025
diff
changeset
|
707 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
708 msn_switchboard_add_user(swboard, passport); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
709 |
| 10481 | 710 process_queue(swboard); |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9194
diff
changeset
|
711 |
| 10463 | 712 if (!session->http_method) |
| 713 send_clientcaps(swboard); | |
| 10403 | 714 |
| 715 if (swboard->closed) | |
| 716 msn_switchboard_close(swboard); | |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
717 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
718 |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
719 static void |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
720 msg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len) |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
721 { |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
722 MsnMessage *msg; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
723 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
724 msg = msn_message_new_from_cmd(cmdproc->session, cmd); |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
725 |
|
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
726 msn_message_parse_payload(msg, payload, len); |
| 11321 | 727 #ifdef MSN_DEBUG_SB |
| 728 msn_message_show_readable(msg, "SB RECV", FALSE); | |
| 729 #endif | |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
730 |
| 10284 | 731 if (msg->remote_user != NULL) |
| 732 g_free (msg->remote_user); | |
| 733 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
734 msg->remote_user = g_strdup(cmd->params[0]); |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
735 msn_cmdproc_process_msg(cmdproc, msg); |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
736 |
|
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
737 msn_message_destroy(msg); |
|
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
738 } |
|
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
739 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
740 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
741 msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
742 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
743 cmdproc->servconn->payload_len = atoi(cmd->params[2]); |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
744 cmdproc->last_cmd->payload_cb = msg_cmd_post; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
745 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
746 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
747 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
748 nak_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
749 { |
| 10345 | 750 MsnMessage *msg; |
| 751 | |
| 752 msg = cmd->trans->data; | |
| 753 g_return_if_fail(msg != NULL); | |
| 754 | |
| 755 msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_NAK); | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
756 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
757 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
758 static void |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
759 ack_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
760 { |
| 10403 | 761 MsnSwitchBoard *swboard; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
762 MsnMessage *msg; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
763 |
| 10345 | 764 msg = cmd->trans->data; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
765 |
| 10345 | 766 if (msg->ack_cb != NULL) |
| 767 msg->ack_cb(msg, msg->ack_data); | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
768 |
| 10463 | 769 swboard = cmdproc->data; |
| 10403 | 770 swboard->ack_list = g_list_remove(swboard->ack_list, msg); |
| 10345 | 771 msn_message_unref(msg); |
| 4542 | 772 } |
| 773 | |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
774 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
775 out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
776 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
777 GaimConnection *gc; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
778 MsnSwitchBoard *swboard; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
779 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
780 gc = cmdproc->session->account->gc; |
| 10463 | 781 swboard = cmdproc->data; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
782 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
783 if (swboard->current_users > 1) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
784 serv_got_chat_left(gc, swboard->chat_id); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
785 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
786 msn_switchboard_disconnect(swboard); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
787 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
788 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
789 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
790 usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) |
| 4542 | 791 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
792 MsnSwitchBoard *swboard; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
793 |
| 10463 | 794 swboard = cmdproc->data; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
795 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
796 #if 0 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
797 GList *l; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
798 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
799 for (l = swboard->users; l != NULL; l = l->next) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
800 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
801 const char *user; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
802 user = l->data; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
803 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
804 msn_cmdproc_send(cmdproc, "CAL", "%s", user); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
805 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
806 #endif |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
807 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
808 swboard->ready = TRUE; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
809 msn_cmdproc_process_queue(cmdproc); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
810 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
811 |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
812 /************************************************************************** |
| 10345 | 813 * Message Handlers |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
814 **************************************************************************/ |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
815 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
816 plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
817 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
818 GaimConnection *gc; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
819 MsnSwitchBoard *swboard; |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
820 const char *body; |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
821 char *body_str; |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
822 char *body_enc; |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
823 char *body_final; |
| 10112 | 824 size_t body_len; |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
825 const char *passport; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
826 const char *value; |
| 4542 | 827 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
828 gc = cmdproc->session->account->gc; |
| 10463 | 829 swboard = cmdproc->data; |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
830 |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
831 body = msn_message_get_bin_data(msg, &body_len); |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
832 body_str = g_strndup(body, body_len); |
|
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10621
diff
changeset
|
833 body_enc = g_markup_escape_text(body_str, -1); |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
834 g_free(body_str); |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
835 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
836 passport = msg->remote_user; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
837 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
838 if (!strcmp(passport, "messenger@microsoft.com") && |
|
6668
7e8a70c531a7
[gaim-migrate @ 7193]
Christian Hammond <chipx86@chipx86.com>
parents:
6640
diff
changeset
|
839 strstr(body, "immediate security update")) |
|
7e8a70c531a7
[gaim-migrate @ 7193]
Christian Hammond <chipx86@chipx86.com>
parents:
6640
diff
changeset
|
840 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
841 return; |
|
6668
7e8a70c531a7
[gaim-migrate @ 7193]
Christian Hammond <chipx86@chipx86.com>
parents:
6640
diff
changeset
|
842 } |
|
7e8a70c531a7
[gaim-migrate @ 7193]
Christian Hammond <chipx86@chipx86.com>
parents:
6640
diff
changeset
|
843 |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
844 #if 0 |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
845 if ((value = msn_message_get_attr(msg, "User-Agent")) != NULL) |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
846 { |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
847 gaim_debug_misc("msn", "User-Agent = '%s'\n", value); |
| 4542 | 848 } |
|
8646
1e211dde3cae
[gaim-migrate @ 9398]
Christian Hammond <chipx86@chipx86.com>
parents:
8583
diff
changeset
|
849 #endif |
| 4542 | 850 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
851 if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
852 { |
| 10568 | 853 char *pre, *post; |
|
6358
8ba58b296cc1
[gaim-migrate @ 6862]
Christian Hammond <chipx86@chipx86.com>
parents:
6148
diff
changeset
|
854 |
| 10568 | 855 msn_parse_format(value, &pre, &post); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
856 |
| 10568 | 857 body_final = g_strdup_printf("%s%s%s", pre ? pre : "", |
| 858 body_enc ? body_enc : "", post ? post : ""); | |
|
6358
8ba58b296cc1
[gaim-migrate @ 6862]
Christian Hammond <chipx86@chipx86.com>
parents:
6148
diff
changeset
|
859 |
| 10568 | 860 g_free(pre); |
| 861 g_free(post); | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
862 g_free(body_enc); |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
863 } |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
864 else |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
865 { |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
866 body_final = body_enc; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
867 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
868 |
| 10773 | 869 swboard->flag |= MSN_SB_FLAG_IM; |
| 870 | |
| 10533 | 871 if (swboard->current_users > 1 || |
| 872 ((swboard->conv != NULL) && | |
| 11338 | 873 gaim_conversation_get_type(swboard->conv) == GAIM_CONV_TYPE_CHAT)) |
|
8499
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8442
diff
changeset
|
874 { |
| 10773 | 875 /* If current_users is always ok as it should then there is no need to |
| 876 * check if this is a chat. */ | |
| 877 if (swboard->current_users <= 1) | |
| 878 gaim_debug_misc("msn", "plain_msg: current_users(%d)\n", | |
| 879 swboard->current_users); | |
| 880 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
881 serv_got_chat_in(gc, swboard->chat_id, passport, 0, body_final, |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
882 time(NULL)); |
| 10533 | 883 if (swboard->conv == NULL) |
| 10773 | 884 { |
| 10533 | 885 swboard->conv = gaim_find_chat(gc, swboard->chat_id); |
| 10773 | 886 swboard->flag |= MSN_SB_FLAG_IM; |
| 887 } | |
|
8499
467b01d02f9c
[gaim-migrate @ 9235]
Christian Hammond <chipx86@chipx86.com>
parents:
8442
diff
changeset
|
888 } |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
889 else |
| 10533 | 890 { |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
891 serv_got_im(gc, passport, body_final, 0, time(NULL)); |
| 10533 | 892 if (swboard->conv == NULL) |
| 10773 | 893 { |
| 11338 | 894 swboard->conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
| 10533 | 895 passport, gaim_connection_get_account(gc)); |
| 10773 | 896 swboard->flag |= MSN_SB_FLAG_IM; |
| 897 } | |
| 10533 | 898 } |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
899 |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
900 g_free(body_final); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
901 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
902 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
903 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
904 control_msg(MsnCmdProc *cmdproc, MsnMessage *msg) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
905 { |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
906 GaimConnection *gc; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
907 MsnSwitchBoard *swboard; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
908 const char *value; |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
909 char *passport; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
910 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
911 gc = cmdproc->session->account->gc; |
| 10463 | 912 swboard = cmdproc->data; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
913 passport = msg->remote_user; |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
914 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
915 if (swboard->current_users == 1 && |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
916 (value = msn_message_get_attr(msg, "TypingUser")) != NULL) |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
917 { |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
918 serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT, |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5793
diff
changeset
|
919 GAIM_TYPING); |
| 4542 | 920 } |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
921 } |
| 4542 | 922 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
923 static void |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
924 clientcaps_msg(MsnCmdProc *cmdproc, MsnMessage *msg) |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
925 { |
|
6845
5de4d9a4e0e2
[gaim-migrate @ 7390]
Christian Hammond <chipx86@chipx86.com>
parents:
6842
diff
changeset
|
926 #if 0 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
927 MsnSession *session; |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
928 MsnSwitchBoard *swboard; |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
929 MsnUser *user; |
|
5475
ad9887c91a59
[gaim-migrate @ 5871]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
930 GHashTable *clientcaps; |
|
5351
2aa7e4237142
[gaim-migrate @ 5727]
Christian Hammond <chipx86@chipx86.com>
parents:
5342
diff
changeset
|
931 const char *value; |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
932 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
933 char *passport = msg->sender; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
934 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
935 session = cmdproc->session; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
936 swboard = cmdproc->servconn->swboard; |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
937 |
|
5475
ad9887c91a59
[gaim-migrate @ 5871]
Christian Hammond <chipx86@chipx86.com>
parents:
5454
diff
changeset
|
938 clientcaps = msn_message_get_hashtable_from_body(msg); |
|
6845
5de4d9a4e0e2
[gaim-migrate @ 7390]
Christian Hammond <chipx86@chipx86.com>
parents:
6842
diff
changeset
|
939 #endif |
|
5316
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
940 } |
|
d5690ed70085
[gaim-migrate @ 5688]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
941 |
| 11897 | 942 static void |
| 11321 | 943 nudge_msg(MsnCmdProc *cmdproc, MsnMessage *msg) |
| 944 { | |
| 945 MsnSwitchBoard *swboard; | |
| 946 char *username, *str; | |
| 947 GaimAccount *account; | |
| 948 GaimBuddy *buddy; | |
| 949 const char *user; | |
| 950 | |
| 951 swboard = cmdproc->data; | |
| 952 account = cmdproc->session->account; | |
| 953 user = msg->remote_user; | |
| 954 | |
| 955 if ((buddy = gaim_find_buddy(account, user)) != NULL) | |
| 956 username = g_markup_escape_text(gaim_buddy_get_alias(buddy), -1); | |
| 957 else | |
| 958 username = g_markup_escape_text(user, -1); | |
| 959 | |
| 960 str = g_strdup_printf(_("%s just sent you a Nudge!"), username); | |
| 961 g_free(username); | |
| 962 msn_switchboard_report_user(swboard, GAIM_MESSAGE_SYSTEM, str); | |
| 963 g_free(str); | |
| 964 } | |
| 965 | |
| 10345 | 966 /************************************************************************** |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
967 * Connect stuff |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
968 **************************************************************************/ |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
969 static void |
|
8583
fc27237783ee
[gaim-migrate @ 9333]
Christian Hammond <chipx86@chipx86.com>
parents:
8499
diff
changeset
|
970 connect_cb(MsnServConn *servconn) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
971 { |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
972 MsnSwitchBoard *swboard; |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
973 MsnCmdProc *cmdproc; |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
974 GaimAccount *account; |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
975 |
|
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
976 cmdproc = servconn->cmdproc; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
977 g_return_if_fail(cmdproc != NULL); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
978 |
| 10463 | 979 account = cmdproc->session->account; |
| 980 swboard = cmdproc->data; | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
981 g_return_if_fail(swboard != NULL); |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
982 |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
983 if (msn_switchboard_is_invited(swboard)) |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
984 { |
| 10346 | 985 swboard->empty = FALSE; |
| 986 | |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
987 msn_cmdproc_send(cmdproc, "ANS", "%s %s %s", |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
988 gaim_account_get_username(account), |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
989 swboard->auth_key, swboard->session_id); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
990 } |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
991 else |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
992 { |
|
9158
c30d81b4dd22
[gaim-migrate @ 9942]
Christian Hammond <chipx86@chipx86.com>
parents:
9083
diff
changeset
|
993 msn_cmdproc_send(cmdproc, "USR", "%s %s", |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
994 gaim_account_get_username(account), |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
995 swboard->auth_key); |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
996 } |
| 4542 | 997 } |
| 998 | |
| 999 static void | |
|
8583
fc27237783ee
[gaim-migrate @ 9333]
Christian Hammond <chipx86@chipx86.com>
parents:
8499
diff
changeset
|
1000 disconnect_cb(MsnServConn *servconn) |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
1001 { |
|
8583
fc27237783ee
[gaim-migrate @ 9333]
Christian Hammond <chipx86@chipx86.com>
parents:
8499
diff
changeset
|
1002 MsnSwitchBoard *swboard; |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
1003 |
| 10463 | 1004 swboard = servconn->cmdproc->data; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1005 g_return_if_fail(swboard != NULL); |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
1006 |
| 10481 | 1007 msn_servconn_set_disconnect_cb(swboard->servconn, NULL); |
| 1008 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1009 msn_switchboard_destroy(swboard); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
1010 } |
|
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
1011 |
| 10345 | 1012 gboolean |
| 1013 msn_switchboard_connect(MsnSwitchBoard *swboard, const char *host, int port) | |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
1014 { |
| 10345 | 1015 g_return_val_if_fail(swboard != NULL, FALSE); |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
1016 |
| 10345 | 1017 msn_servconn_set_connect_cb(swboard->servconn, connect_cb); |
| 10434 | 1018 msn_servconn_set_disconnect_cb(swboard->servconn, disconnect_cb); |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9194
diff
changeset
|
1019 |
| 10345 | 1020 return msn_servconn_connect(swboard->servconn, host, port); |
|
8808
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
1021 } |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
1022 |
|
bbd8cdaf0ad5
[gaim-migrate @ 9570]
Christian Hammond <chipx86@chipx86.com>
parents:
8663
diff
changeset
|
1023 void |
| 10345 | 1024 msn_switchboard_disconnect(MsnSwitchBoard *swboard) |
| 4542 | 1025 { |
| 10345 | 1026 g_return_if_fail(swboard != NULL); |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
1027 |
| 10345 | 1028 msn_servconn_disconnect(swboard->servconn); |
| 4542 | 1029 } |
| 1030 | |
| 10345 | 1031 /************************************************************************** |
| 1032 * Call stuff | |
| 1033 **************************************************************************/ | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1034 static void |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1035 got_cal(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1036 { |
| 10403 | 1037 #if 0 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1038 MsnSwitchBoard *swboard; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1039 const char *user; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1040 |
| 10463 | 1041 swboard = cmdproc->data; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1042 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1043 user = cmd->params[0]; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1044 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1045 msn_switchboard_add_user(swboard, user); |
| 10403 | 1046 #endif |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1047 } |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1048 |
| 10225 | 1049 static void |
| 1050 cal_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans) | |
| 1051 { | |
| 13125 | 1052 gaim_debug_warning("msn", "cal_timeout: command %s timed out\n", trans->command); |
| 1053 | |
| 10225 | 1054 cal_error_helper(trans, MSN_SB_ERROR_UNKNOWN); |
| 1055 } | |
| 1056 | |
| 1057 static void | |
| 1058 cal_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) | |
| 1059 { | |
| 1060 int reason = MSN_SB_ERROR_UNKNOWN; | |
| 1061 | |
| 10451 | 1062 if (error == 215) |
| 1063 { | |
| 1064 gaim_debug_info("msn", "Invited user already in switchboard\n"); | |
| 1065 return; | |
| 1066 } | |
| 1067 else if (error == 217) | |
| 1068 { | |
| 10225 | 1069 reason = MSN_SB_ERROR_USER_OFFLINE; |
| 10451 | 1070 } |
| 10225 | 1071 |
| 13125 | 1072 gaim_debug_warning("msn", "cal_error: command %s gave error %i\n", trans->command, error); |
| 1073 | |
| 10225 | 1074 cal_error_helper(trans, reason); |
| 1075 } | |
| 1076 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1077 void |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1078 msn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1079 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1080 MsnTransaction *trans; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1081 MsnCmdProc *cmdproc; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1082 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1083 g_return_if_fail(swboard != NULL); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1084 |
| 10463 | 1085 cmdproc = swboard->cmdproc; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1086 |
| 10225 | 1087 trans = msn_transaction_new(cmdproc, "CAL", "%s", user); |
| 10403 | 1088 /* this doesn't do anything, but users seem to think that |
| 1089 * 'Unhandled command' is some kind of error, so we don't report it */ | |
| 1090 msn_transaction_add_cb(trans, "CAL", got_cal); | |
| 10225 | 1091 |
| 1092 msn_transaction_set_data(trans, swboard); | |
| 1093 msn_transaction_set_timeout_cb(trans, cal_timeout); | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1094 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1095 if (swboard->ready) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1096 msn_cmdproc_send_trans(cmdproc, trans); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1097 else |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1098 msn_cmdproc_queue_trans(cmdproc, trans); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1099 } |
| 4542 | 1100 |
| 10345 | 1101 /************************************************************************** |
| 1102 * Create & Transfer stuff | |
| 1103 **************************************************************************/ | |
| 10481 | 1104 |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1105 static void |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1106 got_swboard(MsnCmdProc *cmdproc, MsnCommand *cmd) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1107 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1108 MsnSwitchBoard *swboard; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1109 char *host; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1110 int port; |
| 9218 | 1111 swboard = cmd->trans->data; |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1112 |
| 10403 | 1113 if (g_list_find(cmdproc->session->switches, swboard) == NULL) |
| 1114 /* The conversation window was closed. */ | |
| 1115 return; | |
| 1116 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1117 msn_switchboard_set_auth_key(swboard, cmd->params[4]); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1118 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1119 msn_parse_socket(cmd->params[2], &host, &port); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1120 |
| 10568 | 1121 if (!msn_switchboard_connect(swboard, host, port)) |
| 1122 msn_switchboard_destroy(swboard); | |
| 10093 | 1123 |
| 1124 g_free(host); | |
|
5309
e2e53316a21d
[gaim-migrate @ 5681]
Christian Hammond <chipx86@chipx86.com>
parents:
5221
diff
changeset
|
1125 } |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1126 |
| 10225 | 1127 static void |
| 1128 xfr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) | |
| 1129 { | |
| 1130 MsnSwitchBoard *swboard; | |
| 1131 int reason = MSN_SB_ERROR_UNKNOWN; | |
| 1132 | |
| 1133 if (error == 913) | |
| 1134 reason = MSN_SB_ERROR_OFFLINE; | |
| 13125 | 1135 else if (error == 800) |
| 1136 reason = MSN_SB_ERROR_TOO_FAST; | |
| 10225 | 1137 |
| 1138 swboard = trans->data; | |
| 1139 | |
| 13125 | 1140 gaim_debug_info("msn", "xfr_error %i for %s: trans %x, command %s, reason %i\n", |
| 1141 error, swboard->im_user, trans, trans->command, reason); | |
| 1142 | |
| 10225 | 1143 swboard_error_helper(swboard, reason, swboard->im_user); |
| 1144 } | |
| 1145 | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1146 void |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1147 msn_switchboard_request(MsnSwitchBoard *swboard) |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1148 { |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1149 MsnCmdProc *cmdproc; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1150 MsnTransaction *trans; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1151 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1152 g_return_if_fail(swboard != NULL); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1153 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1154 cmdproc = swboard->session->notification->cmdproc; |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1155 |
| 10225 | 1156 trans = msn_transaction_new(cmdproc, "XFR", "%s", "SB"); |
| 1157 msn_transaction_add_cb(trans, "XFR", got_swboard); | |
| 10403 | 1158 |
| 10225 | 1159 msn_transaction_set_data(trans, swboard); |
| 1160 msn_transaction_set_error_cb(trans, xfr_error); | |
|
9193
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1161 |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1162 msn_cmdproc_send_trans(cmdproc, trans); |
|
502707ca1836
[gaim-migrate @ 9988]
Christian Hammond <chipx86@chipx86.com>
parents:
9158
diff
changeset
|
1163 } |
| 10345 | 1164 |
| 10403 | 1165 void |
| 1166 msn_switchboard_close(MsnSwitchBoard *swboard) | |
| 1167 { | |
| 1168 g_return_if_fail(swboard != NULL); | |
| 1169 | |
| 10481 | 1170 if (swboard->error != MSN_SB_ERROR_NONE) |
| 1171 { | |
| 1172 msn_switchboard_destroy(swboard); | |
| 1173 } | |
| 1174 else if (g_queue_is_empty(swboard->msg_queue) || | |
| 1175 !swboard->session->connected) | |
| 10403 | 1176 { |
| 1177 MsnCmdProc *cmdproc; | |
| 10463 | 1178 cmdproc = swboard->cmdproc; |
| 10403 | 1179 msn_cmdproc_send_quick(cmdproc, "OUT", NULL, NULL); |
| 1180 | |
| 1181 msn_switchboard_destroy(swboard); | |
| 1182 } | |
| 1183 else | |
| 10481 | 1184 { |
| 10403 | 1185 swboard->closed = TRUE; |
| 10481 | 1186 } |
| 10403 | 1187 } |
| 1188 | |
| 10773 | 1189 gboolean |
| 1190 msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag) | |
| 1191 { | |
| 1192 g_return_val_if_fail(swboard != NULL, FALSE); | |
| 1193 | |
| 1194 swboard->flag &= ~flag; | |
| 1195 | |
| 1196 if (flag == MSN_SB_FLAG_IM) | |
| 1197 /* Forget any conversation that used to be associated with this | |
| 1198 * swboard. */ | |
| 1199 swboard->conv = NULL; | |
| 1200 | |
| 1201 if (swboard->flag == 0) | |
| 1202 { | |
| 1203 msn_switchboard_close(swboard); | |
| 1204 return TRUE; | |
| 1205 } | |
| 1206 | |
| 1207 return FALSE; | |
| 1208 } | |
| 1209 | |
| 10345 | 1210 /************************************************************************** |
| 1211 * Init stuff | |
| 1212 **************************************************************************/ | |
| 10481 | 1213 |
| 10345 | 1214 void |
| 1215 msn_switchboard_init(void) | |
| 1216 { | |
| 1217 cbs_table = msn_table_new(); | |
| 1218 | |
| 1219 msn_table_add_cmd(cbs_table, "ANS", "ANS", ans_cmd); | |
| 1220 msn_table_add_cmd(cbs_table, "ANS", "IRO", iro_cmd); | |
| 1221 | |
| 1222 msn_table_add_cmd(cbs_table, "MSG", "ACK", ack_cmd); | |
| 1223 msn_table_add_cmd(cbs_table, "MSG", "NAK", nak_cmd); | |
| 1224 | |
| 1225 msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); | |
| 1226 | |
| 1227 msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); | |
| 1228 msn_table_add_cmd(cbs_table, NULL, "JOI", joi_cmd); | |
| 1229 msn_table_add_cmd(cbs_table, NULL, "BYE", bye_cmd); | |
| 1230 msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); | |
| 1231 | |
| 1232 #if 0 | |
| 1233 /* They might skip the history */ | |
| 1234 msn_table_add_cmd(cbs_table, NULL, "ACK", NULL); | |
| 1235 #endif | |
| 1236 | |
| 1237 msn_table_add_error(cbs_table, "MSG", msg_error); | |
| 1238 msn_table_add_error(cbs_table, "CAL", cal_error); | |
| 1239 | |
| 1240 /* Register the message type callbacks. */ | |
| 1241 msn_table_add_msg_type(cbs_table, "text/plain", | |
| 1242 plain_msg); | |
| 1243 msn_table_add_msg_type(cbs_table, "text/x-msmsgscontrol", | |
| 1244 control_msg); | |
| 1245 msn_table_add_msg_type(cbs_table, "text/x-clientcaps", | |
| 1246 clientcaps_msg); | |
| 1247 msn_table_add_msg_type(cbs_table, "text/x-clientinfo", | |
| 1248 clientcaps_msg); | |
| 1249 msn_table_add_msg_type(cbs_table, "application/x-msnmsgrp2p", | |
| 1250 msn_p2p_msg); | |
| 1251 msn_table_add_msg_type(cbs_table, "text/x-mms-emoticon", | |
| 1252 msn_emoticon_msg); | |
| 11518 | 1253 msn_table_add_msg_type(cbs_table, "text/x-mms-animemoticon", |
| 1254 msn_emoticon_msg); | |
| 11321 | 1255 msn_table_add_msg_type(cbs_table, "text/x-msnmsgr-datacast", |
| 1256 nudge_msg); | |
| 10345 | 1257 #if 0 |
| 1258 msn_table_add_msg_type(cbs_table, "text/x-msmmsginvite", | |
| 1259 msn_invite_msg); | |
| 1260 #endif | |
| 1261 } | |
| 1262 | |
| 1263 void | |
| 1264 msn_switchboard_end(void) | |
| 1265 { | |
| 1266 msn_table_destroy(cbs_table); | |
| 1267 } |
