comparison libgaim/protocols/msn/oim.c @ 20391:0b0ecee55091

The second msn.tgz from SF Patch #1621854 from Ka-Hing Cheung. "new version, fixes some crashes because group_id is char * but in some places it's set to an int (!). skadotnet, I don't understand why you need `if (!strcmp(type, "MFN")) {` in so many places, so I didn't include most of them. I also have different versions of some of your fixes because I already fixed them. Group manipulations may still not work, at least it's not crashing :-)" committer: Richard Laager <rlaager@wiktel.com>
author Ka-Hing Cheung <khc@hxbc.us>
date Sun, 15 Apr 2007 02:43:47 +0000
parents d634f88e25d8
children 9ba7dee775e1
comparison
equal deleted inserted replaced
20390:d634f88e25d8 20391:0b0ecee55091
28 #include "oim.h" 28 #include "oim.h"
29 #include "msn-utils.h" 29 #include "msn-utils.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 void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn); 33 static MsnOimSendReq *msn_oim_new_send_req(const char *from_member,
34 void msn_oim_send_connect_init(MsnSoapConn *soapconn); 34 const char *friendname,
35 void msn_oim_free_send_req(MsnOimSendReq *req); 35 const char* to_member,
36 gint send_seq,
37 const char *msg);
38 static void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn);
39 static void msn_oim_send_connect_init(MsnSoapConn *soapconn);
40 static void msn_oim_free_send_req(MsnOimSendReq *req);
41 static void msn_oim_report_to_user(MsnOim *oim, char *msg_str);
42 static void msn_oim_get_process(MsnOim *oim, char *oim_msg);
43 static char *msn_oim_msg_to_str(MsnOim *oim, const char *body);
44 const void msn_oim_send_process(MsnOim *oim, const char *body, int len);
36 45
37 /*new a OIM object*/ 46 /*new a OIM object*/
38 MsnOim * 47 MsnOim *
39 msn_oim_new(MsnSession *session) 48 msn_oim_new(MsnSession *session)
40 { 49 {
71 g_queue_free(oim->send_queue); 80 g_queue_free(oim->send_queue);
72 81
73 g_free(oim); 82 g_free(oim);
74 } 83 }
75 84
76 MsnOimSendReq * 85 static MsnOimSendReq *
77 msn_oim_new_send_req(char *from_member, 86 msn_oim_new_send_req(const char *from_member, const char*friendname,
78 char*friendname,char* to_member, 87 const char* to_member, gint send_seq,
79 gint send_seq, 88 const char *msg)
80 char *msg)
81 { 89 {
82 MsnOimSendReq *request; 90 MsnOimSendReq *request;
83 91
84 request = g_new0(MsnOimSendReq, 1); 92 request = g_new0(MsnOimSendReq, 1);
85 request->from_member =g_strdup(from_member); 93 request->from_member =g_strdup(from_member);
88 request->send_seq = send_seq; 96 request->send_seq = send_seq;
89 request->oim_msg = g_strdup(msg); 97 request->oim_msg = g_strdup(msg);
90 return request; 98 return request;
91 } 99 }
92 100
93 void 101 static void
94 msn_oim_free_send_req(MsnOimSendReq *req) 102 msn_oim_free_send_req(MsnOimSendReq *req)
95 { 103 {
96 g_return_if_fail(req != NULL); 104 g_return_if_fail(req != NULL);
97 105
98 g_free(req->from_member); 106 g_free(req->from_member);
105 113
106 /**************************************** 114 /****************************************
107 * OIM send SOAP request 115 * OIM send SOAP request
108 * **************************************/ 116 * **************************************/
109 /*encode the message to OIM Message Format*/ 117 /*encode the message to OIM Message Format*/
110 char * 118 static char *
111 msn_oim_msg_to_str(MsnOim *oim,char *body) 119 msn_oim_msg_to_str(MsnOim *oim, const char *body)
112 { 120 {
113 char *oim_body,*oim_base64; 121 char *oim_body,*oim_base64;
114 122
115 gaim_debug_info("MaYuan","encode OIM Message...\n"); 123 gaim_debug_info("MaYuan","encode OIM Message...\n");
116 oim_base64 = gaim_base64_encode((const guchar *)body, strlen(body)); 124 oim_base64 = gaim_base64_encode((const guchar *)body, strlen(body));
152 160
153 /* 161 /*
154 * Process the send return SOAP string 162 * Process the send return SOAP string
155 * If got SOAP Fault,get the lock key,and resend it. 163 * If got SOAP Fault,get the lock key,and resend it.
156 */ 164 */
157 void 165 const void
158 msn_oim_send_process(MsnOim *oim,char *body,int len) 166 msn_oim_send_process(MsnOim *oim, const char *body, int len)
159 { 167 {
160 xmlnode *responseNode,*bodyNode; 168 xmlnode *responseNode, *bodyNode;
161 xmlnode *faultNode,*faultCodeNode,*faultstringNode; 169 xmlnode *faultNode, *faultCodeNode, *faultstringNode;
162 xmlnode *detailNode,*challengeNode; 170 xmlnode *detailNode, *challengeNode;
163 char *faultCodeStr,*faultstring; 171 char *faultCodeStr, *faultstring;
164 char *challenge;
165 172
166 responseNode = xmlnode_from_str(body,len); 173 responseNode = xmlnode_from_str(body,len);
167 g_return_if_fail(responseNode != NULL); 174 g_return_if_fail(responseNode != NULL);
168 bodyNode = xmlnode_get_child(responseNode,"Body"); 175 bodyNode = xmlnode_get_child(responseNode,"Body");
169 faultNode = xmlnode_get_child(bodyNode,"Fault"); 176 faultNode = xmlnode_get_child(bodyNode,"Fault");
243 soapconn->read_cb = msn_oim_send_read_cb; 250 soapconn->read_cb = msn_oim_send_read_cb;
244 // msn_soap_read_cb(data,source,cond); 251 // msn_soap_read_cb(data,source,cond);
245 } 252 }
246 253
247 void 254 void
248 msn_oim_prep_send_msg_info(MsnOim *oim, 255 msn_oim_prep_send_msg_info(MsnOim *oim, const char *membername,
249 char *membername,char*friendname,char *tomember, 256 const char* friendname, const char *tomember,
250 char * msg) 257 const char * msg)
251 { 258 {
252 MsnOimSendReq *request; 259 MsnOimSendReq *request;
253 260
254 g_return_if_fail(oim != NULL); 261 g_return_if_fail(oim != NULL);
255 262
322 static void 329 static void
323 msn_oim_delete_read_cb(gpointer data, GaimSslConnection *gsc, 330 msn_oim_delete_read_cb(gpointer data, GaimSslConnection *gsc,
324 GaimInputCondition cond) 331 GaimInputCondition cond)
325 { 332 {
326 MsnSoapConn * soapconn = data; 333 MsnSoapConn * soapconn = data;
327 MsnOim * oim = soapconn->session->oim;
328 334
329 gaim_debug_info("MaYuan","OIM delete read buffer:{%s}\n",soapconn->body); 335 gaim_debug_info("MaYuan","OIM delete read buffer:{%s}\n",soapconn->body);
330 336
331 msn_soap_free_read_buf(soapconn); 337 msn_soap_free_read_buf(soapconn);
332 /*get next single Offline Message*/ 338 /*get next single Offline Message*/
402 408
403 gaim_debug_info("MaYuan","oim get SOAP Server connected!\n"); 409 gaim_debug_info("MaYuan","oim get SOAP Server connected!\n");
404 } 410 }
405 411
406 /*Post the Offline Instant Message to User Conversation*/ 412 /*Post the Offline Instant Message to User Conversation*/
407 void 413 static void
408 msn_oim_report_to_user(MsnOim *oim,char *msg_str) 414 msn_oim_report_to_user(MsnOim *oim, char *msg_str)
409 { 415 {
410 MsnMessage *message; 416 MsnMessage *message;
411 char *date,*from,*decode_msg; 417 char *date,*from,*decode_msg;
412 gsize body_len; 418 gsize body_len;
413 char **tokens; 419 char **tokens;
414 char *start,*end; 420 char *start,*end;
415 int has_nick = 0; 421 int has_nick = 0;
416 char *passport_str,*passport; 422 char *passport_str, *passport;
417 char *msg_id; 423 char *msg_id;
418 424
419 message = msn_message_new(MSN_MSG_UNKNOWN); 425 message = msn_message_new(MSN_MSG_UNKNOWN);
420 426
421 msn_message_parse_payload(message,msg_str,strlen(msg_str), 427 msn_message_parse_payload(message, msg_str, strlen(msg_str),
422 MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); 428 MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
423 gaim_debug_info("MaYuan","oim body:{%s}\n",message->body); 429 gaim_debug_info("MaYuan","oim body:{%s}\n",message->body);
424 decode_msg = gaim_base64_decode(message->body,&body_len); 430 decode_msg = gaim_base64_decode(message->body,&body_len);
425 date = (char *)g_hash_table_lookup(message->attr_table, "Date"); 431 date = (char *)g_hash_table_lookup(message->attr_table, "Date");
426 from = (char *)g_hash_table_lookup(message->attr_table, "From"); 432 from = (char *)g_hash_table_lookup(message->attr_table, "From");
427 if(strstr(from," ")){ 433 if(strstr(from," ")){
461 } 467 }
462 468
463 /* Parse the XML data, 469 /* Parse the XML data,
464 * prepare to report the OIM to user 470 * prepare to report the OIM to user
465 */ 471 */
466 void 472 static void
467 msn_oim_get_process(MsnOim *oim,char *oim_msg) 473 msn_oim_get_process(MsnOim *oim, char *oim_msg)
468 { 474 {
469 xmlnode *oimNode,*bodyNode,*responseNode,*msgNode; 475 xmlnode *oimNode,*bodyNode,*responseNode,*msgNode;
470 char *msg_data,*msg_str; 476 char *msg_data,*msg_str;
471 477
472 oimNode = xmlnode_from_str(oim_msg, strlen(oim_msg)); 478 oimNode = xmlnode_from_str(oim_msg, strlen(oim_msg));
567 msn_oim_get_written_cb); 573 msn_oim_get_written_cb);
568 msn_soap_post(oim->retrieveconn,soap_request,msn_oim_retrieve_connect_init); 574 msn_soap_post(oim->retrieveconn,soap_request,msn_oim_retrieve_connect_init);
569 } 575 }
570 576
571 /*msn oim retrieve server connect init */ 577 /*msn oim retrieve server connect init */
572 void 578 static void
573 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) 579 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn)
574 { 580 {
575 gaim_debug_info("MaYuan","msn_oim_connect...\n"); 581 gaim_debug_info("MaYuan","msn_oim_connect...\n");
576 msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1, 582 msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1,
577 msn_oim_get_connect_cb, 583 msn_oim_get_connect_cb,
578 msn_oim_get_error_cb); 584 msn_oim_get_error_cb);
579 } 585 }
580 586
581 /*Msn OIM Send Server Connect Init Function*/ 587 /*Msn OIM Send Server Connect Init Function*/
582 void msn_oim_send_connect_init(MsnSoapConn *sendconn) 588 static void
589 msn_oim_send_connect_init(MsnSoapConn *sendconn)
583 { 590 {
584 gaim_debug_info("MaYuan","msn oim send connect init...\n"); 591 gaim_debug_info("MaYuan","msn oim send connect init...\n");
585 msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1, 592 msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1,
586 msn_oim_send_connect_cb, 593 msn_oim_send_connect_cb,
587 msn_oim_send_error_cb); 594 msn_oim_send_error_cb);