libpurple/protocols/gg/gg.c

changeset 36124
3dcb9b9b7c11
parent 36119
b2ad25dfbd57
child 36281
017310ea69c0
child 37155
1aee6d5eefba
equal deleted inserted replaced
36123:faba3b092f55 36124:3dcb9b9b7c11
42 #include "chat.h" 42 #include "chat.h"
43 #include "search.h" 43 #include "search.h"
44 #include "blist.h" 44 #include "blist.h"
45 #include "utils.h" 45 #include "utils.h"
46 #include "resolver-purple.h" 46 #include "resolver-purple.h"
47 #include "deprecated.h"
48 #include "purplew.h" 47 #include "purplew.h"
49 #include "libgadu-events.h" 48 #include "libgadu-events.h"
50 #include "multilogon.h" 49 #include "multilogon.h"
51 #include "status.h" 50 #include "status.h"
52 #include "servconn.h" 51 #include "servconn.h"
315 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 314 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
316 _("Unable to read from socket")); 315 _("Unable to read from socket"));
317 return; 316 return;
318 } 317 }
319 318
320 #if GGP_ENABLE_GG11
321 if (purple_debug_is_verbose()) { 319 if (purple_debug_is_verbose()) {
322 purple_debug_misc("gg", "ggp_callback_recv: got event %s", 320 purple_debug_misc("gg", "ggp_callback_recv: got event %s",
323 gg_debug_event(ev->type)); 321 gg_debug_event(ev->type));
324 } 322 }
325 #endif
326 323
327 purple_input_remove(info->inpa); 324 purple_input_remove(info->inpa);
328 info->inpa = purple_input_add(info->session->fd, 325 info->inpa = purple_input_add(info->session->fd,
329 ggp_tcpsocket_inputcond_gg_to_purple(info->session->check), 326 ggp_tcpsocket_inputcond_gg_to_purple(info->session->check),
330 ggp_callback_recv, gc); 327 ggp_callback_recv, gc);
340 break; 337 break;
341 case GG_EVENT_MSG: 338 case GG_EVENT_MSG:
342 ggp_message_got(gc, &ev->event.msg); 339 ggp_message_got(gc, &ev->event.msg);
343 break; 340 break;
344 case GG_EVENT_ACK: 341 case GG_EVENT_ACK:
345 #if GGP_ENABLE_GG11
346 case GG_EVENT_ACK110: 342 case GG_EVENT_ACK110:
347 #endif
348 break; 343 break;
349 case GG_EVENT_IMAGE_REPLY: 344 case GG_EVENT_IMAGE_REPLY:
350 ggp_image_recv(gc, &ev->event.image_reply); 345 ggp_image_recv(gc, &ev->event.image_reply);
351 break; 346 break;
352 case GG_EVENT_IMAGE_REQUEST: 347 case GG_EVENT_IMAGE_REQUEST:
365 ggp_xml_event_handler(gc, ev->event.xml_event.data); 360 ggp_xml_event_handler(gc, ev->event.xml_event.data);
366 break; 361 break;
367 case GG_EVENT_USER_DATA: 362 case GG_EVENT_USER_DATA:
368 ggp_events_user_data(gc, &ev->event.user_data); 363 ggp_events_user_data(gc, &ev->event.user_data);
369 break; 364 break;
370 #if GGP_ENABLE_GG11
371 case GG_EVENT_JSON_EVENT: 365 case GG_EVENT_JSON_EVENT:
372 ggp_events_json(gc, &ev->event.json_event); 366 ggp_events_json(gc, &ev->event.json_event);
373 break; 367 break;
374 #endif
375 case GG_EVENT_USERLIST100_VERSION: 368 case GG_EVENT_USERLIST100_VERSION:
376 ggp_roster_version(gc, &ev->event.userlist100_version); 369 ggp_roster_version(gc, &ev->event.userlist100_version);
377 break; 370 break;
378 case GG_EVENT_USERLIST100_REPLY: 371 case GG_EVENT_USERLIST100_REPLY:
379 ggp_roster_reply(gc, &ev->event.userlist100_reply); 372 ggp_roster_reply(gc, &ev->event.userlist100_reply);
382 ggp_message_got_multilogon(gc, &ev->event.multilogon_msg); 375 ggp_message_got_multilogon(gc, &ev->event.multilogon_msg);
383 break; 376 break;
384 case GG_EVENT_MULTILOGON_INFO: 377 case GG_EVENT_MULTILOGON_INFO:
385 ggp_multilogon_info(gc, &ev->event.multilogon_info); 378 ggp_multilogon_info(gc, &ev->event.multilogon_info);
386 break; 379 break;
387 #if GGP_ENABLE_GG11
388 case GG_EVENT_IMTOKEN: 380 case GG_EVENT_IMTOKEN:
389 purple_debug_info("gg", "gg11: got IMTOKEN\n"); 381 purple_debug_info("gg", "gg11: got IMTOKEN\n");
390 g_free(info->imtoken); 382 g_free(info->imtoken);
391 info->imtoken = g_strdup(ev->event.imtoken.imtoken); 383 info->imtoken = g_strdup(ev->event.imtoken.imtoken);
392 break; 384 break;
399 case GG_EVENT_CHAT_INFO_UPDATE: 391 case GG_EVENT_CHAT_INFO_UPDATE:
400 case GG_EVENT_CHAT_CREATED: 392 case GG_EVENT_CHAT_CREATED:
401 case GG_EVENT_CHAT_INVITE_ACK: 393 case GG_EVENT_CHAT_INVITE_ACK:
402 ggp_chat_got_event(gc, ev); 394 ggp_chat_got_event(gc, ev);
403 break; 395 break;
404 #endif
405 case GG_EVENT_DISCONNECT: 396 case GG_EVENT_DISCONNECT:
406 ggp_servconn_remote_disconnect(gc); 397 ggp_servconn_remote_disconnect(gc);
407 break; 398 break;
408 default: 399 default:
409 purple_debug_warning("gg", 400 purple_debug_warning("gg",
453 purple_debug_info("gg", "GG_STATE_READING_REPLY\n"); 444 purple_debug_info("gg", "GG_STATE_READING_REPLY\n");
454 break; 445 break;
455 case GG_STATE_TLS_NEGOTIATION: 446 case GG_STATE_TLS_NEGOTIATION:
456 purple_debug_info("gg", "GG_STATE_TLS_NEGOTIATION\n"); 447 purple_debug_info("gg", "GG_STATE_TLS_NEGOTIATION\n");
457 break; 448 break;
458 #if GGP_ENABLE_GG11
459 case GG_STATE_RESOLVING_HUB: 449 case GG_STATE_RESOLVING_HUB:
460 purple_debug_info("gg", "GG_STATE_RESOLVING_HUB\n"); 450 purple_debug_info("gg", "GG_STATE_RESOLVING_HUB\n");
461 break; 451 break;
462 case GG_STATE_READING_HUB: 452 case GG_STATE_READING_HUB:
463 purple_debug_info("gg", "GG_STATE_READING_HUB\n"); 453 purple_debug_info("gg", "GG_STATE_READING_HUB\n");
464 break; 454 break;
465 #endif
466 default: 455 default:
467 purple_debug_error("gg", "unknown state = %d\n", 456 purple_debug_error("gg", "unknown state = %d\n",
468 info->session->state); 457 info->session->state);
469 break; 458 break;
470 } 459 }
495 /* Nothing happened. */ 484 /* Nothing happened. */
496 purple_debug_info("gg", "GG_EVENT_NONE\n"); 485 purple_debug_info("gg", "GG_EVENT_NONE\n");
497 break; 486 break;
498 case GG_EVENT_CONN_SUCCESS: 487 case GG_EVENT_CONN_SUCCESS:
499 { 488 {
500 #if GGP_ENABLE_GG11
501 purple_debug_info("gg", "GG_EVENT_CONN_SUCCESS:" 489 purple_debug_info("gg", "GG_EVENT_CONN_SUCCESS:"
502 " successfully connected to %s\n", 490 " successfully connected to %s\n",
503 info->session->connect_host); 491 info->session->connect_host);
504 ggp_servconn_add_server(info->session-> 492 ggp_servconn_add_server(info->session->
505 connect_host); 493 connect_host);
506 #endif
507 purple_input_remove(info->inpa); 494 purple_input_remove(info->inpa);
508 info->inpa = purple_input_add(info->session->fd, 495 info->inpa = purple_input_add(info->session->fd,
509 PURPLE_INPUT_READ, 496 PURPLE_INPUT_READ,
510 ggp_callback_recv, gc); 497 ggp_callback_recv, gc);
511 498
564 purple_connection_error(gc, 551 purple_connection_error(gc,
565 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 552 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
566 _("Error connecting to master " 553 _("Error connecting to master "
567 "server")); 554 "server"));
568 break; 555 break;
569 #if GGP_ENABLE_GG11
570 case GG_FAILURE_INTERNAL: 556 case GG_FAILURE_INTERNAL:
571 purple_connection_error(gc, 557 purple_connection_error(gc,
572 PURPLE_CONNECTION_ERROR_OTHER_ERROR, 558 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
573 _("Internal error")); 559 _("Internal error"));
574 break; 560 break;
575 #endif
576 default: 561 default:
577 purple_connection_error(gc, 562 purple_connection_error(gc,
578 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 563 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
579 _("Connection failed")); 564 _("Connection failed"));
580 } 565 }
662 static void ggp_login(PurpleAccount *account) 647 static void ggp_login(PurpleAccount *account)
663 { 648 {
664 PurpleConnection *gc = purple_account_get_connection(account); 649 PurpleConnection *gc = purple_account_get_connection(account);
665 struct gg_login_params *glp; 650 struct gg_login_params *glp;
666 GGPInfo *info; 651 GGPInfo *info;
667 #if GGP_ENABLE_GG11
668 const char *address; 652 const char *address;
669 #endif
670 const gchar *encryption_type, *protocol_version; 653 const gchar *encryption_type, *protocol_version;
671 654
672 if (!ggp_deprecated_setup_proxy(gc))
673 return;
674
675 purple_connection_set_flags(gc, 655 purple_connection_set_flags(gc,
676 #if ! GGP_ENABLE_GG11
677 PURPLE_CONNECTION_FLAG_NO_IMAGES |
678 #endif
679 PURPLE_CONNECTION_FLAG_HTML | 656 PURPLE_CONNECTION_FLAG_HTML |
680 PURPLE_CONNECTION_FLAG_NO_URLDESC); 657 PURPLE_CONNECTION_FLAG_NO_URLDESC);
681 658
682 glp = g_new0(struct gg_login_params, 1); 659 glp = g_new0(struct gg_login_params, 1);
683 #if GGP_ENABLE_GG11
684 glp->struct_size = sizeof(struct gg_login_params); 660 glp->struct_size = sizeof(struct gg_login_params);
685 #endif
686 info = g_new0(GGPInfo, 1); 661 info = g_new0(GGPInfo, 1);
687 662
688 purple_connection_set_protocol_data(gc, info); 663 purple_connection_set_protocol_data(gc, info);
689 664
690 ggp_tcpsocket_setup(gc, glp); 665 ggp_tcpsocket_setup(gc, glp);
747 722
748 protocol_version = purple_account_get_string(account, 723 protocol_version = purple_account_get_string(account,
749 "protocol_version", "default"); 724 "protocol_version", "default");
750 purple_debug_info("gg", "Requested protocol version: %s\n", 725 purple_debug_info("gg", "Requested protocol version: %s\n",
751 protocol_version); 726 protocol_version);
752 #if GGP_ENABLE_GG11
753 if (g_strcmp0(protocol_version, "gg10") == 0) 727 if (g_strcmp0(protocol_version, "gg10") == 0)
754 glp->protocol_version = GG_PROTOCOL_VERSION_100; 728 glp->protocol_version = GG_PROTOCOL_VERSION_100;
755 else if (g_strcmp0(protocol_version, "gg11") == 0) 729 else if (g_strcmp0(protocol_version, "gg11") == 0)
756 glp->protocol_version = GG_PROTOCOL_VERSION_110; 730 glp->protocol_version = GG_PROTOCOL_VERSION_110;
757 glp->compatibility = GG_COMPAT_1_12_0; 731 glp->compatibility = GG_COMPAT_1_12_0;
758 #else
759 glp->protocol_version = 0x2e;
760 #endif
761 732
762 ggp_status_set_initial(gc, glp); 733 ggp_status_set_initial(gc, glp);
763 734
764 #if GGP_ENABLE_GG11
765 address = purple_account_get_string(account, "gg_server", ""); 735 address = purple_account_get_string(account, "gg_server", "");
766 if (address && *address) 736 if (address && *address)
767 glp->connect_host = g_strdup(address); 737 glp->connect_host = g_strdup(address);
768 #endif
769 738
770 info->session = gg_login(glp); 739 info->session = gg_login(glp);
771 #if GGP_ENABLE_GG11
772 g_free(glp->connect_host); 740 g_free(glp->connect_host);
773 #endif
774 purple_str_wipe(glp->password); 741 purple_str_wipe(glp->password);
775 g_free(glp); 742 g_free(glp);
776 743
777 purple_connection_update_progress(gc, _("Connecting"), 0, 2); 744 purple_connection_update_progress(gc, _("Connecting"), 0, 2);
778 if (info->session == NULL) { 745 if (info->session == NULL) {
987 ggp_list_emblem, /* list_emblem */ 954 ggp_list_emblem, /* list_emblem */
988 ggp_status_buddy_text, /* status_text */ 955 ggp_status_buddy_text, /* status_text */
989 ggp_tooltip_text, /* tooltip_text */ 956 ggp_tooltip_text, /* tooltip_text */
990 ggp_status_types, /* status_types */ 957 ggp_status_types, /* status_types */
991 NULL, /* blist_node_menu */ 958 NULL, /* blist_node_menu */
992 #if GGP_ENABLE_GG11
993 ggp_chat_info, /* chat_info */ 959 ggp_chat_info, /* chat_info */
994 ggp_chat_info_defaults, /* chat_info_defaults */ 960 ggp_chat_info_defaults, /* chat_info_defaults */
995 #else
996 NULL, NULL,
997 #endif
998 ggp_login, /* login */ 961 ggp_login, /* login */
999 ggp_close, /* close */ 962 ggp_close, /* close */
1000 ggp_message_send_im, /* send_im */ 963 ggp_message_send_im, /* send_im */
1001 NULL, /* set_info */ 964 NULL, /* set_info */
1002 ggp_send_typing, /* send_typing */ 965 ggp_send_typing, /* send_typing */
1011 NULL, /* add_permit */ 974 NULL, /* add_permit */
1012 ggp_add_deny, /* add_deny */ 975 ggp_add_deny, /* add_deny */
1013 NULL, /* rem_permit */ 976 NULL, /* rem_permit */
1014 ggp_rem_deny, /* rem_deny */ 977 ggp_rem_deny, /* rem_deny */
1015 NULL, /* set_permit_deny */ 978 NULL, /* set_permit_deny */
1016 #if GGP_ENABLE_GG11
1017 ggp_chat_join, /* join_chat */ 979 ggp_chat_join, /* join_chat */
1018 NULL, /* TODO */ /* reject_chat */ 980 NULL, /* TODO */ /* reject_chat */
1019 ggp_chat_get_name, /* get_chat_name */ 981 ggp_chat_get_name, /* get_chat_name */
1020 ggp_chat_invite, /* chat_invite */ 982 ggp_chat_invite, /* chat_invite */
1021 ggp_chat_leave, /* chat_leave */ 983 ggp_chat_leave, /* chat_leave */
1022 ggp_chat_send, /* chat_send */ 984 ggp_chat_send, /* chat_send */
1023 #else
1024 NULL, NULL, NULL, NULL, NULL, NULL,
1025 #endif
1026 ggp_keepalive, /* keepalive */ 985 ggp_keepalive, /* keepalive */
1027 NULL, /* register_user */ 986 NULL, /* register_user */
1028 NULL, /* get_cb_info */ 987 NULL, /* get_cb_info */
1029 ggp_roster_alias_buddy, /* alias_buddy */ 988 ggp_roster_alias_buddy, /* alias_buddy */
1030 ggp_roster_group_buddy, /* group_buddy */ 989 ggp_roster_group_buddy, /* group_buddy */
1035 ggp_avatar_own_set, /* set_buddy_icon */ 994 ggp_avatar_own_set, /* set_buddy_icon */
1036 NULL, /* remove_group */ 995 NULL, /* remove_group */
1037 NULL, /* get_cb_real_name */ 996 NULL, /* get_cb_real_name */
1038 NULL, /* set_chat_topic */ 997 NULL, /* set_chat_topic */
1039 NULL, /* find_blist_chat */ 998 NULL, /* find_blist_chat */
1040 #if GGP_ENABLE_GG11
1041 ggp_chat_roomlist_get_list, /* roomlist_get_list */ 999 ggp_chat_roomlist_get_list, /* roomlist_get_list */
1042 #else
1043 NULL,
1044 #endif
1045 NULL, /* roomlist_cancel */ 1000 NULL, /* roomlist_cancel */
1046 NULL, /* roomlist_expand_category */ 1001 NULL, /* roomlist_expand_category */
1047 ggp_edisc_xfer_can_receive_file, /* can_receive_file */ 1002 ggp_edisc_xfer_can_receive_file, /* can_receive_file */
1048 ggp_edisc_xfer_send_file, /* send_file */ 1003 ggp_edisc_xfer_send_file, /* send_file */
1049 ggp_edisc_xfer_send_new, /* new_xfer */ 1004 ggp_edisc_xfer_send_new, /* new_xfer */

mercurial