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&amp;p=%s", 288 mspauth = g_strdup_printf("t=%s&amp;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*/