comparison libpurple/protocols/msn/oim.c @ 20471:530a92d50c5e

Misc cleanups, better error handling, and print the Address Book received from the server in a human readable way.
author Carlos Silva <typ0@pidgin.im>
date Tue, 17 Jul 2007 00:35:50 +0000
parents a0d104281002
children eb93710aec4d
comparison
equal deleted inserted replaced
20470:7d6f247f08d9 20471:530a92d50c5e
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("MaYuan","encode OIM Message...\n"); 123 purple_debug_info("MSNP14","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("MaYuan","encoded base64 body:{%s}\n",oim_base64); 125 purple_debug_info("MSNP14","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 }
176 faultNode = xmlnode_get_child(bodyNode,"Fault"); 176 faultNode = xmlnode_get_child(bodyNode,"Fault");
177 if(faultNode == NULL){ 177 if(faultNode == NULL){
178 /*Send OK! return*/ 178 /*Send OK! return*/
179 MsnOimSendReq *request; 179 MsnOimSendReq *request;
180 180
181 purple_debug_info("MaYuan","send OIM OK!"); 181 purple_debug_info("MSNP14","send OIM OK!");
182 xmlnode_free(responseNode); 182 xmlnode_free(responseNode);
183 request = g_queue_pop_head(oim->send_queue); 183 request = g_queue_pop_head(oim->send_queue);
184 msn_oim_free_send_req(request); 184 msn_oim_free_send_req(request);
185 /*send next buffered Offline Message*/ 185 /*send next buffered Offline Message*/
186 msn_soap_post(oim->sendconn,NULL,msn_oim_send_connect_init); 186 msn_soap_post(oim->sendconn,NULL,msn_oim_send_connect_init);
187 return; 187 return;
188 } 188 }
189 /*get the challenge,and repost it*/ 189 /*get the challenge,and repost it*/
190 faultCodeNode = xmlnode_get_child(faultNode,"faultcode"); 190 faultCodeNode = xmlnode_get_child(faultNode,"faultcode");
191 if(faultCodeNode == NULL){ 191 if(faultCodeNode == NULL){
192 purple_debug_info("MaYuan","faultcode Node is NULL\n"); 192 purple_debug_info("MSNP14","faultcode Node is NULL\n");
193 goto oim_send_process_fail; 193 goto oim_send_process_fail;
194 } 194 }
195 faultCodeStr = xmlnode_get_data(faultCodeNode); 195 faultCodeStr = xmlnode_get_data(faultCodeNode);
196 purple_debug_info("MaYuan","fault code:{%s}\n",faultCodeStr); 196 purple_debug_info("MSNP14","fault code:{%s}\n",faultCodeStr);
197 197
198 if(!strcmp(faultCodeStr,"q0:AuthenticationFailed")){ 198 if(!strcmp(faultCodeStr,"q0:AuthenticationFailed")){
199 /*other Fault Reason?*/ 199 /*other Fault Reason?*/
200 goto oim_send_process_fail; 200 goto oim_send_process_fail;
201 } 201 }
202 202
203 faultstringNode = xmlnode_get_child(faultNode,"faultstring"); 203 faultstringNode = xmlnode_get_child(faultNode,"faultstring");
204 faultstring = xmlnode_get_data(faultstringNode); 204 faultstring = xmlnode_get_data(faultstringNode);
205 purple_debug_info("MaYuan","fault string :{%s}\n",faultstring); 205 purple_debug_info("MSNP14","fault string :{%s}\n",faultstring);
206 206
207 /* lock key fault reason, 207 /* lock key fault reason,
208 * compute the challenge and resend it 208 * compute the challenge and resend it
209 */ 209 */
210 detailNode = xmlnode_get_child(faultNode, "detail"); 210 detailNode = xmlnode_get_child(faultNode, "detail");
216 goto oim_send_process_fail; 216 goto oim_send_process_fail;
217 } 217 }
218 218
219 g_free(oim->challenge); 219 g_free(oim->challenge);
220 oim->challenge = xmlnode_get_data(challengeNode); 220 oim->challenge = xmlnode_get_data(challengeNode);
221 purple_debug_info("MaYuan","lockkey:{%s}\n",oim->challenge); 221 purple_debug_info("MSNP14","lockkey:{%s}\n",oim->challenge);
222 222
223 /*repost the send*/ 223 /*repost the send*/
224 purple_debug_info("MaYuan","prepare to repost the send...\n"); 224 purple_debug_info("MSNP14","prepare to repost the send...\n");
225 msn_oim_send_msg(oim); 225 msn_oim_send_msg(oim);
226 226
227 oim_send_process_fail: 227 oim_send_process_fail:
228 xmlnode_free(responseNode); 228 xmlnode_free(responseNode);
229 return ; 229 return ;
238 238
239 g_return_if_fail(session != NULL); 239 g_return_if_fail(session != NULL);
240 oim = soapconn->session->oim; 240 oim = soapconn->session->oim;
241 g_return_if_fail(oim != NULL); 241 g_return_if_fail(oim != NULL);
242 242
243 purple_debug_info("MaYuan","read buffer:{%s}\n",soapconn->body); 243 purple_debug_info("MSNP14","read buffer:{%s}\n",soapconn->body);
244 msn_oim_send_process(oim,soapconn->body,soapconn->body_len); 244 msn_oim_send_process(oim,soapconn->body,soapconn->body_len);
245 } 245 }
246 246
247 static void 247 static void
248 msn_oim_send_written_cb(gpointer data, gint source, PurpleInputCondition cond) 248 msn_oim_send_written_cb(gpointer data, gint source, PurpleInputCondition cond)
278 278
279 g_return_if_fail(oim != NULL); 279 g_return_if_fail(oim != NULL);
280 oim_request = g_queue_pop_head(oim->send_queue); 280 oim_request = g_queue_pop_head(oim->send_queue);
281 g_return_if_fail(oim_request != NULL); 281 g_return_if_fail(oim_request != NULL);
282 282
283 purple_debug_info("MaYuan","send single OIM Message\n"); 283 purple_debug_info("MSNP14","send single OIM Message\n");
284 mspauth = g_strdup_printf("t=%s&amp;p=%s", 284 mspauth = g_strdup_printf("t=%s&amp;p=%s",
285 oim->session->passport_info.t, 285 oim->session->passport_info.t,
286 oim->session->passport_info.p 286 oim->session->passport_info.p
287 ); 287 );
288 g_queue_push_head(oim->send_queue,oim_request); 288 g_queue_push_head(oim->send_queue,oim_request);
291 * else we go for the SOAP fault and resend it. 291 * else we go for the SOAP fault and resend it.
292 */ 292 */
293 if(oim->challenge != NULL){ 293 if(oim->challenge != NULL){
294 msn_handle_chl(oim->challenge, buf); 294 msn_handle_chl(oim->challenge, buf);
295 }else{ 295 }else{
296 purple_debug_info("MaYuan","no lock key challenge,wait for SOAP Fault and Resend\n"); 296 purple_debug_info("MSNP14","no lock key challenge,wait for SOAP Fault and Resend\n");
297 buf[0]='\0'; 297 buf[0]='\0';
298 } 298 }
299 purple_debug_info("MaYuan","get the lock key challenge {%s}\n",buf); 299 purple_debug_info("MSNP14","get the lock key challenge {%s}\n",buf);
300 300
301 msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg); 301 msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg);
302 soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE, 302 soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE,
303 oim_request->from_member, 303 oim_request->from_member,
304 oim_request->friendname, 304 oim_request->friendname,
331 static void 331 static void
332 msn_oim_delete_read_cb(gpointer data, gint source, PurpleInputCondition cond) 332 msn_oim_delete_read_cb(gpointer data, gint source, PurpleInputCondition cond)
333 { 333 {
334 MsnSoapConn * soapconn = data; 334 MsnSoapConn * soapconn = data;
335 335
336 purple_debug_info("MaYuan","OIM delete read buffer:{%s}\n",soapconn->body); 336 purple_debug_info("MSNP14","OIM delete read buffer:{%s}\n",soapconn->body);
337 337
338 msn_soap_free_read_buf(soapconn); 338 msn_soap_free_read_buf(soapconn);
339 /*get next single Offline Message*/ 339 /*get next single Offline Message*/
340 msn_soap_post(soapconn,NULL,msn_oim_retrieve_connect_init); 340 msn_soap_post(soapconn,NULL,msn_oim_retrieve_connect_init);
341 } 341 }
356 const char *soap_body,*t,*p; 356 const char *soap_body,*t,*p;
357 357
358 g_return_if_fail(oim != NULL); 358 g_return_if_fail(oim != NULL);
359 g_return_if_fail(msgid != NULL); 359 g_return_if_fail(msgid != NULL);
360 360
361 purple_debug_info("MaYuan","Delete single OIM Message {%s}\n",msgid); 361 purple_debug_info("MSNP14","Delete single OIM Message {%s}\n",msgid);
362 t = oim->session->passport_info.t; 362 t = oim->session->passport_info.t;
363 p = oim->session->passport_info.p; 363 p = oim->session->passport_info.p;
364 364
365 soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE, 365 soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE,
366 t, 366 t,
405 g_return_if_fail(oim != NULL); 405 g_return_if_fail(oim != NULL);
406 406
407 session = oim->session; 407 session = oim->session;
408 g_return_if_fail(session != NULL); 408 g_return_if_fail(session != NULL);
409 409
410 purple_debug_info("MaYuan","oim get SOAP Server connected!\n"); 410 purple_debug_info("MSNP14","oim get SOAP Server connected!\n");
411 } 411 }
412 412
413 /*Post the Offline Instant Message to User Conversation*/ 413 /*Post the Offline Instant Message to User Conversation*/
414 static void 414 static void
415 msn_oim_report_to_user(MsnOim *oim, char *msg_str) 415 msn_oim_report_to_user(MsnOim *oim, char *msg_str)
426 426
427 message = msn_message_new(MSN_MSG_UNKNOWN); 427 message = msn_message_new(MSN_MSG_UNKNOWN);
428 428
429 msn_message_parse_payload(message, msg_str, strlen(msg_str), 429 msn_message_parse_payload(message, msg_str, strlen(msg_str),
430 MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); 430 MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
431 purple_debug_info("MaYuan","oim body:{%s}\n",message->body); 431 purple_debug_info("MSNP14","oim body:{%s}\n",message->body);
432 decode_msg = (char *)purple_base64_decode(message->body,&body_len); 432 decode_msg = (char *)purple_base64_decode(message->body,&body_len);
433 date = (char *)g_hash_table_lookup(message->attr_table, "Date"); 433 date = (char *)g_hash_table_lookup(message->attr_table, "Date");
434 from = (char *)g_hash_table_lookup(message->attr_table, "From"); 434 from = (char *)g_hash_table_lookup(message->attr_table, "From");
435 if(strstr(from," ")){ 435 if(strstr(from," ")){
436 has_nick = 1; 436 has_nick = 1;
437 } 437 }
438 if(has_nick){ 438 if(has_nick){
439 tokens = g_strsplit(from , " " , 2); 439 tokens = g_strsplit(from , " " , 2);
440 passport_str = g_strdup(tokens[1]); 440 passport_str = g_strdup(tokens[1]);
441 purple_debug_info("MaYuan","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n", 441 purple_debug_info("MSNP14","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n",
442 date,tokens[0],tokens[1],passport_str); 442 date,tokens[0],tokens[1],passport_str);
443 g_strfreev(tokens); 443 g_strfreev(tokens);
444 }else{ 444 }else{
445 passport_str = g_strdup(from); 445 passport_str = g_strdup(from);
446 purple_debug_info("MaYuan","oim Date:{%s},passport{%s}\n", 446 purple_debug_info("MSNP14","oim Date:{%s},passport{%s}\n",
447 date,passport_str); 447 date,passport_str);
448 } 448 }
449 start = strstr(passport_str,"<"); 449 start = strstr(passport_str,"<");
450 start += 1; 450 start += 1;
451 end = strstr(passport_str,">"); 451 end = strstr(passport_str,">");
452 passport = g_strndup(start,end - start); 452 passport = g_strndup(start,end - start);
453 g_free(passport_str); 453 g_free(passport_str);
454 purple_debug_info("MaYuan","oim Date:{%s},passport{%s}\n",date,passport); 454 purple_debug_info("MSNP14","oim Date:{%s},passport{%s}\n",date,passport);
455 455
456 stamp = purple_str_to_time(date, TRUE, NULL, NULL, NULL); 456 stamp = purple_str_to_time(date, TRUE, NULL, NULL, NULL);
457 457
458 serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp); 458 serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp);
459 459
496 msn_oim_get_read_cb(gpointer data, gint source, PurpleInputCondition cond) 496 msn_oim_get_read_cb(gpointer data, gint source, PurpleInputCondition cond)
497 { 497 {
498 MsnSoapConn * soapconn = data; 498 MsnSoapConn * soapconn = data;
499 MsnOim * oim = soapconn->session->oim; 499 MsnOim * oim = soapconn->session->oim;
500 500
501 purple_debug_info("MaYuan","OIM get read buffer:{%s}\n",soapconn->body); 501 purple_debug_info("MSNP14","OIM get read buffer:{%s}\n",soapconn->body);
502 502
503 /*we need to process the read message!*/ 503 /*we need to process the read message!*/
504 msn_oim_get_process(oim,soapconn->body); 504 msn_oim_get_process(oim,soapconn->body);
505 msn_soap_free_read_buf(soapconn); 505 msn_soap_free_read_buf(soapconn);
506 506
570 rtNode = xmlnode_get_child(mNode,"RT"); 570 rtNode = xmlnode_get_child(mNode,"RT");
571 if(rtNode != NULL) { 571 if(rtNode != NULL) {
572 rTime = xmlnode_get_data(rtNode); 572 rTime = xmlnode_get_data(rtNode);
573 rtNode = NULL; 573 rtNode = NULL;
574 } 574 }
575 /* purple_debug_info("MaYuan","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ 575 /* purple_debug_info("MSNP14","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */
576 576
577 oim->oim_list = g_list_append(oim->oim_list,msgid); 577 oim->oim_list = g_list_append(oim->oim_list,msgid);
578 msn_oim_post_single_get_msg(oim,msgid); 578 msn_oim_post_single_get_msg(oim,msgid);
579 g_free(passport); 579 g_free(passport);
580 g_free(msgid); 580 g_free(msgid);
590 msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) 590 msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid)
591 { 591 {
592 MsnSoapReq *soap_request; 592 MsnSoapReq *soap_request;
593 const char *soap_body,*t,*p; 593 const char *soap_body,*t,*p;
594 594
595 purple_debug_info("MaYuan","Get single OIM Message\n"); 595 purple_debug_info("MSNP14","Get single OIM Message\n");
596 t = oim->session->passport_info.t; 596 t = oim->session->passport_info.t;
597 p = oim->session->passport_info.p; 597 p = oim->session->passport_info.p;
598 598
599 soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, 599 soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE,
600 t, 600 t,
611 611
612 /*msn oim retrieve server connect init */ 612 /*msn oim retrieve server connect init */
613 static void 613 static void
614 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) 614 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn)
615 { 615 {
616 purple_debug_info("MaYuan","msn_oim_connect...\n"); 616 purple_debug_info("MSNP14","msn_oim_connect...\n");
617 msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1, 617 msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1,
618 msn_oim_get_connect_cb, 618 msn_oim_get_connect_cb,
619 msn_oim_get_error_cb); 619 msn_oim_get_error_cb);
620 } 620 }
621 621
622 /*Msn OIM Send Server Connect Init Function*/ 622 /*Msn OIM Send Server Connect Init Function*/
623 static void 623 static void
624 msn_oim_send_connect_init(MsnSoapConn *sendconn) 624 msn_oim_send_connect_init(MsnSoapConn *sendconn)
625 { 625 {
626 purple_debug_info("MaYuan","msn oim send connect init...\n"); 626 purple_debug_info("MSNP14","msn oim send connect init...\n");
627 msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1, 627 msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1,
628 msn_oim_send_connect_cb, 628 msn_oim_send_connect_cb,
629 msn_oim_send_error_cb); 629 msn_oim_send_error_cb);
630 } 630 }
631 631