Mercurial > pidgin.yaz
diff libpurple/protocols/qq/qq.c @ 24026:25f62d21b3f8
disapproval of revision '8cebefbc6cd5d84acb69c74e69e8821f11dd225d'
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Mon, 15 Sep 2008 03:04:07 +0000 |
parents | 147ada94a1d8 |
children | 225e0e9e1055 |
line wrap: on
line diff
--- a/libpurple/protocols/qq/qq.c Thu Sep 11 13:25:07 2008 +0000 +++ b/libpurple/protocols/qq/qq.c Mon Sep 15 03:04:07 2008 +0000 @@ -24,6 +24,10 @@ #include "internal.h" +#ifdef _WIN32 +#define random rand +#endif + #include "accountopt.h" #include "debug.h" #include "notify.h" @@ -58,72 +62,79 @@ #define OPENQ_AUTHOR "Puzzlebird" #define OPENQ_WEBSITE "http://openq.sourceforge.net" -static GList *server_list_build(gchar select) -{ - GList *list = NULL; +#define QQ_TCP_PORT 8000 +#define QQ_UDP_PORT 8000 - if ( select == 'T' || select == 'A') { - list = g_list_append(list, "tcpconn.tencent.com:8000"); - list = g_list_append(list, "tcpconn2.tencent.com:8000"); - list = g_list_append(list, "tcpconn3.tencent.com:8000"); - list = g_list_append(list, "tcpconn4.tencent.com:8000"); - list = g_list_append(list, "tcpconn5.tencent.com:8000"); - list = g_list_append(list, "tcpconn6.tencent.com:8000"); - } - if ( select == 'U' || select == 'A') { - list = g_list_append(list, "sz.tencent.com:8000"); - list = g_list_append(list, "sz2.tencent.com:8000"); - list = g_list_append(list, "sz3.tencent.com:8000"); - list = g_list_append(list, "sz4.tencent.com:8000"); - list = g_list_append(list, "sz5.tencent.com:8000"); - list = g_list_append(list, "sz6.tencent.com:8000"); - list = g_list_append(list, "sz7.tencent.com:8000"); - list = g_list_append(list, "sz8.tencent.com:8000"); - list = g_list_append(list, "sz9.tencent.com:8000"); - } - return list; -} - -static void server_list_create(PurpleAccount *account) -{ +static void server_list_create(PurpleAccount *account) { PurpleConnection *gc; qq_data *qd; - PurpleProxyInfo *gpi; const gchar *user_server; + int port; + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Create server list\n"); gc = purple_account_get_connection(account); g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = gc->proto_data; - gpi = purple_proxy_get_setup(account); - - qd->use_tcp = TRUE; - if (purple_proxy_info_get_type(gpi) == PURPLE_PROXY_UDP) { - qd->use_tcp = FALSE; + qd->use_tcp = purple_account_get_bool(account, "use_tcp", TRUE); + port = purple_account_get_int(account, "port", 0); + if (port == 0) { + if (qd->use_tcp) { + port = QQ_TCP_PORT; + } else { + port = QQ_UDP_PORT; + } } + qd->user_port = port; + g_return_if_fail(qd->user_server == NULL); user_server = purple_account_get_string(account, "server", NULL); - purple_debug_info("QQ", "Select server '%s'\n", user_server); - if ( (user_server != NULL && strlen(user_server) > 0) && strcasecmp(user_server, "auto") != 0) { - qd->servers = g_list_append(qd->servers, g_strdup(user_server)); - return; + if (user_server != NULL && strlen(user_server) > 0) { + qd->user_server = g_strdup(user_server); } + if (qd->user_server != NULL) { + qd->servers = g_list_append(qd->servers, qd->user_server); + return; + } if (qd->use_tcp) { - qd->servers = server_list_build('T'); + qd->servers = g_list_append(qd->servers, "tcpconn.tencent.com"); + qd->servers = g_list_append(qd->servers, "tcpconn2.tencent.com"); + qd->servers = g_list_append(qd->servers, "tcpconn3.tencent.com"); + qd->servers = g_list_append(qd->servers, "tcpconn4.tencent.com"); + qd->servers = g_list_append(qd->servers, "tcpconn5.tencent.com"); + qd->servers = g_list_append(qd->servers, "tcpconn6.tencent.com"); return; } - - qd->servers = server_list_build('U'); + + qd->servers = g_list_append(qd->servers, "sz.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz2.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz3.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz4.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz5.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz6.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz7.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz8.tencent.com"); + qd->servers = g_list_append(qd->servers, "sz9.tencent.com"); } -static void server_list_remove_all(qq_data *qd) -{ +static void server_list_remove_all(qq_data *qd) { g_return_if_fail(qd != NULL); - purple_debug_info("QQ", "free server list\n"); + if (qd->real_hostname) { + purple_debug(PURPLE_DEBUG_INFO, "QQ", "free real_hostname\n"); + g_free(qd->real_hostname); + qd->real_hostname = NULL; + } + + if (qd->user_server != NULL) { + purple_debug(PURPLE_DEBUG_INFO, "QQ", "free user_server\n"); + g_free(qd->user_server); + qd->user_server = NULL; + } + + purple_debug(PURPLE_DEBUG_INFO, "QQ", "free server list\n"); g_list_free(qd->servers); - qd->curr_server = NULL; } static void qq_login(PurpleAccount *account) @@ -140,7 +151,6 @@ gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_AUTO_RESP; qd = g_new0(qq_data, 1); - memset(qd, 0, sizeof(qq_data)); qd->gc = gc; gc->proto_data = qd; @@ -155,31 +165,10 @@ } server_list_create(account); - purple_debug_info("QQ", "Server list has %d\n", g_list_length(qd->servers)); - - qd->is_show_notice = purple_account_get_bool(account, "show_notice", TRUE); - qd->is_show_news = purple_account_get_bool(account, "show_news", TRUE); - - qd->itv_config.resend = purple_account_get_int(account, "resend_interval", 10); - if (qd->itv_config.resend <= 0) qd->itv_config.resend = 10; - - qd->itv_config.keep_alive = purple_account_get_int(account, "keep_alive_interval", 60); - if (qd->itv_config.keep_alive < 30) qd->itv_config.keep_alive = 30; - qd->itv_config.keep_alive /= qd->itv_config.resend; - qd->itv_count.keep_alive = qd->itv_config.keep_alive; + purple_debug(PURPLE_DEBUG_INFO, "QQ", + "Server list has %d\n", g_list_length(qd->servers)); - qd->itv_config.update = purple_account_get_int(account, "update_interval", 300); - if (qd->itv_config.update > 0) { - if (qd->itv_config.update < qd->itv_config.keep_alive) { - qd->itv_config.update = qd->itv_config.keep_alive; - } - qd->itv_config.update /= qd->itv_config.resend; - qd->itv_count.update = qd->itv_config.update; - } else { - qd->itv_config.update = 0; - } - - qd->connect_watcher = purple_timeout_add_seconds(0, qq_connect_later, gc); + qq_connect(account); } /* clean up the given QQ connection and free all resources */ @@ -190,20 +179,12 @@ g_return_if_fail(gc != NULL && gc->proto_data); qd = gc->proto_data; - if (qd->check_watcher > 0) { - purple_timeout_remove(qd->check_watcher); - qd->check_watcher = 0; - } + qq_disconnect(gc); - if (qd->connect_watcher > 0) { - purple_timeout_remove(qd->connect_watcher); - qd->connect_watcher = 0; - } + server_list_remove_all(qd); + + g_free(qd); - qq_disconnect(gc); - server_list_remove_all(qd); - - g_free(qd); gc->proto_data = NULL; } @@ -231,7 +212,7 @@ g_string_append(status, _("Offline")); break; case QQ_BUDDY_ONLINE_NORMAL: - g_string_append(status, _("Online")); + return NULL; break; /* TODO What does this status mean? Labelling it as offline... */ case QQ_BUDDY_ONLINE_OFFLINE: @@ -322,8 +303,8 @@ g_string_append( str, _(" Video") ); } - if (q_bud->ext_flag & QQ_EXT_FLAG_ZONE) { - g_string_append( str, _(" Zone") ); + if (q_bud->ext_flag & QQ_EXT_FLAG_SPACE) { + g_string_append( str, _(" Space") ); } purple_notify_user_info_add_pair(user_info, _("Flag"), str->str); @@ -348,7 +329,7 @@ { /* each char** are refering to a filename in pixmaps/purple/status/default/ */ qq_buddy *q_bud; - + if (!b || !(q_bud = b->proto_data)) { return NULL; } @@ -393,11 +374,11 @@ } /* initiate QQ away with proper change_status packet */ -static void _qq_change_status(PurpleAccount *account, PurpleStatus *status) +static void _qq_set_away(PurpleAccount *account, PurpleStatus *status) { PurpleConnection *gc = purple_account_get_connection(account); - qq_request_change_status(gc, 0); + qq_send_packet_change_status(gc); } /* IMPORTANT: PurpleConvImFlags -> PurpleMessageFlags */ @@ -463,7 +444,7 @@ uid = purple_name_to_uid(who); if (uid <= 0) { - purple_debug_error("QQ", "Not valid QQid: %s\n", who); + purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Not valid QQid: %s\n", who); purple_notify_error(gc, NULL, _("Invalid name"), NULL); return; } @@ -535,8 +516,9 @@ g_string_append(info, "<hr>\n"); - g_string_append_printf(info, _("<b>Server</b>: %s<br>\n"), qd->curr_server); + g_string_append_printf(info, _("<b>Server</b>: %s: %d<br>\n"), qd->server_name, qd->real_port); g_string_append_printf(info, _("<b>Connection Mode</b>: %s<br>\n"), qd->use_tcp ? "TCP" : "UDP"); + g_string_append_printf(info, _("<b>Real hostname</b>: %s: %d<br>\n"), qd->real_hostname, qd->real_port); g_string_append_printf(info, _("<b>My Public IP</b>: %s<br>\n"), inet_ntoa(qd->my_ip)); g_string_append(info, "<hr>\n"); @@ -651,7 +633,7 @@ PurpleMenuAction *act; m = NULL; - act = purple_menu_action_new(_("Leave the QQ Qun"), PURPLE_CALLBACK(_qq_menu_unsubscribe_group), NULL, NULL); + act = purple_menu_action_new(_("Leave this QQ Qun"), PURPLE_CALLBACK(_qq_menu_unsubscribe_group), NULL, NULL); m = g_list_append(m, act); /* TODO: enable this @@ -726,7 +708,7 @@ NULL, /* set_info */ NULL, /* send_typing */ _qq_get_info, /* get_info */ - _qq_change_status, /* change status */ + _qq_set_away, /* set_away */ NULL, /* set_idle */ NULL, /* change_passwd */ qq_add_buddy, /* add_buddy */ @@ -818,50 +800,17 @@ static void init_plugin(PurplePlugin *plugin) { PurpleAccountOption *option; - PurpleKeyValuePair *kvp; - GList *list = NULL; - GList *kvlist = NULL; - GList *entry; - list = server_list_build('A'); - - purple_prefs_add_string_list("/plugins/prpl/qq/serverlist", list); - list = purple_prefs_get_string_list("/plugins/prpl/qq/serverlist"); - - kvlist = NULL; - kvp = g_new0(PurpleKeyValuePair, 1); - kvp->key = g_strdup(_("Auto")); - kvp->value = g_strdup("auto"); - kvlist = g_list_append(kvlist, kvp); - - entry = list; - while(entry) { - if (entry->data != NULL && strlen(entry->data) > 0) { - kvp = g_new0(PurpleKeyValuePair, 1); - kvp->key = g_strdup(entry->data); - kvp->value = g_strdup(entry->data); - kvlist = g_list_append(kvlist, kvp); - } - entry = entry->next; - } - - /* option = purple_account_option_string_new(_("Server"), "server", NULL); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); option = purple_account_option_int_new(_("Port"), "port", 0); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - */ - option = purple_account_option_list_new(_("Server"), "server", kvlist); + + option = purple_account_option_bool_new(_("Connect using TCP"), "use_tcp", TRUE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); - prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - - option = purple_account_option_bool_new(_("Show server news"), "show_news", TRUE); - prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - - option = purple_account_option_int_new(_("Resend interval(s)"), "resend_interval", 10); + option = purple_account_option_int_new(_("resend interval(s)"), "resend_interval", 10); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); option = purple_account_option_int_new(_("Keep alive interval(s)"), "keep_alive_interval", 60); @@ -874,7 +823,6 @@ purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); purple_prefs_add_bool("/plugins/prpl/qq/prompt_group_msg_on_recv", TRUE); - } PURPLE_INIT_PLUGIN(qq, init_plugin, info);