Mercurial > pidgin.yaz
changeset 23659:c1e23b9d9cf5
merge of '006d5deacf5a5a7ed5e6410903c3815794845ce9'
and 'c6f48a020334f1614d2363fdc8f52c3ea71a0018'
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Tue, 29 Jul 2008 07:02:18 +0000 |
parents | 3bc912c3874a (diff) 860e5e210fc9 (current diff) |
children | f4001a130765 |
files | |
diffstat | 26 files changed, 336 insertions(+), 173 deletions(-) [+] |
line wrap: on
line diff
--- a/AUTHORS Tue Jul 29 07:01:30 2008 +0000 +++ b/AUTHORS Tue Jul 29 07:02:18 2008 +0000 @@ -24,6 +24,7 @@ Bartosz Oler - Developer Etan 'deryni' Reisner - Developer Tim 'marv' Ringenbach - Developer +Elliott 'QuLogic' Sales de Andrade - Developer Luke 'LSchiere' Schierer - Support Megan 'Cae' Schneider - support/QA Evan Schoenberg - Developer @@ -37,7 +38,6 @@ Felipe 'shx' Contreras Dennis 'EvilDennisR' Ristuccia Peter 'Fmoo' Ruibal -Elliott 'QuLogic' Sales de Andrade Gabriel 'Nix' Schulhof Jorge 'Masca' Villaseñor
--- a/ChangeLog.win32 Tue Jul 29 07:01:30 2008 +0000 +++ b/ChangeLog.win32 Tue Jul 29 07:02:18 2008 +0000 @@ -1,5 +1,7 @@ version 2.5.0 (??/??/2008): * Don't install the GSSAPI SASL plugin on NT4 to avoid an error popup. + * Upgrade to Perl 5.10 (System Perl runtime must be upgraded for Perl + plugins to continue to work). version 2.4.3 (07/01/2008): * No changes
--- a/doc/funniest_home_convos.txt Tue Jul 29 07:01:30 2008 +0000 +++ b/doc/funniest_home_convos.txt Tue Jul 29 07:02:18 2008 +0000 @@ -510,3 +510,8 @@ 12:58 <staggered_ranks> why hasn't support for napster been removed? 12:58 <deryni> It has. 12:59 <staggered_ranks> oh.. ok + + +14:39 <rrobbertt> Does anyone know a way to get text to speech with pidgin? +14:41 <elb> do you want to be rooted sooner, or later? +14:42 <seanegan> good question"; rm -rf ~
--- a/doc/pidgin.1.in Tue Jul 29 07:01:30 2008 +0000 +++ b/doc/pidgin.1.in Tue Jul 29 07:02:18 2008 +0000 @@ -582,6 +582,8 @@ .br Tim 'marv' Ringenbach (developer) <\fImarv_sf@users.sf.net\fR> .br + Elliott 'QuLogic' Sales de Andrade (developer) +.br Luke 'LSchiere' Schierer (support) .br Megan 'Cae' Schneider (support/QA) @@ -606,8 +608,6 @@ .br Peter 'fmoo' Ruibal .br - Elliott 'QuLogic' Sales de Andrade -.br Gabriel 'Nix' Schulhof .br Jorge 'Masca' Villaseñor
--- a/libpurple/plugins/perl/Makefile.mingw Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/plugins/perl/Makefile.mingw Tue Jul 29 07:02:18 2008 +0000 @@ -47,7 +47,7 @@ -lws2_32 \ -lintl \ -lpurple \ - -lperl58 + -lperl510 include $(PIDGIN_COMMON_RULES)
--- a/libpurple/plugins/perl/common/Makefile.mingw Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/plugins/perl/common/Makefile.mingw Tue Jul 29 07:02:18 2008 +0000 @@ -5,6 +5,7 @@ # PIDGIN_TREE_TOP := ../../../.. +GCCWARNINGS := -Wno-comment -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Winit-self -Wmissing-declarations -Wmissing-prototypes -Wpointer-arith -Wundef -Wno-unused include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak TARGET = Purple @@ -12,8 +13,6 @@ EXTUTILS ?= C:/perl/lib/ExtUtils PERL_PLUGIN_TOP := .. -CFLAGS += -Wno-comment -Wno-unused - ## ## INCLUDE PATHS ## @@ -77,7 +76,7 @@ ## ## LIBRARIES ## -LIBS = -lperl58 \ +LIBS = -lperl510 \ -lperl \ -lpurple \ -lglib-2.0
--- a/libpurple/plugins/perl/perl-common.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/plugins/perl/perl-common.c Tue Jul 29 07:02:18 2008 +0000 @@ -32,7 +32,10 @@ static MGVTBL vtbl_free_object = { - NULL, NULL, NULL, NULL, magic_free_object, NULL, NULL + 0, 0, 0, 0, magic_free_object, 0, 0 +#if PERL_API_REVISION > 5 || (PERL_API_REVISION == 5 && PERL_API_VERSION >= 10) + , 0 +#endif }; static SV *
--- a/libpurple/plugins/perl/perl-common.h Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/plugins/perl/perl-common.h Tue Jul 29 07:02:18 2008 +0000 @@ -5,9 +5,9 @@ #ifdef _WIN32 #undef pipe #endif -#include <XSUB.h> #include <EXTERN.h> #include <perl.h> +#include <XSUB.h> /* XXX: perl defines it's own _ but I think it's safe to undef it */ #undef _
--- a/libpurple/plugins/perl/perl.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/plugins/perl/perl.c Tue Jul 29 07:02:18 2008 +0000 @@ -67,6 +67,10 @@ #undef group /* perl module support */ +#ifdef _WIN32 +EXTERN_C void boot_Win32CORE (pTHX_ CV* cv); +#endif + #ifdef OLD_PERL extern void boot_DynaLoader _((CV * cv)); #else @@ -127,10 +131,14 @@ #endif { char *file = __FILE__; + dXSUB_SYS; /* This one allows dynamic loading of perl modules in perl scripts by * the 'use perlmod;' construction */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); +#ifdef _WIN32 + newXS("Win32CORE::bootstrap", boot_Win32CORE, file); +#endif } static void @@ -240,18 +248,44 @@ static gboolean probe_perl_plugin(PurplePlugin *plugin) { - /* XXX This would be much faster if I didn't create a new - * PerlInterpreter every time I probed a plugin */ - PerlInterpreter *prober = perl_alloc(); - char *argv[] = {"", plugin->path }; + char *args[] = {"", plugin->path }; + char **argv = args; + int argc = 2; + PerlInterpreter *prober; gboolean status = TRUE; HV *plugin_info; + + PERL_SYS_INIT(&argc, &argv); + + /* XXX This would be much faster if we didn't create a new + * PerlInterpreter every time we probe a plugin */ + prober = perl_alloc(); + PERL_SET_CONTEXT(prober); + PL_perl_destruct_level = 1; perl_construct(prober); - perl_parse(prober, xs_init, 2, argv, NULL); +/* Fix IO redirection to match where pidgin's is going. + * Without this, we lose stdout/stderr unless we redirect to a file */ +#ifdef _WIN32 +{ + PerlIO* newprlIO = PerlIO_open("CONOUT$", "w"); + if (newprlIO) { + int stdout_fd = PerlIO_fileno(PerlIO_stdout()); + int stderr_fd = PerlIO_fileno(PerlIO_stderr()); + PerlIO_close(PerlIO_stdout()); + PerlIO_close(PerlIO_stderr()); + PerlLIO_dup2(PerlIO_fileno(newprlIO), stdout_fd); + PerlLIO_dup2(PerlIO_fileno(newprlIO), stderr_fd); + + PerlIO_close(newprlIO); + } +} +#endif + + perl_parse(prober, xs_init, argc, argv, NULL); perl_run(prober); @@ -578,7 +612,7 @@ load_perl_plugin, /**< load */ unload_perl_plugin, /**< unload */ destroy_perl_plugin, /**< destroy */ - + /* padding */ NULL, NULL,
--- a/libpurple/protocols/irc/irc.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/irc/irc.c Tue Jul 29 07:02:18 2008 +0000 @@ -360,7 +360,8 @@ static gboolean do_login(PurpleConnection *gc) { char *buf, *tmp = NULL; - const char *hostname; + char *hostname, *server; + const char *hosttmp; const char *username, *realname; struct irc_conn *irc = gc->proto_data; const char *pass = purple_connection_get_password(gc); @@ -374,7 +375,6 @@ g_free(buf); } - hostname = purple_get_host_name(); realname = purple_account_get_string(irc->account, "realname", ""); username = purple_account_get_string(irc->account, "username", ""); @@ -389,9 +389,29 @@ } } - buf = irc_format(irc, "vvvv:", "USER", tmp ? tmp : username, hostname, irc->server, - strlen(realname) ? realname : IRC_DEFAULT_ALIAS); + hosttmp = purple_get_host_name(); + if (*hosttmp == ':') { + /* This is either an IPv6 address, or something which + * doesn't belong here. Either way, we need to escape + * it. */ + hostname = g_strdup_printf("0%s", hosttmp); + } else { + /* Ugly, I know. */ + hostname = g_strdup(hosttmp); + } + + if (*irc->server == ':') { + /* Same as hostname, above. */ + server = g_strdup_printf("0%s", irc->server); + } else { + server = g_strdup(irc->server); + } + + buf = irc_format(irc, "vvvv:", "USER", tmp ? tmp : username, hostname, server, + strlen(realname) ? realname : IRC_DEFAULT_ALIAS); g_free(tmp); + g_free(hostname); + g_free(server); if (irc_send(irc, buf) < 0) { g_free(buf); return FALSE;
--- a/libpurple/protocols/jabber/disco.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/jabber/disco.c Tue Jul 29 07:02:18 2008 +0000 @@ -73,6 +73,15 @@ "jid='%s' host='%s' port='%d' zeroconf='%s'\n", from ? from : "", sh->host ? sh->host : "", sh->port, sh->zeroconf ? sh->zeroconf : ""); + + /* TODO: When we support zeroconf proxies, fix this to handle them */ + if (!(sh->jid && sh->host && sh->port > 0)) { + g_free(sh->jid); + g_free(sh->host); + g_free(sh->zeroconf); + g_free(sh); + js->bs_proxies = g_list_remove(js->bs_proxies, sh); + } } @@ -329,6 +338,7 @@ static void jabber_disco_finish_server_info_result_cb(JabberStream *js) { + const char *ft_proxies; jabber_vcard_fetch_mine(js); @@ -339,11 +349,44 @@ /* Send initial presence; this will trigger receipt of presence for contacts on the roster */ jabber_presence_send(js->gc->account, NULL); - + if (js->server_caps & JABBER_CAP_ADHOC) { /* The server supports ad-hoc commands, so let's request the list */ jabber_adhoc_server_get_list(js); } + + /* If there are manually specified bytestream proxies, query them */ + ft_proxies = purple_account_get_string(js->gc->account, "ft_proxies", NULL); + if (ft_proxies) { + JabberIq *iq; + JabberBytestreamsStreamhost *sh; + int i; + char *tmp; + gchar **ft_proxy_list = g_strsplit(ft_proxies, ",", 0); + + for(i = 0; ft_proxy_list[i]; i++) { + g_strstrip(ft_proxy_list[i]); + if(!(*ft_proxy_list[i])) + continue; + + /* We used to allow specifying a port directly here; get rid of it */ + if((tmp = strchr(ft_proxy_list[i], ':'))) + *tmp = '\0'; + + sh = g_new0(JabberBytestreamsStreamhost, 1); + sh->jid = g_strdup(ft_proxy_list[i]); + js->bs_proxies = g_list_prepend(js->bs_proxies, sh); + + iq = jabber_iq_new_query(js, JABBER_IQ_GET, + "http://jabber.org/protocol/bytestreams"); + xmlnode_set_attrib(iq->node, "to", sh->jid); + jabber_iq_set_callback(iq, jabber_disco_bytestream_server_cb, sh); + jabber_iq_send(iq); + } + + g_strfreev(ft_proxy_list); + } + } static void
--- a/libpurple/protocols/jabber/jabber.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.c Tue Jul 29 07:02:18 2008 +0000 @@ -63,6 +63,7 @@ GList *jabber_features = NULL; static void jabber_unregister_account_cb(JabberStream *js); +static void try_srv_connect(JabberStream *js); static void jabber_stream_init(JabberStream *js) { @@ -520,15 +521,23 @@ JabberStream *js = gc->proto_data; if (source < 0) { - gchar *tmp; - tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), - error); - purple_connection_error_reason (gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); - g_free(tmp); + if (js->srv_rec != NULL) { + purple_debug_error("jabber", "Unable to connect to server: %s. Trying next SRV record.\n", error); + try_srv_connect(js); + } else { + gchar *tmp; + tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), + error); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); + g_free(tmp); + } return; } + g_free(js->srv_rec); + js->srv_rec = NULL; + js->fd = source; if(js->state == JABBER_STREAM_CONNECTING) @@ -563,37 +572,62 @@ jabber_login_callback_ssl, jabber_ssl_connect_failure, js->certificate_CN, js->gc); } -static void jabber_login_connect(JabberStream *js, const char *domain, const char *host, int port) +static gboolean jabber_login_connect(JabberStream *js, const char *domain, const char *host, int port, + gboolean fatal_failure) { /* host should be used in preference to domain to * allow SASL authentication to work with FQDN of the server, * but we use domain as fallback for when users enter IP address * in connect server */ + g_free(js->serverFQDN); if (purple_ip_address_is_valid(host)) js->serverFQDN = g_strdup(domain); else js->serverFQDN = g_strdup(host); if (purple_proxy_connect(js->gc, js->gc->account, host, - port, jabber_login_callback, js->gc) == NULL) - purple_connection_error_reason (js->gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Unable to create socket")); + port, jabber_login_callback, js->gc) == NULL) { + if (fatal_failure) { + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to create socket")); + } + + return FALSE; + } + + return TRUE; +} + +static void try_srv_connect(JabberStream *js) +{ + while (js->srv_rec != NULL && js->srv_rec_idx < js->max_srv_rec_idx) { + PurpleSrvResponse *tmp_resp = js->srv_rec + (js->srv_rec_idx++); + if (jabber_login_connect(js, tmp_resp->hostname, tmp_resp->hostname, tmp_resp->port, FALSE)) + return; + } + + g_free(js->srv_rec); + js->srv_rec = NULL; + + /* Fall back to the defaults (I'm not sure if we should actually do this) */ + jabber_login_connect(js, js->user->domain, js->user->domain, + purple_account_get_int(js->gc->account, "port", 5222), TRUE); } static void srv_resolved_cb(PurpleSrvResponse *resp, int results, gpointer data) { - JabberStream *js; - - js = data; + JabberStream *js = data; js->srv_query_data = NULL; if(results) { - jabber_login_connect(js, resp->hostname, resp->hostname, resp->port); - g_free(resp); + js->srv_rec = resp; + js->srv_rec_idx = 0; + js->max_srv_rec_idx = results; + try_srv_connect(js); } else { jabber_login_connect(js, js->user->domain, js->user->domain, - purple_account_get_int(js->gc->account, "port", 5222)); + purple_account_get_int(js->gc->account, "port", 5222), TRUE); } } @@ -675,7 +709,7 @@ * invoke the magic of SRV lookups, to figure out host and port */ if(!js->gsc) { if(connect_server[0]) { - jabber_login_connect(js, js->user->domain, connect_server, purple_account_get_int(account, "port", 5222)); + jabber_login_connect(js, js->user->domain, connect_server, purple_account_get_int(account, "port", 5222), TRUE); } else { js->srv_query_data = purple_srv_resolve("xmpp-client", "tcp", js->user->domain, srv_resolved_cb, js); @@ -1156,7 +1190,7 @@ if (connect_server[0]) { jabber_login_connect(js, js->user->domain, server, purple_account_get_int(account, - "port", 5222)); + "port", 5222), TRUE); } else { js->srv_query_data = purple_srv_resolve("xmpp-client", "tcp", @@ -1327,7 +1361,10 @@ if (js->keepalive_timeout != -1) purple_timeout_remove(js->keepalive_timeout); - + + g_free(js->srv_rec); + js->srv_rec = NULL; + g_free(js); gc->proto_data = NULL;
--- a/libpurple/protocols/jabber/jabber.h Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.h Tue Jul 29 07:02:18 2008 +0000 @@ -201,6 +201,10 @@ /* A purple timeout tag for the keepalive */ int keepalive_timeout; + + PurpleSrvResponse *srv_rec; + guint srv_rec_idx; + guint max_srv_rec_idx; }; typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *shortname, const gchar *namespace);
--- a/libpurple/protocols/jabber/libxmpp.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Tue Jul 29 07:02:18 2008 +0000 @@ -236,7 +236,7 @@ option = purple_account_option_string_new(_("File transfer proxies"), "ft_proxies", /* TODO: Is this an acceptable default? */ - "proxy.jabber.org:7777"); + "proxy.jabber.org"); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
--- a/libpurple/protocols/jabber/si.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/jabber/si.c Tue Jul 29 07:02:18 2008 +0000 @@ -721,7 +721,6 @@ JabberSIXfer *jsx; JabberIq *iq; xmlnode *query, *streamhost; - const char *ft_proxies; char port[6]; GList *tmp; JabberBytestreamsStreamhost *sh, *sh2; @@ -785,52 +784,6 @@ jabber_si_xfer_bytestreams_send_connected_cb, xfer); } - /* insert proxies here */ - ft_proxies = purple_account_get_string(xfer->account, "ft_proxies", NULL); - if (ft_proxies) { - int i, portnum; - char *tmp; - gchar **ft_proxy_list = g_strsplit(ft_proxies, ",", 0); - - g_list_foreach(jsx->streamhosts, jabber_si_free_streamhost, NULL); - g_list_free(jsx->streamhosts); - jsx->streamhosts = NULL; - - for(i = 0; ft_proxy_list[i]; i++) { - g_strstrip(ft_proxy_list[i]); - if(!(*ft_proxy_list[i])) - continue; - - if((tmp = strchr(ft_proxy_list[i], ':'))) { - portnum = atoi(tmp + 1); - *tmp = '\0'; - } else - portnum = 7777; - - g_snprintf(port, sizeof(port), "%hu", portnum); - - purple_debug_info("jabber", "jabber_si_xfer_bytestreams_listen_cb() will be looking at jsx %p: jsx->streamhosts %p and ft_proxy_list[%i] %p\n", - jsx, jsx->streamhosts, i, ft_proxy_list[i]); - if(g_list_find_custom(jsx->streamhosts, ft_proxy_list[i], jabber_si_compare_jid) != NULL) - continue; - - streamhost_count++; - streamhost = xmlnode_new_child(query, "streamhost"); - xmlnode_set_attrib(streamhost, "jid", ft_proxy_list[i]); - xmlnode_set_attrib(streamhost, "host", ft_proxy_list[i]); - xmlnode_set_attrib(streamhost, "port", port); - - sh = g_new0(JabberBytestreamsStreamhost, 1); - sh->jid = g_strdup(ft_proxy_list[i]); - sh->host = g_strdup(ft_proxy_list[i]); - sh->port = portnum; - - jsx->streamhosts = g_list_prepend(jsx->streamhosts, sh); - } - - g_strfreev(ft_proxy_list); - } - for (tmp = jsx->js->bs_proxies; tmp; tmp = tmp->next) { sh = tmp->data;
--- a/libpurple/protocols/oscar/family_locate.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/oscar/family_locate.c Tue Jul 29 07:02:18 2008 +0000 @@ -53,10 +53,9 @@ * These are in ascending numerical order. */ - /* - * Perhaps better called OSCAR_CAPABILITY_SHORTCAPS - */ - {OSCAR_CAPABILITY_ICHAT, + /* Client understands short caps, a UUID of the form + * 0946XXYY-4C7F-11D1-8222-444553540000 where XXYY is the short cap. */ + {OSCAR_CAPABILITY_SHORTCAPS, {0x09, 0x46, 0x00, 0x00, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, @@ -64,11 +63,15 @@ {0x09, 0x46, 0x00, 0x01, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, + {OSCAR_CAPABILITY_XHTML_IM, + {0x09, 0x46, 0x00, 0x02, 0x4c, 0x7f, 0x11, 0xd1, + 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, + {OSCAR_CAPABILITY_VIDEO, {0x09, 0x46, 0x01, 0x00, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, - /* "Live Video" support in Windows AIM 5.5.3501 and newer */ + /* "Live Video" (SIP/RTC Video) support in Windows AIM 5.5.3501 and newer */ {OSCAR_CAPABILITY_LIVEVIDEO, {0x09, 0x46, 0x01, 0x01, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, @@ -78,9 +81,15 @@ {0x09, 0x46, 0x01, 0x02, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, - /* In Windows AIM 5.5.3501 and newer */ + /* "Microphone" support in Windows AIM 5.5.3501 and newer */ + {OSCAR_CAPABILITY_MICROPHONE, + {0x09, 0x46, 0x01, 0x03, 0x4c, 0x7f, 0x11, 0xd1, + 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, + + /* Supports RTC Audio */ + /* OSCAR_CAPABILITY_RTCAUDIO */ {OSCAR_CAPABILITY_GENERICUNKNOWN, - {0x09, 0x46, 0x01, 0x03, 0x4c, 0x7f, 0x11, 0xd1, + {0x09, 0x46, 0x01, 0x04, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, /* In iChatAV (version numbers...?) */ @@ -88,12 +97,21 @@ {0x09, 0x46, 0x01, 0x05, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x45, 0x53, 0x54, 0x00}}, - /* - * Not really sure about this one. In an email from - * 26 Sep 2003, Matthew Sachs suggested that, "this - * is probably the capability for the SMS features." - */ - {OSCAR_CAPABILITY_SMS, + /* Supports "new status message features" (Who advertises this one?) */ + /* OSCAR_CAPABILITY_HOST_STATUS_TEXT_AWARE */ + {OSCAR_CAPABILITY_GENERICUNKNOWN, + {0x09, 0x46, 0x01, 0x0a, 0x4c, 0x7f, 0x11, 0xd1, + 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, + + /* Supports "see as I type" (Who advertises this one?) */ + /* OSCAR_CAPABILITY_SEE_AS_I_TYPE */ + {OSCAR_CAPABILITY_GENERICUNKNOWN, + {0x09, 0x46, 0x01, 0x0b, 0x4c, 0x7f, 0x11, 0xd1, + 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, + + /* Client only asserts caps for services in which it is participating */ + /* OSCAR_CAPABILITY_SMARTCAPS */ + {OSCAR_CAPABILITY_GENERICUNKNOWN, {0x09, 0x46, 0x01, 0xff, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}},
--- a/libpurple/protocols/oscar/oscar.c Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.c Tue Jul 29 07:02:18 2008 +0000 @@ -66,7 +66,9 @@ #define OSCAR_CONNECT_STEPS 6 -static OscarCapability purple_caps = OSCAR_CAPABILITY_CHAT | OSCAR_CAPABILITY_BUDDYICON | OSCAR_CAPABILITY_DIRECTIM | OSCAR_CAPABILITY_SENDFILE | OSCAR_CAPABILITY_UNICODE | OSCAR_CAPABILITY_INTEROPERATE | OSCAR_CAPABILITY_ICHAT; +static OscarCapability purple_caps = (OSCAR_CAPABILITY_CHAT | OSCAR_CAPABILITY_BUDDYICON | OSCAR_CAPABILITY_DIRECTIM | + OSCAR_CAPABILITY_SENDFILE | OSCAR_CAPABILITY_UNICODE | OSCAR_CAPABILITY_INTEROPERATE | + OSCAR_CAPABILITY_SHORTCAPS); static guint8 features_aim[] = {0x01, 0x01, 0x01, 0x02}; static guint8 features_icq[] = {0x01, 0x06}; @@ -1510,6 +1512,7 @@ /* Suspended account */ purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Your account is currently suspended.")); break; + case 0x02: case 0x14: /* service temporarily unavailable */ purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("The AOL Instant Messenger service is temporarily unavailable.")); @@ -3134,7 +3137,7 @@ oscar_user_info_append_status(gc, user_info, /* PurpleBuddy */ NULL, userinfo, /* strip_html_tags */ FALSE); - if (userinfo->present & AIM_USERINFO_PRESENT_IDLE) { + if ((userinfo->present & AIM_USERINFO_PRESENT_IDLE) && userinfo->idletime != 0) { tmp = purple_str_seconds_to_string(userinfo->idletime*60); oscar_user_info_add_pair(user_info, _("Idle"), tmp); g_free(tmp);
--- a/libpurple/protocols/oscar/oscar.h Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.h Tue Jul 29 07:02:18 2008 +0000 @@ -353,17 +353,19 @@ OSCAR_CAPABILITY_TRILLIANCRYPT = 0x00010000, OSCAR_CAPABILITY_UNICODE = 0x00020000, OSCAR_CAPABILITY_INTEROPERATE = 0x00040000, - OSCAR_CAPABILITY_ICHAT = 0x00080000, + OSCAR_CAPABILITY_SHORTCAPS = 0x00080000, OSCAR_CAPABILITY_HIPTOP = 0x00100000, OSCAR_CAPABILITY_SECUREIM = 0x00200000, OSCAR_CAPABILITY_SMS = 0x00400000, - OSCAR_CAPABILITY_GENERICUNKNOWN = 0x00800000, + OSCAR_CAPABILITY_MICROPHONE = 0x00800000, OSCAR_CAPABILITY_VIDEO = 0x01000000, OSCAR_CAPABILITY_ICHATAV = 0x02000000, OSCAR_CAPABILITY_LIVEVIDEO = 0x04000000, OSCAR_CAPABILITY_CAMERA = 0x08000000, - OSCAR_CAPABILITY_ICHAT_SCREENSHARE = 0x10000000, - OSCAR_CAPABILITY_LAST = 0x20000000 + OSCAR_CAPABILITY_ICHAT_SCREENSHARE = 0x10000000, + OSCAR_CAPABILITY_XHTML_IM = 0x20000000, + OSCAR_CAPABILITY_GENERICUNKNOWN = 0x40000000, + OSCAR_CAPABILITY_LAST = 0x80000000 } OscarCapability; /*
--- a/libpurple/win32/global.mak Tue Jul 29 07:01:30 2008 +0000 +++ b/libpurple/win32/global.mak Tue Jul 29 07:02:18 2008 +0000 @@ -19,7 +19,7 @@ MEANWHILE_TOP ?= $(WIN32_DEV_TOP)/meanwhile-1.0.2_daa1 NSPR_TOP ?= $(WIN32_DEV_TOP)/nspr-4.6.4 NSS_TOP ?= $(WIN32_DEV_TOP)/nss-3.11.4 -PERL_LIB_TOP ?= $(WIN32_DEV_TOP)/perl58 +PERL_LIB_TOP ?= $(WIN32_DEV_TOP)/perl-5.10.0 SILC_TOOLKIT ?= $(WIN32_DEV_TOP)/silc-toolkit-1.1.5 TCL_LIB_TOP ?= $(WIN32_DEV_TOP)/tcl-8.4.5 GSTREAMER_TOP ?= $(WIN32_DEV_TOP)/gstreamer-0.10.13 @@ -56,7 +56,7 @@ PIDGIN_EXE := $(PIDGIN_TOP)/pidgin.exe PIDGIN_PORTABLE_EXE := $(PIDGIN_TOP)/pidgin-portable.exe -GCCWARNINGS := -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Winit-self -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wundef +GCCWARNINGS ?= -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Winit-self -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wundef # parse the version number from the configure.ac file if it is newer #m4_define([purple_major_version], [2])
--- a/pidgin/gtkdialogs.c Tue Jul 29 07:01:30 2008 +0000 +++ b/pidgin/gtkdialogs.c Tue Jul 29 07:02:18 2008 +0000 @@ -73,7 +73,8 @@ {"John 'rekkanoryo' Bailey", N_("developer"), NULL}, {"Ethan 'Paco-Paco' Blanton", N_("developer"), NULL}, {"Thomas Butter", N_("developer"), NULL}, - {"Ka-Hing Cheung", N_("developer"), NULL}, + /* feel free to not translate this */ + {N_("Ka-Hing Cheung"), N_("developer"), NULL}, {"Sadrul Habib Chowdhury", N_("developer"), NULL}, {"Mark 'KingAnt' Doliner", N_("developer"), "mark@kingant.net"}, {"Sean Egan", N_("developer"), "sean.egan@gmail.com"}, @@ -85,6 +86,7 @@ {"Bartosz Oler", N_("developer"), NULL}, {"Etan 'deryni' Reisner", N_("developer"), NULL}, {"Tim 'marv' Ringenbach", N_("developer"), NULL}, + {"Elliott 'QuLogic' Sales de Andrade", N_("developer"), NULL}, {"Luke 'LSchiere' Schierer", N_("support"), "lschiere@users.sf.net"}, {"Megan 'Cae' Schneider", N_("support/QA"), NULL}, {"Evan Schoenberg", N_("developer"), NULL}, @@ -100,7 +102,6 @@ {"Felipe 'shx' Contreras", NULL, NULL}, {"Dennis 'EvilDennisR' Ristuccia", N_("Senior Contributor/QA"), NULL}, {"Peter 'Fmoo' Ruibal", NULL, NULL}, - {"Elliott 'QuLogic' Sales de Andrade", NULL, NULL}, {"Gabriel 'Nix' Schulhof", NULL, NULL}, {"Jorge 'Masca' Villaseñor", NULL, NULL}, {NULL, NULL, NULL} @@ -424,11 +425,11 @@ for (i = 0; developers[i].name != NULL; i++) { if (developers[i].email != NULL) { g_string_append_printf(str, " %s (%s) <<a href=\"mailto:%s\">%s</a>><br/>", - developers[i].name, _(developers[i].role), + _(developers[i].name), _(developers[i].role), developers[i].email, developers[i].email); } else { g_string_append_printf(str, " %s (%s)<br/>", - developers[i].name, _(developers[i].role)); + _(developers[i].name), _(developers[i].role)); } } g_string_append(str, "<BR/>");
--- a/pidgin/gtkroomlist.c Tue Jul 29 07:01:30 2008 +0000 +++ b/pidgin/gtkroomlist.c Tue Jul 29 07:02:18 2008 +0000 @@ -53,7 +53,6 @@ PurpleRoomlist *roomlist; gboolean pg_needs_pulse; - gboolean pg_to_active; guint pg_update_to; } PidginRoomlistDialog; @@ -84,32 +83,34 @@ static gint delete_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) { - PidginRoomlistDialog *dialog; - - dialog = (PidginRoomlistDialog *) d; + PidginRoomlistDialog *dialog = d; if (dialog->roomlist && purple_roomlist_get_in_progress(dialog->roomlist)) purple_roomlist_cancel_get_list(dialog->roomlist); + if (dialog->pg_update_to > 0) + purple_timeout_remove(dialog->pg_update_to); + if (dialog->roomlist) { - if (dialog->pg_to_active) { - purple_timeout_remove(dialog->pg_update_to); - dialog->pg_to_active = FALSE; + PidginRoomlist *rl = dialog->roomlist->ui_data; + + if (dialog->pg_update_to > 0) /* yes, that's right, unref it twice. */ purple_roomlist_unref(dialog->roomlist); - } + + if (rl) + rl->dialog = NULL; + purple_roomlist_unref(dialog->roomlist); } - /* free stuff here */ - if (dialog->roomlist) - purple_roomlist_unref(dialog->roomlist); + dialog->progress = NULL; g_free(dialog); return FALSE; } static void dialog_select_account_cb(GObject *w, PurpleAccount *account, - PidginRoomlistDialog *dialog) + PidginRoomlistDialog *dialog) { dialog->account = account; } @@ -186,9 +187,7 @@ GValue val; PurpleRoomlistRoom *room; static struct _menu_cb_info *info; - PidginRoomlistDialog *dialog; - - dialog = grl->dialog; + PidginRoomlistDialog *dialog = grl->dialog; if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { val.g_type = 0; @@ -239,9 +238,7 @@ { PurpleRoomlist *rl = dialog->roomlist; PidginRoomlist *grl = rl->ui_data; - struct _menu_cb_info *info; - - info = (struct _menu_cb_info*)g_object_get_data(G_OBJECT(button), "room-info"); + struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info"); if(info != NULL) do_add_room_cb(grl->tree, info); @@ -256,9 +253,7 @@ { PurpleRoomlist *rl = dialog->roomlist; PidginRoomlist *grl = rl->ui_data; - struct _menu_cb_info *info; - - info = (struct _menu_cb_info*)g_object_get_data(G_OBJECT(button), "room-info"); + struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info"); if(info != NULL) do_join_cb(grl->tree, info); @@ -490,12 +485,13 @@ static gboolean account_filter_func(PurpleAccount *account) { - PurpleConnection *gc = purple_account_get_connection(account); + PurpleConnection *conn = purple_account_get_connection(account); PurplePluginProtocolInfo *prpl_info = NULL; - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if (conn) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(conn->prpl); - return (prpl_info->roomlist_get_list != NULL); + return (prpl_info && prpl_info->roomlist_get_list != NULL); } gboolean @@ -518,10 +514,7 @@ pidgin_roomlist_dialog_new_with_account(PurpleAccount *account) { PidginRoomlistDialog *dialog; - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *bbox; + GtkWidget *window, *vbox, *vbox2, *bbox; dialog = g_new0(PidginRoomlistDialog, 1); dialog->account = account; @@ -611,9 +604,8 @@ void pidgin_roomlist_dialog_show_with_account(PurpleAccount *account) { - PidginRoomlistDialog *dialog; + PidginRoomlistDialog *dialog = pidgin_roomlist_dialog_new_with_account(account); - dialog = pidgin_roomlist_dialog_new_with_account(account); if (!dialog) return; @@ -627,9 +619,7 @@ static void pidgin_roomlist_new(PurpleRoomlist *list) { - PidginRoomlist *rl; - - rl = g_new0(PidginRoomlist, 1); + PidginRoomlist *rl = g_new0(PidginRoomlist, 1); list->ui_data = rl; @@ -802,7 +792,7 @@ if (!rl || !rl->dialog || !rl->dialog->pg_needs_pulse) { if (rl && rl->dialog) - rl->dialog->pg_to_active = FALSE; + rl->dialog->pg_update_to = 0; purple_roomlist_unref(list); return FALSE; } @@ -827,15 +817,14 @@ rl->num_rooms++; if (rl->dialog) { - if (!rl->dialog->pg_to_active) { - rl->dialog->pg_to_active = TRUE; + if (rl->dialog->pg_update_to == 0) { purple_roomlist_ref(list); rl->dialog->pg_update_to = g_timeout_add(100, pidgin_progress_bar_pulse, list); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(rl->dialog->progress)); - } else { + } else rl->dialog->pg_needs_pulse = TRUE; - } } + if (room->parent) { parentrr = g_hash_table_lookup(rl->cats, room->parent); path = gtk_tree_row_reference_get_path(parentrr); @@ -881,14 +870,14 @@ } } -static void pidgin_roomlist_in_progress(PurpleRoomlist *list, gboolean flag) +static void pidgin_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progress) { PidginRoomlist *rl = list->ui_data; if (!rl || !rl->dialog) return; - if (flag) { + if (in_progress) { if (rl->dialog->account_widget) gtk_widget_set_sensitive(rl->dialog->account_widget, FALSE); gtk_widget_set_sensitive(rl->dialog->stop_button, TRUE); @@ -905,12 +894,10 @@ static void pidgin_roomlist_destroy(PurpleRoomlist *list) { - PidginRoomlist *rl; + PidginRoomlist *rl = list->ui_data; roomlists = g_list_remove(roomlists, list); - rl = list->ui_data; - g_return_if_fail(rl != NULL); g_hash_table_destroy(rl->cats);
--- a/pidgin/plugins/perl/common/Makefile.mingw Tue Jul 29 07:01:30 2008 +0000 +++ b/pidgin/plugins/perl/common/Makefile.mingw Tue Jul 29 07:02:18 2008 +0000 @@ -5,13 +5,12 @@ # PIDGIN_TREE_TOP := ../../../.. +GCCWARNINGS := -Wno-comment -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Winit-self -Wmissing-declarations -Wmissing-prototypes -Wpointer-arith -Wundef -Wno-unused include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak TARGET = Pidgin EXTUTILS ?= C:/perl/lib/ExtUtils -CFLAGS += -Wno-comment -Wno-unused - ## ## INCLUDE PATHS ## @@ -72,7 +71,7 @@ ## ## LIBRARIES ## -LIBS = -lperl58 \ +LIBS = -lperl510 \ -lperl \ -lpurple \ -lpidgin \
--- a/pidgin/win32/nsis/pidgin-installer.nsi Tue Jul 29 07:01:30 2008 +0000 +++ b/pidgin/win32/nsis/pidgin-installer.nsi Tue Jul 29 07:02:18 2008 +0000 @@ -72,7 +72,7 @@ !define GTK_MIN_VERSION "2.6.10" !define GTK_REG_KEY "SOFTWARE\GTK\2.0" !define PERL_REG_KEY "SOFTWARE\Perl" -!define PERL_DLL "perl58.dll" +!define PERL_DLL "perl510.dll" !define GTK_DEFAULT_INSTALL_PATH "$COMMONFILES\GTK\2.0" !define GTK_RUNTIME_INSTALLER "..\..\..\..\gtk_installer\gtk-runtime*.exe"
--- a/pidgin/win32/winpidgin.c Tue Jul 29 07:01:30 2008 +0000 +++ b/pidgin/win32/winpidgin.c Tue Jul 29 07:02:18 2008 +0000 @@ -89,9 +89,8 @@ const char *err_msg = get_win32_error_message(retv); printf("Could not read reg key '%s' subkey '%s' value: '%s'.\nMessage: (%ld) %s\n", - ((key == HKEY_LOCAL_MACHINE) ? "HKLM" : - (key == HKEY_CURRENT_USER) ? "HKCU" : - "???"), + (key == HKEY_LOCAL_MACHINE) ? "HKLM" + : ((key == HKEY_CURRENT_USER) ? "HKCU" : "???"), sub_key, val_name, retv, err_msg); } RegCloseKey(hkey); @@ -216,13 +215,13 @@ /* Set up the settings dir base to be \\path\to * The actual settings dir will be \\path\to\.purple */ - snprintf(path2, sizeof(path2), "PURPLEHOME=%s", path); + _snprintf(path2, sizeof(path2), "PURPLEHOME=%s", path); printf("Setting settings dir: %s\n", path2); - putenv(path2); + _putenv(path2); - snprintf(path2, sizeof(path2), "PIDGIN_ASPELL_DIR=%s\\Aspell\\bin", path); + _snprintf(path2, sizeof(path2), "PIDGIN_ASPELL_DIR=%s\\Aspell\\bin", path); printf("%s\n", path2); - putenv(path2); + _putenv(path2); /* set the GTK+ path to be \\path\to\GTK\bin */ strcat(path, "\\GTK\\bin"); @@ -437,9 +436,50 @@ locale = winpidgin_get_locale(); - snprintf(envstr, 25, "LANG=%s", locale); + _snprintf(envstr, 25, "LANG=%s", locale); printf("Setting locale: %s\n", envstr); - putenv(envstr); + _putenv(envstr); +} + +static void winpidgin_add_perl_to_path() { + char perl_path[MAX_PATH + 1]; + DWORD plen = sizeof(perl_path); + + printf("%s", "Looking for Perl... "); + + if (read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\Perl", "", + (LPBYTE) &perl_path, &plen)) { + const char *path = getenv("PATH"); + /* Enough to add "PATH=" + ";" + perl_path + "\\bin" + \0 */ + + /* We *could* check for perl510.dll, but it seems unnecessary. */ + + printf("found in '%s'.\n", perl_path); + + if (perl_path[strlen(perl_path) - 1] != '\\') { + strcat(perl_path, "\\"); + } + strcat(perl_path, "bin"); + + if (!strstr(path, perl_path)) { + int newlen = (path ? strlen(path) : 0) + strlen(perl_path) + 10; + char *newpath = malloc(newlen); + *newpath = '\0'; + + _snprintf(newpath, newlen, "PATH=%s%s%s", + path ? path : "", + path ? ";" : "", + perl_path); + + printf("Adding Perl to PATH: %s\n", newpath); + + _putenv(newpath); + free(newpath); + } else + printf("%s\n", "Perl already in PATH."); + } else + printf("%s", "not found.\n"); + } #define PIDGIN_WM_FOCUS_REQUEST (WM_APP + 13) @@ -598,10 +638,10 @@ } else { DWORD dw = GetLastError(); const char *err_msg = get_win32_error_message(dw); - snprintf(errbuf, 512, + _snprintf(errbuf, 512, "Error getting module filename.\nError: (%u) %s", (UINT) dw, err_msg); - printf("%s", errbuf); + printf("%s\n", errbuf); MessageBox(NULL, errbuf, NULL, MB_OK | MB_TOPMOST); pidgin_dir[0] = '\0'; } @@ -631,6 +671,9 @@ dll_prep(); winpidgin_set_locale(); + + winpidgin_add_perl_to_path(); + /* If help, version or multiple flag used, do not check Mutex */ if (!strstr(lpszCmdLine, "-h") && !strstr(lpszCmdLine, "-v")) if (!winpidgin_set_running(getenv("PIDGIN_MULTI_INST") == NULL && strstr(lpszCmdLine, "-m") == NULL)) @@ -645,11 +688,11 @@ BOOL mod_not_found = (dw == ERROR_MOD_NOT_FOUND || dw == ERROR_DLL_NOT_FOUND); const char *err_msg = get_win32_error_message(dw); - snprintf(errbuf, 512, "Error loading pidgin.dll.\nError: (%u) %s%s%s", + _snprintf(errbuf, 512, "Error loading pidgin.dll.\nError: (%u) %s%s%s", (UINT) dw, err_msg, mod_not_found ? "\n" : "", mod_not_found ? "This probably means that GTK+ can't be found." : ""); - printf("%s", errbuf); + printf("%s\n", errbuf); MessageBox(NULL, errbuf, TEXT("Error"), MB_OK | MB_TOPMOST); return 0;
--- a/po/zh_CN.po Tue Jul 29 07:01:30 2008 +0000 +++ b/po/zh_CN.po Tue Jul 29 07:02:18 2008 +0000 @@ -17454,3 +17454,8 @@ msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "此插件用于调试 XMPP 服务器或客户端。" +#. feel free to not translate this +#: ../pidgin/gtkdialogs.c:77 +msgid "Ka-Hing Cheung" +msgstr "张家兴" +
--- a/po/zh_TW.po Tue Jul 29 07:01:30 2008 +0000 +++ b/po/zh_TW.po Tue Jul 29 07:02:18 2008 +0000 @@ -13684,6 +13684,11 @@ msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "幫助為 XMPP 伺服器或客戶端進行除錯。" +#. feel free to not translate this +#: ../pidgin/gtkdialogs.c:77 +msgid "Ka-Hing Cheung" +msgstr "張家興" + #~ msgid "_Resume" #~ msgstr "恢復(_R)"