--- a/ChangeLog Sun Jul 17 21:57:50 2011 +0000
+++ b/ChangeLog Thu Aug 11 14:44:44 2011 +0000
@@ -3,9 +3,14 @@
version 2.10.0 (MM/DD/YYYY):
* Make the max size of incoming smileys a pref instead of hardcoding it.
- (Quentin Brandon)(#5231)
+ (Quentin Brandon) (#5231) * Added a plugin information dialog to show information for plugins
that aren't otherwise visible in the plugins dialog.
+ * Fix building with GTK+ earlier than 2.14.0 (GTK+ 2.10 is still the + minimum supported) (#14261) + * Fix a potential crash in the Log Reader plugin when reading QIP logs. * Fix a large number of strcpy() and strcat() invocations to use
@@ -19,6 +24,15 @@
* Better status message handling. (Tomasz Wasilczyk) (#14314)
* Merged two buddy blocking methods. (Tomasz Wasilczyk) (#5303)
+ * Fix building of the bundled libgadu library with older versions + of GnuTLS. (patch plucked from upstream) (#14365) + * Fix crash selecting Tools->Set Mood when you're online with an + ICQ account that is configured as an AIM account. (#14437) + * Fix the handling of formatting following mIRC ^O (#14436) * Fix seemingly random crashing. (#14307)
@@ -26,6 +40,12 @@
* Do not generate malformed XML ("</>") when setting an empty mood.
+ * Fix the /join <room> behavior. (Broken when adding support for + <room>@<server>) (#14205) + * Fix coming out of idle while in an unavailable state + * Fix logging into Yahoo! JAPAN. (#14259) version 2.9.0 (06/23/2011):
--- a/libpurple/dnssrv.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/dnssrv.c Thu Aug 11 14:44:44 2011 +0000
@@ -250,6 +250,52 @@
+static PurpleSrvTxtQueryData * +query_data_new(int type, gchar *query, gpointer extradata) + PurpleSrvTxtQueryData *query_data = g_new0(PurpleSrvTxtQueryData, 1); + query_data->type = type; + query_data->extradata = extradata; + query_data->query = query; + query_data->fd_in = -1; + query_data->fd_out = -1; +purple_srv_txt_query_destroy(PurpleSrvTxtQueryData *query_data) + PurpleSrvTxtQueryUiOps *ops = purple_srv_txt_query_get_ui_ops(); + if (ops && ops->destroy) + ops->destroy(query_data); + if (query_data->handle > 0) + purple_input_remove(query_data->handle); + if (query_data->resolver != NULL) + * It's not really possible to kill a thread. So instead we + * just set the callback to NULL and let the DNS lookup + query_data->cb.srv = NULL; + g_free(query_data->error_message); + if (query_data->fd_out != -1) + close(query_data->fd_out); + if (query_data->fd_in != -1) + close(query_data->fd_in); + g_free(query_data->query); dns_str_is_ascii(const char *name)
@@ -523,7 +569,7 @@
waitpid(query_data->pid, &status, 0);
- purple_srv_cancel(query_data);
+ purple_srv_txt_query_destroy(query_data); @@ -583,7 +629,7 @@
query_data->resolver = NULL;
- purple_srv_cancel(query_data);
+ purple_srv_txt_query_destroy(query_data); @@ -730,13 +776,10 @@
purple_debug_info("dnssrv","querying SRV record for %s: %s\n", domain,
- query_data = g_new0(PurpleSrvTxtQueryData, 1);
- query_data->type = PurpleDnsTypeSrv;
+ query_data = query_data_new(PurpleDnsTypeSrv, query, extradata); - query_data->extradata = extradata;
- query_data->query = query;
if (purple_srv_txt_query_ui_resolve(query_data))
@@ -746,6 +789,7 @@
if(pipe(in) || pipe(out)) {
purple_debug_error("dnssrv", "Could not create pipe\n");
@@ -753,8 +797,9 @@
purple_debug_error("dnssrv", "Could not create process!\n");
@@ -762,6 +807,7 @@
@@ -784,8 +830,6 @@
query_data->fd_in = in[1];
query_data->handle = purple_input_add(out[0], PURPLE_INPUT_READ, resolved, query_data);
@@ -862,13 +906,10 @@
purple_debug_info("dnssrv","querying TXT record for %s: %s\n", domain,
- query_data = g_new0(PurpleSrvTxtQueryData, 1);
- query_data->type = PurpleDnsTypeTxt;
+ query_data = query_data_new(PurpleDnsTypeTxt, query, extradata); - query_data->extradata = extradata;
- query_data->query = query;
if (purple_srv_txt_query_ui_resolve(query_data)) {
/* query intentionally not freed
@@ -879,6 +920,7 @@
if(pipe(in) || pipe(out)) {
purple_debug_error("dnssrv", "Could not create pipe\n");
@@ -886,8 +928,9 @@
purple_debug_error("dnssrv", "Could not create process!\n");
@@ -895,6 +938,7 @@
@@ -911,14 +955,12 @@
if (write(in[1], &internal_query, sizeof(internal_query)) < 0)
purple_debug_error("dnssrv", "Could not write to TXT resolver\n");
query_data->fd_out = out[0];
query_data->fd_in = in[1];
query_data->handle = purple_input_add(out[0], PURPLE_INPUT_READ, resolved, query_data);
@@ -949,39 +991,15 @@
-purple_srv_cancel(PurpleSrvTxtQueryData *query_data)
+purple_txt_cancel(PurpleSrvTxtQueryData *query_data) - PurpleSrvTxtQueryUiOps *ops = purple_srv_txt_query_get_ui_ops();
- if (ops && ops->destroy)
- ops->destroy(query_data);
- if (query_data->handle > 0)
- purple_input_remove(query_data->handle);
- if (query_data->resolver != NULL)
- * It's not really possible to kill a thread. So instead we
- * just set the callback to NULL and let the DNS lookup
- query_data->cb.srv = NULL;
- g_free(query_data->query);
- g_free(query_data->error_message);
- close(query_data->fd_out);
- close(query_data->fd_in);
+ purple_srv_txt_query_destroy(query_data); -purple_txt_cancel(PurpleSrvTxtQueryData *query_data)
+purple_srv_cancel(PurpleSrvTxtQueryData *query_data) - purple_srv_cancel(query_data);
+ purple_srv_txt_query_destroy(query_data); @@ -1006,12 +1024,41 @@
purple_srv_query_resolved(PurpleSrvTxtQueryData *query_data, GList *records)
+ PurpleSrvResponse *records_array; g_return_if_fail(records != NULL);
- purple_debug_info("dnssrv", "SRV records resolved for %s, count: %d\n", query_data->query, g_list_length(records));
- if (query_data->cb.srv != NULL)
- query_data->cb.srv(purple_srv_sort(records)->data, g_list_length(records), query_data->extradata);
+ if (query_data->cb.srv == NULL) { + purple_srv_txt_query_destroy(query_data); + records = g_list_delete_link(records, records); + records = purple_srv_sort(records); + length = g_list_length(records); + purple_debug_info("dnssrv", "SRV records resolved for %s, count: %d\n", + query_data->query, length); + records_array = g_new(PurpleSrvResponse, length); + for (l = records; l; l = l->next, i++) { + records_array[i] = *(PurpleSrvResponse *)l->data; + query_data->cb.srv(records_array, length, query_data->extradata); + purple_srv_txt_query_destroy(query_data); + records = g_list_delete_link(records, records); @@ -1024,19 +1071,29 @@
purple_debug_info("dnssrv", "TXT entries resolved for %s, count: %d\n", query_data->query, g_list_length(entries));
+ /* the callback should g_free the entries. if (query_data->cb.txt != NULL)
query_data->cb.txt(entries, query_data->extradata);
+ entries = g_list_delete_link(entries, entries); + purple_srv_txt_query_destroy(query_data); purple_srv_query_failed(PurpleSrvTxtQueryData *query_data, const gchar *error_message)
purple_debug_error("dnssrv", "%s\n", error_message);
if (query_data->cb.srv != NULL)
query_data->cb.srv(NULL, 0, query_data->extradata);
- purple_srv_cancel(query_data);
+ purple_srv_txt_query_destroy(query_data); @@ -1069,7 +1126,7 @@
purple_srv_txt_query_get_query(PurpleSrvTxtQueryData *query_data)
g_return_val_if_fail(query_data != NULL, NULL);
return query_data->query;
@@ -1078,6 +1135,6 @@
purple_srv_txt_query_get_type(PurpleSrvTxtQueryData *query_data)
g_return_val_if_fail(query_data != NULL, 0);
--- a/libpurple/dnssrv.h Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/dnssrv.h Thu Aug 11 14:44:44 2011 +0000
@@ -133,6 +133,8 @@
* Cancel an SRV or DNS query.
* @param query_data The request to cancel.
+ * @deprecated Use purple_srv_txt_query_destroy instead void purple_srv_cancel(PurpleSrvTxtQueryData *query_data);
@@ -170,6 +172,8 @@
* @param query_data The request to cancel.
+ * @deprecated Use purple_srv_txt_query_destroy instead void purple_txt_cancel(PurpleSrvTxtQueryData *query_data);
--- a/libpurple/plugins/log_reader.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/plugins/log_reader.c Thu Aug 11 14:44:44 2011 +0000
@@ -1454,11 +1454,15 @@
const char *footer = NULL;
- if ((c = strstr(c, "\n")))
+ /* There's always a trailing '\n' at the end of the file (see above), so + * just quit out if we don't find another, because we're at the end. @@ -1482,14 +1486,14 @@
- if (!(end_paren = strstr(link, ")")))
+ if (!(end_paren = strchr(link, ')'))) /* Something is not as we expect. Bail out. */
- temp = g_string_sized_new(c ? (c - 1 - line) : strlen(line));
+ temp = g_string_sized_new(strlen(line)); g_string_append_len(temp, line, (tmp - line));
@@ -1504,7 +1508,7 @@
/* The \r is a bit of a hack to keep there from being a \r in
* the link text, which may not matter. */
- if ((space = strstr(end_paren, " ")) || (space = strstr(end_paren, "\r")))
+ if ((space = strchr(end_paren, ' ')) || (space = strchr(end_paren, '\r'))) g_string_append_len(temp, end_paren + 1, space - end_paren - 1);
@@ -1539,7 +1543,7 @@
- if ((timestamp = strstr(line, "]"))) {
+ if ((timestamp = strchr(line, ']'))) { /* TODO: Parse the timestamp and convert it to Purple's format. */
g_string_append(formatted, "<font size=\"2\">(");
@@ -1658,7 +1662,7 @@
- const char *line2 = strstr(line, ":");
+ const char *line2 = strchr(line, ':'); @@ -1819,7 +1823,7 @@
gboolean add_new_log = FALSE;
if (purple_str_has_prefix(c, QIP_LOG_IN_MESSAGE) ||
purple_str_has_prefix(c, QIP_LOG_OUT_MESSAGE)) {
@@ -1828,11 +1832,11 @@
/* Find the last '(' character. */
- if ((tmp = strstr(c, "\n")) != NULL) {
+ if ((tmp = strchr(c, '\n')) != NULL) { while (*tmp && *tmp != '(') --tmp;
@@ -1902,10 +1906,10 @@
+ if ((c = strchr(c, '\n'))) @@ -1983,13 +1987,13 @@
is_in_message = purple_str_has_prefix(line, QIP_LOG_IN_MESSAGE_ESC);
/* XXX: Do we need buddy_name when we have buddy->alias? */
/* Find the last '(' character. */
- if ((tmp = strstr(c, "\n")) != NULL) {
+ if ((tmp = strchr(c, '\n')) != NULL) { while (*tmp && *tmp != '(') --tmp;
@@ -2042,12 +2046,12 @@
- if ((c = strstr(c, "\n")))
+ if ((c = strchr(c, '\n'))) if (line[0] != '\n' && line[0] != '\r') {
@@ -2186,7 +2190,7 @@
sn, data->path, data->offset, data->length);
@@ -2342,7 +2346,7 @@
- end = strstr(start, "\n");
+ end = strchr(start, '\n'); --- a/libpurple/protocols/gg/lib/libgadu.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/gg/lib/libgadu.c Thu Aug 11 14:44:44 2011 +0000
@@ -893,8 +893,7 @@
gnutls_certificate_allocate_credentials(&tmp->xcred);
gnutls_init(&tmp->session, GNUTLS_CLIENT);
- gnutls_priority_set_direct(tmp->session, "NORMAL:-VERS-TLS", NULL);
-// gnutls_priority_set_direct(tmp->session, "NONE:+VERS-SSL3.0:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL", NULL);
+ gnutls_set_default_priority(tmp->session); gnutls_credentials_set(tmp->session, GNUTLS_CRD_CERTIFICATE, tmp->xcred);
#elif defined(GG_CONFIG_HAVE_OPENSSL)
--- a/libpurple/protocols/irc/parse.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/irc/parse.c Thu Aug 11 14:44:44 2011 +0000
@@ -459,6 +459,7 @@
decoded = g_string_append(decoded, "</U>");
decoded = g_string_append(decoded, "</FONT>");
+ bold = italic = underline = font = FALSE; purple_debug(PURPLE_DEBUG_ERROR, "irc", "Unexpected mIRC formatting character %d\n", *cur);
--- a/libpurple/protocols/jabber/jabber.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/jabber/jabber.c Thu Aug 11 14:44:44 2011 +0000
@@ -3009,7 +3009,7 @@
JabberChat *chat = jabber_chat_find_by_conv(conv);
const char *room = NULL, *server = NULL, *handle = NULL;
if (!chat || !args || !args[0])
@@ -3017,7 +3017,8 @@
components = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
- jid = jabber_id_new(args[0]);
+ if (strchr(args[0], '@')) + jid = jabber_id_new(args[0]); @@ -3673,8 +3674,7 @@
PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY |
PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber",
- _("join: <room> [password]: Join a chat on this server."),
- /* _("join: <room[@server]> [password]: Join a chat."), */
+ _("join: <room[@server]> [password]: Join a chat."), commands = g_slist_prepend(commands, GUINT_TO_POINTER(id));
--- a/libpurple/protocols/msn/contact.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/msn/contact.c Thu Aug 11 14:44:44 2011 +0000
@@ -474,7 +474,7 @@
msn_parse_contact_list(MsnSession *session, xmlnode *node)
xmlnode *fault, *faultnode;
@@ -499,13 +499,14 @@
if (g_str_equal(errorcode, "ABDoesNotExist")) {
msn_create_address_book(session);
msn_get_contact_list(session, MSN_PS_INITIAL, NULL);
@@ -514,6 +515,7 @@
service; service = xmlnode_get_next_twin(service)) {
msn_parse_each_service(session, service);
@@ -534,23 +536,24 @@
purple_debug_misc("msn", "Got the contact list!\n");
- msn_parse_contact_list(session, resp->xml);
+ if (msn_parse_contact_list(session, resp->xml)) { - abLastChange = purple_account_get_string(session->account,
- dynamicItemLastChange = purple_account_get_string(session->account,
- "DynamicItemLastChanged", NULL);
+ abLastChange = purple_account_get_string(session->account, + dynamicItemLastChange = purple_account_get_string(session->account, + "DynamicItemLastChanged", NULL); - if (state->partner_scenario == MSN_PS_INITIAL) {
+ if (state->partner_scenario == MSN_PS_INITIAL) { - /* XXX: this should be enabled when we can correctly do partial
- syncs with the server. Currently we need to retrieve the whole
- list to detect sync issues */
- msn_get_address_book(session, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange);
+ /* XXX: this should be enabled when we can correctly do partial + syncs with the server. Currently we need to retrieve the whole + list to detect sync issues */ + msn_get_address_book(session, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange); - msn_get_address_book(session, MSN_PS_INITIAL, NULL, NULL);
+ msn_get_address_book(session, MSN_PS_INITIAL, NULL, NULL); --- a/libpurple/protocols/msn/session.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/msn/session.c Thu Aug 11 14:44:44 2011 +0000
@@ -288,6 +288,8 @@
msn_session_activate_login_timeout(MsnSession *session)
if (!session->logged_in && session->connected) {
+ if (session->login_timeout) + purple_timeout_remove(session->login_timeout); purple_timeout_add_seconds(MSN_LOGIN_FQY_TIMEOUT,
msn_login_timeout_cb, session);
--- a/libpurple/protocols/oscar/oscar.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/oscar/oscar.c Thu Aug 11 14:44:44 2011 +0000
@@ -743,11 +743,15 @@
gc->flags |= PURPLE_CONNECTION_HTML;
if (oscar_util_valid_name_icq((purple_account_get_username(account)))) {
- gc->flags |= PURPLE_CONNECTION_SUPPORT_MOODS;
gc->flags |= PURPLE_CONNECTION_AUTO_RESP;
+ /* Set this flag based on the protocol_id rather than the username, + because that is what's tied to the get_moods prpl callback. */ + if (g_str_equal(purple_account_get_protocol_id(account), "prpl-icq")) + gc->flags |= PURPLE_CONNECTION_SUPPORT_MOODS; od->default_port = purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT);
encryption_type = purple_account_get_string(account, "encryption", OSCAR_DEFAULT_ENCRYPTION);
--- a/libpurple/protocols/sametime/sametime.c Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/sametime/sametime.c Thu Aug 11 14:44:44 2011 +0000
@@ -922,6 +922,11 @@
alias = mwSametimeGroup_getAlias(stgroup);
type = mwSametimeGroup_getType(stgroup);
+ DEBUG_WARN("Can't ensure a null group\n"); DEBUG_INFO("attempting to ensure group %s, called %s\n",
NSTR(name), NSTR(alias));
--- a/libpurple/protocols/yahoo/libymsg.h Sun Jul 17 21:57:50 2011 +0000
+++ b/libpurple/protocols/yahoo/libymsg.h Thu Aug 11 14:44:44 2011 +0000
@@ -48,7 +48,7 @@
#define YAHOO_ROOMLIST_LOCALE "us"
-#define YAHOOJP_PAGER_HOST_REQ_URL "http://cs1.msg.vip.ogk.yahoo.co.jp/capacity"
+#define YAHOOJP_PAGER_HOST_REQ_URL "http://cs1.yahoo.co.jp/capacity" #define YAHOOJP_TOKEN_URL "https://login.yahoo.co.jp/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s"
#define YAHOOJP_LOGIN_URL "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s"
#define YAHOOJP_PROFILE_URL "http://profiles.yahoo.co.jp/"
--- a/pidgin/gtkdialogs.c Sun Jul 17 21:57:50 2011 +0000
+++ b/pidgin/gtkdialogs.c Thu Aug 11 14:44:44 2011 +0000
@@ -794,7 +794,8 @@
PurplePlugin *plugin = NULL;
char *title = g_strdup_printf(_("%s Plugin Information"), PIDGIN_NAME);
- const char *pname, *pauthor, *pver, *pwebsite, *pid;
+ char *pname = NULL, *pauthor = NULL; + const char *pver, *pwebsite, *pid; gboolean ploaded, punloadable;
static GtkWidget *plugins_info = NULL;
@@ -806,8 +807,8 @@
for(l = purple_plugins_get_all(); l; l = l->next) {
plugin = (PurplePlugin *)l->data;
- pname = purple_plugin_get_name(plugin);
- pauthor = purple_plugin_get_author(plugin);
+ pname = g_markup_escape_text(purple_plugin_get_name(plugin), -1); + pauthor = g_markup_escape_text(purple_plugin_get_author(plugin), -1); pver = purple_plugin_get_version(plugin);
pwebsite = purple_plugin_get_homepage(plugin);
pid = purple_plugin_get_id(plugin);
@@ -829,6 +830,8 @@
g_signal_connect(G_OBJECT(plugins_info), "destroy",
G_CALLBACK(gtk_widget_destroyed), &plugins_info);
--- a/pidgin/gtkmedia.c Sun Jul 17 21:57:50 2011 +0000
+++ b/pidgin/gtkmedia.c Thu Aug 11 14:44:44 2011 +0000
@@ -538,12 +538,20 @@
GdkWindow *window = NULL;
if (data->participant == NULL)
+#if GTK_CHECK_VERSION(2, 14, 0) window = gtk_widget_get_window(priv->local_video);
+ window = (priv->local_video)->window; GtkWidget *widget = pidgin_media_get_widget(data->gtkmedia,
data->session_id, data->participant);
+#if GTK_CHECK_VERSION(2, 14, 0) window = gtk_widget_get_window(widget);
+ window = widget->window; --- a/po/de.po Sun Jul 17 21:57:50 2011 +0000
+++ b/po/de.po Thu Aug 11 14:44:44 2011 +0000
@@ -11,8 +11,8 @@
"Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-21 09:12+0200\n"
-"PO-Revision-Date: 2011-06-21 09:11+0200\n"
+"POT-Creation-Date: 2011-08-11 10:27+0200\n" +"PO-Revision-Date: 2011-08-11 10:12+0200\n" "Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
"Language-Team: German <de@li.org>\n"
@@ -1959,7 +1959,7 @@
msgstr "Unbekannter Grund"
msgid "Aborting DNS lookup in Tor Proxy mode."
-msgstr "DNS-Anfrage im Tor-Proxy-Modus abgebrochen"
+msgstr "DNS-Anfrage im Tor-Proxy-Modus abgebrochen." @@ -4778,8 +4778,8 @@
"invite <Benutzer> [Nachricht]: Lade einen Benutzer in den Raum ein."
-msgid "join: <room> [password]: Join a chat on this server."
-msgstr "join: <Raum> [Passwort]: Betrete einen Chat auf diesem Server."
+msgid "join: <room[@server]> [password]: Join a chat." +msgstr "join: <Raum[@Server]> [Passwort]: Betrete einen Chat." msgid "kick <user> [reason]: Kick a user from the room."
msgstr "kick <Benutzer> [Grund]: Kickt einen Benutzer aus dem Raum."
@@ -11134,6 +11134,9 @@
msgid "/Help/De_veloper Information"
msgstr "/Hilfe/_Entwickler-Informationen"
+msgid "/Help/_Plugin Information" +msgstr "/Hilfe/_Plugin-Informationen" msgid "/Help/_Translator Information"
msgstr "/Hilfe/Über_setzer-Informationen"
@@ -12149,6 +12152,13 @@
msgid "%s Translator Information"
msgstr "%s-Übersetzer-Informationen"
+msgid "%s Plugin Information" +msgstr "%s Plugin-Informationen" +msgid "Plugin Information" +msgstr "Plugin-Informationen" @@ -12750,7 +12760,7 @@
msgid "Exiting because another libpurple client is already running.\n"
-msgstr "Wird geschlossen, da bereits ein anderer libpurple-Client läuft\n"
+msgstr "Wird geschlossen, da bereits ein anderer libpurple-Client läuft.\n" @@ -13116,6 +13126,12 @@
msgid "F_lash window when IMs are received"
msgstr "Fenster b_linkt, wenn IM-Nachrichten empfangen werden"
+msgid "Resize incoming custom smileys" +msgstr "Erhaltene benutzerdefinierte Smileys skalieren" +msgstr "Maximale Größe:" msgid "Minimum input area height in lines:"
msgstr "Minimale Höhe des Eingabefeldes in Zeilen:"