Mercurial > pidgin
comparison libpurple/protocols/qq/qq.c @ 25871:65cfc59858cf
propagate from branch 'im.pidgin.pidgin' (head d5bb29138cbe033bbfd8ec689203d73818765327)
to branch 'im.pidgin.pidgin.next.minor' (head 35ee8e40db640867e5b9239030cdc326e7f0a005)
author | Gary Kramlich <grim@reaperworld.com> |
---|---|
date | Sat, 13 Dec 2008 05:45:27 +0000 |
parents | 0331bc480515 8f757b2139d2 |
children |
comparison
equal
deleted
inserted
replaced
25870:d9da15c9e2a1 | 25871:65cfc59858cf |
---|---|
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; |
438 PurpleConnection *gc = purple_account_get_connection(account); | 439 PurpleConnection *gc = purple_account_get_connection(account); |
439 | 440 |
440 qq_request_change_status(gc, 0); | 441 qq_request_change_status(gc, 0); |
441 } | 442 } |
442 | 443 |
443 static void qq_add_deny(PurpleConnection *gc, const char *who) | |
444 { | |
445 qq_data *qd; | |
446 g_return_if_fail(NULL != gc && NULL != gc->proto_data); | |
447 | |
448 qd = (qq_data *) gc->proto_data; | |
449 if (!qd->is_login) | |
450 return; | |
451 | |
452 if (!who || who[0] == '\0') | |
453 return; | |
454 | |
455 purple_debug_info("QQ", "Add deny for %s\n", who); | |
456 } | |
457 | |
458 static void qq_rem_deny(PurpleConnection *gc, const char *who) | |
459 { | |
460 qq_data *qd; | |
461 g_return_if_fail(NULL != gc && NULL != gc->proto_data); | |
462 | |
463 qd = (qq_data *) gc->proto_data; | |
464 if (!qd->is_login) | |
465 return; | |
466 | |
467 if (!who || who[0] == '\0') | |
468 return; | |
469 | |
470 purple_debug_info("QQ", "Rem deny for %s\n", who); | |
471 } | |
472 | |
473 static void qq_set_permit_deny(PurpleConnection *gc) | |
474 { | |
475 PurpleAccount *account; | |
476 GSList *deny; | |
477 | |
478 purple_debug_info("QQ", "Set permit deny\n"); | |
479 account = purple_connection_get_account(gc); | |
480 switch (account->perm_deny) | |
481 { | |
482 case PURPLE_PRIVACY_ALLOW_ALL: | |
483 for (deny = account->deny; deny; deny = deny->next) | |
484 qq_rem_deny(gc, deny->data); | |
485 break; | |
486 | |
487 case PURPLE_PRIVACY_ALLOW_BUDDYLIST: | |
488 case PURPLE_PRIVACY_ALLOW_USERS: | |
489 case PURPLE_PRIVACY_DENY_USERS: | |
490 case PURPLE_PRIVACY_DENY_ALL: | |
491 for (deny = account->deny; deny; deny = deny->next) | |
492 qq_add_deny(gc, deny->data); | |
493 break; | |
494 } | |
495 } | |
496 | |
497 /* IMPORTANT: PurpleConvImFlags -> PurpleMessageFlags */ | |
498 /* send an instant msg to a buddy */ | |
499 static gint qq_send_im(PurpleConnection *gc, const gchar *who, const gchar *message, PurpleMessageFlags flags) | |
500 { | |
501 gint type, uid_to; | |
502 gchar *msg, *msg_with_qq_smiley; | |
503 qq_data *qd; | |
504 | |
505 g_return_val_if_fail(who != NULL, -1); | |
506 | |
507 qd = (qq_data *) gc->proto_data; | |
508 | |
509 g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG); | |
510 | |
511 type = (flags == PURPLE_MESSAGE_AUTO_RESP ? QQ_IM_AUTO_REPLY : QQ_IM_TEXT); | |
512 uid_to = purple_name_to_uid(who); | |
513 | |
514 /* if msg is to myself, bypass the network */ | |
515 if (uid_to == qd->uid) { | |
516 serv_got_im(gc, who, message, flags, time(NULL)); | |
517 } else { | |
518 msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT); | |
519 msg_with_qq_smiley = purple_smiley_to_qq(msg); | |
520 qq_request_send_im(gc, uid_to, msg_with_qq_smiley, type); | |
521 g_free(msg); | |
522 g_free(msg_with_qq_smiley); | |
523 } | |
524 | |
525 return 1; | |
526 } | |
527 | |
528 /* send a chat msg to a QQ Qun */ | |
529 static int qq_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) | |
530 { | |
531 gchar *msg, *msg_with_qq_smiley; | |
532 guint32 room_id = id; | |
533 | |
534 g_return_val_if_fail(message != NULL, -1); | |
535 g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG); | |
536 | |
537 purple_debug_info("QQ_MESG", "Send qun mesg in utf8: %s\n", message); | |
538 msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT); | |
539 msg_with_qq_smiley = purple_smiley_to_qq(msg); | |
540 qq_request_room_send_im(gc, room_id, msg_with_qq_smiley); | |
541 g_free(msg); | |
542 g_free(msg_with_qq_smiley); | |
543 | |
544 return 1; | |
545 } | |
546 | |
547 /* send packet to get who's detailed information */ | 444 /* send packet to get who's detailed information */ |
548 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who) | 445 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who) |
549 { | 446 { |
550 guint32 uid; | 447 guint32 uid; |
551 qq_data *qd; | 448 qq_data *qd; |
598 | 495 |
599 icon_name = qq_get_icon_name(qd->my_icon); | 496 icon_name = qq_get_icon_name(qd->my_icon); |
600 icon_path = qq_get_icon_path(icon_name); | 497 icon_path = qq_get_icon_path(icon_name); |
601 g_free(icon_name); | 498 g_free(icon_name); |
602 | 499 |
603 purple_debug_info("QQ", "Change prev icon %s to ...\n", icon_path); | 500 purple_debug_info("QQ", "Change prev icon %s to...\n", icon_path); |
604 purple_request_file(action, _("Select icon..."), icon_path, | 501 purple_request_file(action, _("Select icon..."), icon_path, |
605 FALSE, | 502 FALSE, |
606 G_CALLBACK(qq_change_icon_cb), NULL, | 503 G_CALLBACK(qq_change_icon_cb), NULL, |
607 purple_connection_get_account(gc), NULL, NULL, | 504 purple_connection_get_account(gc), NULL, NULL, |
608 gc); | 505 gc); |
759 g_string_append(info, "OpenQ Team : http://openq.linuxsir.org<br>\n"); | 656 g_string_append(info, "OpenQ Team : http://openq.linuxsir.org<br>\n"); |
760 g_string_append(info, "LumaQQ Team : http://lumaqq.linuxsir.org<br>\n"); | 657 g_string_append(info, "LumaQQ Team : http://lumaqq.linuxsir.org<br>\n"); |
761 g_string_append(info, "khc(at)pidgin.im<br>\n"); | 658 g_string_append(info, "khc(at)pidgin.im<br>\n"); |
762 g_string_append(info, "qulogic(at)pidgin.im<br>\n"); | 659 g_string_append(info, "qulogic(at)pidgin.im<br>\n"); |
763 g_string_append(info, "rlaager(at)pidgin.im<br>\n"); | 660 g_string_append(info, "rlaager(at)pidgin.im<br>\n"); |
661 g_string_append(info, "Huang Guan : http://home.xxsyzx.com<br>\n"); | |
764 g_string_append(info, "OpenQ Google Group : http://groups.google.com/group/openq<br>\n"); | 662 g_string_append(info, "OpenQ Google Group : http://groups.google.com/group/openq<br>\n"); |
765 g_string_append(info, "<br>\n"); | 663 g_string_append(info, "<br>\n"); |
766 g_string_append(info, _("<p><i>And, all the boys in the backroom...</i><br>\n")); | 664 g_string_append(info, _("<p><i>And, all the boys in the backroom...</i><br>\n")); |
767 g_string_append(info, _("<i>Feel free to join us!</i> :)")); | 665 g_string_append(info, _("<i>Feel free to join us!</i> :)")); |
768 g_string_append(info, "</body></html>"); | 666 g_string_append(info, "</body></html>"); |
769 | 667 |
770 title = g_strdup_printf(_("About OpenQ r%s"), OPENQ_VERSION); | 668 title = g_strdup_printf(_("About OpenQ %s"), OPENQ_VERSION); |
771 purple_notify_formatted(gc, title, title, NULL, info->str, NULL, NULL); | 669 purple_notify_formatted(gc, title, title, NULL, info->str, NULL, NULL); |
772 | 670 |
773 g_free(title); | 671 g_free(title); |
774 g_string_free(info, TRUE); | 672 g_string_free(info, TRUE); |
775 } | 673 } |
805 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); | 703 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); |
806 | 704 |
807 g_return_if_fail(components != NULL); | 705 g_return_if_fail(components != NULL); |
808 | 706 |
809 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); | 707 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); |
810 room_id = strtol(num_str, NULL, 10); | 708 room_id = strtoul(num_str, NULL, 10); |
811 g_return_if_fail(room_id != 0); | 709 g_return_if_fail(room_id != 0); |
812 | 710 |
813 qq_room_quit(gc, room_id); | 711 qq_room_quit(gc, room_id); |
814 } | 712 } |
815 | 713 |
825 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); | 723 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); |
826 | 724 |
827 g_return_if_fail(components != NULL); | 725 g_return_if_fail(components != NULL); |
828 | 726 |
829 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); | 727 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); |
830 room_id = strtol(num_str, NULL, 10); | 728 room_id = strtoul(num_str, NULL, 10); |
831 g_return_if_fail(room_id != 0); | 729 g_return_if_fail(room_id != 0); |
832 | 730 |
833 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0, | 731 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0, |
834 0, QQ_ROOM_INFO_DISPLAY); | 732 0, QQ_ROOM_INFO_DISPLAY); |
835 } | 733 } |
1038 qq_status_text, /* status_text */ | 936 qq_status_text, /* status_text */ |
1039 qq_tooltip_text, /* tooltip_text */ | 937 qq_tooltip_text, /* tooltip_text */ |
1040 qq_status_types, /* away_states */ | 938 qq_status_types, /* away_states */ |
1041 qq_blist_node_menu, /* blist_node_menu */ | 939 qq_blist_node_menu, /* blist_node_menu */ |
1042 qq_chat_info, /* chat_info */ | 940 qq_chat_info, /* chat_info */ |
1043 qq_chat_info_defaults, /* chat_info_defaults */ | 941 qq_chat_info_defaults, /* chat_info_defaults */ |
1044 qq_login, /* open */ | 942 qq_login, /* open */ |
1045 qq_close, /* close */ | 943 qq_close, /* close */ |
1046 qq_send_im, /* send_im */ | 944 qq_send_im, /* send_im */ |
1047 NULL, /* set_info */ | 945 NULL, /* set_info */ |
1048 NULL, /* send_typing */ | 946 NULL, /* send_typing */ |
1049 qq_show_buddy_info, /* get_info */ | 947 qq_show_buddy_info, /* get_info */ |
1050 qq_change_status, /* change status */ | 948 qq_change_status, /* change status */ |
1051 NULL, /* set_idle */ | 949 NULL, /* set_idle */ |
1052 NULL, /* change_passwd */ | 950 NULL, /* change_passwd */ |
1053 qq_add_buddy, /* add_buddy */ | 951 qq_add_buddy, /* add_buddy */ |
1054 NULL, /* add_buddies */ | 952 NULL, /* add_buddies */ |
1055 qq_remove_buddy, /* remove_buddy */ | 953 qq_remove_buddy, /* remove_buddy */ |
1056 NULL, /* remove_buddies */ | 954 NULL, /* remove_buddies */ |
1057 NULL, /* add_permit */ | 955 NULL, /* add_permit */ |
1058 qq_add_deny, /* add_deny */ | 956 NULL, /* add_deny */ |
1059 NULL, /* rem_permit */ | 957 NULL, /* rem_permit */ |
1060 NULL, /* rem_deny */ | 958 NULL, /* rem_deny */ |
1061 qq_set_permit_deny, /* set_permit_deny */ | 959 NULL, /* set_permit_deny */ |
1062 qq_group_join, /* join_chat */ | 960 qq_group_join, /* join_chat */ |
1063 NULL, /* reject chat invite */ | 961 NULL, /* reject chat invite */ |
1064 NULL, /* get_chat_name */ | 962 NULL, /* get_chat_name */ |
1065 NULL, /* chat_invite */ | 963 NULL, /* chat_invite */ |
1066 NULL, /* chat_leave */ | 964 NULL, /* chat_leave */ |
1067 NULL, /* chat_whisper */ | 965 NULL, /* chat_whisper */ |
1076 NULL, /* buddy_free */ | 974 NULL, /* buddy_free */ |
1077 NULL, /* convo_closed */ | 975 NULL, /* convo_closed */ |
1078 NULL, /* normalize */ | 976 NULL, /* normalize */ |
1079 qq_set_custom_icon, | 977 qq_set_custom_icon, |
1080 NULL, /* remove_group */ | 978 NULL, /* remove_group */ |
1081 qq_get_chat_buddy_real_name, /* get_cb_real_name */ | 979 qq_get_chat_buddy_real_name, /* get_cb_real_name */ |
1082 NULL, /* set_chat_topic */ | 980 NULL, /* set_chat_topic */ |
1083 NULL, /* find_blist_chat */ | 981 NULL, /* find_blist_chat */ |
1084 qq_roomlist_get_list, /* roomlist_get_list */ | 982 qq_roomlist_get_list, /* roomlist_get_list */ |
1085 qq_roomlist_cancel, /* roomlist_cancel */ | 983 qq_roomlist_cancel, /* roomlist_cancel */ |
1086 NULL, /* roomlist_expand_category */ | 984 NULL, /* roomlist_expand_category */ |
1087 NULL, /* can_receive_file */ | 985 NULL, /* can_receive_file */ |
1088 NULL, /* qq_send_file send_file */ | 986 NULL, /* qq_send_file send_file */ |
1089 NULL, /* new xfer */ | 987 NULL, /* new xfer */ |
1090 NULL, /* offline_message */ | 988 NULL, /* offline_message */ |
1171 g_list_free(server_list); | 1069 g_list_free(server_list); |
1172 | 1070 |
1173 option = purple_account_option_list_new(_("Select Server"), "server", server_kv_list); | 1071 option = purple_account_option_list_new(_("Select Server"), "server", server_kv_list); |
1174 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1072 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1175 | 1073 |
1176 //#ifdef DEBUG | |
1177 kvp = g_new0(PurpleKeyValuePair, 1); | 1074 kvp = g_new0(PurpleKeyValuePair, 1); |
1178 kvp->key = g_strdup(_("QQ2005")); | 1075 kvp->key = g_strdup(_("QQ2005")); |
1179 kvp->value = g_strdup("qq2005"); | 1076 kvp->value = g_strdup("qq2005"); |
1180 version_kv_list = g_list_append(version_kv_list, kvp); | 1077 version_kv_list = g_list_append(version_kv_list, kvp); |
1181 | 1078 |
1189 kvp->value = g_strdup("qq2008"); | 1086 kvp->value = g_strdup("qq2008"); |
1190 version_kv_list = g_list_append(version_kv_list, kvp); | 1087 version_kv_list = g_list_append(version_kv_list, kvp); |
1191 | 1088 |
1192 option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list); | 1089 option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list); |
1193 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1090 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1194 //#endif | |
1195 | 1091 |
1196 option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE); | 1092 option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE); |
1197 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1093 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1198 | 1094 |
1199 option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); | 1095 option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); |
1209 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1105 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1210 | 1106 |
1211 purple_prefs_add_none("/plugins/prpl/qq"); | 1107 purple_prefs_add_none("/plugins/prpl/qq"); |
1212 purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); | 1108 purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); |
1213 purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); | 1109 purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); |
1214 purple_prefs_add_bool("/plugins/prpl/qq/auto_popup_conversation", FALSE); | 1110 purple_prefs_add_bool("/plugins/prpl/qq/auto_popup_conversation", TRUE); |
1215 purple_prefs_add_bool("/plugins/prpl/qq/auto_get_authorize_info", TRUE); | 1111 purple_prefs_add_bool("/plugins/prpl/qq/auto_get_authorize_info", TRUE); |
1216 purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3); | 1112 purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3); |
1217 purple_prefs_add_int("/plugins/prpl/qq/resend_times", 10); | 1113 purple_prefs_add_int("/plugins/prpl/qq/resend_times", 10); |
1218 } | 1114 } |
1219 | 1115 |