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