Mercurial > pidgin.yaz
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 |