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