comparison libpurple/protocols/msn/notification.c @ 20449:4403cecc7cd6

propagate from branch 'im.pidgin.pidgin' (head 850e223e9597fdc482eebe75c00efda941b3bdb6) to branch 'im.pidgin.cpw.khc.msnp14' (head 92f5b4953a29318b630e01b296e54d1037fe96d3)
author Stu Tomlinson <stu@nosnilmot.com>
date Sun, 03 Jun 2007 00:40:27 +0000
parents 59e09ff3490d 18ecdee88ed0
children 69febfa6d307
comparison
equal deleted inserted replaced
17667:98f27c7f0ef5 20449:4403cecc7cd6
23 */ 23 */
24 #include "msn.h" 24 #include "msn.h"
25 #include "notification.h" 25 #include "notification.h"
26 #include "state.h" 26 #include "state.h"
27 #include "error.h" 27 #include "error.h"
28 #include "msn-utils.h" 28 #include "msnutils.h"
29 #include "page.h" 29 #include "page.h"
30 30
31 #include "userlist.h" 31 #include "userlist.h"
32 #include "sync.h" 32 #include "sync.h"
33 #include "slplink.h" 33 #include "slplink.h"
34 34
35 static MsnTable *cbs_table; 35 static MsnTable *cbs_table;
36
37 /****************************************************************************
38 * Local Function Prototype
39 ****************************************************************************/
40
41 static void msn_notification_fqy_yahoo(MsnSession *session, const char *passport);
42 static void msn_notification_post_adl(MsnCmdProc *cmdproc, const char *payload, int payload_len);
43 static void msn_add_contact_xml(MsnSession *session, xmlnode *mlNode, const char *passport, int list_op, MsnUserType type);
36 44
37 /************************************************************************** 45 /**************************************************************************
38 * Main 46 * Main
39 **************************************************************************/ 47 **************************************************************************/
40 48
100 cmdproc = servconn->cmdproc; 108 cmdproc = servconn->cmdproc;
101 session = servconn->session; 109 session = servconn->session;
102 account = session->account; 110 account = session->account;
103 111
104 /* Allocate an array for CVR0, NULL, and all the versions */ 112 /* Allocate an array for CVR0, NULL, and all the versions */
105 a = c = g_new0(char *, session->protocol_ver - 8 + 3); 113 // a = c = g_new0(char *, session->protocol_ver - WLM_MIN_PROTOCOL + 3);
106 114 a = c = g_new0(char *, WLM_MAX_PROTOCOL - WLM_MIN_PROTOCOL + 3);
107 for (i = session->protocol_ver; i >= 8; i--) 115
116 // for (i = session->protocol_ver; i >= WLM_MIN_PROTOCOL; i--)
117 for (i = WLM_MAX_PROTOCOL; i >= WLM_MIN_PROTOCOL; i--)
108 *c++ = g_strdup_printf("MSNP%d", i); 118 *c++ = g_strdup_printf("MSNP%d", i);
109 119
110 *c++ = g_strdup("CVR0"); 120 *c++ = g_strdup("CVR0");
111 121
112 vers = g_strjoinv(" ", a); 122 vers = g_strjoinv(" ", a);
113 123
114 if (session->login_step == MSN_LOGIN_STEP_START) 124 if (session->login_step == MSN_LOGIN_STEP_START)
125 {
115 msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE); 126 msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE);
127 }
116 else 128 else
129 {
117 msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE2); 130 msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE2);
131 }
118 132
119 msn_cmdproc_send(cmdproc, "VER", "%s", vers); 133 msn_cmdproc_send(cmdproc, "VER", "%s", vers);
120 134
121 g_strfreev(a); 135 g_strfreev(a);
122 g_free(vers); 136 g_free(vers);
151 /************************************************************************** 165 /**************************************************************************
152 * Util 166 * Util
153 **************************************************************************/ 167 **************************************************************************/
154 168
155 static void 169 static void
156 group_error_helper(MsnSession *session, const char *msg, int group_id, int error) 170 group_error_helper(MsnSession *session, const char *msg, const char *group_id, int error)
157 { 171 {
158 PurpleAccount *account; 172 PurpleAccount *account;
159 PurpleConnection *gc; 173 PurpleConnection *gc;
160 char *reason = NULL; 174 char *reason = NULL;
161 char *title = NULL; 175 char *title = NULL;
170 return; 184 return;
171 } 185 }
172 else 186 else
173 { 187 {
174 const char *group_name; 188 const char *group_name;
175 group_name = 189 group_name = msn_userlist_find_group_name(session->userlist,group_id);
176 msn_userlist_find_group_name(session->userlist,
177 group_id);
178 reason = g_strdup_printf(_("%s is not a valid group."), 190 reason = g_strdup_printf(_("%s is not a valid group."),
179 group_name); 191 group_name);
180 } 192 }
181 } 193 }
182 else 194 else
212 cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 224 cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
213 { 225 {
214 PurpleAccount *account; 226 PurpleAccount *account;
215 227
216 account = cmdproc->session->account; 228 account = cmdproc->session->account;
217
218 msn_cmdproc_send(cmdproc, "USR", "TWN I %s", 229 msn_cmdproc_send(cmdproc, "USR", "TWN I %s",
219 purple_account_get_username(account)); 230 purple_account_get_username(account));
220 } 231 }
221 232
222 static void 233 static void
230 account = session->account; 241 account = session->account;
231 gc = purple_account_get_connection(account); 242 gc = purple_account_get_connection(account);
232 243
233 if (!g_ascii_strcasecmp(cmd->params[1], "OK")) 244 if (!g_ascii_strcasecmp(cmd->params[1], "OK"))
234 { 245 {
235 /* OK */ 246 /* authenticate OK */
247 /* friendly name part no longer true in msnp11 */
248 #if 0
236 const char *friendly = purple_url_decode(cmd->params[3]); 249 const char *friendly = purple_url_decode(cmd->params[3]);
237 250
238 purple_connection_set_display_name(gc, friendly); 251 purple_connection_set_display_name(gc, friendly);
239 252 #endif
240 msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN); 253 msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN);
241 254
242 msn_cmdproc_send(cmdproc, "SYN", "%s", "0"); 255 // msn_cmdproc_send(cmdproc, "SYN", "%s", "0");
256 //TODO we should use SOAP contact to fetch contact list
243 } 257 }
244 else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")) 258 else if (!g_ascii_strcasecmp(cmd->params[1], "TWN"))
245 { 259 {
246 /* Passport authentication */ 260 /* Passport authentication */
247 char **elems, **cur, **tokens; 261 char **elems, **cur, **tokens;
248 262
249 session->nexus = msn_nexus_new(session); 263 session->nexus = msn_nexus_new(session);
250 264
251 /* Parse the challenge data. */ 265 /* Parse the challenge data. */
252 266 session->nexus->challenge_data_str = g_strdup(cmd->params[3]);
253 elems = g_strsplit(cmd->params[3], ",", 0); 267 elems = g_strsplit(cmd->params[3], ",", 0);
254 268
255 for (cur = elems; *cur != NULL; cur++) 269 for (cur = elems; *cur != NULL; cur++)
256 { 270 {
257 tokens = g_strsplit(*cur, "=", 2); 271 tokens = g_strsplit(*cur, "=", 2);
272 if(tokens[0]&&tokens[1])
273 {
274 purple_debug_info("MaYuan","challenge %p,key:%s,value:%s\n",
275 session->nexus->challenge_data,tokens[0],tokens[1]);
258 g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); 276 g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]);
259 /* Don't free each of the tokens, only the array. */ 277 }
260 g_free(tokens); 278 /* Don't free each of the tokens, only the array. */
279 g_free(tokens);
261 } 280 }
262 281
263 g_strfreev(elems); 282 g_strfreev(elems);
264 283
265 msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_START); 284 msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_START);
320 msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL, 339 msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL,
321 NULL); 340 NULL);
322 return; 341 return;
323 } 342 }
324 343
344 /*
345 * Windows Live Messenger 8.0
346 * Notice :CVR String discriminate!
347 * reference of http://www.microsoft.com/globaldev/reference/oslocversion.mspx
348 * to see the Local ID
349 */
325 msn_cmdproc_send(cmdproc, "CVR", 350 msn_cmdproc_send(cmdproc, "CVR",
326 "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s", 351 // "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s",
352 "0x0804 winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs %s",
327 purple_account_get_username(account)); 353 purple_account_get_username(account));
328 } 354 }
329 355
330 /************************************************************************** 356 /**************************************************************************
331 * Log out 357 * Log out
364 { 390 {
365 MsnMessage *msg; 391 MsnMessage *msg;
366 392
367 msg = msn_message_new_from_cmd(cmdproc->session, cmd); 393 msg = msn_message_new_from_cmd(cmdproc->session, cmd);
368 394
369 msn_message_parse_payload(msg, payload, len); 395 msn_message_parse_payload(msg, payload, len,MSG_LINE_DEM,MSG_BODY_DEM);
370 #ifdef MSN_DEBUG_NS 396 #ifdef MSN_DEBUG_NS
371 msn_message_show_readable(msg, "Notification", TRUE); 397 msn_message_show_readable(msg, "Notification", TRUE);
372 #endif 398 #endif
373 399
374 msn_cmdproc_process_msg(cmdproc, msg); 400 msn_cmdproc_process_msg(cmdproc, msg);
377 } 403 }
378 404
379 static void 405 static void
380 msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 406 msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
381 { 407 {
408 purple_debug_info("MaYuan","Processing MSG... \n");
409 if(cmd->payload_len == 0){
410 return;
411 }
382 /* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued 412 /* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
383 * command and we are processing it */ 413 * command and we are processing it */
384
385 if (cmd->payload == NULL) 414 if (cmd->payload == NULL)
386 { 415 {
387 cmdproc->last_cmd->payload_cb = msg_cmd_post; 416 cmdproc->last_cmd->payload_cb = msg_cmd_post;
388 cmdproc->servconn->payload_len = atoi(cmd->params[2]); 417 cmdproc->servconn->payload_len = atoi(cmd->params[2]);
389 } 418 }
390 else 419 else
391 { 420 {
392 g_return_if_fail(cmd->payload_cb != NULL); 421 g_return_if_fail(cmd->payload_cb != NULL);
393 422
423 purple_debug_info("MaYuan","MSG payload:{%s}\n",cmd->payload);
394 cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len); 424 cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len);
425 }
426 }
427
428 /*send Message to Yahoo Messenger*/
429 void
430 uum_send_msg(MsnSession *session,MsnMessage *msg)
431 {
432 MsnCmdProc *cmdproc;
433 MsnTransaction *trans;
434 char *payload;
435 gsize payload_len;
436 int type;
437
438 cmdproc = session->notification->cmdproc;
439 g_return_if_fail(msg != NULL);
440 payload = msn_message_gen_payload(msg, &payload_len);
441 purple_debug_info("MaYuan","send UUM,payload{%s},strlen:%d,len:%d\n",
442 payload,strlen(payload),payload_len);
443 type = msg->type;
444 trans = msn_transaction_new(cmdproc, "UUM","%s 32 %d %d",msg->remote_user,type,payload_len);
445 msn_transaction_set_payload(trans, payload, strlen(payload));
446 msn_cmdproc_send_trans(cmdproc, trans);
447 }
448
449 static void
450 ubm_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
451 size_t len)
452 {
453 MsnMessage *msg;
454 PurpleConnection *gc;
455 const char *passport;
456 const char *content_type;
457
458 purple_debug_info("MaYuan","Process UBM payload:%s\n",payload);
459 msg = msn_message_new_from_cmd(cmdproc->session, cmd);
460
461 msn_message_parse_payload(msg, payload, len,MSG_LINE_DEM,MSG_BODY_DEM);
462 #ifdef MSN_DEBUG_NS
463 msn_message_show_readable(msg, "Notification", TRUE);
464 #endif
465
466 gc = cmdproc->session->account->gc;
467 passport = msg->remote_user;
468
469 content_type = msn_message_get_content_type(msg);
470 purple_debug_info("MaYuan","type:%d\n",content_type);
471 if(!strcmp(content_type,"text/plain")){
472 const char *value;
473 const char *body;
474 char *body_str;
475 char *body_enc;
476 char *body_final = NULL;
477 size_t body_len;
478
479 body = msn_message_get_bin_data(msg, &body_len);
480 body_str = g_strndup(body, body_len);
481 body_enc = g_markup_escape_text(body_str, -1);
482 g_free(body_str);
483
484 if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) {
485 char *pre, *post;
486
487 msn_parse_format(value, &pre, &post);
488 body_final = g_strdup_printf("%s%s%s", pre ? pre : "",
489 body_enc ? body_enc : "", post ? post : "");
490 g_free(pre);
491 g_free(post);
492 g_free(body_enc);
493 }
494 serv_got_im(gc, passport, body_final, 0, time(NULL));
495 }
496 if(!strcmp(content_type,"text/x-msmsgscontrol")){
497 if(msn_message_get_attr(msg, "TypingUser") != NULL){
498 serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT,
499 PURPLE_TYPING);
500 }
501 }
502 if(!strcmp(content_type,"text/x-msnmsgr-datacast")){
503 char *username, *str;
504 PurpleAccount *account;
505 PurpleBuddy *buddy;
506 const char *user;
507
508 account = cmdproc->session->account;
509 user = msg->remote_user;
510
511 if ((buddy = purple_find_buddy(account, user)) != NULL){
512 username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1);
513 }else{
514 username = g_markup_escape_text(user, -1);
515 }
516
517 str = g_strdup_printf(_("%s just sent you a Nudge!"), username);
518 g_free(username);
519 msn_session_report_user(cmdproc->session,user,str,PURPLE_MESSAGE_SYSTEM);
520 g_free(str);
521 }
522 msn_message_destroy(msg);
523 }
524
525 /*Yahoo msg process*/
526 static void
527 ubm_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
528 {
529 purple_debug_info("MaYuan","Processing UBM... \n");
530 if(cmd->payload_len == 0){
531 return;
532 }
533 /* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
534 * command and we are processing it */
535 if (cmd->payload == NULL){
536 cmdproc->last_cmd->payload_cb = ubm_cmd_post;
537 cmdproc->servconn->payload_len = atoi(cmd->params[2]);
538 }else{
539 g_return_if_fail(cmd->payload_cb != NULL);
540
541 purple_debug_info("MaYuan","UBM payload:{%s}\n",cmd->payload);
542 ubm_cmd_post(cmdproc, cmd, cmd->payload, cmd->payload_len);
395 } 543 }
396 } 544 }
397 545
398 /************************************************************************** 546 /**************************************************************************
399 * Challenges 547 * Challenges
548 * we use MD5 to caculate the Challenges
400 **************************************************************************/ 549 **************************************************************************/
401
402 static void 550 static void
403 chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 551 chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
404 { 552 {
405 MsnTransaction *trans; 553 MsnTransaction *trans;
406 char buf[33]; 554 char buf[33];
407 const char *challenge_resp; 555
408 PurpleCipher *cipher; 556 #if 0
409 PurpleCipherContext *context;
410 guchar digest[16];
411 int i;
412
413 cipher = purple_ciphers_find_cipher("md5"); 557 cipher = purple_ciphers_find_cipher("md5");
414 context = purple_cipher_context_new(cipher, NULL); 558 context = purple_cipher_context_new(cipher, NULL);
415
416 purple_cipher_context_append(context, (const guchar *)cmd->params[1], 559 purple_cipher_context_append(context, (const guchar *)cmd->params[1],
417 strlen(cmd->params[1])); 560 strlen(cmd->params[1]));
418 561 challenge_resp = MSNP13_WLM_PRODUCT_KEY;
419 challenge_resp = "VT6PX?UQTM4WM%YR";
420 562
421 purple_cipher_context_append(context, (const guchar *)challenge_resp, 563 purple_cipher_context_append(context, (const guchar *)challenge_resp,
422 strlen(challenge_resp)); 564 strlen(challenge_resp));
423 purple_cipher_context_digest(context, sizeof(digest), digest, NULL); 565 purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
424 purple_cipher_context_destroy(context); 566 purple_cipher_context_destroy(context);
425 567
426 for (i = 0; i < 16; i++) 568 for (i = 0; i < 16; i++)
569 {
427 g_snprintf(buf + (i*2), 3, "%02x", digest[i]); 570 g_snprintf(buf + (i*2), 3, "%02x", digest[i]);
428 571 }
429 trans = msn_transaction_new(cmdproc, "QRY", "%s 32", "PROD0038W!61ZTF9"); 572 #else
573 msn_handle_chl(cmd->params[1], buf);
574 #endif
575 // purple_debug_info("MaYuan","<<challenge:{%s}:{%s}\n",cmd->params[1],buf);
576 trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP13_WLM_PRODUCT_ID);
430 577
431 msn_transaction_set_payload(trans, buf, 32); 578 msn_transaction_set_payload(trans, buf, 32);
432 579
433 msn_cmdproc_send_trans(cmdproc, trans); 580 msn_cmdproc_send_trans(cmdproc, trans);
434 } 581 }
435 582
436 /************************************************************************** 583 /**************************************************************************
437 * Buddy Lists 584 * Buddy Lists
438 **************************************************************************/ 585 **************************************************************************/
439 586 /* add contact to xmlnode */
440 static void 587 static void
441 add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 588 msn_add_contact_xml(MsnSession *session, xmlnode *mlNode,const char *passport,int list_op, MsnUserType type)
589 {
590 xmlnode *d_node,*c_node;
591 char **tokens;
592 char *email,*domain;
593 char *list_op_str,*type_str;
594
595 purple_debug_info("MaYuan","passport:%s type: %d\n",passport, type);
596 tokens = g_strsplit(passport, "@", 2);
597 email = tokens[0];
598 domain = tokens[1];
599
600 /*find a domain Node*/
601 for(d_node = xmlnode_get_child(mlNode,"d"); d_node; d_node = xmlnode_get_next_twin(d_node))
602 {
603 const char * attr = NULL;
604 purple_debug_info("MaYuan","d_node:%s\n",d_node->name);
605 attr = xmlnode_get_attrib(d_node,"n");
606 if(attr == NULL){
607 continue;
608 }
609 if(!strcmp(attr,domain)){
610 break;
611 }
612 }
613 if(d_node == NULL)
614 {
615 /*domain not found, create a new domain Node*/
616 purple_debug_info("MaYuan","get No d_node\n");
617 d_node = xmlnode_new("d");
618 xmlnode_set_attrib(d_node,"n",domain);
619 xmlnode_insert_child(mlNode,d_node);
620 }
621
622 /*create contact node*/
623 c_node = xmlnode_new("c");
624 xmlnode_set_attrib(c_node,"n",email);
625
626 list_op_str = g_strdup_printf("%d",list_op);
627 purple_debug_info("MaYuan","list_op:%d\n",list_op);
628 xmlnode_set_attrib(c_node,"l",list_op_str);
629 g_free(list_op_str);
630
631 if (type != MSN_USER_TYPE_UNKNOWN) {
632 type_str = g_strdup_printf("%d", type);
633 } else {
634 if (msn_user_is_yahoo(session->account, passport))
635 type_str = g_strdup_printf("%d", MSN_USER_TYPE_YAHOO);
636 else
637 type_str = g_strdup_printf("%d", MSN_USER_TYPE_PASSPORT);
638 }
639 /*mobile*/
640 //type_str = g_strdup_printf("4");
641 xmlnode_set_attrib(c_node,"t",type_str);
642 g_free(type_str);
643
644 xmlnode_insert_child(d_node, c_node);
645
646 g_strfreev(tokens);
647 }
648
649 static void
650 msn_notification_post_adl(MsnCmdProc *cmdproc, const char *payload, int payload_len)
651 {
652 MsnTransaction *trans;
653
654 purple_debug_info("MaYuan","Send ADL{%s}\n",payload);
655 trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload));
656 msn_transaction_set_payload(trans, payload, strlen(payload));
657 msn_cmdproc_send_trans(cmdproc, trans);
658 }
659
660 /*dump contact info to NS*/
661 void
662 msn_notification_dump_contact(MsnSession *session)
663 {
664 MsnUser *user;
665 GList *l;
666 xmlnode *adl_node;
667 char *payload;
668 int payload_len;
669 int adl_count = 0;
670 const char *display_name;
671
672 adl_node = xmlnode_new("ml");
673 adl_node->child = NULL;
674 xmlnode_set_attrib(adl_node, "l", "1");
675
676 /*get the userlist*/
677 for (l = session->userlist->users; l != NULL; l = l->next){
678 user = l->data;
679
680 /* skip RL & PL during initial dump */
681 if (!(user->list_op & MSN_LIST_OP_MASK))
682 continue;
683
684 msn_add_contact_xml(session, adl_node, user->passport,
685 user->list_op & MSN_LIST_OP_MASK, user->type);
686
687 /* each ADL command may contain up to 150 contacts */
688 if (++adl_count % 150 == 0 || l->next == NULL) {
689 payload = xmlnode_to_str(adl_node,&payload_len);
690
691 msn_notification_post_adl(session->notification->cmdproc,
692 payload, payload_len);
693
694 g_free(payload);
695 xmlnode_free(adl_node);
696
697 if (l->next) {
698 adl_node = xmlnode_new("ml");
699 adl_node->child = NULL;
700 xmlnode_set_attrib(adl_node, "l", "1");
701 }
702 }
703 }
704
705
706 display_name = purple_connection_get_display_name(session->account->gc);
707 if (display_name && strcmp(display_name,
708 purple_account_get_username(session->account))) {
709 msn_act_id(session->account->gc, display_name);
710 }
711
712 }
713
714 /*Post FQY to NS,Inform add a Yahoo User*/
715 static void
716 msn_notification_fqy_yahoo(MsnSession *session, const char *passport)
717 {
718 MsnTransaction *trans;
719 MsnCmdProc *cmdproc;
720 char* email,*domain,*payload;
721 char **tokens;
722
723 cmdproc = session->notification->cmdproc;
724
725 tokens = g_strsplit(passport, "@", 2);
726 email = tokens[0];
727 domain = tokens[1];
728
729 payload = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>",domain,email);
730 trans = msn_transaction_new(cmdproc, "FQY","%d",strlen(payload));
731 msn_transaction_set_payload(trans, payload, strlen(payload));
732 msn_cmdproc_send_trans(cmdproc, trans);
733
734 g_free(payload);
735 g_free(tokens);
736 }
737
738 static void
739 blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
740 {
741 purple_debug_info("MaYuan","Process BLP\n");
742 }
743
744 static void
745 adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
746 {
747 purple_debug_info("MaYuan","Process ADL\n");
748 }
749
750 static void
751 adl_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
442 { 752 {
443 MsnSession *session; 753 MsnSession *session;
444 MsnUser *user; 754 PurpleAccount *account;
445 const char *list; 755 PurpleConnection *gc;
446 const char *passport; 756 char *reason = NULL;
447 const char *friendly;
448 MsnListId list_id;
449 int group_id;
450
451 list = cmd->params[1];
452 passport = cmd->params[3];
453 friendly = purple_url_decode(cmd->params[4]);
454 757
455 session = cmdproc->session; 758 session = cmdproc->session;
456 759 account = session->account;
457 user = msn_userlist_find_user(session->userlist, passport); 760 gc = purple_account_get_connection(account);
458 761
459 if (user == NULL) 762 purple_debug_error("msn","ADL error\n");
460 { 763 reason = g_strdup_printf(_("Unknown error (%d)"), error);
461 user = msn_user_new(session->userlist, passport, friendly); 764 purple_notify_error(gc, NULL, _("Unable to add user"), reason);
462 msn_userlist_add_user(session->userlist, user); 765 g_free(reason);
463 } 766 }
464 else 767
465 msn_user_set_friendly_name(user, friendly); 768 static void
466 769 fqy_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
467 list_id = msn_get_list_id(list); 770 size_t len)
468 771 {
469 if (cmd->param_count >= 6) 772 purple_debug_info("MaYuan","FQY payload{%s}\n",payload);
470 group_id = atoi(cmd->params[5]); 773 msn_notification_post_adl(cmdproc,payload,len);
471 else 774 }
472 group_id = -1; 775
473 776 static void
474 msn_got_add_user(session, user, list_id, group_id); 777 fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
475 msn_user_update(user); 778 {
779 purple_debug_info("MaYuan","Process FQY\n");
780 cmdproc->last_cmd->payload_cb = fqy_cmd_post;
781 }
782
783 static void
784 rml_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
785 {
786 #if 0
787 MsnTransaction *trans;
788 char * payload;
789 #endif
790
791 purple_debug_info("MaYuan","Process RML\n");
792 #if 0
793 trans = msn_transaction_new(cmdproc, "RML","");
794
795 msn_transaction_set_payload(trans, payload, strlen(payload));
796
797 msn_cmdproc_send_trans(cmdproc, trans);
798 #endif
476 } 799 }
477 800
478 static void 801 static void
479 add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) 802 add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
480 { 803 {
565 888
566 group_id = atoi(cmd->params[3]); 889 group_id = atoi(cmd->params[3]);
567 890
568 group_name = purple_url_decode(cmd->params[2]); 891 group_name = purple_url_decode(cmd->params[2]);
569 892
570 msn_group_new(session->userlist, group_id, group_name); 893 msn_group_new(session->userlist, cmd->params[3], group_name);
571 894
572 /* There is a user that must me moved to this group */ 895 /* There is a user that must me moved to this group */
573 if (cmd->trans->data) 896 if (cmd->trans->data)
574 { 897 {
575 /* msn_userlist_move_buddy(); */ 898 /* msn_userlist_move_buddy(); */
629 MsnSession *session; 952 MsnSession *session;
630 PurpleAccount *account; 953 PurpleAccount *account;
631 PurpleConnection *gc; 954 PurpleConnection *gc;
632 MsnUser *user; 955 MsnUser *user;
633 MsnObject *msnobj; 956 MsnObject *msnobj;
957 int wlmclient;
634 const char *state, *passport, *friendly; 958 const char *state, *passport, *friendly;
635 959
636 session = cmdproc->session; 960 session = cmdproc->session;
637 account = session->account; 961 account = session->account;
638 gc = purple_account_get_connection(account); 962 gc = purple_account_get_connection(account);
639 963
640 state = cmd->params[1]; 964 state = cmd->params[1];
641 passport = cmd->params[2]; 965 passport = cmd->params[2];
642 friendly = purple_url_decode(cmd->params[3]); 966 /*if a contact is actually on the WLM part or the yahoo part*/
967 wlmclient = atoi(cmd->params[3]);
968 friendly = purple_url_decode(cmd->params[4]);
643 969
644 user = msn_userlist_find_user(session->userlist, passport); 970 user = msn_userlist_find_user(session->userlist, passport);
645 971
646 serv_got_alias(gc, passport, friendly); 972 serv_got_alias(gc, passport, friendly);
647 973
648 msn_user_set_friendly_name(user, friendly); 974 msn_user_set_friendly_name(user, friendly);
649 975
650 if (session->protocol_ver >= 9 && cmd->param_count == 6) 976 if (session->protocol_ver >= 9 && cmd->param_count == 8)
651 { 977 {
652 msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5])); 978 msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[6]));
653 msn_user_set_object(user, msnobj); 979 msn_user_set_object(user, msnobj);
654 } 980 }
655 981
656 msn_user_set_state(user, state); 982 msn_user_set_state(user, state);
657 msn_user_update(user); 983 msn_user_update(user);
679 PurpleAccount *account; 1005 PurpleAccount *account;
680 PurpleConnection *gc; 1006 PurpleConnection *gc;
681 MsnUser *user; 1007 MsnUser *user;
682 MsnObject *msnobj; 1008 MsnObject *msnobj;
683 int clientid; 1009 int clientid;
1010 int wlmclient;
684 const char *state, *passport, *friendly, *old_friendly; 1011 const char *state, *passport, *friendly, *old_friendly;
685 1012
686 session = cmdproc->session; 1013 session = cmdproc->session;
687 account = session->account; 1014 account = session->account;
688 gc = purple_account_get_connection(account); 1015 gc = purple_account_get_connection(account);
689 1016
690 state = cmd->params[0]; 1017 state = cmd->params[0];
691 passport = cmd->params[1]; 1018 passport = cmd->params[1];
692 friendly = purple_url_decode(cmd->params[2]); 1019 wlmclient = atoi(cmd->params[2]);
1020 friendly = purple_url_decode(cmd->params[3]);
693 1021
694 user = msn_userlist_find_user(session->userlist, passport); 1022 user = msn_userlist_find_user(session->userlist, passport);
695 1023
696 old_friendly = msn_user_get_friendly_name(user); 1024 old_friendly = msn_user_get_friendly_name(user);
697 if (!old_friendly || (old_friendly && strcmp(old_friendly, friendly))) 1025 if (!old_friendly || (old_friendly && strcmp(old_friendly, friendly)))
700 msn_user_set_friendly_name(user, friendly); 1028 msn_user_set_friendly_name(user, friendly);
701 } 1029 }
702 1030
703 if (session->protocol_ver >= 9) 1031 if (session->protocol_ver >= 9)
704 { 1032 {
705 if (cmd->param_count == 5) 1033 if (cmd->param_count == 7)
706 { 1034 {
707 msnobj = 1035 msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5]));
708 msn_object_new_from_string(purple_url_decode(cmd->params[4]));
709 msn_user_set_object(user, msnobj); 1036 msn_user_set_object(user, msnobj);
710 } 1037 }
711 else 1038 else
712 { 1039 {
713 msn_user_set_object(user, NULL); 1040 msn_user_set_object(user, NULL);
714 } 1041 }
715 } 1042 }
716 1043
717 clientid = atoi(cmd->params[3]); 1044 clientid = atoi(cmd->params[4]);
718 user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE); 1045 user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE);
719 1046
720 msn_user_set_state(user, state); 1047 msn_user_set_state(user, state);
721 msn_user_update(user); 1048 msn_user_update(user);
722 } 1049 }
808 msn_user_set_home_phone(session->user, NULL); 1135 msn_user_set_home_phone(session->user, NULL);
809 else if (!strcmp(type, "PHW")) 1136 else if (!strcmp(type, "PHW"))
810 msn_user_set_work_phone(session->user, NULL); 1137 msn_user_set_work_phone(session->user, NULL);
811 else if (!strcmp(type, "PHM")) 1138 else if (!strcmp(type, "PHM"))
812 msn_user_set_mobile_phone(session->user, NULL); 1139 msn_user_set_mobile_phone(session->user, NULL);
1140 else if (!strcmp(type, "MFM")) {
1141 type = cmd->params[1];
1142 purple_connection_set_display_name(
1143 purple_account_get_connection(session->account),
1144 purple_url_decode(cmd->params[2]));
1145 }
813 } 1146 }
814 } 1147 }
815 1148
816 static void 1149 static void
817 reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 1150 reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
818 { 1151 {
819 MsnSession *session; 1152 MsnSession *session;
820 int group_id; 1153 const char *group_id, *group_name;
821 const char *group_name;
822 1154
823 session = cmdproc->session; 1155 session = cmdproc->session;
824 group_id = atoi(cmd->params[2]); 1156 group_id = cmd->params[2];
825 group_name = purple_url_decode(cmd->params[3]); 1157 group_name = purple_url_decode(cmd->params[3]);
826 1158
827 msn_userlist_rename_group_id(session->userlist, group_id, group_name); 1159 msn_userlist_rename_group_id(session->userlist, group_id, group_name);
828 } 1160 }
829 1161
830 static void 1162 static void
831 reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) 1163 reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
832 { 1164 {
833 int group_id; 1165 const char * group_id;
834 char **params; 1166 char **params;
835 1167
836 params = g_strsplit(trans->params, " ", 0); 1168 params = g_strsplit(trans->params, " ", 0);
837 1169
838 group_id = atoi(params[0]); 1170 group_id = params[0];
839 1171
840 group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error); 1172 group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error);
841 1173
842 g_strfreev(params); 1174 g_strfreev(params);
843 } 1175 }
845 static void 1177 static void
846 rem_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 1178 rem_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
847 { 1179 {
848 MsnSession *session; 1180 MsnSession *session;
849 MsnUser *user; 1181 MsnUser *user;
850 const char *list; 1182 const char *group_id, *list, *passport;
851 const char *passport;
852 MsnListId list_id; 1183 MsnListId list_id;
853 int group_id;
854 1184
855 session = cmdproc->session; 1185 session = cmdproc->session;
856 list = cmd->params[1]; 1186 list = cmd->params[1];
857 passport = cmd->params[3]; 1187 passport = cmd->params[3];
858 user = msn_userlist_find_user(session->userlist, passport); 1188 user = msn_userlist_find_user(session->userlist, passport);
860 g_return_if_fail(user != NULL); 1190 g_return_if_fail(user != NULL);
861 1191
862 list_id = msn_get_list_id(list); 1192 list_id = msn_get_list_id(list);
863 1193
864 if (cmd->param_count == 5) 1194 if (cmd->param_count == 5)
865 group_id = atoi(cmd->params[4]); 1195 group_id = cmd->params[4];
866 else 1196 else
867 group_id = -1; 1197 group_id = NULL;
868 1198
869 msn_got_rem_user(session, user, list_id, group_id); 1199 msn_got_rem_user(session, user, list_id, group_id);
870 msn_user_update(user); 1200 msn_user_update(user);
871 } 1201 }
872 1202
873 static void 1203 static void
874 rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 1204 rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
875 { 1205 {
876 MsnSession *session; 1206 MsnSession *session;
877 int group_id; 1207 const char *group_id;
878 1208
879 session = cmdproc->session; 1209 session = cmdproc->session;
880 group_id = atoi(cmd->params[2]); 1210 group_id = cmd->params[2];
881 1211
882 msn_userlist_remove_group_id(session->userlist, group_id); 1212 msn_userlist_remove_group_id(session->userlist, group_id);
883 } 1213 }
884 1214
885 static void 1215 static void
886 rmg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) 1216 rmg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
887 { 1217 {
888 int group_id; 1218 const char *group_id;
889 char **params; 1219 char **params;
890 1220
891 params = g_strsplit(trans->params, " ", 0); 1221 params = g_strsplit(trans->params, " ", 0);
892 1222
893 group_id = atoi(params[0]); 1223 group_id = params[0];
894 1224
895 group_error_helper(cmdproc->session, _("Unable to delete group"), group_id, error); 1225 group_error_helper(cmdproc->session, _("Unable to delete group"), group_id, error);
896 1226
897 g_strfreev(params); 1227 g_strfreev(params);
898 } 1228 }
1133 } 1463 }
1134 1464
1135 g_free(host); 1465 g_free(host);
1136 } 1466 }
1137 1467
1468 static void
1469 gcf_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
1470 size_t len)
1471 {
1472 /*get the payload content*/
1473 purple_debug_info("MaYuan","GCF{%s}\n",cmd->payload);
1474 }
1475
1476 static void
1477 gcf_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1478 {
1479 purple_debug_info("MaYuan","Processing GCF... \n");
1480 cmdproc->last_cmd->payload_cb = gcf_cmd_post;
1481 return;
1482 }
1483
1484 static void
1485 sbs_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1486 {
1487 purple_debug_info("MaYuan","Processing SBS... \n");
1488 if(cmd->payload_len == 0){
1489 return;
1490 }
1491 /*get the payload content*/
1492 }
1493
1494 /*
1495 * Get the UBX's PSM info
1496 * Post it to the User status
1497 * Thanks for Chris <ukdrizzle@yahoo.co.uk>'s code
1498 */
1499 static void
1500 ubx_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
1501 size_t len)
1502 {
1503 MsnSession *session;
1504 PurpleAccount *account;
1505 PurpleConnection *gc;
1506 MsnUser *user;
1507 const char *passport;
1508 char *psm_str, *currentmedia_str;
1509
1510 /*get the payload content*/
1511 // purple_debug_info("MaYuan","UBX {%s} payload{%s}\n",cmd->params[0], cmd->payload);
1512
1513 session = cmdproc->session;
1514 account = session->account;
1515 gc = purple_account_get_connection(account);
1516
1517 passport = cmd->params[0];
1518 user = msn_userlist_find_user(session->userlist, passport);
1519
1520 psm_str = msn_get_psm(cmd->payload,len);
1521 currentmedia_str = msn_parse_currentmedia(
1522 msn_get_currentmedia(cmd->payload, len));
1523
1524 msn_user_set_statusline(user, psm_str);
1525 msn_user_set_currentmedia(user, currentmedia_str);
1526 msn_user_update(user);
1527
1528 g_free(psm_str);
1529 g_free(currentmedia_str);
1530 }
1531
1532 static void
1533 ubx_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1534 {
1535 purple_debug_info("MaYuan","UBX... \n");
1536 if(cmd->payload_len == 0){
1537 return;
1538 }
1539 cmdproc->last_cmd->payload_cb = ubx_cmd_post;
1540 }
1541
1542 static void
1543 uux_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1544 {
1545 purple_debug_info("MaYuan","UUX... \n");
1546 }
1547
1138 /************************************************************************** 1548 /**************************************************************************
1139 * Message Types 1549 * Message Types
1140 **************************************************************************/ 1550 **************************************************************************/
1141 1551
1142 static void 1552 static void
1143 profile_msg(MsnCmdProc *cmdproc, MsnMessage *msg) 1553 profile_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1144 { 1554 {
1145 MsnSession *session; 1555 MsnSession *session;
1146 const char *value; 1556 const char *value;
1147 1557 const char *clLastChange;
1558
1559 purple_debug_info("MaYuan","profile_msg... \n");
1148 session = cmdproc->session; 1560 session = cmdproc->session;
1149 1561
1150 if (strcmp(msg->remote_user, "Hotmail")) 1562 if (strcmp(msg->remote_user, "Hotmail"))
1151 /* This isn't an official message. */ 1563 /* This isn't an official message. */
1152 return; 1564 return;
1174 g_free(session->passport_info.client_ip); 1586 g_free(session->passport_info.client_ip);
1175 session->passport_info.client_ip = g_strdup(value); 1587 session->passport_info.client_ip = g_strdup(value);
1176 } 1588 }
1177 1589
1178 if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL) 1590 if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL)
1591 {
1179 session->passport_info.client_port = ntohs(atoi(value)); 1592 session->passport_info.client_port = ntohs(atoi(value));
1593 }
1180 1594
1181 if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL) 1595 if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL)
1182 session->passport_info.sl = atol(value); 1596 session->passport_info.sl = atol(value);
1597
1598 /*starting retrieve the contact list*/
1599 clLastChange = purple_account_get_string(session->account, "CLLastChange", NULL);
1600 session->contact = msn_contact_new(session);
1601 #ifdef MSN_PARTIAL_LISTS
1602 /* msn_userlist_load defeats all attempts at trying to detect blist sync issues */
1603 msn_userlist_load(session);
1604 msn_get_contact_list(session->contact, clLastChange);
1605 #else
1606 /* always get the full list? */
1607 msn_get_contact_list(session->contact, NULL);
1608 #endif
1609 #if 0
1610 msn_contact_connect(session->contact);
1611 #endif
1183 } 1612 }
1184 1613
1185 static void 1614 static void
1186 initial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) 1615 initial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1187 { 1616 {
1231 &passport, &url, NULL, NULL); 1660 &passport, &url, NULL, NULL);
1232 } 1661 }
1233 } 1662 }
1234 1663
1235 g_hash_table_destroy(table); 1664 g_hash_table_destroy(table);
1665 }
1666
1667 /*offline Message notification process*/
1668 static void
1669 initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1670 {
1671 MsnSession *session;
1672 PurpleConnection *gc;
1673 GHashTable *table;
1674 const char *mdata, *unread;
1675
1676 session = cmdproc->session;
1677 gc = session->account->gc;
1678
1679 if (strcmp(msg->remote_user, "Hotmail"))
1680 /* This isn't an official message. */
1681 return;
1682
1683 /*new a oim session*/
1684 session->oim = msn_oim_new(session);
1685 // msn_oim_connect(session->oim);
1686
1687 table = msn_message_get_hashtable_from_body(msg);
1688
1689 mdata = g_hash_table_lookup(table, "Mail-Data");
1690
1691 if (mdata != NULL)
1692 msn_parse_oim_msg(session->oim, mdata);
1693
1694 if (g_hash_table_lookup(table, "Inbox-URL") == NULL)
1695 {
1696 g_hash_table_destroy(table);
1697 return;
1698 }
1699
1700 if (session->passport_info.file == NULL)
1701 {
1702 MsnTransaction *trans;
1703 trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");
1704 msn_transaction_queue_cmd(trans, msg->cmd);
1705
1706 msn_cmdproc_send_trans(cmdproc, trans);
1707
1708 g_hash_table_destroy(table);
1709 return;
1710 }
1711
1712 if (!purple_account_get_check_mail(session->account))
1713 {
1714 g_hash_table_destroy(table);
1715 return;
1716 }
1717
1718 unread = g_hash_table_lookup(table, "Inbox-Unread");
1719
1720 if (unread != NULL)
1721 {
1722 int count = atoi(unread);
1723
1724 if (count > 0)
1725 {
1726 const char *passport;
1727 const char *url;
1728
1729 passport = msn_user_get_passport(session->user);
1730 url = session->passport_info.file;
1731
1732 purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL,
1733 &passport, &url, NULL, NULL);
1734 }
1735 }
1736
1737 g_hash_table_destroy(table);
1738 }
1739
1740 /*offline Message Notification*/
1741 static void
1742 delete_oim_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1743 {
1236 } 1744 }
1237 1745
1238 static void 1746 static void
1239 email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) 1747 email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1240 { 1748 {
1336 } 1844 }
1337 1845
1338 void 1846 void
1339 msn_notification_add_buddy(MsnNotification *notification, const char *list, 1847 msn_notification_add_buddy(MsnNotification *notification, const char *list,
1340 const char *who, const char *store_name, 1848 const char *who, const char *store_name,
1341 int group_id) 1849 const char *group_id)
1342 { 1850 {
1343 MsnCmdProc *cmdproc; 1851 MsnCmdProc *cmdproc;
1852 xmlnode *adl_node;
1853 char *payload;
1854 int payload_len;
1855
1344 cmdproc = notification->servconn->cmdproc; 1856 cmdproc = notification->servconn->cmdproc;
1345 1857
1346 if (group_id < 0 && !strcmp(list, "FL")) 1858 adl_node = xmlnode_new("ml");
1347 group_id = 0; 1859 adl_node->child = NULL;
1348 1860
1349 if (group_id >= 0) 1861 msn_add_contact_xml(notification->session,adl_node,who,1,MSN_USER_TYPE_PASSPORT);
1350 { 1862
1351 msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d", 1863 payload = xmlnode_to_str(adl_node,&payload_len);
1352 list, who, store_name, group_id); 1864 xmlnode_free(adl_node);
1865 if (msn_user_is_yahoo(notification->session->account,who))
1866 {
1867 msn_notification_fqy_yahoo(notification->session, who);
1353 } 1868 }
1354 else 1869 else
1355 { 1870 {
1356 msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name); 1871 msn_notification_post_adl(notification->servconn->cmdproc,
1872 payload,payload_len);
1357 } 1873 }
1358 } 1874 }
1359 1875
1360 void 1876 void
1361 msn_notification_rem_buddy(MsnNotification *notification, const char *list, 1877 msn_notification_rem_buddy(MsnNotification *notification, const char *list,
1362 const char *who, int group_id) 1878 const char *who, const char *group_id)
1363 { 1879 {
1364 MsnCmdProc *cmdproc; 1880 MsnCmdProc *cmdproc;
1881 MsnTransaction *trans;
1882 xmlnode *rml_node;
1883 char *payload;
1884 int payload_len;
1885
1365 cmdproc = notification->servconn->cmdproc; 1886 cmdproc = notification->servconn->cmdproc;
1366 1887
1367 if (group_id >= 0) 1888 rml_node = xmlnode_new("ml");
1368 { 1889 rml_node->child = NULL;
1369 msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id); 1890
1370 } 1891 msn_add_contact_xml(notification->session,rml_node,who,1,MSN_USER_TYPE_PASSPORT);
1371 else 1892
1372 { 1893 payload = xmlnode_to_str(rml_node,&payload_len);
1373 msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who); 1894 xmlnode_free(rml_node);
1374 } 1895
1896 purple_debug_info("MaYuan","RML{%s}\n",payload);
1897 trans = msn_transaction_new(cmdproc, "RML","%d",strlen(payload));
1898 msn_transaction_set_payload(trans, payload, strlen(payload));
1899 msn_cmdproc_send_trans(cmdproc, trans);
1375 } 1900 }
1376 1901
1377 /************************************************************************** 1902 /**************************************************************************
1378 * Init 1903 * Init
1379 **************************************************************************/ 1904 **************************************************************************/
1380
1381 void 1905 void
1382 msn_notification_init(void) 1906 msn_notification_init(void)
1383 { 1907 {
1384 /* TODO: check prp, blp */ 1908 /* TODO: check prp, blp */
1385 1909
1386 cbs_table = msn_table_new(); 1910 cbs_table = msn_table_new();
1387 1911
1388 /* Synchronous */ 1912 /* Synchronous */
1389 msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL); 1913 msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL);
1390 msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd); 1914 msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd);
1391 msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd); 1915 msn_table_add_cmd(cbs_table, "ADL", "ILN", iln_cmd);
1392 msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd);
1393 msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); 1916 msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd);
1394 msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); 1917 msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd);
1395 msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd); 1918 msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd);
1919 msn_table_add_cmd(cbs_table, "USR", "GCF", gcf_cmd);
1396 msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd); 1920 msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd);
1397 msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd); 1921 msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd);
1398 msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd); 1922 msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd);
1399 msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd); 1923 msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd);
1400 msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd); 1924 msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd);
1401 /* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */ 1925 msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd);
1402 msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL); 1926 // msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL);
1403 msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd); 1927 msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd);
1404 msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd); 1928 msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd);
1405 msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd); 1929 msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd);
1406 msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd); 1930 msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd);
1407 1931
1408 /* Asynchronous */ 1932 /* Asynchronous */
1409 msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd); 1933 msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd);
1410 msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); 1934 msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd);
1935 msn_table_add_cmd(cbs_table, NULL, "UBM", ubm_cmd);
1936 msn_table_add_cmd(cbs_table, NULL, "GCF", gcf_cmd);
1937 msn_table_add_cmd(cbs_table, NULL, "SBS", sbs_cmd);
1411 msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); 1938 msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd);
1412 1939
1413 msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); 1940 msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd);
1414 msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd); 1941 msn_table_add_cmd(cbs_table, NULL, "RML", rml_cmd);
1415 msn_table_add_cmd(cbs_table, NULL, "ADD", add_cmd); 1942 msn_table_add_cmd(cbs_table, NULL, "ADL", adl_cmd);
1943 msn_table_add_cmd(cbs_table, NULL, "FQY", fqy_cmd);
1416 1944
1417 msn_table_add_cmd(cbs_table, NULL, "QRY", NULL); 1945 msn_table_add_cmd(cbs_table, NULL, "QRY", NULL);
1418 msn_table_add_cmd(cbs_table, NULL, "QNG", qng_cmd); 1946 msn_table_add_cmd(cbs_table, NULL, "QNG", qng_cmd);
1419 msn_table_add_cmd(cbs_table, NULL, "FLN", fln_cmd); 1947 msn_table_add_cmd(cbs_table, NULL, "FLN", fln_cmd);
1420 msn_table_add_cmd(cbs_table, NULL, "NLN", nln_cmd); 1948 msn_table_add_cmd(cbs_table, NULL, "NLN", nln_cmd);
1421 msn_table_add_cmd(cbs_table, NULL, "ILN", iln_cmd); 1949 msn_table_add_cmd(cbs_table, NULL, "ILN", iln_cmd);
1422 msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); 1950 msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd);
1423 msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd); 1951 msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd);
1424 1952
1953 msn_table_add_cmd(cbs_table, NULL, "UBX", ubx_cmd);
1954 msn_table_add_cmd(cbs_table, NULL, "UUX", uux_cmd);
1955
1425 msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd); 1956 msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd);
1426 1957
1427 msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd); 1958 msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd);
1428 1959
1429 msn_table_add_error(cbs_table, "ADD", add_error); 1960 msn_table_add_error(cbs_table, "ADD", add_error);
1961 msn_table_add_error(cbs_table, "ADL", adl_error);
1430 msn_table_add_error(cbs_table, "REG", reg_error); 1962 msn_table_add_error(cbs_table, "REG", reg_error);
1431 msn_table_add_error(cbs_table, "RMG", rmg_error); 1963 msn_table_add_error(cbs_table, "RMG", rmg_error);
1432 /* msn_table_add_error(cbs_table, "REA", rea_error); */ 1964 /* msn_table_add_error(cbs_table, "REA", rea_error); */
1433 msn_table_add_error(cbs_table, "USR", usr_error); 1965 msn_table_add_error(cbs_table, "USR", usr_error);
1434 1966
1435 msn_table_add_msg_type(cbs_table, 1967 msn_table_add_msg_type(cbs_table,
1436 "text/x-msmsgsprofile", 1968 "text/x-msmsgsprofile",
1437 profile_msg); 1969 profile_msg);
1970 /*initial OIM notification*/
1971 msn_table_add_msg_type(cbs_table,
1972 "text/x-msmsgsinitialmdatanotification",
1973 initial_mdata_msg);
1974 /*OIM notification when user online*/
1975 msn_table_add_msg_type(cbs_table,
1976 "text/x-msmsgsoimnotification",
1977 initial_mdata_msg);
1438 msn_table_add_msg_type(cbs_table, 1978 msn_table_add_msg_type(cbs_table,
1439 "text/x-msmsgsinitialemailnotification", 1979 "text/x-msmsgsinitialemailnotification",
1440 initial_email_msg); 1980 initial_email_msg);
1441 msn_table_add_msg_type(cbs_table, 1981 msn_table_add_msg_type(cbs_table,
1442 "text/x-msmsgsemailnotification", 1982 "text/x-msmsgsemailnotification",
1443 email_msg); 1983 email_msg);
1984 /*delete an offline Message notification*/
1985 msn_table_add_msg_type(cbs_table,
1986 "text/x-msmsgsactivemailnotification",
1987 delete_oim_msg);
1444 msn_table_add_msg_type(cbs_table, 1988 msn_table_add_msg_type(cbs_table,
1445 "application/x-msmsgssystemmessage", 1989 "application/x-msmsgssystemmessage",
1446 system_msg); 1990 system_msg);
1447 } 1991 }
1448 1992
1449 void 1993 void
1450 msn_notification_end(void) 1994 msn_notification_end(void)
1451 { 1995 {
1452 msn_table_destroy(cbs_table); 1996 msn_table_destroy(cbs_table);
1453 } 1997 }
1998