Mercurial > pidgin.yaz
comparison libpurple/protocols/msn/oim.c @ 20539:2c8c6d77f12c
Make use of the GQueue in MsnSoapConn to manage the SOAP requests, allowing them to work perfectly even when dispatching multiple requests at once.
Delete a user from the userlist after the contact is deleted from the server.
author | Carlos Silva <typ0@pidgin.im> |
---|---|
date | Wed, 19 Sep 2007 06:08:42 +0000 |
parents | 905891855710 |
children | 48ee7ec3426d |
comparison
equal
deleted
inserted
replaced
20525:5bef3197383a | 20539:2c8c6d77f12c |
---|---|
29 #include "msnutils.h" | 29 #include "msnutils.h" |
30 | 30 |
31 /*Local Function Prototype*/ | 31 /*Local Function Prototype*/ |
32 static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid); | 32 static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid); |
33 static MsnOimSendReq *msn_oim_new_send_req(const char *from_member, | 33 static MsnOimSendReq *msn_oim_new_send_req(const char *from_member, |
34 const char *friendname, | 34 const char *friendname, |
35 const char* to_member, | 35 const char* to_member, |
36 gint send_seq, | 36 gint send_seq, |
37 const char *msg); | 37 const char *msg); |
38 static void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn); | 38 static void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn); |
39 static void msn_oim_send_connect_init(MsnSoapConn *soapconn); | 39 static void msn_oim_send_connect_init(MsnSoapConn *soapconn); |
40 static void msn_oim_free_send_req(MsnOimSendReq *req); | 40 static void msn_oim_free_send_req(MsnOimSendReq *req); |
41 static void msn_oim_report_to_user(MsnOim *oim, const char *msg_str); | 41 static void msn_oim_report_to_user(MsnOim *oim, const char *msg_str); |
42 static void msn_oim_get_process(MsnOim *oim, const char *oim_msg); | 42 static void msn_oim_get_process(MsnOim *oim, const char *oim_msg); |
118 static char * | 118 static char * |
119 msn_oim_msg_to_str(MsnOim *oim, const char *body) | 119 msn_oim_msg_to_str(MsnOim *oim, const char *body) |
120 { | 120 { |
121 char *oim_body,*oim_base64; | 121 char *oim_body,*oim_base64; |
122 | 122 |
123 purple_debug_info("MSNP14","encode OIM Message...\n"); | 123 purple_debug_info("MSN OIM","encode OIM Message...\n"); |
124 oim_base64 = purple_base64_encode((const guchar *)body, strlen(body)); | 124 oim_base64 = purple_base64_encode((const guchar *)body, strlen(body)); |
125 purple_debug_info("MSNP14","encoded base64 body:{%s}\n",oim_base64); | 125 purple_debug_info("MSN OIM","encoded base64 body:{%s}\n",oim_base64); |
126 oim_body = g_strdup_printf(MSN_OIM_MSG_TEMPLATE, | 126 oim_body = g_strdup_printf(MSN_OIM_MSG_TEMPLATE, |
127 oim->run_id,oim->send_seq,oim_base64); | 127 oim->run_id,oim->send_seq,oim_base64); |
128 | 128 |
129 return oim_body; | 129 return oim_body; |
130 } | 130 } |
131 | 131 |
132 /*oim SOAP server login error*/ | 132 /*oim SOAP server login error*/ |
133 static void | 133 static void |
134 msn_oim_send_error_cb(PurpleSslConnection *gsc, PurpleSslErrorType error, void *data) | 134 msn_oim_send_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error) |
135 { | 135 { |
136 MsnSoapConn *soapconn = data; | |
137 MsnSession *session; | 136 MsnSession *session; |
138 | 137 |
139 session = soapconn->session; | 138 session = soapconn->session; |
140 g_return_if_fail(session != NULL); | 139 g_return_if_fail(session != NULL); |
141 | 140 |
142 msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); | 141 msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); |
143 } | 142 } |
144 | 143 |
145 /*msn oim SOAP server connect process*/ | 144 /*msn oim SOAP server connect process*/ |
146 static void | 145 static gboolean |
147 msn_oim_send_connect_cb(gpointer data, PurpleSslConnection *gsc, | 146 msn_oim_send_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc) |
148 PurpleInputCondition cond) | 147 { |
149 { | |
150 MsnSoapConn *soapconn = data; | |
151 MsnSession * session; | 148 MsnSession * session; |
152 MsnOim *oim; | 149 MsnOim *oim; |
153 | 150 |
154 oim = soapconn->parent; | 151 oim = soapconn->parent; |
155 g_return_if_fail(oim != NULL); | 152 g_return_val_if_fail(oim != NULL, TRUE); |
156 | 153 |
157 session = oim->session; | 154 session = oim->session; |
158 g_return_if_fail(session != NULL); | 155 g_return_val_if_fail(session != NULL, FALSE); |
156 | |
157 return TRUE; | |
159 } | 158 } |
160 | 159 |
161 /* | 160 /* |
162 * Process the send return SOAP string | 161 * Process the send return SOAP string |
163 * If got SOAP Fault,get the lock key,and resend it. | 162 * If got SOAP Fault,get the lock key,and resend it. |
176 faultNode = xmlnode_get_child(bodyNode,"Fault"); | 175 faultNode = xmlnode_get_child(bodyNode,"Fault"); |
177 if(faultNode == NULL){ | 176 if(faultNode == NULL){ |
178 /*Send OK! return*/ | 177 /*Send OK! return*/ |
179 MsnOimSendReq *request; | 178 MsnOimSendReq *request; |
180 | 179 |
181 purple_debug_info("MSNP14","send OIM OK!"); | 180 purple_debug_info("MSN OIM","send OIM OK!"); |
182 xmlnode_free(responseNode); | 181 xmlnode_free(responseNode); |
183 request = g_queue_pop_head(oim->send_queue); | 182 request = g_queue_pop_head(oim->send_queue); |
184 msn_oim_free_send_req(request); | 183 msn_oim_free_send_req(request); |
185 /*send next buffered Offline Message*/ | 184 /*send next buffered Offline Message*/ |
186 msn_soap_post(oim->sendconn,NULL,msn_oim_send_connect_init); | 185 msn_soap_post(oim->sendconn, NULL); |
187 return; | 186 return; |
188 } | 187 } |
189 /*get the challenge,and repost it*/ | 188 /*get the challenge,and repost it*/ |
190 faultCodeNode = xmlnode_get_child(faultNode,"faultcode"); | 189 faultCodeNode = xmlnode_get_child(faultNode,"faultcode"); |
191 if(faultCodeNode == NULL){ | 190 if(faultCodeNode == NULL){ |
192 purple_debug_info("MSNP14","faultcode Node is NULL\n"); | 191 purple_debug_info("MSN OIM","faultcode Node is NULL\n"); |
193 goto oim_send_process_fail; | 192 goto oim_send_process_fail; |
194 } | 193 } |
195 faultCodeStr = xmlnode_get_data(faultCodeNode); | 194 faultCodeStr = xmlnode_get_data(faultCodeNode); |
196 purple_debug_info("MSNP14","fault code:{%s}\n",faultCodeStr); | 195 purple_debug_info("MSN OIM","fault code:{%s}\n",faultCodeStr); |
197 #if 0 | 196 #if 0 |
198 if(!strcmp(faultCodeStr,"q0:AuthenticationFailed")){ | 197 if(!strcmp(faultCodeStr,"q0:AuthenticationFailed")){ |
199 /*other Fault Reason?*/ | 198 /*other Fault Reason?*/ |
200 goto oim_send_process_fail; | 199 goto oim_send_process_fail; |
201 } | 200 } |
202 #endif | 201 #endif |
203 | 202 |
204 faultstringNode = xmlnode_get_child(faultNode,"faultstring"); | 203 faultstringNode = xmlnode_get_child(faultNode,"faultstring"); |
205 faultstring = xmlnode_get_data(faultstringNode); | 204 faultstring = xmlnode_get_data(faultstringNode); |
206 purple_debug_info("MSNP14","fault string :{%s}\n",faultstring); | 205 purple_debug_info("MSN OIM","fault string :{%s}\n",faultstring); |
207 | 206 |
208 /* lock key fault reason, | 207 /* lock key fault reason, |
209 * compute the challenge and resend it | 208 * compute the challenge and resend it |
210 */ | 209 */ |
211 detailNode = xmlnode_get_child(faultNode, "detail"); | 210 detailNode = xmlnode_get_child(faultNode, "detail"); |
217 goto oim_send_process_fail; | 216 goto oim_send_process_fail; |
218 } | 217 } |
219 | 218 |
220 g_free(oim->challenge); | 219 g_free(oim->challenge); |
221 oim->challenge = xmlnode_get_data(challengeNode); | 220 oim->challenge = xmlnode_get_data(challengeNode); |
222 purple_debug_info("MSNP14","lockkey:{%s}\n",oim->challenge); | 221 purple_debug_info("MSN OIM","lockkey:{%s}\n",oim->challenge); |
223 | 222 |
224 /*repost the send*/ | 223 /*repost the send*/ |
225 purple_debug_info("MSNP14","prepare to repost the send...\n"); | 224 purple_debug_info("MSN OIM","prepare to repost the send...\n"); |
226 msn_oim_send_msg(oim); | 225 msn_oim_send_msg(oim); |
227 | 226 |
228 oim_send_process_fail: | 227 oim_send_process_fail: |
229 g_free(faultstring); | 228 g_free(faultstring); |
230 g_free(faultCodeStr); | 229 g_free(faultCodeStr); |
231 xmlnode_free(responseNode); | 230 xmlnode_free(responseNode); |
232 return ; | 231 return ; |
233 } | 232 } |
234 | 233 |
235 static void | 234 static gboolean |
236 msn_oim_send_read_cb(gpointer data, gint source, PurpleInputCondition cond) | 235 msn_oim_send_read_cb(MsnSoapConn *soapconn) |
237 { | 236 { |
238 MsnSoapConn * soapconn = data; | |
239 MsnSession *session = soapconn->session; | 237 MsnSession *session = soapconn->session; |
240 MsnOim * oim; | 238 MsnOim * oim; |
241 | 239 |
242 if (soapconn->body == NULL) | 240 if (soapconn->body == NULL) |
243 return; | 241 return TRUE; |
244 | 242 |
245 g_return_if_fail(session != NULL); | 243 g_return_val_if_fail(session != NULL, FALSE); |
246 oim = soapconn->session->oim; | 244 oim = soapconn->session->oim; |
247 g_return_if_fail(oim != NULL); | 245 g_return_val_if_fail(oim != NULL, TRUE); |
248 | 246 |
249 purple_debug_info("MSNP14","read buffer:{%s}\n",soapconn->body); | 247 purple_debug_info("MSN OIM","read buffer:{%s}\n", soapconn->body); |
250 msn_oim_send_process(oim,soapconn->body,soapconn->body_len); | 248 msn_oim_send_process(oim,soapconn->body,soapconn->body_len); |
251 } | 249 |
252 | 250 return TRUE; |
253 static void | 251 } |
254 msn_oim_send_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 252 |
255 { | 253 static void |
256 MsnSoapConn * soapconn = data; | 254 msn_oim_send_written_cb(MsnSoapConn *soapconn) |
257 | 255 { |
258 soapconn->read_cb = msn_oim_send_read_cb; | 256 soapconn->read_cb = msn_oim_send_read_cb; |
259 // msn_soap_read_cb(data,source,cond); | 257 // msn_soap_read_cb(data,source,cond); |
260 } | 258 } |
261 | 259 |
262 void | 260 void |
284 | 282 |
285 g_return_if_fail(oim != NULL); | 283 g_return_if_fail(oim != NULL); |
286 oim_request = g_queue_pop_head(oim->send_queue); | 284 oim_request = g_queue_pop_head(oim->send_queue); |
287 g_return_if_fail(oim_request != NULL); | 285 g_return_if_fail(oim_request != NULL); |
288 | 286 |
289 purple_debug_info("MSNP14","send single OIM Message\n"); | 287 purple_debug_info("MSN OIM","send single OIM Message\n"); |
290 mspauth = g_strdup_printf("t=%s&p=%s", | 288 mspauth = g_strdup_printf("t=%s&p=%s", |
291 oim->session->passport_info.t, | 289 oim->session->passport_info.t, |
292 oim->session->passport_info.p | 290 oim->session->passport_info.p |
293 ); | 291 ); |
294 g_queue_push_head(oim->send_queue,oim_request); | 292 g_queue_push_head(oim->send_queue,oim_request); |
297 * else we go for the SOAP fault and resend it. | 295 * else we go for the SOAP fault and resend it. |
298 */ | 296 */ |
299 if(oim->challenge != NULL){ | 297 if(oim->challenge != NULL){ |
300 msn_handle_chl(oim->challenge, buf); | 298 msn_handle_chl(oim->challenge, buf); |
301 }else{ | 299 }else{ |
302 purple_debug_info("MSNP14","no lock key challenge,wait for SOAP Fault and Resend\n"); | 300 purple_debug_info("MSN OIM","no lock key challenge,wait for SOAP Fault and Resend\n"); |
303 buf[0]='\0'; | 301 buf[0]='\0'; |
304 } | 302 } |
305 purple_debug_info("MSNP14","get the lock key challenge {%s}\n",buf); | 303 purple_debug_info("MSN OIM","get the lock key challenge {%s}\n",buf); |
306 | 304 |
307 msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg); | 305 msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg); |
308 soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE, | 306 soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE, |
309 oim_request->from_member, | 307 oim_request->from_member, |
310 oim_request->friendname, | 308 oim_request->friendname, |
319 MSN_OIM_SEND_URL, | 317 MSN_OIM_SEND_URL, |
320 MSN_OIM_SEND_SOAP_ACTION, | 318 MSN_OIM_SEND_SOAP_ACTION, |
321 soap_body, | 319 soap_body, |
322 NULL, | 320 NULL, |
323 msn_oim_send_read_cb, | 321 msn_oim_send_read_cb, |
324 msn_oim_send_written_cb); | 322 msn_oim_send_written_cb, |
323 msn_oim_send_connect_init); | |
325 g_free(mspauth); | 324 g_free(mspauth); |
326 g_free(msg_body); | 325 g_free(msg_body); |
327 g_free(soap_body); | 326 g_free(soap_body); |
328 | 327 |
329 /*increase the offline Sequence control*/ | 328 /*increase the offline Sequence control*/ |
330 if(oim->challenge != NULL){ | 329 if(oim->challenge != NULL){ |
331 oim->send_seq++; | 330 oim->send_seq++; |
332 } | 331 } |
333 msn_soap_post(oim->sendconn,soap_request,msn_oim_send_connect_init); | 332 msn_soap_post(oim->sendconn,soap_request); |
334 } | 333 } |
335 | 334 |
336 /**************************************** | 335 /**************************************** |
337 * OIM delete SOAP request | 336 * OIM delete SOAP request |
338 * **************************************/ | 337 * **************************************/ |
339 static void | 338 static gboolean |
340 msn_oim_delete_read_cb(gpointer data, gint source, PurpleInputCondition cond) | 339 msn_oim_delete_read_cb(MsnSoapConn *soapconn) |
341 { | 340 { |
342 MsnSoapConn * soapconn = data; | |
343 | |
344 if (soapconn->body == NULL) | 341 if (soapconn->body == NULL) |
345 return; | 342 return TRUE; |
346 purple_debug_info("MSNP14","OIM delete read buffer:{%s}\n",soapconn->body); | 343 purple_debug_info("MSN OIM","OIM delete read buffer:{%s}\n",soapconn->body); |
347 | 344 |
348 msn_soap_free_read_buf(soapconn); | 345 msn_soap_free_read_buf(soapconn); |
349 /*get next single Offline Message*/ | 346 /*get next single Offline Message*/ |
350 msn_soap_post(soapconn,NULL,msn_oim_retrieve_connect_init); | 347 // msn_soap_post(soapconn,NULL); /* we already do this in soap.c */ |
351 } | 348 return TRUE; |
352 | 349 } |
353 static void | 350 |
354 msn_oim_delete_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 351 static void |
355 { | 352 msn_oim_delete_written_cb(MsnSoapConn *soapconn) |
356 MsnSoapConn * soapconn = data; | 353 { |
357 | |
358 soapconn->read_cb = msn_oim_delete_read_cb; | 354 soapconn->read_cb = msn_oim_delete_read_cb; |
359 } | 355 } |
360 | 356 |
361 /*Post to get the Offline Instant Message*/ | 357 /*Post to get the Offline Instant Message*/ |
362 static void | 358 static void |
366 const char *soap_body,*t,*p; | 362 const char *soap_body,*t,*p; |
367 | 363 |
368 g_return_if_fail(oim != NULL); | 364 g_return_if_fail(oim != NULL); |
369 g_return_if_fail(msgid != NULL); | 365 g_return_if_fail(msgid != NULL); |
370 | 366 |
371 purple_debug_info("MSNP14","Delete single OIM Message {%s}\n",msgid); | 367 purple_debug_info("MSN OIM","Delete single OIM Message {%s}\n",msgid); |
372 t = oim->session->passport_info.t; | 368 t = oim->session->passport_info.t; |
373 p = oim->session->passport_info.p; | 369 p = oim->session->passport_info.p; |
374 | 370 |
375 soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE, | 371 soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE, |
376 t, | 372 t, |
381 MSN_OIM_RETRIEVE_URL, | 377 MSN_OIM_RETRIEVE_URL, |
382 MSN_OIM_DEL_SOAP_ACTION, | 378 MSN_OIM_DEL_SOAP_ACTION, |
383 soap_body, | 379 soap_body, |
384 NULL, | 380 NULL, |
385 msn_oim_delete_read_cb, | 381 msn_oim_delete_read_cb, |
386 msn_oim_delete_written_cb); | 382 msn_oim_delete_written_cb, |
387 msn_soap_post(oim->retrieveconn,soap_request,msn_oim_retrieve_connect_init); | 383 msn_oim_retrieve_connect_init); |
384 msn_soap_post(oim->retrieveconn,soap_request); | |
388 } | 385 } |
389 | 386 |
390 /**************************************** | 387 /**************************************** |
391 * OIM get SOAP request | 388 * OIM get SOAP request |
392 * **************************************/ | 389 * **************************************/ |
393 /*oim SOAP server login error*/ | 390 /*oim SOAP server login error*/ |
394 static void | 391 static void |
395 msn_oim_get_error_cb(PurpleSslConnection *gsc, PurpleSslErrorType error, void *data) | 392 msn_oim_get_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error) |
396 { | 393 { |
397 MsnSoapConn *soapconn = data; | |
398 MsnSession *session; | 394 MsnSession *session; |
399 | 395 |
400 session = soapconn->session; | 396 session = soapconn->session; |
401 g_return_if_fail(session != NULL); | 397 g_return_if_fail(session != NULL); |
402 msn_soap_clean_unhandled_request(soapconn); | 398 msn_soap_clean_unhandled_requests(soapconn); |
403 | 399 |
404 // msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); | 400 // msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); |
405 } | 401 } |
406 | 402 |
407 /*msn oim SOAP server connect process*/ | 403 /*msn oim SOAP server connect process*/ |
408 static void | 404 static gboolean |
409 msn_oim_get_connect_cb(gpointer data, PurpleSslConnection *gsc, | 405 msn_oim_get_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc) |
410 PurpleInputCondition cond) | 406 { |
411 { | |
412 MsnSoapConn *soapconn = data; | |
413 MsnSession * session; | 407 MsnSession * session; |
414 MsnOim *oim; | 408 MsnOim *oim; |
415 | 409 |
416 oim = soapconn->parent; | 410 oim = soapconn->parent; |
417 g_return_if_fail(oim != NULL); | 411 g_return_val_if_fail(oim != NULL, TRUE); |
418 | 412 |
419 session = oim->session; | 413 session = oim->session; |
420 g_return_if_fail(session != NULL); | 414 g_return_val_if_fail(session != NULL, FALSE); |
421 | 415 |
422 purple_debug_info("MSNP14","oim get SOAP Server connected!\n"); | 416 purple_debug_info("MSN OIM","Connected and ready to get OIM!\n"); |
417 | |
418 return TRUE; | |
423 } | 419 } |
424 | 420 |
425 /* like purple_str_to_time, but different. The format of the timestamp | 421 /* like purple_str_to_time, but different. The format of the timestamp |
426 * is like this: 5 Sep 2007 21:42:12 -0700 */ | 422 * is like this: 5 Sep 2007 21:42:12 -0700 */ |
427 static time_t | 423 static time_t |
483 return mktime(&t) + tzoff; | 479 return mktime(&t) + tzoff; |
484 } | 480 } |
485 } | 481 } |
486 } | 482 } |
487 | 483 |
488 purple_debug_info("MSNP14:OIM", "Can't parse timestamp %s\n", timestamp); | 484 purple_debug_info("MSN OIM:OIM", "Can't parse timestamp %s\n", timestamp); |
489 return time(NULL); | 485 return time(NULL); |
490 } | 486 } |
491 | 487 |
492 /*Post the Offline Instant Message to User Conversation*/ | 488 /*Post the Offline Instant Message to User Conversation*/ |
493 static void | 489 static void |
505 | 501 |
506 message = msn_message_new(MSN_MSG_UNKNOWN); | 502 message = msn_message_new(MSN_MSG_UNKNOWN); |
507 | 503 |
508 msn_message_parse_payload(message, msg_str, strlen(msg_str), | 504 msn_message_parse_payload(message, msg_str, strlen(msg_str), |
509 MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); | 505 MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); |
510 purple_debug_info("MSNP14","oim body:{%s}\n",message->body); | 506 purple_debug_info("MSN OIM","oim body:{%s}\n",message->body); |
511 decode_msg = (char *)purple_base64_decode(message->body,&body_len); | 507 decode_msg = (char *)purple_base64_decode(message->body,&body_len); |
512 date = (char *)g_hash_table_lookup(message->attr_table, "Date"); | 508 date = (char *)g_hash_table_lookup(message->attr_table, "Date"); |
513 from = (char *)g_hash_table_lookup(message->attr_table, "From"); | 509 from = (char *)g_hash_table_lookup(message->attr_table, "From"); |
514 if(strstr(from," ")){ | 510 if(strstr(from," ")){ |
515 has_nick = 1; | 511 has_nick = 1; |
516 } | 512 } |
517 if(has_nick){ | 513 if(has_nick){ |
518 tokens = g_strsplit(from , " " , 2); | 514 tokens = g_strsplit(from , " " , 2); |
519 passport_str = g_strdup(tokens[1]); | 515 passport_str = g_strdup(tokens[1]); |
520 purple_debug_info("MSNP14","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n", | 516 purple_debug_info("MSN OIM","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n", |
521 date,tokens[0],tokens[1],passport_str); | 517 date,tokens[0],tokens[1],passport_str); |
522 g_strfreev(tokens); | 518 g_strfreev(tokens); |
523 }else{ | 519 }else{ |
524 passport_str = g_strdup(from); | 520 passport_str = g_strdup(from); |
525 purple_debug_info("MSNP14","oim Date:{%s},passport{%s}\n", | 521 purple_debug_info("MSN OIM","oim Date:{%s},passport{%s}\n", |
526 date,passport_str); | 522 date,passport_str); |
527 } | 523 } |
528 start = strstr(passport_str,"<"); | 524 start = strstr(passport_str,"<"); |
529 start += 1; | 525 start += 1; |
530 end = strstr(passport_str,">"); | 526 end = strstr(passport_str,">"); |
531 passport = g_strndup(start,end - start); | 527 passport = g_strndup(start,end - start); |
532 g_free(passport_str); | 528 g_free(passport_str); |
533 purple_debug_info("MSNP14","oim Date:{%s},passport{%s}\n",date,passport); | 529 purple_debug_info("MSN OIM","oim Date:{%s},passport{%s}\n",date,passport); |
534 | 530 |
535 stamp = msn_oim_parse_timestamp(date); | 531 stamp = msn_oim_parse_timestamp(date); |
536 | 532 |
537 serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp); | 533 serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp); |
538 | 534 |
568 | 564 |
569 g_free(msg_str); | 565 g_free(msg_str); |
570 xmlnode_free(oim_node); | 566 xmlnode_free(oim_node); |
571 } | 567 } |
572 | 568 |
573 static void | 569 static gboolean |
574 msn_oim_get_read_cb(gpointer data, gint source, PurpleInputCondition cond) | 570 msn_oim_get_read_cb(MsnSoapConn *soapconn) |
575 { | 571 { |
576 MsnSoapConn * soapconn = data; | |
577 MsnOim * oim = soapconn->session->oim; | 572 MsnOim * oim = soapconn->session->oim; |
578 | 573 |
579 if (soapconn->body == NULL) | 574 if (soapconn->body == NULL) |
580 return; | 575 return TRUE; |
581 | 576 |
582 purple_debug_info("MSNP14","OIM get read buffer:{%s}\n",soapconn->body); | 577 purple_debug_info("MSN OIM","OIM get read buffer:{%s}\n",soapconn->body); |
583 | 578 |
584 /*we need to process the read message!*/ | 579 /*we need to process the read message!*/ |
585 msn_oim_get_process(oim,soapconn->body); | 580 msn_oim_get_process(oim,soapconn->body); |
586 msn_soap_free_read_buf(soapconn); | 581 msn_soap_free_read_buf(soapconn); |
587 | 582 |
588 /*get next single Offline Message*/ | 583 /*get next single Offline Message*/ |
589 msn_soap_post(soapconn,NULL,msn_oim_retrieve_connect_init); | 584 // msn_soap_post(soapconn,NULL); /* we already do this in soap.c */ |
590 } | 585 return TRUE; |
591 | 586 } |
592 static void | 587 |
593 msn_oim_get_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 588 static void |
594 { | 589 msn_oim_get_written_cb(MsnSoapConn *soapconn) |
595 MsnSoapConn * soapconn = data; | 590 { |
596 | |
597 soapconn->read_cb = msn_oim_get_read_cb; | 591 soapconn->read_cb = msn_oim_get_read_cb; |
598 // msn_soap_read_cb(data,source,cond); | 592 // msn_soap_read_cb(data,source,cond); |
599 } | 593 } |
600 | 594 |
601 /* parse the oim XML data | 595 /* parse the oim XML data |
606 { | 600 { |
607 xmlnode *node, *mNode,*ENode,*INode,*rtNode,*nNode; | 601 xmlnode *node, *mNode,*ENode,*INode,*rtNode,*nNode; |
608 char *passport,*msgid,*nickname, *unread, *rTime = NULL; | 602 char *passport,*msgid,*nickname, *unread, *rTime = NULL; |
609 MsnSession *session = oim->session; | 603 MsnSession *session = oim->session; |
610 | 604 |
611 purple_debug_info("MSNP14:OIM", "%s", xmlmsg); | 605 purple_debug_info("MSN OIM:OIM", "%s", xmlmsg); |
612 | 606 |
613 node = xmlnode_from_str(xmlmsg, strlen(xmlmsg)); | 607 node = xmlnode_from_str(xmlmsg, strlen(xmlmsg)); |
614 if (strcmp(node->name, "MD") != 0) { | 608 if (strcmp(node->name, "MD") != 0) { |
615 xmlnode_free(node); | 609 xmlnode_free(node); |
616 return; | 610 return; |
652 rtNode = xmlnode_get_child(mNode,"RT"); | 646 rtNode = xmlnode_get_child(mNode,"RT"); |
653 if(rtNode != NULL) { | 647 if(rtNode != NULL) { |
654 rTime = xmlnode_get_data(rtNode); | 648 rTime = xmlnode_get_data(rtNode); |
655 rtNode = NULL; | 649 rtNode = NULL; |
656 } | 650 } |
657 /* purple_debug_info("MSNP14","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ | 651 /* purple_debug_info("MSN OIM","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ |
658 | 652 |
659 oim->oim_list = g_list_append(oim->oim_list,strdup(msgid)); | 653 oim->oim_list = g_list_append(oim->oim_list,strdup(msgid)); |
660 msn_oim_post_single_get_msg(oim,msgid); | 654 msn_oim_post_single_get_msg(oim,msgid); |
661 g_free(passport); | 655 g_free(passport); |
662 g_free(msgid); | 656 g_free(msgid); |
673 msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) | 667 msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) |
674 { | 668 { |
675 MsnSoapReq *soap_request; | 669 MsnSoapReq *soap_request; |
676 const char *soap_body,*t,*p; | 670 const char *soap_body,*t,*p; |
677 | 671 |
678 purple_debug_info("MSNP14","Get single OIM Message\n"); | 672 purple_debug_info("MSN OIM","Get single OIM Message\n"); |
679 t = oim->session->passport_info.t; | 673 t = oim->session->passport_info.t; |
680 p = oim->session->passport_info.p; | 674 p = oim->session->passport_info.p; |
681 | 675 |
682 soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, | 676 soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, |
683 t, | 677 t, |
688 MSN_OIM_RETRIEVE_URL, | 682 MSN_OIM_RETRIEVE_URL, |
689 MSN_OIM_GET_SOAP_ACTION, | 683 MSN_OIM_GET_SOAP_ACTION, |
690 soap_body, | 684 soap_body, |
691 NULL, | 685 NULL, |
692 msn_oim_get_read_cb, | 686 msn_oim_get_read_cb, |
693 msn_oim_get_written_cb); | 687 msn_oim_get_written_cb, |
694 msn_soap_post(oim->retrieveconn,soap_request,msn_oim_retrieve_connect_init); | 688 msn_oim_retrieve_connect_init); |
689 msn_soap_post(oim->retrieveconn,soap_request); | |
695 } | 690 } |
696 | 691 |
697 /*msn oim retrieve server connect init */ | 692 /*msn oim retrieve server connect init */ |
698 static void | 693 static void |
699 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) | 694 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) |
700 { | 695 { |
701 purple_debug_info("MSNP14","msn_oim_connect...\n"); | 696 purple_debug_info("MSN OIM","Initializing OIM retrieve connection\n"); |
702 msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1, | 697 msn_soap_init(soapconn, MSN_OIM_RETRIEVE_HOST, 1, |
703 msn_oim_get_connect_cb, | 698 msn_oim_get_connect_cb, |
704 msn_oim_get_error_cb); | 699 msn_oim_get_error_cb); |
705 } | 700 } |
706 | 701 |
707 /*Msn OIM Send Server Connect Init Function*/ | 702 /*Msn OIM Send Server Connect Init Function*/ |
708 static void | 703 static void |
709 msn_oim_send_connect_init(MsnSoapConn *sendconn) | 704 msn_oim_send_connect_init(MsnSoapConn *sendconn) |
710 { | 705 { |
711 purple_debug_info("MSNP14","msn oim send connect init...\n"); | 706 purple_debug_info("MSN OIM","Initializing OIM send connection\n"); |
712 msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1, | 707 msn_soap_init(sendconn, MSN_OIM_SEND_HOST, 1, |
713 msn_oim_send_connect_cb, | 708 msn_oim_send_connect_cb, |
714 msn_oim_send_error_cb); | 709 msn_oim_send_error_cb); |
715 } | 710 } |
716 | 711 |
717 /*endof oim.c*/ | 712 /* EOF oim.c*/ |