comparison src/protocols/msn/msn.c @ 9193:502707ca1836

[gaim-migrate @ 9988] Patch by Felipe Contreras to add MSN file transfer and buddy icons. Please test and report any bugs! committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sun, 06 Jun 2004 02:39:08 +0000
parents c30d81b4dd22
children ab6636c5a136
comparison
equal deleted inserted replaced
9192:5655dcd94d0f 9193:502707ca1836
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */ 21 */
22 #include <glib.h> 22 #include <glib.h>
23 #include "internal.h" 23
24
25 #include "blist.h"
26 #include "msn.h" 24 #include "msn.h"
27 #include "accountopt.h" 25 #include "accountopt.h"
28 #include "msg.h" 26 #include "msg.h"
29 #include "page.h" 27 #include "page.h"
30 #include "pluginpref.h" 28 #include "pluginpref.h"
31 #include "prefs.h" 29 #include "prefs.h"
32 #include "session.h" 30 #include "session.h"
33 #include "state.h" 31 #include "state.h"
34 #include "utils.h" 32 #include "utils.h"
33 #include "multi.h"
35 #include "util.h" 34 #include "util.h"
36 35
36 #include "switchboard.h"
37 #include "notification.h" 37 #include "notification.h"
38 #include "switchboard.h" 38 #include "sync.h"
39 #include "slplink.h"
39 40
40 #define BUDDY_ALIAS_MAXLEN 387 41 #define BUDDY_ALIAS_MAXLEN 387
41 42
42 static GaimPlugin *my_protocol = NULL; 43 static GaimPlugin *my_protocol = NULL;
43 44
80 MsnSession *session; 81 MsnSession *session;
81 GaimAccount *account; 82 GaimAccount *account;
82 const char *alias; 83 const char *alias;
83 84
84 session = gc->proto_data; 85 session = gc->proto_data;
85 cmdproc = session->notification_conn->cmdproc; 86 cmdproc = session->notification->cmdproc;
86 account = gaim_connection_get_account(gc); 87 account = gaim_connection_get_account(gc);
87 88
88 alias = (entry && *entry) ? entry : ""; 89 alias = (entry && *entry) ? entry : "";
89 90
90 if (strlen(alias) > BUDDY_ALIAS_MAXLEN) 91 if (strlen(alias) > BUDDY_ALIAS_MAXLEN)
91 { 92 {
92 gaim_notify_error(gc, NULL, 93 gaim_notify_error(gc, NULL,
93 _("Your new MSN friendly name is too long."), NULL); 94 _("Your new MSN friendly name is too long."), NULL);
94
95 return; 95 return;
96 } 96 }
97 97
98 msn_cmdproc_send(cmdproc, "REA", "%s %s", 98 msn_cmdproc_send(cmdproc, "REA", "%s %s",
99 gaim_account_get_username(account), 99 gaim_account_get_username(account),
105 { 105 {
106 MsnCmdProc *cmdproc; 106 MsnCmdProc *cmdproc;
107 MsnSession *session; 107 MsnSession *session;
108 108
109 session = gc->proto_data; 109 session = gc->proto_data;
110 cmdproc = session->notification_conn->cmdproc; 110 cmdproc = session->notification->cmdproc;
111 111
112 if (entry == NULL || *entry == '\0') 112 if (entry == NULL || *entry == '\0')
113 { 113 {
114 msn_cmdproc_send(cmdproc, "PRP", "%s", type); 114 msn_cmdproc_send(cmdproc, "PRP", "%s", type);
115 } 115 }
151 } 151 }
152 152
153 static void 153 static void
154 send_to_mobile(GaimConnection *gc, const char *who, const char *entry) 154 send_to_mobile(GaimConnection *gc, const char *who, const char *entry)
155 { 155 {
156 MsnSession *session; 156 MsnTransaction *trans;
157 MsnServConn *servconn; 157 MsnSession *session;
158 MsnCmdProc *cmdproc; 158 MsnCmdProc *cmdproc;
159 MsnTransaction *trans;
160 MsnPage *page; 159 MsnPage *page;
161 char *payload; 160 char *payload;
162 size_t payload_len; 161 size_t payload_len;
163 162
164 session = gc->proto_data; 163 session = gc->proto_data;
165 servconn = session->notification_conn; 164 cmdproc = session->notification->cmdproc;
166 cmdproc = servconn->cmdproc;
167 165
168 page = msn_page_new(); 166 page = msn_page_new();
169 msn_page_set_body(page, entry); 167 msn_page_set_body(page, entry);
170 168
171 payload = msn_page_gen_payload(page, &payload_len); 169 payload = msn_page_gen_payload(page, &payload_len);
260 GaimConnection *gc; 258 GaimConnection *gc;
261 259
262 gc = (GaimConnection *) action->context; 260 gc = (GaimConnection *) action->context;
263 261
264 gaim_request_action(gc, NULL, _("Allow MSN Mobile pages?"), 262 gaim_request_action(gc, NULL, _("Allow MSN Mobile pages?"),
265 _("Do you want to allow or disallow people on " 263 _("Do you want to allow or disallow people on "
266 "your buddy list to send you MSN Mobile pages " 264 "your buddy list to send you MSN Mobile pages "
267 "to your cell phone or other mobile device?"), 265 "to your cell phone or other mobile device?"),
268 -1, gc, 3, 266 -1, gc, 3,
269 _("Allow"), G_CALLBACK(enable_msn_pages_cb), 267 _("Allow"), G_CALLBACK(enable_msn_pages_cb),
270 _("Disallow"), G_CALLBACK(disable_msn_pages_cb), 268 _("Disallow"), G_CALLBACK(disable_msn_pages_cb),
271 _("Cancel"), NULL); 269 _("Cancel"), NULL);
272 } 270 }
273 271
274 static void 272 static void
275 show_send_to_mobile_cb(GaimBlistNode *node, gpointer ignored) 273 show_send_to_mobile_cb(GaimBlistNode *node, gpointer ignored)
276 { 274 {
284 282
285 buddy = (GaimBuddy *) node; 283 buddy = (GaimBuddy *) node;
286 gc = gaim_account_get_connection(buddy->account); 284 gc = gaim_account_get_connection(buddy->account);
287 285
288 session = gc->proto_data; 286 session = gc->proto_data;
289 user = msn_users_find_with_passport(session->users, buddy->name); 287 user = msn_userlist_find_user(session->userlist, buddy->name);
290 288
291 data = g_new0(MsnMobileData, 1); 289 data = g_new0(MsnMobileData, 1);
292 data->gc = gc; 290 data->gc = gc;
293 data->passport = buddy->name; 291 data->passport = buddy->name;
294 292
295 gaim_request_input(gc, NULL, _("Send a mobile message."), NULL, 293 gaim_request_input(gc, NULL, _("Send a mobile message."), NULL,
296 NULL, TRUE, FALSE, NULL, 294 NULL, TRUE, FALSE, NULL,
297 _("Page"), G_CALLBACK(send_to_mobile_cb), 295 _("Page"), G_CALLBACK(send_to_mobile_cb),
298 _("Close"), G_CALLBACK(close_mobile_page_cb), 296 _("Close"), G_CALLBACK(close_mobile_page_cb),
299 data); 297 data);
300 } 298 }
301 299
302 static void 300 static void
303 initiate_chat_cb(GaimBlistNode *node, gpointer data) 301 initiate_chat_cb(GaimBlistNode *node, gpointer data)
304 { 302 {
305 GaimBuddy *buddy; 303 GaimBuddy *buddy;
306 GaimConnection *gc; 304 GaimConnection *gc;
307 305
308 MsnSession *session; 306 MsnSession *session;
309 MsnCmdProc *cmdproc;
310 MsnSwitchBoard *swboard; 307 MsnSwitchBoard *swboard;
311 MsnUser *user; 308
312
313 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); 309 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node));
314 310
315 buddy = (GaimBuddy *) node; 311 buddy = (GaimBuddy *) node;
316 gc = gaim_account_get_connection(buddy->account); 312 gc = gaim_account_get_connection(buddy->account);
317 313
318 session = gc->proto_data; 314 session = gc->proto_data;
319 cmdproc = session->notification_conn->cmdproc; 315
320 316 swboard = msn_switchboard_new(session);
321 if ((swboard = msn_session_open_switchboard(session)) == NULL) 317 msn_switchboard_request(swboard);
322 return; 318 msn_switchboard_request_add_user(swboard, buddy->name);
323 319
324 user = msn_user_new(session, buddy->name, NULL); 320 /* TODO: This might move somewhere else, after USR might be */
325 321 swboard->chat_id = session->conv_seq++;
326 msn_switchboard_set_user(swboard, user); 322 swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat");
327 323 }
328 swboard->total_users = 1; 324
329 325 static void
330 session->last_chat_id++; 326 t_msn_xfer_init(GaimXfer *xfer)
331 swboard->chat_id = session->last_chat_id; 327 {
332 swboard->chat = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat"); 328 MsnSlpLink *slplink;
333 329
334 gaim_conv_chat_add_user(GAIM_CONV_CHAT(swboard->chat), 330 slplink = xfer->data;
335 gaim_account_get_username(buddy->account), NULL); 331
332 msn_slplink_request_ft(slplink, xfer);
333 }
334
335 static void
336 show_send_file_cb(GaimBlistNode *node, gpointer ignored)
337 {
338 GaimBuddy *buddy;
339 GaimConnection *gc;
340 MsnSession *session;
341 MsnSlpLink *slplink;
342 GaimXfer *xfer;
343
344 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node));
345
346 buddy = (GaimBuddy *) node;
347
348 gc = gaim_account_get_connection(buddy->account);
349 session = gc->proto_data;
350
351 xfer = gaim_xfer_new(buddy->account, GAIM_XFER_SEND, buddy->name);
352
353 slplink = msn_session_get_slplink(session, buddy->name);
354
355 xfer->data = slplink;
356
357 gaim_xfer_set_init_fnc(xfer, t_msn_xfer_init);
358
359 gaim_xfer_request(xfer);
336 } 360 }
337 361
338 /************************************************************************** 362 /**************************************************************************
339 * Protocol Plugin ops 363 * Protocol Plugin ops
340 **************************************************************************/ 364 **************************************************************************/
458 MsnUser *user; 482 MsnUser *user;
459 483
460 GList *m = NULL; 484 GList *m = NULL;
461 GaimBlistNodeAction *act; 485 GaimBlistNodeAction *act;
462 486
487 g_return_val_if_fail(buddy != NULL, NULL);
488
463 user = buddy->proto_data; 489 user = buddy->proto_data;
464 490
465 if (user != NULL) 491 if (user != NULL)
466 { 492 {
467 if (user->mobile) 493 if (user->mobile)
468 { 494 {
469 act = gaim_blist_node_action_new(_("Send to Mobile"), 495 act = gaim_blist_node_action_new(_("Send to Mobile"),
470 show_send_to_mobile_cb, NULL); 496 show_send_to_mobile_cb, NULL);
471 m = g_list_append(m, act); 497 m = g_list_append(m, act);
472 } 498 }
499
500 act = gaim_blist_node_action_new(_("Send File"),
501 show_send_file_cb, NULL);
502
503 m = g_list_append(m, act);
473 } 504 }
474 505
475 if (g_ascii_strcasecmp(buddy->name, 506 if (g_ascii_strcasecmp(buddy->name,
476 gaim_account_get_username(buddy->account))) 507 gaim_account_get_username(buddy->account)))
477 { 508 {
520 551
521 if (gaim_account_get_bool(account, "http_method", FALSE)) 552 if (gaim_account_get_bool(account, "http_method", FALSE))
522 { 553 {
523 http_method = TRUE; 554 http_method = TRUE;
524 555
525 gaim_debug(GAIM_DEBUG_INFO, "msn", "using http method\n"); 556 gaim_debug_info("msn", "using http method\n");
526 557
527 host = "gateway.messenger.hotmail.com"; 558 host = "gateway.messenger.hotmail.com";
528 port = 80; 559 port = 80;
529 } 560 }
530 else 561 else
531 { 562 {
532 host = gaim_account_get_string(account, "server", MSN_SERVER); 563 host = gaim_account_get_string(account, "server", MSN_SERVER);
533 port = gaim_account_get_int(account, "port", MSN_PORT); 564 port = gaim_account_get_int(account, "port", MSN_PORT);
534 } 565 }
535 566
536 session = msn_session_new(account, host, port); 567 session = msn_session_new(account, host, port, http_method);
537 session->http_method = http_method;
538 session->prpl = my_protocol; 568 session->prpl = my_protocol;
539 569
540 if (session->http_method) 570 if (session->http_method)
541 msn_http_session_init(session); 571 msn_http_session_init(session);
542 572
543 gc->proto_data = session; 573 gc->proto_data = session;
544 gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_FORMATTING_WBFO | GAIM_CONNECTION_NO_BGCOLOR | GAIM_CONNECTION_NO_FONTSIZE | GAIM_CONNECTION_NO_URLDESC; 574 gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_FORMATTING_WBFO | GAIM_CONNECTION_NO_BGCOLOR | GAIM_CONNECTION_NO_FONTSIZE | GAIM_CONNECTION_NO_URLDESC;;
545 575
546 gaim_connection_update_progress(gc, _("Connecting"), 0, MSN_CONNECT_STEPS); 576 gaim_connection_update_progress(gc, _("Connecting"), 0, MSN_CONNECT_STEPS);
547 577
548 /* Hmm, I don't like this. */ 578 /* Hmm, I don't like this. */
549 username = msn_normalize(account, gaim_account_get_username(account)); 579 username = msn_normalize(account, gaim_account_get_username(account));
550 580
551 if (strcmp(username, gaim_account_get_username(account))) 581 if (strcmp(username, gaim_account_get_username(account)))
552 gaim_account_set_username(account, username); 582 gaim_account_set_username(account, username);
553 583
554 if (!msn_session_connect(session)) 584 msn_session_connect(session);
555 {
556 gaim_connection_error(gc, _("Unable to connect."));
557
558 return;
559 }
560 } 585 }
561 586
562 static void 587 static void
563 msn_close(GaimConnection *gc) 588 msn_close(GaimConnection *gc)
564 { 589 {
565 MsnSession *session = gc->proto_data; 590 MsnSession *session;
566 591
567 if (session != NULL) 592 session = gc->proto_data;
568 { 593
569 if (session->http_method) 594 g_return_if_fail(session != NULL);
570 msn_http_session_uninit(session); 595
571 596 if (session->http_method)
572 msn_session_destroy(session); 597 msn_http_session_uninit(session);
573 } 598
599 msn_session_destroy(session);
574 600
575 gc->proto_data = NULL; 601 gc->proto_data = NULL;
576 } 602 }
577 603
578 static int 604 static int
586 if (g_ascii_strcasecmp(who, gaim_account_get_username(account))) 612 if (g_ascii_strcasecmp(who, gaim_account_get_username(account)))
587 { 613 {
588 MsnSession *session; 614 MsnSession *session;
589 MsnSwitchBoard *swboard; 615 MsnSwitchBoard *swboard;
590 MsnMessage *msg; 616 MsnMessage *msg;
591 MsnUser *user;
592 char *msgformat; 617 char *msgformat;
593 char *msgtext; 618 char *msgtext;
594 619
595 session = gc->proto_data; 620 session = gc->proto_data;
596 swboard = msn_session_find_switch_with_passport(session, who); 621 swboard = msn_session_get_swboard(session, who);
597 user = msn_user_new(session, who, NULL);
598 622
599 msn_import_html(message, &msgformat, &msgtext); 623 msn_import_html(message, &msgformat, &msgtext);
600
601 msg = msn_message_new_plain(msgtext); 624 msg = msn_message_new_plain(msgtext);
602 msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); 625 msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);
603 626
604 g_free(msgformat); 627 g_free(msgformat);
605 g_free(msgtext); 628 g_free(msgtext);
606 629
607 if (swboard != NULL) 630 swboard = msn_session_get_swboard(session, who);
631
632 if (!g_queue_is_empty(swboard->im_queue) ||
633 !swboard->user_joined)
634 {
635 msn_switchboard_queue_msg(swboard, msg);
636 }
637 else
608 { 638 {
609 msn_switchboard_send_msg(swboard, msg); 639 msn_switchboard_send_msg(swboard, msg);
610 } 640 }
611 else 641
612 {
613 if ((swboard = msn_session_open_switchboard(session)) == NULL)
614 {
615 msn_message_destroy(msg);
616
617 return 1;
618 }
619
620 msn_switchboard_set_user(swboard, user);
621 msn_switchboard_send_msg(swboard, msg);
622 }
623
624 msn_user_destroy(user);
625 msn_message_destroy(msg); 642 msn_message_destroy(msg);
626 } 643 }
627 else 644 else
628 { 645 {
629 /* 646 /*
630 * In MSN, you can't send messages to yourself, so 647 * In MSN, you can't send messages to yourself, so
631 * we'll fake like we received it ;) 648 * we'll fake like we received it ;)
632 */ 649 */
633 serv_got_typing_stopped(gc, (char *)who); 650 serv_got_typing_stopped(gc, who);
634 serv_got_im(gc, who, message, flags, time(NULL)); 651 serv_got_im(gc, who, message, flags, time(NULL));
635 } 652 }
636 653
637 return 1; 654 return 1;
638 } 655 }
657 serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, GAIM_TYPING); 674 serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, GAIM_TYPING);
658 675
659 return MSN_TYPING_SEND_TIMEOUT; 676 return MSN_TYPING_SEND_TIMEOUT;
660 } 677 }
661 678
662 swboard = msn_session_find_switch_with_passport(session, who); 679 swboard = msn_session_find_swboard(session, who);
663 680
664 if (swboard == NULL) 681 if (swboard == NULL)
682 return 0;
683
684 if (!swboard->user_joined)
665 return 0; 685 return 0;
666 686
667 msg = msn_message_new(); 687 msg = msn_message_new();
668 msn_message_set_content_type(msg, "text/x-msmsgscontrol"); 688 msn_message_set_content_type(msg, "text/x-msmsgscontrol");
669 msn_message_set_flag(msg, 'U'); 689 msn_message_set_flag(msg, 'U');
680 700
681 static void 701 static void
682 msn_set_away(GaimConnection *gc, const char *state, const char *msg) 702 msn_set_away(GaimConnection *gc, const char *state, const char *msg)
683 { 703 {
684 MsnSession *session; 704 MsnSession *session;
685 const char *status; 705 int status;
686 706
687 session = gc->proto_data; 707 session = gc->proto_data;
688 708
689 if (gc->away != NULL) 709 if (gc->away != NULL)
690 { 710 {
693 } 713 }
694 714
695 if (msg != NULL) 715 if (msg != NULL)
696 { 716 {
697 gc->away = g_strdup(""); 717 gc->away = g_strdup("");
698 status = "AWY"; 718 status = MSN_AWAY;
699 } 719 }
700 else if (state) 720 else if (state)
701 { 721 {
702 gc->away = g_strdup(""); 722 gc->away = g_strdup("");
703 723
704 if (!strcmp(state, _("Away From Computer"))) 724 if (!strcmp(state, _("Away From Computer")))
705 status = "AWY"; 725 status = MSN_AWAY;
706 else if (!strcmp(state, _("Be Right Back"))) 726 else if (!strcmp(state, _("Be Right Back")))
707 status = "BRB"; 727 status = MSN_BRB;
708 else if (!strcmp(state, _("Busy"))) 728 else if (!strcmp(state, _("Busy")))
709 status = "BSY"; 729 status = MSN_BUSY;
710 else if (!strcmp(state, _("On The Phone"))) 730 else if (!strcmp(state, _("On The Phone")))
711 status = "PHN"; 731 status = MSN_PHONE;
712 else if (!strcmp(state, _("Out To Lunch"))) 732 else if (!strcmp(state, _("Out To Lunch")))
713 status = "LUN"; 733 status = MSN_LUNCH;
714 else if (!strcmp(state, _("Hidden"))) 734 else if (!strcmp(state, _("Hidden")))
715 status = "HDN"; 735 status = MSN_HIDDEN;
716 else 736 else
717 { 737 {
718 g_free(gc->away); 738 g_free(gc->away);
719 gc->away = NULL; 739 gc->away = NULL;
720 status = "NLN"; 740 status = MSN_ONLINE;
721 } 741 }
722 } 742 }
723 else if (gc->is_idle) 743 else if (gc->is_idle)
724 status = "IDL"; 744 status = MSN_IDLE;
725 else 745 else
726 status = "NLN"; 746 status = MSN_ONLINE;
727 747
728 msn_session_change_status(session, status); 748 msn_change_status(session, status);
729 } 749 }
730 750
731 static void 751 static void
732 msn_set_idle(GaimConnection *gc, int idle) 752 msn_set_idle(GaimConnection *gc, int idle)
733 { 753 {
736 session = gc->proto_data; 756 session = gc->proto_data;
737 757
738 if (gc->away != NULL) 758 if (gc->away != NULL)
739 return; 759 return;
740 760
741 msn_session_change_status(session, (idle ? "IDL" : "NLN")); 761 msn_change_status(session, (idle ? MSN_IDLE : MSN_ONLINE));
742 } 762 }
743 763
744 static void 764 static void
745 msn_add_buddy(GaimConnection *gc, const char *name, GaimGroup *group) 765 msn_add_buddy(GaimConnection *gc, const char *name, GaimGroup *group)
746 { 766 {
747 MsnSession *session; 767 MsnSession *session;
768 MsnUserList *userlist;
769 const char *who;
770
771 session = gc->proto_data;
772 userlist = session->userlist;
773 who = msn_normalize(gc->account, name);
774
775 if (group != NULL)
776 gaim_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name);
777 else
778 gaim_debug_info("msn", "msn_add_buddy: %s\n", who);
779
780 #if 0
781 /* Which is the max? */
782 if (session->fl_users_count >= 150)
783 {
784 gaim_debug_info("msn", "Too many buddies\n");
785 /* Buddy list full */
786 /* TODO: gaim should be notifyied of this */
787 return;
788 }
789 #endif
790
791 msn_userlist_add_buddy(userlist, who, MSN_LIST_FL,
792 group ? group->name : NULL);
793 }
794
795 static void
796 msn_rem_buddy(GaimConnection *gc, const char *who, const char *group_name)
797 {
798 MsnSession *session;
799 MsnUserList *userlist;
800
801 session = gc->proto_data;
802 userlist = session->userlist;
803
804 msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, group_name);
805 }
806
807 static void
808 msn_add_permit(GaimConnection *gc, const char *who)
809 {
810 MsnSession *session;
811 MsnUserList *userlist;
812 MsnUser *user;
813
814 session = gc->proto_data;
815 userlist = session->userlist;
816 user = msn_userlist_find_user(userlist, who);
817
818 if (user->list_op & MSN_LIST_BL_OP)
819 msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL);
820
821 msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);
822 }
823
824 static void
825 msn_add_deny(GaimConnection *gc, const char *who)
826 {
827 MsnSession *session;
828 MsnUserList *userlist;
829 MsnUser *user;
830
831 session = gc->proto_data;
832 userlist = session->userlist;
833 user = msn_userlist_find_user(userlist, who);
834
835 if (user->list_op & MSN_LIST_AL_OP)
836 msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL);
837
838 msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);
839 }
840
841 static void
842 msn_rem_permit(GaimConnection *gc, const char *who)
843 {
844 MsnSession *session;
845 MsnUserList *userlist;
846 MsnUser *user;
847
848 session = gc->proto_data;
849 userlist = session->userlist;
850
851 user = msn_userlist_find_user(userlist, who);
852
853 msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL);
854
855 if (user->list_op & MSN_LIST_RL_OP)
856 msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);
857 }
858
859 void
860 msn_rem_deny(GaimConnection *gc, const char *who)
861 {
862 MsnSession *session;
863 MsnUserList *userlist;
864 MsnUser *user;
865
866 session = gc->proto_data;
867 userlist = session->userlist;
868
869 user = msn_userlist_find_user(userlist, who);
870
871 msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL);
872
873 if (user->list_op & MSN_LIST_RL_OP)
874 msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);
875 }
876
877 static void
878 msn_set_permit_deny(GaimConnection *gc)
879 {
880 GaimAccount *account;
881 MsnSession *session;
748 MsnCmdProc *cmdproc; 882 MsnCmdProc *cmdproc;
749 MsnGroup *msn_group = NULL;
750 const char *who;
751 GSList *l;
752
753 session = gc->proto_data;
754 cmdproc = session->notification_conn->cmdproc;
755 who = msn_normalize(gc->account, name);
756
757 if (strchr(who, ' '))
758 {
759 /* This is a broken blist entry. */
760 return;
761 }
762
763 if (group != NULL)
764 msn_group = msn_groups_find_with_name(session->groups, group->name);
765
766 /* We should check if the user isn't alredy there. */
767 for (l = session->lists.forward; l != NULL; l = l->next)
768 {
769 MsnUser *user = l->data;
770
771 if (!gaim_utf8_strcasecmp(who, msn_user_get_passport(user)))
772 {
773 if (group == NULL)
774 break;
775 else if (msn_group != NULL)
776 {
777 /* Now we should check if it's in the group. */
778 if (g_list_find(user->group_ids,
779 GINT_TO_POINTER(msn_group->id)))
780 break;
781 }
782 }
783 }
784
785 if (l != NULL)
786 return;
787
788 if (msn_group != NULL)
789 {
790 msn_cmdproc_send(cmdproc, "ADD", "FL %s %s %d", who, who,
791 msn_group_get_id(msn_group));
792 }
793 else
794 {
795 msn_cmdproc_send(cmdproc, "ADD", "FL %s %s", who, who);
796 }
797 }
798
799 static void
800 msn_rem_buddy(GaimConnection *gc, const char *who, const char *group_name)
801 {
802 MsnSession *session;
803 MsnCmdProc *cmdproc;
804 MsnGroup *group;
805 GSList *l;
806
807 session = gc->proto_data;
808 cmdproc = session->notification_conn->cmdproc;
809
810 if (strchr(who, ' '))
811 {
812 /* This is a broken blist entry. */
813 return;
814 }
815
816 group = msn_groups_find_with_name(session->groups, group_name);
817
818 /* We should check if the user is there. */
819 for (l = session->lists.forward; l != NULL; l = l->next)
820 {
821 MsnUser *user = l->data;
822
823 if (!gaim_utf8_strcasecmp(who, msn_user_get_passport(user)))
824 {
825 if (group_name == NULL)
826 break;
827 else if (group != NULL)
828 {
829 /* Now we should check if it's in the group. */
830 if (g_list_find(user->group_ids,
831 GINT_TO_POINTER(group->id)))
832 break;
833 }
834 }
835 }
836
837 if (l == NULL)
838 return;
839
840 if (group == NULL)
841 {
842 msn_cmdproc_send(cmdproc, "REM", "FL %s", who);
843 }
844 else
845 {
846 msn_cmdproc_send(cmdproc, "REM", "FL %s %d", who,
847 msn_group_get_id(group));
848 }
849 }
850
851 static void
852 msn_add_permit(GaimConnection *gc, const char *who)
853 {
854 MsnSession *session;
855 MsnCmdProc *cmdproc;
856
857 session = gc->proto_data;
858 cmdproc = session->notification_conn->cmdproc;
859
860 if (!strchr(who, '@'))
861 {
862 char buf[MSN_BUF_LEN];
863
864 g_snprintf(buf, sizeof(buf),
865 _("An MSN screen name must be in the form \"user@server.com\". "
866 "Perhaps you meant %s@hotmail.com. No changes were made "
867 "to your allow list."), who);
868
869 gaim_notify_error(gc, NULL, _("Invalid MSN screen name"), buf);
870 gaim_privacy_permit_remove(gc->account, who, TRUE);
871
872 return;
873 }
874
875 if (g_slist_find_custom(gc->account->deny, who, (GCompareFunc)strcasecmp))
876 {
877 gaim_debug_info("msn", "Moving %s from BL to AL\n", who);
878 gaim_privacy_deny_remove(gc->account, who, TRUE);
879
880 msn_cmdproc_send(cmdproc, "REM", "BL %s", who);
881
882 if (cmdproc->error)
883 return;
884 }
885
886 msn_cmdproc_send(cmdproc, "ADD", "AL %s %s", who, who);
887 }
888
889 static void
890 msn_add_deny(GaimConnection *gc, const char *who)
891 {
892 MsnCmdProc *cmdproc;
893 MsnSession *session;
894
895 session = gc->proto_data;
896 cmdproc = session->notification_conn->cmdproc;
897
898 if (!strchr(who, '@'))
899 {
900 char buf[MSN_BUF_LEN];
901 g_snprintf(buf, sizeof(buf),
902 _("An MSN screen name must be in the form \"user@server.com\". "
903 "Perhaps you meant %s@hotmail.com. No changes were made "
904 "to your block list."), who);
905
906 gaim_notify_error(gc, NULL, _("Invalid MSN screen name"), buf);
907
908 gaim_privacy_deny_remove(gc->account, who, TRUE);
909
910 return;
911 }
912
913 if (g_slist_find_custom(gc->account->permit, who, (GCompareFunc)strcmp))
914 {
915 gaim_debug(GAIM_DEBUG_INFO, "msn", "Moving %s from AL to BL\n", who);
916 gaim_privacy_permit_remove(gc->account, who, TRUE);
917
918 msn_cmdproc_send(cmdproc, "REM", "AL %s", who);
919
920 if (cmdproc->error)
921 return;
922 }
923
924 msn_cmdproc_send(cmdproc, "ADD", "BL %s %s", who, who);
925 }
926
927 static void
928 msn_rem_permit(GaimConnection *gc, const char *who)
929 {
930 MsnSession *session;
931 MsnCmdProc *cmdproc;
932
933 session = gc->proto_data;
934 cmdproc = session->notification_conn->cmdproc;
935
936 msn_cmdproc_send(cmdproc, "REM", "AL %s", who);
937
938 if (cmdproc->error)
939 return;
940
941 gaim_privacy_deny_add(gc->account, who, TRUE);
942
943 msn_cmdproc_send(cmdproc, "ADD", "BL %s %s", who, who);
944 }
945
946 static void
947 msn_rem_deny(GaimConnection *gc, const char *who)
948 {
949 MsnSession *session;
950 MsnCmdProc *cmdproc;
951
952 session = gc->proto_data;
953 cmdproc = session->notification_conn->cmdproc;
954
955 msn_cmdproc_send(cmdproc, "REM", "BL %s", who);
956
957 if (cmdproc->error)
958 return;
959
960 gaim_privacy_permit_add(gc->account, who, TRUE);
961
962 msn_cmdproc_send(cmdproc, "ADD", "AL %s %s", who, who);
963 }
964
965 static void
966 msn_set_permit_deny(GaimConnection *gc)
967 {
968 GaimAccount *account;
969 MsnSession *session;
970 MsnCmdProc *cmdproc;
971 GSList *s, *t = NULL;
972 883
973 account = gaim_connection_get_account(gc); 884 account = gaim_connection_get_account(gc);
974 session = gc->proto_data; 885 session = gc->proto_data;
975 cmdproc = session->notification_conn->cmdproc; 886 cmdproc = session->notification->cmdproc;
976 887
977 if (account->perm_deny == GAIM_PRIVACY_ALLOW_ALL || 888 if (account->perm_deny == GAIM_PRIVACY_ALLOW_ALL ||
978 account->perm_deny == GAIM_PRIVACY_DENY_USERS) 889 account->perm_deny == GAIM_PRIVACY_DENY_USERS)
979 { 890 {
980 msn_cmdproc_send(cmdproc, "BLP", "%s", "AL"); 891 msn_cmdproc_send(cmdproc, "BLP", "%s", "AL");
981 } 892 }
982 else 893 else
983 { 894 {
984 msn_cmdproc_send(cmdproc, "BLP", "%s", "BL"); 895 msn_cmdproc_send(cmdproc, "BLP", "%s", "BL");
985 } 896 }
986
987 if (cmdproc->error)
988 return;
989
990 /*
991 * This is safe because we'll always come here after we've gotten
992 * the list off the server, and data is never removed. So if the
993 * lengths are equal we don't know about anyone locally and so
994 * there's no sense in going through them all.
995 */
996 if (g_slist_length(gc->account->permit) ==
997 g_slist_length(session->lists.allow))
998 {
999 g_slist_free(session->lists.allow);
1000 session->lists.allow = NULL;
1001 }
1002
1003 if (g_slist_length(gc->account->deny) ==
1004 g_slist_length(session->lists.block))
1005 {
1006 g_slist_free(session->lists.block);
1007 session->lists.block = NULL;
1008 }
1009
1010 if (session->lists.allow == NULL && session->lists.block == NULL)
1011 return;
1012
1013 if (session->lists.allow != NULL)
1014 {
1015 for (s = g_slist_nth(gc->account->permit,
1016 g_slist_length(session->lists.allow));
1017 s != NULL;
1018 s = s->next)
1019 {
1020 char *who = s->data;
1021
1022 if (!strchr(who, '@'))
1023 {
1024 t = g_slist_append(t, who);
1025 continue;
1026 }
1027
1028 if (g_slist_find(session->lists.block, who))
1029 {
1030 t = g_slist_append(t, who);
1031 continue;
1032 }
1033
1034 msn_cmdproc_send(cmdproc, "ADD", "AL %s %s", who, who);
1035
1036 if (cmdproc->error)
1037 return;
1038 }
1039
1040 for (; t != NULL; t = t->next)
1041 gaim_privacy_permit_remove(gc->account, t->data, TRUE);
1042
1043 if (t != NULL)
1044 g_slist_free(t);
1045
1046 t = NULL;
1047 g_slist_free(session->lists.allow);
1048 session->lists.allow = NULL;
1049 }
1050
1051 if (session->lists.block)
1052 {
1053 for (s = g_slist_nth(gc->account->deny,
1054 g_slist_length(session->lists.block));
1055 s != NULL;
1056 s = s->next)
1057 {
1058 char *who = s->data;
1059
1060 if (!strchr(who, '@'))
1061 {
1062 t = g_slist_append(t, who);
1063 continue;
1064 }
1065
1066 if (g_slist_find(session->lists.block, who))
1067 {
1068 t = g_slist_append(t, who);
1069 continue;
1070 }
1071
1072 msn_cmdproc_send(cmdproc, "ADD", "BL %s %s", who, who);
1073
1074 if (cmdproc->error)
1075 return;
1076 }
1077
1078 for (; t != NULL; t = t->next)
1079 gaim_privacy_deny_remove(gc->account, t->data, TRUE);
1080
1081 if (t != NULL)
1082 g_slist_free(t);
1083
1084 g_slist_free(session->lists.block);
1085 session->lists.block = NULL;
1086 }
1087 } 897 }
1088 898
1089 static void 899 static void
1090 msn_chat_invite(GaimConnection *gc, int id, const char *msg, 900 msn_chat_invite(GaimConnection *gc, int id, const char *msg,
1091 const char *who) 901 const char *who)
1097 session = gc->proto_data; 907 session = gc->proto_data;
1098 908
1099 swboard = msn_session_find_switch_with_id(session, id); 909 swboard = msn_session_find_switch_with_id(session, id);
1100 g_return_if_fail(swboard != NULL); 910 g_return_if_fail(swboard != NULL);
1101 911
1102 cmdproc = swboard->cmdproc; 912 cmdproc = swboard->servconn->cmdproc;
1103 913
1104 msn_cmdproc_send(cmdproc, "CAL", "%s", who); 914 msn_cmdproc_send(cmdproc, "CAL", "%s", who);
1105 } 915 }
1106 916
1107 static void 917 static void
1110 MsnSession *session; 920 MsnSession *session;
1111 MsnSwitchBoard *swboard; 921 MsnSwitchBoard *swboard;
1112 MsnCmdProc *cmdproc; 922 MsnCmdProc *cmdproc;
1113 923
1114 session = gc->proto_data; 924 session = gc->proto_data;
925
1115 swboard = msn_session_find_switch_with_id(session, id); 926 swboard = msn_session_find_switch_with_id(session, id);
1116 g_return_if_fail(swboard != NULL); 927 g_return_if_fail(swboard != NULL);
1117 928
1118 cmdproc = swboard->servconn->cmdproc; 929 cmdproc = swboard->servconn->cmdproc;
1119 930
1138 swboard = msn_session_find_switch_with_id(session, id); 949 swboard = msn_session_find_switch_with_id(session, id);
1139 950
1140 if (swboard == NULL) 951 if (swboard == NULL)
1141 return -EINVAL; 952 return -EINVAL;
1142 953
1143 msn_import_html(message, &msgformat, &msgtext); 954 if (swboard->ready)
1144 955 {
1145 msg = msn_message_new_plain(msgtext); 956 msn_import_html(message, &msgformat, &msgtext);
1146 msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); 957
1147 958 msg = msn_message_new_plain(msgtext);
1148 g_free(msgformat); 959 msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);
1149 g_free(msgtext); 960 msn_switchboard_send_msg(swboard, msg);
1150 961 msn_message_destroy(msg);
1151 msn_switchboard_send_msg(swboard, msg); 962
1152 963 g_free(msgformat);
1153 msn_message_destroy(msg); 964 g_free(msgtext);
1154 965
1155 serv_got_chat_in(gc, id, gaim_account_get_username(account), 0, 966 serv_got_chat_in(gc, id, gaim_account_get_username(account), 0,
1156 message, time(NULL)); 967 message, time(NULL));
968 }
1157 969
1158 return 0; 970 return 0;
1159 } 971 }
1160 972
1161 static void 973 static void
1163 { 975 {
1164 MsnSession *session; 976 MsnSession *session;
1165 MsnCmdProc *cmdproc; 977 MsnCmdProc *cmdproc;
1166 978
1167 session = gc->proto_data; 979 session = gc->proto_data;
1168 cmdproc = session->notification_conn->cmdproc; 980 cmdproc = session->notification->cmdproc;
1169 981
1170 if (!session->http_method) 982 if (!session->http_method)
1171 msn_cmdproc_send_quick(cmdproc, "PNG", NULL, NULL); 983 msn_cmdproc_send_quick(cmdproc, "PNG", NULL, NULL);
1172 } 984 }
1173 985
1174 static void 986 static void
1175 msn_group_buddy(GaimConnection *gc, const char *who, 987 msn_group_buddy(GaimConnection *gc, const char *who,
1176 const char *old_group_name, const char *new_group_name) 988 const char *old_group_name, const char *new_group_name)
1177 { 989 {
1178 MsnSession *session; 990 MsnSession *session;
1179 MsnCmdProc *cmdproc; 991 MsnUserList *userlist;
1180 MsnGroup *old_group, *new_group; 992
1181 MsnUser *user; 993 session = gc->proto_data;
1182 const char *friendly; 994 userlist = session->userlist;
1183 995
1184 session = gc->proto_data; 996 msn_userlist_move_buddy(userlist, who, old_group_name, new_group_name);
1185 cmdproc = session->notification_conn->cmdproc;
1186 old_group = msn_groups_find_with_name(session->groups, old_group_name);
1187 new_group = msn_groups_find_with_name(session->groups, new_group_name);
1188
1189 user = msn_users_find_with_passport(session->users, who);
1190
1191 if ((friendly = msn_user_get_name(user)) == NULL)
1192 friendly = msn_user_get_passport(user);
1193
1194 if (old_group != NULL)
1195 msn_user_remove_group_id(user, msn_group_get_id(old_group));
1196
1197 if (new_group == NULL)
1198 {
1199 msn_cmdproc_send(cmdproc, "ADG", "%s 0",
1200 gaim_url_encode(new_group_name));
1201
1202 if (cmdproc->error)
1203 return;
1204
1205 /* I hate this. So much. */
1206 session->moving_buddy = TRUE;
1207 session->dest_group_name = g_strdup(new_group_name);
1208 session->old_group = old_group;
1209
1210 session->moving_user =
1211 msn_users_find_with_passport(session->users, who);
1212
1213 msn_user_ref(session->moving_user);
1214 }
1215 else
1216 {
1217 msn_cmdproc_send(cmdproc, "ADD", "FL %s %s %d",
1218 who, gaim_url_encode(friendly),
1219 msn_group_get_id(new_group));
1220
1221 if (cmdproc->error)
1222 return;
1223 }
1224
1225 if (old_group != NULL)
1226 {
1227 msn_cmdproc_send(cmdproc, "REM", "FL %s %d", who,
1228 msn_group_get_id(old_group));
1229
1230 if (cmdproc->error)
1231 return;
1232
1233 #if 0
1234 if (msn_users_get_count(msn_group_get_users(old_group)) <= 0)
1235 {
1236 msn_cmdproc_send(cmdproc, "RMG", "%d",
1237 msn_group_get_id(old_group));
1238 }
1239 #endif
1240 }
1241 } 997 }
1242 998
1243 static void 999 static void
1244 msn_rename_group(GaimConnection *gc, const char *old_group_name, 1000 msn_rename_group(GaimConnection *gc, const char *old_group_name,
1245 const char *new_group_name, GList *members) 1001 const char *new_group_name, GList *members)
1246 { 1002 {
1247 MsnSession *session; 1003 MsnSession *session;
1248 MsnCmdProc *cmdproc; 1004 MsnCmdProc *cmdproc;
1249 MsnGroup *old_group; 1005 int old_gid;
1250 const char *enc_new_group_name; 1006 const char *enc_new_group_name;
1251 1007
1252 session = gc->proto_data; 1008 session = gc->proto_data;
1253 cmdproc = session->notification_conn->cmdproc; 1009 cmdproc = session->notification->cmdproc;
1254 enc_new_group_name = gaim_url_encode(new_group_name); 1010 enc_new_group_name = gaim_url_encode(new_group_name);
1255 1011
1256 if ((old_group = msn_groups_find_with_name(session->groups, 1012 old_gid = msn_userlist_find_group_id(session->userlist, old_group_name);
1257 old_group_name)) != NULL) 1013
1258 { 1014 if (old_gid >= 0)
1259 msn_cmdproc_send(cmdproc, "REG", "%d %s 0", 1015 {
1260 msn_group_get_id(old_group), enc_new_group_name); 1016 msn_cmdproc_send(cmdproc, "REG", "%d %s 0", old_gid,
1261 1017 enc_new_group_name);
1262 if (cmdproc->error)
1263 return;
1264
1265 msn_group_set_name(old_group, new_group_name);
1266 } 1018 }
1267 else 1019 else
1268 { 1020 {
1269 msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name); 1021 msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name);
1270 }
1271 }
1272
1273 static void
1274 msn_buddy_free(GaimBuddy *b)
1275 {
1276 if (b->proto_data != NULL)
1277 {
1278 msn_user_destroy(b->proto_data);
1279 b->proto_data = NULL;
1280 } 1022 }
1281 } 1023 }
1282 1024
1283 static void 1025 static void
1284 msn_convo_closed(GaimConnection *gc, const char *who) 1026 msn_convo_closed(GaimConnection *gc, const char *who)
1287 MsnSwitchBoard *swboard; 1029 MsnSwitchBoard *swboard;
1288 MsnCmdProc *cmdproc; 1030 MsnCmdProc *cmdproc;
1289 1031
1290 session = gc->proto_data; 1032 session = gc->proto_data;
1291 1033
1292 swboard = msn_session_find_switch_with_passport(session, who); 1034 swboard = msn_session_find_swboard(session, who);
1293 g_return_if_fail(swboard != NULL); 1035
1036 /*
1037 * Don't perform an assertion here. It swboard is NULL, then the
1038 * switchboard was either closed by the other party, or the person
1039 * is talking to himself.
1040 */
1041 if (swboard == NULL)
1042 return;
1294 1043
1295 cmdproc = swboard->servconn->cmdproc; 1044 cmdproc = swboard->servconn->cmdproc;
1296 1045
1297 if (swboard->chat == NULL) 1046 if (swboard->current_users == 1)
1298 { 1047 {
1048 /* This must happen on both IM's and Chat's, right? */
1299 GaimAccount *account; 1049 GaimAccount *account;
1300 1050
1301 account = gaim_connection_get_account(gc); 1051 account = gaim_connection_get_account(gc);
1302 1052
1303 msn_cmdproc_send_quick(cmdproc, "BYE", "%s", 1053 msn_cmdproc_send_quick(cmdproc, "BYE", "%s",
1316 session = gc->proto_data; 1066 session = gc->proto_data;
1317 user = session->user; 1067 user = session->user;
1318 1068
1319 msn_user_set_buddy_icon(user, filename); 1069 msn_user_set_buddy_icon(user, filename);
1320 1070
1321 msn_session_change_status(session, session->away_state); 1071 msn_change_status(session, session->state);
1322 } 1072 }
1323 1073
1324 static void 1074 static void
1325 msn_remove_group(GaimConnection *gc, const char *name) 1075 msn_remove_group(GaimConnection *gc, const char *name)
1326 { 1076 {
1327 MsnSession *session; 1077 MsnSession *session;
1328 MsnCmdProc *cmdproc; 1078 MsnCmdProc *cmdproc;
1329 MsnGroup *group; 1079 int group_id;
1330 1080
1331 session = gc->proto_data; 1081 session = gc->proto_data;
1332 cmdproc = session->notification_conn->cmdproc; 1082 cmdproc = session->notification->cmdproc;
1333 1083
1334 if ((group = msn_groups_find_with_name(session->groups, name)) != NULL) 1084 if ((group_id = msn_userlist_find_group_id(session->userlist, name)) >= 0)
1335 { 1085 {
1336 msn_cmdproc_send(cmdproc, "RMG", "%d", msn_group_get_id(group)); 1086 msn_cmdproc_send(cmdproc, "RMG", "%d", group_id);
1337 } 1087 }
1338 } 1088 }
1339 1089
1340 static void 1090 static void
1341 msn_got_info(void *data, const char *url_text, size_t len) 1091 msn_got_info(void *data, const char *url_text, size_t len)
1353 gaim_debug_info("msn", "In msn_got_info\n"); 1103 gaim_debug_info("msn", "In msn_got_info\n");
1354 1104
1355 if (url_text == NULL || strcmp(url_text, "") == 0) 1105 if (url_text == NULL || strcmp(url_text, "") == 0)
1356 { 1106 {
1357 gaim_notify_formatted(info_data->gc, NULL, 1107 gaim_notify_formatted(info_data->gc, NULL,
1358 _("Buddy Information"), NULL, 1108 _("Buddy Information"), NULL,
1359 _("<html><body><b>Error retrieving profile</b></body></html>"), 1109 _("<html><body><b>Error retrieving profile</b></body></html>"),
1360 NULL, NULL); 1110 NULL, NULL);
1361 1111
1362 return; 1112 return;
1363 } 1113 }
1364 1114
1365 url_buffer = g_strdup(url_text); 1115 url_buffer = g_strdup(url_text);
1642 1392
1643 static gboolean msn_load(GaimPlugin *plugin) 1393 static gboolean msn_load(GaimPlugin *plugin)
1644 { 1394 {
1645 msn_notification_init(); 1395 msn_notification_init();
1646 msn_switchboard_init(); 1396 msn_switchboard_init();
1397 msn_sync_init();
1647 1398
1648 return TRUE; 1399 return TRUE;
1649 } 1400 }
1650 1401
1651 static gboolean msn_unload(GaimPlugin *plugin) 1402 static gboolean msn_unload(GaimPlugin *plugin)
1652 { 1403 {
1653 msn_notification_end(); 1404 msn_notification_end();
1654 msn_switchboard_end(); 1405 msn_switchboard_end();
1406 msn_sync_end();
1655 1407
1656 return TRUE; 1408 return TRUE;
1657 } 1409 }
1658 1410
1659 static GaimPluginPrefFrame * 1411 static GaimPluginPrefFrame *
1684 }; 1436 };
1685 1437
1686 static GaimPluginProtocolInfo prpl_info = 1438 static GaimPluginProtocolInfo prpl_info =
1687 { 1439 {
1688 GAIM_PRPL_API_VERSION, 1440 GAIM_PRPL_API_VERSION,
1689 OPT_PROTO_MAIL_CHECK /* | OPT_PROTO_BUDDY_ICON */, 1441 OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON,
1690 NULL, 1442 NULL,
1691 NULL, 1443 NULL,
1692 msn_list_icon, 1444 msn_list_icon,
1693 msn_list_emblems, 1445 msn_list_emblems,
1694 msn_status_text, 1446 msn_status_text,
1726 NULL, 1478 NULL,
1727 NULL, 1479 NULL,
1728 NULL, 1480 NULL,
1729 msn_group_buddy, 1481 msn_group_buddy,
1730 msn_rename_group, 1482 msn_rename_group,
1731 msn_buddy_free, 1483 NULL, /* msn_buddy_free */
1732 msn_convo_closed, 1484 msn_convo_closed,
1733 msn_normalize, 1485 msn_normalize,
1734 msn_set_buddy_icon, 1486 msn_set_buddy_icon,
1735 msn_remove_group, 1487 msn_remove_group,
1736 NULL, 1488 NULL,