comparison libpurple/protocols/qq/qq.c @ 26054:68f4edb42f39

propagate from branch 'im.pidgin.pidgin' (head e36b0b63962b9c710ecd798a529e1d2b78d7879a) to branch 'im.pidgin.pidgin.vv' (head bb0c02f78281c46db41ef3efba2896a2edad4441)
author Mike Ruprecht <maiku@soc.pidgin.im>
date Mon, 15 Dec 2008 08:39:08 +0000
parents adf153852bcf 8f757b2139d2
children f0c2e27c7ae7
comparison
equal deleted inserted replaced
26053:99c3489e06b0 26054:68f4edb42f39
54 #include "qq_network.h" 54 #include "qq_network.h"
55 #include "send_file.h" 55 #include "send_file.h"
56 #include "utils.h" 56 #include "utils.h"
57 #include "version.h" 57 #include "version.h"
58 58
59 #ifndef OPENQ_VERSION 59 #define OPENQ_VERSION "0.3.2-p19"
60 #define OPENQ_VERSION DISPLAY_VERSION
61 #endif
62 60
63 static GList *server_list_build(gchar select) 61 static GList *server_list_build(gchar select)
64 { 62 {
65 GList *list = NULL; 63 GList *list = NULL;
66 64
89 static void server_list_create(PurpleAccount *account) 87 static void server_list_create(PurpleAccount *account)
90 { 88 {
91 PurpleConnection *gc; 89 PurpleConnection *gc;
92 qq_data *qd; 90 qq_data *qd;
93 PurpleProxyInfo *gpi; 91 PurpleProxyInfo *gpi;
94 const gchar *user_server; 92 const gchar *custom_server;
95 93
96 gc = purple_account_get_connection(account); 94 gc = purple_account_get_connection(account);
97 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 95 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
98 qd = gc->proto_data; 96 qd = gc->proto_data;
99 97
100 gpi = purple_proxy_get_setup(account); 98 gpi = purple_proxy_get_setup(account);
101 99
102 qd->use_tcp = purple_account_get_bool(account, "use_tcp", TRUE); 100 qd->use_tcp = purple_account_get_bool(account, "use_tcp", TRUE);
103 101
104 user_server = purple_account_get_string(account, "server", NULL); 102 custom_server = purple_account_get_string(account, "server", NULL);
105 purple_debug_info("QQ", "Select server '%s'\n", user_server); 103
106 if ( (user_server != NULL && strlen(user_server) > 0) && strcasecmp(user_server, "auto") != 0) { 104 if (custom_server != NULL) {
107 qd->servers = g_list_append(qd->servers, g_strdup(user_server)); 105 purple_debug_info("QQ", "Select server '%s'\n", custom_server);
108 return; 106 if (*custom_server != '\0' && g_ascii_strcasecmp(custom_server, "auto") != 0) {
107 qd->servers = g_list_append(qd->servers, g_strdup(custom_server));
108 return;
109 }
109 } 110 }
110 111
111 if (qd->use_tcp) { 112 if (qd->use_tcp) {
112 qd->servers = server_list_build('T'); 113 qd->servers = server_list_build('T');
113 return; 114 return;
437 PurpleConnection *gc = purple_account_get_connection(account); 438 PurpleConnection *gc = purple_account_get_connection(account);
438 439
439 qq_request_change_status(gc, 0); 440 qq_request_change_status(gc, 0);
440 } 441 }
441 442
442 static void qq_add_deny(PurpleConnection *gc, const char *who)
443 {
444 qq_data *qd;
445 g_return_if_fail(NULL != gc && NULL != gc->proto_data);
446
447 qd = (qq_data *) gc->proto_data;
448 if (!qd->is_login)
449 return;
450
451 if (!who || who[0] == '\0')
452 return;
453
454 purple_debug_info("QQ", "Add deny for %s\n", who);
455 }
456
457 static void qq_rem_deny(PurpleConnection *gc, const char *who)
458 {
459 qq_data *qd;
460 g_return_if_fail(NULL != gc && NULL != gc->proto_data);
461
462 qd = (qq_data *) gc->proto_data;
463 if (!qd->is_login)
464 return;
465
466 if (!who || who[0] == '\0')
467 return;
468
469 purple_debug_info("QQ", "Rem deny for %s\n", who);
470 }
471
472 static void qq_set_permit_deny(PurpleConnection *gc)
473 {
474 PurpleAccount *account;
475 GSList *deny;
476
477 purple_debug_info("QQ", "Set permit deny\n");
478 account = purple_connection_get_account(gc);
479 switch (account->perm_deny)
480 {
481 case PURPLE_PRIVACY_ALLOW_ALL:
482 for (deny = account->deny; deny; deny = deny->next)
483 qq_rem_deny(gc, deny->data);
484 break;
485
486 case PURPLE_PRIVACY_ALLOW_BUDDYLIST:
487 case PURPLE_PRIVACY_ALLOW_USERS:
488 case PURPLE_PRIVACY_DENY_USERS:
489 case PURPLE_PRIVACY_DENY_ALL:
490 for (deny = account->deny; deny; deny = deny->next)
491 qq_add_deny(gc, deny->data);
492 break;
493 }
494 }
495
496 /* IMPORTANT: PurpleConvImFlags -> PurpleMessageFlags */
497 /* send an instant msg to a buddy */
498 static gint qq_send_im(PurpleConnection *gc, const gchar *who, const gchar *message, PurpleMessageFlags flags)
499 {
500 gint type, uid_to;
501 gchar *msg, *msg_with_qq_smiley;
502 qq_data *qd;
503
504 g_return_val_if_fail(who != NULL, -1);
505
506 qd = (qq_data *) gc->proto_data;
507
508 g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG);
509
510 type = (flags == PURPLE_MESSAGE_AUTO_RESP ? QQ_IM_AUTO_REPLY : QQ_IM_TEXT);
511 uid_to = purple_name_to_uid(who);
512
513 /* if msg is to myself, bypass the network */
514 if (uid_to == qd->uid) {
515 serv_got_im(gc, who, message, flags, time(NULL));
516 } else {
517 msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT);
518 msg_with_qq_smiley = purple_smiley_to_qq(msg);
519 qq_request_send_im(gc, uid_to, msg_with_qq_smiley, type);
520 g_free(msg);
521 g_free(msg_with_qq_smiley);
522 }
523
524 return 1;
525 }
526
527 /* send a chat msg to a QQ Qun */
528 static int qq_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags)
529 {
530 gchar *msg, *msg_with_qq_smiley;
531 guint32 room_id = id;
532
533 g_return_val_if_fail(message != NULL, -1);
534 g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG);
535
536 purple_debug_info("QQ_MESG", "Send qun mesg in utf8: %s\n", message);
537 msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT);
538 msg_with_qq_smiley = purple_smiley_to_qq(msg);
539 qq_request_room_send_im(gc, room_id, msg_with_qq_smiley);
540 g_free(msg);
541 g_free(msg_with_qq_smiley);
542
543 return 1;
544 }
545
546 /* send packet to get who's detailed information */ 443 /* send packet to get who's detailed information */
547 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who) 444 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who)
548 { 445 {
549 guint32 uid; 446 guint32 uid;
550 qq_data *qd; 447 qq_data *qd;
597 494
598 icon_name = qq_get_icon_name(qd->my_icon); 495 icon_name = qq_get_icon_name(qd->my_icon);
599 icon_path = qq_get_icon_path(icon_name); 496 icon_path = qq_get_icon_path(icon_name);
600 g_free(icon_name); 497 g_free(icon_name);
601 498
602 purple_debug_info("QQ", "Change prev icon %s to ...\n", icon_path); 499 purple_debug_info("QQ", "Change prev icon %s to...\n", icon_path);
603 purple_request_file(action, _("Select icon..."), icon_path, 500 purple_request_file(action, _("Select icon..."), icon_path,
604 FALSE, 501 FALSE,
605 G_CALLBACK(qq_change_icon_cb), NULL, 502 G_CALLBACK(qq_change_icon_cb), NULL,
606 purple_connection_get_account(gc), NULL, NULL, 503 purple_connection_get_account(gc), NULL, NULL,
607 gc); 504 gc);
758 g_string_append(info, "OpenQ Team : http://openq.linuxsir.org<br>\n"); 655 g_string_append(info, "OpenQ Team : http://openq.linuxsir.org<br>\n");
759 g_string_append(info, "LumaQQ Team : http://lumaqq.linuxsir.org<br>\n"); 656 g_string_append(info, "LumaQQ Team : http://lumaqq.linuxsir.org<br>\n");
760 g_string_append(info, "khc(at)pidgin.im<br>\n"); 657 g_string_append(info, "khc(at)pidgin.im<br>\n");
761 g_string_append(info, "qulogic(at)pidgin.im<br>\n"); 658 g_string_append(info, "qulogic(at)pidgin.im<br>\n");
762 g_string_append(info, "rlaager(at)pidgin.im<br>\n"); 659 g_string_append(info, "rlaager(at)pidgin.im<br>\n");
660 g_string_append(info, "Huang Guan : http://home.xxsyzx.com<br>\n");
763 g_string_append(info, "OpenQ Google Group : http://groups.google.com/group/openq<br>\n"); 661 g_string_append(info, "OpenQ Google Group : http://groups.google.com/group/openq<br>\n");
764 g_string_append(info, "<br>\n"); 662 g_string_append(info, "<br>\n");
765 g_string_append(info, _("<p><i>And, all the boys in the backroom...</i><br>\n")); 663 g_string_append(info, _("<p><i>And, all the boys in the backroom...</i><br>\n"));
766 g_string_append(info, _("<i>Feel free to join us!</i> :)")); 664 g_string_append(info, _("<i>Feel free to join us!</i> :)"));
767 g_string_append(info, "</body></html>"); 665 g_string_append(info, "</body></html>");
768 666
769 title = g_strdup_printf(_("About OpenQ r%s"), OPENQ_VERSION); 667 title = g_strdup_printf(_("About OpenQ %s"), OPENQ_VERSION);
770 purple_notify_formatted(gc, title, title, NULL, info->str, NULL, NULL); 668 purple_notify_formatted(gc, title, title, NULL, info->str, NULL, NULL);
771 669
772 g_free(title); 670 g_free(title);
773 g_string_free(info, TRUE); 671 g_string_free(info, TRUE);
774 } 672 }
803 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); 701 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node));
804 702
805 g_return_if_fail(components != NULL); 703 g_return_if_fail(components != NULL);
806 704
807 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); 705 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID);
808 room_id = strtol(num_str, NULL, 10); 706 room_id = strtoul(num_str, NULL, 10);
809 g_return_if_fail(room_id != 0); 707 g_return_if_fail(room_id != 0);
810 708
811 qq_room_quit(gc, room_id); 709 qq_room_quit(gc, room_id);
812 } 710 }
813 711
822 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); 720 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node));
823 721
824 g_return_if_fail(components != NULL); 722 g_return_if_fail(components != NULL);
825 723
826 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); 724 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID);
827 room_id = strtol(num_str, NULL, 10); 725 room_id = strtoul(num_str, NULL, 10);
828 g_return_if_fail(room_id != 0); 726 g_return_if_fail(room_id != 0);
829 727
830 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0, 728 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0,
831 0, QQ_ROOM_INFO_DISPLAY); 729 0, QQ_ROOM_INFO_DISPLAY);
832 } 730 }
1035 qq_status_text, /* status_text */ 933 qq_status_text, /* status_text */
1036 qq_tooltip_text, /* tooltip_text */ 934 qq_tooltip_text, /* tooltip_text */
1037 qq_status_types, /* away_states */ 935 qq_status_types, /* away_states */
1038 qq_blist_node_menu, /* blist_node_menu */ 936 qq_blist_node_menu, /* blist_node_menu */
1039 qq_chat_info, /* chat_info */ 937 qq_chat_info, /* chat_info */
1040 qq_chat_info_defaults, /* chat_info_defaults */ 938 qq_chat_info_defaults, /* chat_info_defaults */
1041 qq_login, /* open */ 939 qq_login, /* open */
1042 qq_close, /* close */ 940 qq_close, /* close */
1043 qq_send_im, /* send_im */ 941 qq_send_im, /* send_im */
1044 NULL, /* set_info */ 942 NULL, /* set_info */
1045 NULL, /* send_typing */ 943 NULL, /* send_typing */
1046 qq_show_buddy_info, /* get_info */ 944 qq_show_buddy_info, /* get_info */
1047 qq_change_status, /* change status */ 945 qq_change_status, /* change status */
1048 NULL, /* set_idle */ 946 NULL, /* set_idle */
1049 NULL, /* change_passwd */ 947 NULL, /* change_passwd */
1050 qq_add_buddy, /* add_buddy */ 948 qq_add_buddy, /* add_buddy */
1051 NULL, /* add_buddies */ 949 NULL, /* add_buddies */
1052 qq_remove_buddy, /* remove_buddy */ 950 qq_remove_buddy, /* remove_buddy */
1053 NULL, /* remove_buddies */ 951 NULL, /* remove_buddies */
1054 NULL, /* add_permit */ 952 NULL, /* add_permit */
1055 qq_add_deny, /* add_deny */ 953 NULL, /* add_deny */
1056 NULL, /* rem_permit */ 954 NULL, /* rem_permit */
1057 NULL, /* rem_deny */ 955 NULL, /* rem_deny */
1058 qq_set_permit_deny, /* set_permit_deny */ 956 NULL, /* set_permit_deny */
1059 qq_group_join, /* join_chat */ 957 qq_group_join, /* join_chat */
1060 NULL, /* reject chat invite */ 958 NULL, /* reject chat invite */
1061 NULL, /* get_chat_name */ 959 NULL, /* get_chat_name */
1062 NULL, /* chat_invite */ 960 NULL, /* chat_invite */
1063 NULL, /* chat_leave */ 961 NULL, /* chat_leave */
1064 NULL, /* chat_whisper */ 962 NULL, /* chat_whisper */
1073 NULL, /* buddy_free */ 971 NULL, /* buddy_free */
1074 NULL, /* convo_closed */ 972 NULL, /* convo_closed */
1075 NULL, /* normalize */ 973 NULL, /* normalize */
1076 qq_set_custom_icon, 974 qq_set_custom_icon,
1077 NULL, /* remove_group */ 975 NULL, /* remove_group */
1078 qq_get_chat_buddy_real_name, /* get_cb_real_name */ 976 qq_get_chat_buddy_real_name, /* get_cb_real_name */
1079 NULL, /* set_chat_topic */ 977 NULL, /* set_chat_topic */
1080 NULL, /* find_blist_chat */ 978 NULL, /* find_blist_chat */
1081 qq_roomlist_get_list, /* roomlist_get_list */ 979 qq_roomlist_get_list, /* roomlist_get_list */
1082 qq_roomlist_cancel, /* roomlist_cancel */ 980 qq_roomlist_cancel, /* roomlist_cancel */
1083 NULL, /* roomlist_expand_category */ 981 NULL, /* roomlist_expand_category */
1084 NULL, /* can_receive_file */ 982 NULL, /* can_receive_file */
1085 NULL, /* qq_send_file send_file */ 983 NULL, /* qq_send_file send_file */
1086 NULL, /* new xfer */ 984 NULL, /* new xfer */
1087 NULL, /* offline_message */ 985 NULL, /* offline_message */
1170 g_list_free(server_list); 1068 g_list_free(server_list);
1171 1069
1172 option = purple_account_option_list_new(_("Select Server"), "server", server_kv_list); 1070 option = purple_account_option_list_new(_("Select Server"), "server", server_kv_list);
1173 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); 1071 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
1174 1072
1175 //#ifdef DEBUG
1176 kvp = g_new0(PurpleKeyValuePair, 1); 1073 kvp = g_new0(PurpleKeyValuePair, 1);
1177 kvp->key = g_strdup(_("QQ2005")); 1074 kvp->key = g_strdup(_("QQ2005"));
1178 kvp->value = g_strdup("qq2005"); 1075 kvp->value = g_strdup("qq2005");
1179 version_kv_list = g_list_append(version_kv_list, kvp); 1076 version_kv_list = g_list_append(version_kv_list, kvp);
1180 1077
1188 kvp->value = g_strdup("qq2008"); 1085 kvp->value = g_strdup("qq2008");
1189 version_kv_list = g_list_append(version_kv_list, kvp); 1086 version_kv_list = g_list_append(version_kv_list, kvp);
1190 1087
1191 option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list); 1088 option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list);
1192 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); 1089 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
1193 //#endif
1194 1090
1195 option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE); 1091 option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE);
1196 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); 1092 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
1197 1093
1198 option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); 1094 option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE);
1208 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); 1104 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
1209 1105
1210 purple_prefs_add_none("/plugins/prpl/qq"); 1106 purple_prefs_add_none("/plugins/prpl/qq");
1211 purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); 1107 purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE);
1212 purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); 1108 purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE);
1213 purple_prefs_add_bool("/plugins/prpl/qq/auto_popup_conversation", FALSE); 1109 purple_prefs_add_bool("/plugins/prpl/qq/auto_popup_conversation", TRUE);
1214 purple_prefs_add_bool("/plugins/prpl/qq/auto_get_authorize_info", TRUE); 1110 purple_prefs_add_bool("/plugins/prpl/qq/auto_get_authorize_info", TRUE);
1215 purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3); 1111 purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3);
1216 purple_prefs_add_int("/plugins/prpl/qq/resend_times", 10); 1112 purple_prefs_add_int("/plugins/prpl/qq/resend_times", 10);
1217 } 1113 }
1218 1114