summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Lundblad <malu@pidgin.im>2010-01-08 23:22:19 +0000
committerMarcus Lundblad <malu@pidgin.im>2010-01-08 23:22:19 +0000
commite222e693f60d206782e048bae50d31095b5187aa (patch)
tree1754613e8c915ae616860cd14e395c5fd8594509
parent6f2df36d544fb32947547a1270e5334c4e6d9875 (diff)
parentfb07b0105c70af1b413a4882935cb0e6f1502c3b (diff)
downloadpidgin-e222e693f60d206782e048bae50d31095b5187aa.tar.gz
propagate from branch 'im.pidgin.pidgin' (head 1e232732a9f31f155cd1b160e3af9723b583c040)
to branch 'im.pidgin.cpw.malu.xmpp.google_relay' (head faac2ea3e3ecd8aab0d87d7d899b1036bc115970)
-rw-r--r--COPYRIGHT1
-rw-r--r--ChangeLog36
-rw-r--r--ChangeLog.API18
-rw-r--r--ChangeLog.win326
-rw-r--r--NEWS7
-rw-r--r--configure.ac8
-rw-r--r--finch/gntidle.c2
-rw-r--r--finch/gntrequest.c3
-rw-r--r--finch/gntstatus.c3
-rw-r--r--finch/libgnt/gntinternal.h8
-rw-r--r--finch/libgnt/gntline.c1
-rw-r--r--finch/libgnt/gntmenuitem.c1
-rw-r--r--finch/libgnt/gntmenuitemcheck.c1
-rw-r--r--finch/libgnt/gntprogressbar.c1
-rw-r--r--finch/libgnt/gntslider.c1
-rw-r--r--finch/libgnt/gntwidget.c1
-rw-r--r--finch/libgnt/gntwindow.c1
-rw-r--r--finch/libgnt/wms/irssi.c2
-rw-r--r--libpurple/account.c24
-rw-r--r--libpurple/certificate.c5
-rw-r--r--libpurple/conversation.h6
-rw-r--r--libpurple/dbus-server.c6
-rw-r--r--libpurple/ft.c102
-rw-r--r--libpurple/media.h12
-rw-r--r--libpurple/plugins/perl/common/Log.xs2
-rw-r--r--libpurple/plugins/perl/common/Proxy.xs2
-rw-r--r--libpurple/plugins/signals-test.c22
-rw-r--r--libpurple/protocols/bonjour/bonjour.c34
-rw-r--r--libpurple/protocols/gg/gg.c2
-rw-r--r--libpurple/protocols/jabber/buddy.c3
-rw-r--r--libpurple/protocols/jabber/jabber.c5
-rw-r--r--libpurple/protocols/jabber/roster.c4
-rw-r--r--libpurple/protocols/msn/msn.c32
-rw-r--r--libpurple/protocols/msn/slp.c153
-rw-r--r--libpurple/protocols/msn/slp.h6
-rw-r--r--libpurple/protocols/msn/slpcall.c6
-rw-r--r--libpurple/protocols/msn/slpcall.h8
-rw-r--r--libpurple/protocols/msn/slplink.c104
-rw-r--r--libpurple/protocols/msn/slplink.h3
-rw-r--r--libpurple/protocols/msn/slpmsg.c7
-rw-r--r--libpurple/protocols/msn/slpmsg.h2
-rw-r--r--libpurple/protocols/msn/switchboard.c17
-rw-r--r--libpurple/protocols/msn/userlist.c1
-rw-r--r--libpurple/protocols/mxit/splashscreen.c1
-rw-r--r--libpurple/protocols/myspace/user.c9
-rw-r--r--libpurple/protocols/myspace/user.h1
-rw-r--r--libpurple/protocols/oscar/oscar.c82
-rw-r--r--libpurple/purple-uninstalled.pc.in7
-rw-r--r--libpurple/tests/Makefile.am6
-rw-r--r--libpurple/tests/check_libpurple.c5
-rw-r--r--libpurple/tests/test_cipher.c10
-rw-r--r--pidgin/gtkconv.c29
-rw-r--r--pidgin/gtkdialogs.c4
-rw-r--r--pidgin/gtkft.c9
-rw-r--r--pidgin/gtkimhtml.c1
-rw-r--r--pidgin/gtklog.c6
-rw-r--r--pidgin/gtkprefs.c46
-rw-r--r--pidgin/pidgin-uninstalled.pc.in5
-rw-r--r--po/ChangeLog5
-rw-r--r--po/de.po78
60 files changed, 696 insertions, 277 deletions
diff --git a/COPYRIGHT b/COPYRIGHT
index a64ede71aa..926eb07565 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -154,6 +154,7 @@ Leonardo Fernandes
David Fiander
Rob Flynn <gaim@robflynn.com>
Rob Foehl (rwf)
+Chris Foote
Alan Ford
Nathan Fredrickson
Chris J. Friesen
diff --git a/ChangeLog b/ChangeLog
index df507cdaa8..8680beb594 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,18 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
-version 2.6.5 (??/??/20??):
- General:
- * Build-time fixes for Solaris. (Paul Townsend)
+version 2.6.6 (??/??/20??):
+ Gadu-Gadu:
+ * Fix display of avatars after a server-side change. (Krzysztof
+ Klinikowski)
- AIM and ICQ:
- * Messages from some mobile clients are no longer displayed as
- Chinese characters (broken in 2.6.4)
+ MSN:
+ * File transfer requests will no longer cause a crash if you delete the
+ file before the other side accepts.
+ * Recieved files will no longer hold an extra lock after completion,
+ meaning they can be moved or deleted without complaints from your OS.
+ * Buddies who sign in from a second location will no longer cause an
+ unnecessary chat window to open.
+ * Support setting an animated GIF as a buddy icon.
XMPP:
* Added support for the SCRAM-SHA-1 SASL mechanism. This is only
@@ -14,6 +20,24 @@ version 2.6.5 (??/??/20??):
* When getting info on a domain-only (server) JID, show uptime
(when given by the result of the "last query") and don't show status as
offline.
+
+version 2.6.5 (01/08/2010):
+ libpurple:
+ * TLS certificates are actually stored to the local cache once again
+ (accepting a name mismatch on a certificate should now be remembered)
+
+ General:
+ * Build-time fixes for Solaris. (Paul Townsend)
+
+ AIM and ICQ:
+ * Messages from some mobile clients are no longer displayed as
+ Chinese characters (broken in 2.6.4)
+
+ MSN:
+ * Fix an issue allowing a remote user to download arbitrary files from
+ a libpurple client. (CVE-2010-0013)
+
+ XMPP:
* Do not crash when attempting to register for a new account on Windows.
* Fix file transfer with clients that do not support Entity Capabilities
(e.g. Spark)
diff --git a/ChangeLog.API b/ChangeLog.API
index c12e302ba8..49930d99a8 100644
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -1,6 +1,22 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
-version 2.6.5 (??/??/20??):
+version 2.6.6 (??/??/2010):
+ libpurple:
+ Changed:
+ * purple_xfer_cancel_local is now called instead of
+ purple_xfer_request_denied if an error is found when selecting
+ a file to send. Request denied is still used when a receive
+ request is not allowed.
+ Perl:
+ Changed:
+ * Corrected the package names for the PurpleProxyType and
+ PurpleLogReadFlags enums to have the correct number of colons
+ (from Purple::ProxyType::::<type> to Purple::ProxyType::<type>
+ and Purple::Log:ReadFlags::::<type> to
+ Purple::Log::ReadFlags::<type>) (Chris Foote)
+
+version 2.6.5 (01/08/2010):
+ No changes
version 2.6.4 (11/29/2009):
No changes
diff --git a/ChangeLog.win32 b/ChangeLog.win32
index a2f68f6b62..ae6ebe02b6 100644
--- a/ChangeLog.win32
+++ b/ChangeLog.win32
@@ -1,6 +1,10 @@
-version 2.6.5 (??/??/20??):
+
+version 2.6.6 (??/??/2010):
* Installer translations for: Norwegian nynorsk
+version 2.6.5 (01/08/2010):
+ * No changes
+
version 2.6.4 (11/29/2009):
* Register URL handlers for everything that Windows knows about. Still
use the HTTP "open" handler for security reasons.
diff --git a/NEWS b/NEWS
index 925231688e..cc8d464650 100644
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,12 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
Our development blog is available at: http://planet.pidgin.im
-2.6.5 (??/??/20??):
+2.6.6 (??/??/2010):
+
+2.6.5 (01/08/2010):
+ Paul: This release fixes a pretty serious bug in the MSN code, so we're
+ releasing this build a little earlier than planned with only major
+ bugs fixed. See the ChangeLog for details. Enjoy!
2.6.4 (11/29/2009):
John: It's release time again. Lots of bug fixes this time around, as
diff --git a/configure.ac b/configure.ac
index 30e36adfb6..7d98f79411 100644
--- a/configure.ac
+++ b/configure.ac
@@ -46,7 +46,7 @@ AC_PREREQ([2.50])
m4_define([purple_lt_current], [6])
m4_define([purple_major_version], [2])
m4_define([purple_minor_version], [6])
-m4_define([purple_micro_version], [5])
+m4_define([purple_micro_version], [6])
m4_define([purple_version_suffix], [devel])
m4_define([purple_version],
[purple_major_version.purple_minor_version.purple_micro_version])
@@ -55,7 +55,7 @@ m4_define([purple_display_version], purple_version[]m4_ifdef([purple_version_suf
m4_define([gnt_lt_current], [6])
m4_define([gnt_major_version], [2])
m4_define([gnt_minor_version], [6])
-m4_define([gnt_micro_version], [5])
+m4_define([gnt_micro_version], [6])
m4_define([gnt_version_suffix], [devel])
m4_define([gnt_version],
[gnt_major_version.gnt_minor_version.gnt_micro_version])
@@ -812,6 +812,10 @@ Or use --disable-vv if you do not need voice/video support.
fi
AM_CONDITIONAL(USE_VV, test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farsight" != "xno")
+dnl #######################################################################
+dnl # Check for Internationalized Domain Name support
+dnl #######################################################################
+
AC_ARG_ENABLE(idn,
[AC_HELP_STRING([--disable-idn], [compile without IDN support])],
[enable_idn="$enableval" force_idn=$enableval], [enable_idn="yes" force_idn=no])
diff --git a/finch/gntidle.c b/finch/gntidle.c
index 1452bcd6d2..d635bc3eff 100644
--- a/finch/gntidle.c
+++ b/finch/gntidle.c
@@ -21,6 +21,8 @@
*
*/
+#include <internal.h>
+
#include "finch.h"
#include "gntidle.h"
#include "gntwm.h"
diff --git a/finch/gntrequest.c b/finch/gntrequest.c
index 6c51521697..243c16e879 100644
--- a/finch/gntrequest.c
+++ b/finch/gntrequest.c
@@ -23,6 +23,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include <internal.h>
+
#include <gnt.h>
#include <gntbox.h>
#include <gntbutton.h>
@@ -35,7 +37,6 @@
#include <gnttree.h>
#include "finch.h"
-#include <internal.h>
#include "gntrequest.h"
#include "debug.h"
#include "util.h"
diff --git a/finch/gntstatus.c b/finch/gntstatus.c
index 31c7494ad2..0ca23875fe 100644
--- a/finch/gntstatus.c
+++ b/finch/gntstatus.c
@@ -23,6 +23,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include <internal.h>
+
#include <gnt.h>
#include <gntbox.h>
#include <gntbutton.h>
@@ -34,7 +36,6 @@
#include <gntutils.h>
#include "finch.h"
-#include <internal.h>
#include <notify.h>
#include <request.h>
diff --git a/finch/libgnt/gntinternal.h b/finch/libgnt/gntinternal.h
index aaec54f1a5..79c8836346 100644
--- a/finch/libgnt/gntinternal.h
+++ b/finch/libgnt/gntinternal.h
@@ -32,6 +32,14 @@
# define gnt_warning g_warning
#endif
+#ifndef G_GNUC_NULL_TERMINATED
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
+# else
+# define G_GNUC_NULL_TERMINATED
+# endif
+#endif
+
extern int gnt_need_conversation_to_locale;
extern const char *C_(const char *x);
diff --git a/finch/libgnt/gntline.c b/finch/libgnt/gntline.c
index 3f880eb2c0..50418fdda1 100644
--- a/finch/libgnt/gntline.c
+++ b/finch/libgnt/gntline.c
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include "gntinternal.h"
#include "gntline.h"
enum
diff --git a/finch/libgnt/gntmenuitem.c b/finch/libgnt/gntmenuitem.c
index 505ce85585..306ef55d52 100644
--- a/finch/libgnt/gntmenuitem.c
+++ b/finch/libgnt/gntmenuitem.c
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include "gntinternal.h"
#include "gntmenu.h"
#include "gntmenuitem.h"
diff --git a/finch/libgnt/gntmenuitemcheck.c b/finch/libgnt/gntmenuitemcheck.c
index fbaa2bc74e..7a4dd9f779 100644
--- a/finch/libgnt/gntmenuitemcheck.c
+++ b/finch/libgnt/gntmenuitemcheck.c
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include "gntinternal.h"
#include "gntmenuitemcheck.h"
static GntMenuItemClass *parent_class = NULL;
diff --git a/finch/libgnt/gntprogressbar.c b/finch/libgnt/gntprogressbar.c
index 0032fabbe2..1e9f576049 100644
--- a/finch/libgnt/gntprogressbar.c
+++ b/finch/libgnt/gntprogressbar.c
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
**/
+#include "gntinternal.h"
#include "gntprogressbar.h"
#include "gntutils.h"
diff --git a/finch/libgnt/gntslider.c b/finch/libgnt/gntslider.c
index 3d84618cfb..63e5d694bf 100644
--- a/finch/libgnt/gntslider.c
+++ b/finch/libgnt/gntslider.c
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include "gntinternal.h"
#include "gntcolors.h"
#include "gntkeys.h"
#include "gntslider.h"
diff --git a/finch/libgnt/gntwidget.c b/finch/libgnt/gntwidget.c
index 21f0873860..5ccfa14f52 100644
--- a/finch/libgnt/gntwidget.c
+++ b/finch/libgnt/gntwidget.c
@@ -22,6 +22,7 @@
/* Stuff brutally ripped from Gflib */
+#include "gntinternal.h"
#include "gntwidget.h"
#include "gntstyle.h"
#include "gntmarshal.h"
diff --git a/finch/libgnt/gntwindow.c b/finch/libgnt/gntwindow.c
index acf725f86f..f4ea3c6e70 100644
--- a/finch/libgnt/gntwindow.c
+++ b/finch/libgnt/gntwindow.c
@@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
+#include "gntinternal.h"
#include "gntstyle.h"
#include "gntwindow.h"
diff --git a/finch/libgnt/wms/irssi.c b/finch/libgnt/wms/irssi.c
index 15e2242d6a..d9c1460793 100644
--- a/finch/libgnt/wms/irssi.c
+++ b/finch/libgnt/wms/irssi.c
@@ -33,6 +33,8 @@
#include <string.h>
#include <sys/types.h>
+#include "gntinternal.h"
+
#include "gnt.h"
#include "gntbox.h"
#include "gntmenu.h"
diff --git a/libpurple/account.c b/libpurple/account.c
index 78100bbb99..d646c3c467 100644
--- a/libpurple/account.c
+++ b/libpurple/account.c
@@ -1341,7 +1341,8 @@ request_auth_cb(void *data)
handles = g_list_remove(handles, info);
- info->auth_cb(info->userdata);
+ if (info->auth_cb != NULL)
+ info->auth_cb(info->userdata);
purple_signal_emit(purple_accounts_get_handle(),
"account-authorization-granted", info->account, info->user);
@@ -1356,7 +1357,8 @@ request_deny_cb(void *data)
handles = g_list_remove(handles, info);
- info->deny_cb(info->userdata);
+ if (info->deny_cb != NULL)
+ info->deny_cb(info->userdata);
purple_signal_emit(purple_accounts_get_handle(),
"account-authorization-denied", info->account, info->user);
@@ -1383,10 +1385,12 @@ purple_account_request_authorization(PurpleAccount *account, const char *remote_
"account-authorization-requested", account, remote_user));
if (plugin_return > 0) {
- auth_cb(user_data);
+ if (auth_cb != NULL)
+ auth_cb(user_data);
return NULL;
} else if (plugin_return < 0) {
- deny_cb(user_data);
+ if (deny_cb != NULL)
+ deny_cb(user_data);
return NULL;
}
@@ -2311,7 +2315,7 @@ purple_account_add_buddy(PurpleAccount *account, PurpleBuddy *buddy)
gc = purple_account_get_connection(account);
if (gc != NULL)
- prpl = purple_connection_get_prpl(gc);
+ prpl = purple_connection_get_prpl(gc);
if (prpl != NULL)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2328,7 +2332,7 @@ purple_account_add_buddies(PurpleAccount *account, GList *buddies)
PurplePlugin *prpl = NULL;
if (gc != NULL)
- prpl = purple_connection_get_prpl(gc);
+ prpl = purple_connection_get_prpl(gc);
if (prpl != NULL)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2367,7 +2371,7 @@ purple_account_remove_buddy(PurpleAccount *account, PurpleBuddy *buddy,
PurplePlugin *prpl = NULL;
if (gc != NULL)
- prpl = purple_connection_get_prpl(gc);
+ prpl = purple_connection_get_prpl(gc);
if (prpl != NULL)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2384,7 +2388,7 @@ purple_account_remove_buddies(PurpleAccount *account, GList *buddies, GList *gro
PurplePlugin *prpl = NULL;
if (gc != NULL)
- prpl = purple_connection_get_prpl(gc);
+ prpl = purple_connection_get_prpl(gc);
if (prpl != NULL)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2412,7 +2416,7 @@ purple_account_remove_group(PurpleAccount *account, PurpleGroup *group)
PurplePlugin *prpl = NULL;
if (gc != NULL)
- prpl = purple_connection_get_prpl(gc);
+ prpl = purple_connection_get_prpl(gc);
if (prpl != NULL)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2432,7 +2436,7 @@ purple_account_change_password(PurpleAccount *account, const char *orig_pw,
purple_account_set_password(account, new_pw);
if (gc != NULL)
- prpl = purple_connection_get_prpl(gc);
+ prpl = purple_connection_get_prpl(gc);
if (prpl != NULL)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
diff --git a/libpurple/certificate.c b/libpurple/certificate.c
index f4feed8adb..b252cd7972 100644
--- a/libpurple/certificate.c
+++ b/libpurple/certificate.c
@@ -1431,9 +1431,8 @@ x509_tls_cached_complete(PurpleCertificateVerificationRequest *vrq,
tls_peers = purple_certificate_find_pool(x509_tls_cached.scheme_name,
"tls_peers");
if (tls_peers) {
- if (!purple_certificate_pool_contains(tls_peers, vrq->subject_name) &&
- !purple_certificate_pool_store(tls_peers,vrq->subject_name,
- peer_crt)) {
+ if (!purple_certificate_pool_store(tls_peers,vrq->subject_name,
+ peer_crt)) {
purple_debug_error("certificate/x509/tls_cached",
"FAILED to cache peer certificate\n");
}
diff --git a/libpurple/conversation.h b/libpurple/conversation.h
index 5cd0b12a24..d170db02c5 100644
--- a/libpurple/conversation.h
+++ b/libpurple/conversation.h
@@ -368,7 +368,8 @@ extern "C" {
* @param type The type of conversation.
* @param account The account opening the conversation window on the purple
* user's end.
- * @param name The name of the conversation.
+ * @param name The name of the conversation. For PURPLE_CONV_TYPE_IM,
+ * this is the name of the buddy.
*
* @return The new conversation.
*/
@@ -1025,7 +1026,8 @@ PurpleConversation *purple_conv_chat_get_conversation(const PurpleConvChat *chat
GList *purple_conv_chat_set_users(PurpleConvChat *chat, GList *users);
/**
- * Returns a list of users in the chat room.
+ * Returns a list of users in the chat room. The members of the list
+ * are PurpleConvChatBuddy objects.
*
* @param chat The chat.
*
diff --git a/libpurple/dbus-server.c b/libpurple/dbus-server.c
index ed628d4359..197e285464 100644
--- a/libpurple/dbus-server.c
+++ b/libpurple/dbus-server.c
@@ -601,7 +601,6 @@ purple_dbus_dispatch_init(void)
{
static DBusObjectPathVTable vtable = {NULL, &purple_dbus_dispatch, NULL, NULL, NULL, NULL};
DBusError error;
- int result;
dbus_error_init(&error);
purple_dbus_connection = dbus_bus_get(DBUS_BUS_STARTER, &error);
@@ -625,16 +624,15 @@ purple_dbus_dispatch_init(void)
return;
}
- dbus_request_name_reply =
- result = dbus_bus_request_name(purple_dbus_connection,
+ dbus_request_name_reply = dbus_bus_request_name(purple_dbus_connection,
DBUS_SERVICE_PURPLE, 0, &error);
if (dbus_error_is_set(&error))
{
dbus_connection_unref(purple_dbus_connection);
- dbus_error_free(&error);
purple_dbus_connection = NULL;
init_error = g_strdup_printf(N_("Failed to get serv name: %s"), error.name);
+ dbus_error_free(&error);
return;
}
diff --git a/libpurple/ft.c b/libpurple/ft.c
index 0aec504c44..af5b31bccd 100644
--- a/libpurple/ft.c
+++ b/libpurple/ft.c
@@ -69,6 +69,30 @@ purple_xfer_priv_data_destroy(gpointer data)
g_free(priv);
}
+static const gchar *
+purple_xfer_status_type_to_string(PurpleXferStatusType type)
+{
+ static const struct {
+ PurpleXferStatusType type;
+ const char *name;
+ } type_names[] = {
+ { PURPLE_XFER_STATUS_UNKNOWN, "unknown" },
+ { PURPLE_XFER_STATUS_NOT_STARTED, "not started" },
+ { PURPLE_XFER_STATUS_ACCEPTED, "accepted" },
+ { PURPLE_XFER_STATUS_STARTED, "started" },
+ { PURPLE_XFER_STATUS_DONE, "done" },
+ { PURPLE_XFER_STATUS_CANCEL_LOCAL, "cancelled locally" },
+ { PURPLE_XFER_STATUS_CANCEL_REMOTE, "cancelled remotely" }
+ };
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS(type_names); ++i)
+ if (type_names[i].type == type)
+ return type_names[i].name;
+
+ return "invalid state";
+}
+
GList *
purple_xfers_get_all()
{
@@ -109,6 +133,10 @@ purple_xfer_new(PurpleAccount *account, PurpleXferType type, const char *who)
ui_ops->new_xfer(xfer);
xfers = g_list_prepend(xfers, xfer);
+
+ if (purple_debug_is_verbose())
+ purple_debug_info("xfer", "new %p [%d]\n", xfer, xfer->ref);
+
return xfer;
}
@@ -119,6 +147,9 @@ purple_xfer_destroy(PurpleXfer *xfer)
g_return_if_fail(xfer != NULL);
+ if (purple_debug_is_verbose())
+ purple_debug_info("xfer", "destroyed %p [%d]\n", xfer, xfer->ref);
+
/* Close the file browser, if it's open */
purple_request_close_with_handle(xfer);
@@ -148,6 +179,9 @@ purple_xfer_ref(PurpleXfer *xfer)
g_return_if_fail(xfer != NULL);
xfer->ref++;
+
+ if (purple_debug_is_verbose())
+ purple_debug_info("xfer", "ref'd %p [%d]\n", xfer, xfer->ref);
}
void
@@ -158,6 +192,9 @@ purple_xfer_unref(PurpleXfer *xfer)
xfer->ref--;
+ if (purple_debug_is_verbose())
+ purple_debug_info("xfer", "unref'd %p [%d]\n", xfer, xfer->ref);
+
if (xfer->ref == 0)
purple_xfer_destroy(xfer);
}
@@ -167,6 +204,11 @@ purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatusType status)
{
g_return_if_fail(xfer != NULL);
+ if (purple_debug_is_verbose())
+ purple_debug_info("xfer", "Changing status of xfer %p from %s to %s\n",
+ xfer, purple_xfer_status_type_to_string(xfer->status),
+ purple_xfer_status_type_to_string(status));
+
if (xfer->status == status)
return;
@@ -268,14 +310,16 @@ static void
purple_xfer_choose_file_ok_cb(void *user_data, const char *filename)
{
PurpleXfer *xfer;
+ PurpleXferType type;
struct stat st;
gchar *dir;
xfer = (PurpleXfer *)user_data;
+ type = purple_xfer_get_type(xfer);
if (g_stat(filename, &st) != 0) {
/* File not found. */
- if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) {
+ if (type == PURPLE_XFER_RECEIVE) {
#ifndef _WIN32
int mode = W_OK;
#else
@@ -297,29 +341,26 @@ purple_xfer_choose_file_ok_cb(void *user_data, const char *filename)
}
else {
purple_xfer_show_file_error(xfer, filename);
- purple_xfer_request_denied(xfer);
+ purple_xfer_cancel_local(xfer);
}
}
- else if ((purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) &&
- (st.st_size == 0)) {
+ else if ((type == PURPLE_XFER_SEND) && (st.st_size == 0)) {
purple_notify_error(NULL, NULL,
_("Cannot send a file of 0 bytes."), NULL);
- purple_xfer_request_denied(xfer);
+ purple_xfer_cancel_local(xfer);
}
- else if ((purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) &&
- S_ISDIR(st.st_mode)) {
+ else if ((type == PURPLE_XFER_SEND) && S_ISDIR(st.st_mode)) {
/*
* XXX - Sending a directory should be valid for some protocols.
*/
purple_notify_error(NULL, NULL,
_("Cannot send a directory."), NULL);
- purple_xfer_request_denied(xfer);
+ purple_xfer_cancel_local(xfer);
}
- else if ((purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) &&
- S_ISDIR(st.st_mode)) {
+ else if ((type == PURPLE_XFER_RECEIVE) && S_ISDIR(st.st_mode)) {
char *msg, *utf8;
utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
msg = g_strdup_printf(
@@ -329,6 +370,23 @@ purple_xfer_choose_file_ok_cb(void *user_data, const char *filename)
g_free(msg);
purple_xfer_request_denied(xfer);
}
+ else if (type == PURPLE_XFER_SEND) {
+#ifndef _WIN32
+ int mode = R_OK;
+#else
+ int mode = F_OK;
+#endif
+
+ if (g_access(filename, mode) == 0) {
+ purple_xfer_request_accepted(xfer, filename);
+ } else {
+ purple_xfer_ref(xfer);
+ purple_notify_message(
+ NULL, PURPLE_NOTIFY_MSG_ERROR, NULL,
+ _("File is not readable."), NULL,
+ (PurpleNotifyCloseCallback)purple_xfer_choose_file, xfer);
+ }
+ }
else {
purple_xfer_request_accepted(xfer, filename);
}
@@ -342,7 +400,11 @@ purple_xfer_choose_file_cancel_cb(void *user_data, const char *filename)
PurpleXfer *xfer = (PurpleXfer *)user_data;
purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_CANCEL_LOCAL);
- purple_xfer_request_denied(xfer);
+ if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND)
+ purple_xfer_cancel_local(xfer);
+ else
+ purple_xfer_request_denied(xfer);
+ purple_xfer_unref(xfer);
}
static int
@@ -506,6 +568,8 @@ purple_xfer_request_accepted(PurpleXfer *xfer, const char *filename)
type = purple_xfer_get_type(xfer);
account = purple_xfer_get_account(xfer);
+ purple_debug_misc("xfer", "request accepted for %p\n", xfer);
+
if (!filename && type == PURPLE_XFER_RECEIVE) {
xfer->status = PURPLE_XFER_STATUS_ACCEPTED;
xfer->ops.init(xfer);
@@ -583,6 +647,8 @@ purple_xfer_request_denied(PurpleXfer *xfer)
{
g_return_if_fail(xfer != NULL);
+ purple_debug_misc("xfer", "xfer %p denied\n", xfer);
+
if (xfer->ops.request_denied != NULL)
xfer->ops.request_denied(xfer);
@@ -1111,6 +1177,8 @@ transfer_cb(gpointer data, gint source, PurpleInputCondition condition)
purple_input_remove(xfer->watcher);
xfer->watcher = 0;
+
+ purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer);
return;
}
}
@@ -1173,8 +1241,12 @@ purple_xfer_ui_ready(PurpleXfer *xfer)
priv = g_hash_table_lookup(xfers_data, xfer);
priv->ready |= PURPLE_XFER_READY_UI;
- if (0 == (priv->ready & PURPLE_XFER_READY_PRPL))
+ if (0 == (priv->ready & PURPLE_XFER_READY_PRPL)) {
+ purple_debug_misc("xfer", "UI is ready on ft %p, waiting for prpl\n", xfer);
return;
+ }
+
+ purple_debug_misc("xfer", "UI (and prpl) ready on ft %p, so proceeding\n", xfer);
type = purple_xfer_get_type(xfer);
if (type == PURPLE_XFER_SEND)
@@ -1201,8 +1273,12 @@ purple_xfer_prpl_ready(PurpleXfer *xfer)
priv->ready |= PURPLE_XFER_READY_PRPL;
/* I don't think fwrite/fread are ever *not* ready */
- if (xfer->dest_fp == NULL && 0 == (priv->ready & PURPLE_XFER_READY_UI))
+ if (xfer->dest_fp == NULL && 0 == (priv->ready & PURPLE_XFER_READY_UI)) {
+ purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer);
return;
+ }
+
+ purple_debug_misc("xfer", "Prpl (and UI) ready on ft %p, so proceeding\n", xfer);
priv->ready = PURPLE_XFER_READY_NONE;
diff --git a/libpurple/media.h b/libpurple/media.h
index d58f94f367..f945a7c598 100644
--- a/libpurple/media.h
+++ b/libpurple/media.h
@@ -75,7 +75,7 @@ typedef enum {
PURPLE_MEDIA_CAPS_VIDEO_SINGLE_DIRECTION = 1 << 3,
PURPLE_MEDIA_CAPS_AUDIO_VIDEO = 1 << 4,
PURPLE_MEDIA_CAPS_MODIFY_SESSION = 1 << 5,
- PURPLE_MEDIA_CAPS_CHANGE_DIRECTION = 1 << 6,
+ PURPLE_MEDIA_CAPS_CHANGE_DIRECTION = 1 << 6
} PurpleMediaCaps;
/** Media session types */
@@ -93,7 +93,7 @@ typedef enum {
typedef enum {
PURPLE_MEDIA_STATE_NEW = 0,
PURPLE_MEDIA_STATE_CONNECTED,
- PURPLE_MEDIA_STATE_END,
+ PURPLE_MEDIA_STATE_END
} PurpleMediaState;
/** Media info types */
@@ -106,7 +106,7 @@ typedef enum {
PURPLE_MEDIA_INFO_PAUSE,
PURPLE_MEDIA_INFO_UNPAUSE,
PURPLE_MEDIA_INFO_HOLD,
- PURPLE_MEDIA_INFO_UNHOLD,
+ PURPLE_MEDIA_INFO_UNHOLD
} PurpleMediaInfoType;
typedef enum {
@@ -114,18 +114,18 @@ typedef enum {
PURPLE_MEDIA_CANDIDATE_TYPE_SRFLX,
PURPLE_MEDIA_CANDIDATE_TYPE_PRFLX,
PURPLE_MEDIA_CANDIDATE_TYPE_RELAY,
- PURPLE_MEDIA_CANDIDATE_TYPE_MULTICAST,
+ PURPLE_MEDIA_CANDIDATE_TYPE_MULTICAST
} PurpleMediaCandidateType;
typedef enum {
PURPLE_MEDIA_COMPONENT_NONE = 0,
PURPLE_MEDIA_COMPONENT_RTP = 1,
- PURPLE_MEDIA_COMPONENT_RTCP = 2,
+ PURPLE_MEDIA_COMPONENT_RTCP = 2
} PurpleMediaComponentType;
typedef enum {
PURPLE_MEDIA_NETWORK_PROTOCOL_UDP,
- PURPLE_MEDIA_NETWORK_PROTOCOL_TCP,
+ PURPLE_MEDIA_NETWORK_PROTOCOL_TCP
} PurpleMediaNetworkProtocol;
#include "signals.h"
diff --git a/libpurple/plugins/perl/common/Log.xs b/libpurple/plugins/perl/common/Log.xs
index 5daf8462d5..93a68d46b6 100644
--- a/libpurple/plugins/perl/common/Log.xs
+++ b/libpurple/plugins/perl/common/Log.xs
@@ -6,7 +6,7 @@ PROTOTYPES: ENABLE
BOOT:
{
HV *type_stash = gv_stashpv("Purple::Log::Type", 1);
- HV *flags_stash = gv_stashpv("Purple::Log:ReadFlags::", 1);
+ HV *flags_stash = gv_stashpv("Purple::Log::ReadFlags", 1);
static const constiv *civ, type_const_iv[] = {
#define const_iv(name) {#name, (IV)PURPLE_LOG_##name}
diff --git a/libpurple/plugins/perl/common/Proxy.xs b/libpurple/plugins/perl/common/Proxy.xs
index 5853bbebb3..bba23733e8 100644
--- a/libpurple/plugins/perl/common/Proxy.xs
+++ b/libpurple/plugins/perl/common/Proxy.xs
@@ -5,7 +5,7 @@ PROTOTYPES: ENABLE
BOOT:
{
- HV *stash = gv_stashpv("Purple::ProxyType::", 1);
+ HV *stash = gv_stashpv("Purple::ProxyType", 1);
static const constiv *civ, const_iv[] = {
#define const_iv(name) {#name, (IV)PURPLE_PROXY_##name}
diff --git a/libpurple/plugins/signals-test.c b/libpurple/plugins/signals-test.c
index 041e93785e..5e64015a4c 100644
--- a/libpurple/plugins/signals-test.c
+++ b/libpurple/plugins/signals-test.c
@@ -547,6 +547,26 @@ quitting_cb(void *data)
purple_debug_misc("signals test", "quitting ()\n");
}
+static void
+printhash(gpointer key, gpointer value, gpointer data)
+{
+ char *a = (char *)key;
+ char *b = (char *)value;
+ GString *str = (GString *)data;
+ g_string_append_printf(str, " [%s] = [%s]\n", a, b ? b : "(null)");
+}
+
+static gboolean
+uri_handler(const char *proto, const char *cmd, GHashTable *params)
+{
+ GString *str = g_string_new("\n{\n");
+ g_hash_table_foreach(params, printhash, str);
+ g_string_append_c(str, '}');
+ purple_debug_misc("signals test", "uri handler (%s, %s, %s)\n", proto, cmd, str->str);
+ g_string_free(str, TRUE);
+ return FALSE;
+}
+
/**************************************************************************
* File transfer signal callbacks
**************************************************************************/
@@ -820,6 +840,8 @@ plugin_load(PurplePlugin *plugin)
/* Core signals */
purple_signal_connect(core_handle, "quitting",
plugin, PURPLE_CALLBACK(quitting_cb), NULL);
+ purple_signal_connect(core_handle, "uri-handler",
+ plugin, PURPLE_CALLBACK(uri_handler), NULL);
/* File transfer signals */
purple_signal_connect(ft_handle, "file-recv-accept",
diff --git a/libpurple/protocols/bonjour/bonjour.c b/libpurple/protocols/bonjour/bonjour.c
index 39eca55502..f1e26b20ea 100644
--- a/libpurple/protocols/bonjour/bonjour.c
+++ b/libpurple/protocols/bonjour/bonjour.c
@@ -392,11 +392,8 @@ bonjour_tooltip_text(PurpleBuddy *buddy, PurpleNotifyUserInfo *user_info, gboole
purple_notify_user_info_add_pair(user_info, _("XMPP Account"), bb->jid);
}
-static void
-bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group)
-{
+static void bonjour_do_group_change(PurpleBuddy *buddy, const char *new_group) {
PurpleBlistNodeFlags oldflags;
- PurpleBuddy *buddy = purple_find_buddy(connection->account, who);
if (buddy == NULL)
return;
@@ -404,13 +401,38 @@ bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *o
oldflags = purple_blist_node_get_flags((PurpleBlistNode *)buddy);
/* If we're moving them out of the bonjour group, make them persistent */
- if (strcmp(new_group, BONJOUR_GROUP_NAME) == 0)
+ if (purple_strequal(new_group, BONJOUR_GROUP_NAME))
purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags | PURPLE_BLIST_NODE_FLAG_NO_SAVE);
else
purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags ^ PURPLE_BLIST_NODE_FLAG_NO_SAVE);
}
+static void
+bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group)
+{
+ PurpleBuddy *buddy = purple_find_buddy(connection->account, who);
+
+ bonjour_do_group_change(buddy, new_group);
+
+}
+
+static void
+bonjour_rename_group(PurpleConnection *connection, const char *old_name, PurpleGroup *group, GList *moved_buddies)
+{
+ GList *cur;
+ const char *new_group;
+ PurpleBuddy *buddy;
+
+ new_group = purple_group_get_name(group);
+
+ for (cur = moved_buddies; cur; cur = cur->next) {
+ buddy = cur->data;
+ bonjour_do_group_change(buddy, new_group);
+ }
+
+}
+
static gboolean
bonjour_can_receive_file(PurpleConnection *connection, const char *who)
{
@@ -478,7 +500,7 @@ static PurplePluginProtocolInfo prpl_info =
NULL, /* get_cb_away */
NULL, /* alias_buddy */
bonjour_group_buddy, /* group_buddy */
- NULL, /* rename_group */
+ bonjour_rename_group, /* rename_group */
NULL, /* buddy_free */
bonjour_convo_closed, /* convo_closed */
NULL, /* normalize */
diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c
index c66be1b7b5..67ee8a4863 100644
--- a/libpurple/protocols/gg/gg.c
+++ b/libpurple/protocols/gg/gg.c
@@ -947,7 +947,7 @@ static void gg_get_avatar_url_cb(PurpleUtilFetchUrlData *url_data, gpointer user
if (xmlnode_avatar == NULL)
goto out;
- xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "bigAvatar");
+ xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "originBigAvatar");
if (xmlnode_bigavatar == NULL)
goto out;
diff --git a/libpurple/protocols/jabber/buddy.c b/libpurple/protocols/jabber/buddy.c
index 51f650e1cc..4e48e3024c 100644
--- a/libpurple/protocols/jabber/buddy.c
+++ b/libpurple/protocols/jabber/buddy.c
@@ -823,7 +823,8 @@ static void jabber_buddy_info_show_if_ready(JabberBuddyInfo *jbi)
const gchar *title = NULL;
if (is_domain) {
title = _("Uptime");
- message = g_strdup_printf(_("%s"), last);
+ message = last;
+ last = NULL;
} else {
title = _("Logged Off");
message = g_strdup_printf(_("%s ago"), last);
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
index fc7d0e9a5e..5949b985a8 100644
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -639,10 +639,11 @@ txt_resolved_cb(GList *responses, gpointer data)
js->srv_query_data = NULL;
if (responses == NULL) {
+ purple_debug_warning("jabber", "Unable to find alternative XMPP connection "
+ "methods after failing to connect directly.");
purple_connection_error_reason(js->gc,
PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
- _("Unable to find alternative XMPP connection "
- "methods after failing to connect directly."));
+ _("Unable to connect"));
return;
}
diff --git a/libpurple/protocols/jabber/roster.c b/libpurple/protocols/jabber/roster.c
index 0f08ba8234..c18958a75f 100644
--- a/libpurple/protocols/jabber/roster.c
+++ b/libpurple/protocols/jabber/roster.c
@@ -193,7 +193,9 @@ void jabber_roster_parse(JabberStream *js, const char *from,
JabberIqType type, const char *id, xmlnode *query)
{
xmlnode *item, *group;
+#if 0
const char *ver;
+#endif
if (!jabber_is_own_account(js, from)) {
purple_debug_warning("jabber", "Received bogon roster push from %s\n",
@@ -266,11 +268,13 @@ void jabber_roster_parse(JabberStream *js, const char *from,
}
}
+#if 0
ver = xmlnode_get_attrib(query, "ver");
if (ver) {
PurpleAccount *account = purple_connection_get_account(js->gc);
purple_account_set_string(account, "roster_ver", ver);
}
+#endif
js->currently_parsing_roster_push = FALSE;
}
diff --git a/libpurple/protocols/msn/msn.c b/libpurple/protocols/msn/msn.c
index ab6af6ad6f..d9f547f471 100644
--- a/libpurple/protocols/msn/msn.c
+++ b/libpurple/protocols/msn/msn.c
@@ -345,17 +345,23 @@ static void
msn_show_set_friendly_name(PurplePluginAction *action)
{
PurpleConnection *gc;
+ PurpleAccount *account;
+ char *tmp;
gc = (PurpleConnection *) action->context;
+ account = purple_connection_get_account(gc);
- purple_request_input(gc, NULL, _("Set your friendly name."),
+ tmp = g_strdup_printf(_("Set friendly name for %s."),
+ purple_account_get_username(account));
+ purple_request_input(gc, _("Set your friendly name."), tmp,
_("This is the name that other MSN buddies will "
"see you as."),
purple_connection_get_display_name(gc), FALSE, FALSE, NULL,
_("OK"), G_CALLBACK(msn_act_id),
_("Cancel"), NULL,
- purple_connection_get_account(gc), NULL, NULL,
+ account, NULL, NULL,
gc);
+ g_free(tmp);
}
static void
@@ -1537,6 +1543,8 @@ msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
{
const char *bname;
MsnAddReqData *data;
+ MsnSession *session;
+ MsnUser *user;
bname = purple_buddy_get_name(buddy);
@@ -1558,12 +1566,18 @@ msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
data->buddy = buddy;
data->group = group;
- purple_request_input(gc, NULL, _("Authorization Request Message:"),
- NULL, _("Please authorize me!"), TRUE, FALSE, NULL,
- _("_OK"), G_CALLBACK(finish_auth_request),
- _("_Cancel"), G_CALLBACK(cancel_auth_request),
- purple_connection_get_account(gc), bname, NULL,
- data);
+ session = purple_connection_get_protocol_data(gc);
+ user = msn_userlist_find_user(session->userlist, bname);
+ if (user && user->authorized) {
+ finish_auth_request(data, NULL);
+ } else {
+ purple_request_input(gc, NULL, _("Authorization Request Message:"),
+ NULL, _("Please authorize me!"), TRUE, FALSE, NULL,
+ _("_OK"), G_CALLBACK(finish_auth_request),
+ _("_Cancel"), G_CALLBACK(cancel_auth_request),
+ purple_connection_get_account(gc), bname, NULL,
+ data);
+ }
}
static void
@@ -2653,7 +2667,7 @@ static PurplePluginProtocolInfo prpl_info =
OPT_PROTO_MAIL_CHECK,
NULL, /* user_splits */
NULL, /* protocol_options */
- {"png", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */
+ {"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */
msn_list_icon, /* list_icon */
msn_list_emblems, /* list_emblems */
msn_status_text, /* status_text */
diff --git a/libpurple/protocols/msn/slp.c b/libpurple/protocols/msn/slp.c
index 39b67f3f37..a17d3b3f5c 100644
--- a/libpurple/protocols/msn/slp.c
+++ b/libpurple/protocols/msn/slp.c
@@ -126,22 +126,60 @@ msn_xfer_cancel(PurpleXfer *xfer)
g_free(content);
msn_slplink_send_queued_slpmsgs(slpcall->slplink);
- msn_slpcall_destroy(slpcall);
+ if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND)
+ slpcall->wasted = TRUE;
+ else
+ msn_slpcall_destroy(slpcall);
}
}
}
-void
-msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize len, gsize offset)
+gssize
+msn_xfer_write(const guchar *data, gsize len, PurpleXfer *xfer)
+{
+ MsnSlpCall *slpcall;
+
+ g_return_val_if_fail(xfer != NULL, -1);
+ g_return_val_if_fail(data != NULL, -1);
+ g_return_val_if_fail(len > 0, -1);
+
+ g_return_val_if_fail(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND, -1);
+
+ slpcall = xfer->data;
+ /* Not sure I trust it'll be there */
+ g_return_val_if_fail(slpcall != NULL, -1);
+
+ g_return_val_if_fail(slpcall->xfer_msg != NULL, -1);
+
+ slpcall->u.outgoing.len = len;
+ slpcall->u.outgoing.data = data;
+ msn_slplink_send_msgpart(slpcall->slplink, slpcall->xfer_msg);
+ return MIN(1202, len);
+}
+
+gssize
+msn_xfer_read(guchar **data, PurpleXfer *xfer)
{
- PurpleXfer *xfer;
+ MsnSlpCall *slpcall;
+ gsize len;
+
+ g_return_val_if_fail(xfer != NULL, -1);
+ g_return_val_if_fail(data != NULL, -1);
+
+ g_return_val_if_fail(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE, -1);
- xfer = slpcall->xfer;
+ slpcall = xfer->data;
+ /* Not sure I trust it'll be there */
+ g_return_val_if_fail(slpcall != NULL, -1);
+
+ /* Just pass up the whole GByteArray. We'll make another. */
+ *data = slpcall->u.incoming_data->data;
+ len = slpcall->u.incoming_data->len;
- xfer->bytes_sent = (offset + len);
- xfer->bytes_remaining = total_length - (offset + len);
+ g_byte_array_free(slpcall->u.incoming_data, FALSE);
+ slpcall->u.incoming_data = g_byte_array_new();
- purple_xfer_update_progress(xfer);
+ return len;
}
void
@@ -238,6 +276,38 @@ send_decline(MsnSlpCall *slpcall, const char *branch,
msn_slplink_queue_slpmsg(slplink, slpmsg);
}
+/* XXX: this could be improved if we tracked custom smileys
+ * per-protocol, per-account, per-session or (ideally) per-conversation
+ */
+static PurpleStoredImage *
+find_valid_emoticon(PurpleAccount *account, const char *path)
+{
+ GList *smileys;
+
+ if (!purple_account_get_bool(account, "custom_smileys", TRUE))
+ return NULL;
+
+ smileys = purple_smileys_get_all();
+
+ for (; smileys; smileys = g_list_delete_link(smileys, smileys)) {
+ PurpleSmiley *smiley;
+ PurpleStoredImage *img;
+
+ smiley = smileys->data;
+ img = purple_smiley_get_stored_image(smiley);
+
+ if (purple_strequal(path, purple_imgstore_get_filename(img))) {
+ g_list_free(smileys);
+ return img;
+ }
+
+ purple_imgstore_unref(img);
+ }
+
+ purple_debug_error("msn", "Received illegal request for file %s\n", path);
+ return NULL;
+}
+
#define MAX_FILE_NAME_LEN 0x226
static void
@@ -255,7 +325,7 @@ got_sessionreq(MsnSlpCall *slpcall, const char *branch,
MsnSlpMessage *slpmsg;
MsnObject *obj;
char *msnobj_data;
- PurpleStoredImage *img;
+ PurpleStoredImage *img = NULL;
int type;
/* Send Ok */
@@ -273,51 +343,38 @@ got_sessionreq(MsnSlpCall *slpcall, const char *branch,
obj = msn_object_new_from_string(msnobj_data);
type = msn_object_get_type(obj);
g_free(msnobj_data);
-
- if ((type != MSN_OBJECT_USERTILE) && (type != MSN_OBJECT_EMOTICON))
- {
- purple_debug_error("msn", "Wrong object?\n");
- msn_object_destroy(obj);
- g_return_if_reached();
- }
-
if (type == MSN_OBJECT_EMOTICON) {
- char *path;
- path = g_build_filename(purple_smileys_get_storing_dir(),
- obj->location, NULL);
- img = purple_imgstore_new_from_file(path);
- g_free(path);
- } else {
+ img = find_valid_emoticon(slplink->session->account, obj->location);
+ } else if (type == MSN_OBJECT_USERTILE) {
img = msn_object_get_image(obj);
if (img)
purple_imgstore_ref(img);
}
msn_object_destroy(obj);
- if (img == NULL)
- {
+ if (img != NULL) {
+ /* DATA PREP */
+ slpmsg = msn_slpmsg_new(slplink);
+ slpmsg->slpcall = slpcall;
+ slpmsg->session_id = slpcall->session_id;
+ msn_slpmsg_set_body(slpmsg, NULL, 4);
+ slpmsg->info = "SLP DATA PREP";
+ msn_slplink_queue_slpmsg(slplink, slpmsg);
+
+ /* DATA */
+ slpmsg = msn_slpmsg_new(slplink);
+ slpmsg->slpcall = slpcall;
+ slpmsg->flags = 0x20;
+ slpmsg->info = "SLP DATA";
+ msn_slpmsg_set_image(slpmsg, img);
+ msn_slplink_queue_slpmsg(slplink, slpmsg);
+ purple_imgstore_unref(img);
+
+ accepted = TRUE;
+
+ } else {
purple_debug_error("msn", "Wrong object.\n");
- g_return_if_reached();
}
-
- /* DATA PREP */
- slpmsg = msn_slpmsg_new(slplink);
- slpmsg->slpcall = slpcall;
- slpmsg->session_id = slpcall->session_id;
- msn_slpmsg_set_body(slpmsg, NULL, 4);
- slpmsg->info = "SLP DATA PREP";
- msn_slplink_queue_slpmsg(slplink, slpmsg);
-
- /* DATA */
- slpmsg = msn_slpmsg_new(slplink);
- slpmsg->slpcall = slpcall;
- slpmsg->flags = 0x20;
- slpmsg->info = "SLP DATA";
- msn_slpmsg_set_image(slpmsg, img);
- msn_slplink_queue_slpmsg(slplink, slpmsg);
- purple_imgstore_unref(img);
-
- accepted = TRUE;
}
else if (!strcmp(euf_guid, MSN_FT_GUID))
@@ -332,9 +389,7 @@ got_sessionreq(MsnSlpCall *slpcall, const char *branch,
account = slpcall->slplink->session->account;
- slpcall->cb = msn_xfer_completed_cb;
slpcall->end_cb = msn_xfer_end_cb;
- slpcall->progress_cb = msn_xfer_progress_cb;
slpcall->branch = g_strdup(branch);
slpcall->pending = TRUE;
@@ -357,6 +412,10 @@ got_sessionreq(MsnSlpCall *slpcall, const char *branch,
purple_xfer_set_init_fnc(xfer, msn_xfer_init);
purple_xfer_set_request_denied_fnc(xfer, msn_xfer_cancel);
purple_xfer_set_cancel_recv_fnc(xfer, msn_xfer_cancel);
+ purple_xfer_set_read_fnc(xfer, msn_xfer_read);
+ purple_xfer_set_write_fnc(xfer, msn_xfer_write);
+
+ slpcall->u.incoming_data = g_byte_array_new();
slpcall->xfer = xfer;
purple_xfer_ref(slpcall->xfer);
diff --git a/libpurple/protocols/msn/slp.h b/libpurple/protocols/msn/slp.h
index c9cee83f18..baba1eef78 100644
--- a/libpurple/protocols/msn/slp.h
+++ b/libpurple/protocols/msn/slp.h
@@ -29,9 +29,6 @@
#include "internal.h"
#include "ft.h"
-void msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize
- len, gsize offset);
-
MsnSlpCall * msn_slp_sip_recv(MsnSlpLink *slplink,
const char *body);
@@ -41,6 +38,9 @@ void msn_xfer_completed_cb(MsnSlpCall *slpcall,
const guchar *body, gsize size);
void msn_xfer_cancel(PurpleXfer *xfer);
+gssize msn_xfer_write(const guchar *data, gsize len, PurpleXfer *xfer);
+gssize msn_xfer_read(guchar **data, PurpleXfer *xfer);
+
void msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session);
void msn_queue_buddy_icon_request(MsnUser *user);
diff --git a/libpurple/protocols/msn/slpcall.c b/libpurple/protocols/msn/slpcall.c
index 5a656cb50c..87f7ecec08 100644
--- a/libpurple/protocols/msn/slpcall.c
+++ b/libpurple/protocols/msn/slpcall.c
@@ -105,10 +105,13 @@ msn_slpcall_destroy(MsnSlpCall *slpcall)
slpcall->end_cb(slpcall, slpcall->slplink->session);
if (slpcall->xfer != NULL) {
+ if (purple_xfer_get_type(slpcall->xfer) == PURPLE_XFER_RECEIVE)
+ g_byte_array_free(slpcall->u.incoming_data, TRUE);
slpcall->xfer->data = NULL;
purple_xfer_unref(slpcall->xfer);
}
+
msn_slplink_remove_slpcall(slpcall->slplink, slpcall);
g_free(slpcall->id);
@@ -272,7 +275,8 @@ msn_slp_process_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
slpcall->timer = 0;
}
- slpcall->cb(slpcall, body, body_len);
+ if (slpcall->cb)
+ slpcall->cb(slpcall, body, body_len);
slpcall->wasted = TRUE;
}
diff --git a/libpurple/protocols/msn/slpcall.h b/libpurple/protocols/msn/slpcall.h
index 445bac734b..5c7664a7da 100644
--- a/libpurple/protocols/msn/slpcall.h
+++ b/libpurple/protocols/msn/slpcall.h
@@ -72,6 +72,14 @@ struct _MsnSlpCall
char *data_info;
PurpleXfer *xfer;
+ union {
+ GByteArray *incoming_data;
+ struct {
+ gsize len;
+ const guchar *data;
+ } outgoing;
+ } u;
+ MsnSlpMessage *xfer_msg; /* A dirty hack */
MsnSlpCb cb;
void (*end_cb)(MsnSlpCall *slpcall, MsnSession *session);
diff --git a/libpurple/protocols/msn/slplink.c b/libpurple/protocols/msn/slplink.c
index 0b921fa633..77cc8c892a 100644
--- a/libpurple/protocols/msn/slplink.c
+++ b/libpurple/protocols/msn/slplink.c
@@ -232,7 +232,7 @@ msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg)
}
}
-static void
+void
msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
{
MsnMessage *msg;
@@ -247,11 +247,11 @@ msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
if (slpmsg->offset < real_size)
{
- if (slpmsg->fp)
+ if (slpmsg->slpcall && slpmsg->slpcall->xfer && purple_xfer_get_type(slpmsg->slpcall->xfer) == PURPLE_XFER_SEND &&
+ purple_xfer_get_status(slpmsg->slpcall->xfer) == PURPLE_XFER_STATUS_STARTED)
{
- char data[1202];
- len = fread(data, 1, sizeof(data), slpmsg->fp);
- msn_message_set_bin_data(msg, data, len);
+ len = MIN(1202, slpmsg->slpcall->u.outgoing.len);
+ msn_message_set_bin_data(msg, slpmsg->slpcall->u.outgoing.data, len);
}
else
{
@@ -309,7 +309,13 @@ msg_ack(MsnMessage *msg, void *data)
if (slpmsg->offset < real_size)
{
- msn_slplink_send_msgpart(slpmsg->slplink, slpmsg);
+ if (slpmsg->slpcall->xfer && purple_xfer_get_status(slpmsg->slpcall->xfer) == PURPLE_XFER_STATUS_STARTED)
+ {
+ slpmsg->slpcall->xfer_msg = slpmsg;
+ purple_xfer_prpl_ready(slpmsg->slpcall->xfer);
+ }
+ else
+ msn_slplink_send_msgpart(slpmsg->slplink, slpmsg);
}
else
{
@@ -448,20 +454,22 @@ static void
send_file_cb(MsnSlpCall *slpcall)
{
MsnSlpMessage *slpmsg;
- struct stat st;
PurpleXfer *xfer;
+ xfer = (PurpleXfer *)slpcall->xfer;
+ purple_xfer_ref(xfer);
+ purple_xfer_start(xfer, -1, NULL, 0);
+ if (purple_xfer_get_status(xfer) != PURPLE_XFER_STATUS_STARTED) {
+ purple_xfer_unref(xfer);
+ return;
+ }
+ purple_xfer_unref(xfer);
+
slpmsg = msn_slpmsg_new(slpcall->slplink);
slpmsg->slpcall = slpcall;
slpmsg->flags = 0x1000030;
slpmsg->info = "SLP FILE";
-
- xfer = (PurpleXfer *)slpcall->xfer;
- purple_xfer_start(slpcall->xfer, -1, NULL, 0);
- slpmsg->fp = xfer->dest_fp;
- if (g_stat(purple_xfer_get_local_filename(xfer), &st) == 0)
- slpmsg->size = st.st_size;
- xfer->dest_fp = NULL; /* Disable double fclose() */
+ slpmsg->size = purple_xfer_get_size(xfer);
msn_slplink_send_slpmsg(slpcall->slplink, slpmsg);
}
@@ -489,6 +497,7 @@ msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg)
const char *data;
guint64 offset;
gsize len;
+ PurpleXfer *xfer = NULL;
if (purple_debug_is_verbose())
msn_slpmsg_show(msg);
@@ -525,12 +534,12 @@ msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg)
if (slpmsg->flags == 0x20 ||
slpmsg->flags == 0x1000020 || slpmsg->flags == 0x1000030)
{
- PurpleXfer *xfer;
-
xfer = slpmsg->slpcall->xfer;
-
if (xfer != NULL)
{
+ slpmsg->ft = TRUE;
+ slpmsg->slpcall->xfer_msg = slpmsg;
+
purple_xfer_ref(xfer);
purple_xfer_start(xfer, -1, NULL, 0);
@@ -540,14 +549,12 @@ msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg)
g_return_if_reached();
} else {
purple_xfer_unref(xfer);
- slpmsg->fp = xfer->dest_fp;
- xfer->dest_fp = NULL; /* Disable double fclose() */
}
}
}
}
}
- if (!slpmsg->fp && slpmsg->size)
+ if (!slpmsg->ft && slpmsg->size)
{
slpmsg->buffer = g_try_malloc(slpmsg->size);
if (slpmsg->buffer == NULL)
@@ -569,10 +576,12 @@ msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg)
}
}
- if (slpmsg->fp)
+ if (slpmsg->ft)
{
- /* fseek(slpmsg->fp, offset, SEEK_SET); */
- len = fwrite(data, 1, len, slpmsg->fp);
+ xfer = slpmsg->slpcall->xfer;
+ slpmsg->slpcall->u.incoming_data =
+ g_byte_array_append(slpmsg->slpcall->u.incoming_data, (const guchar *)data, len);
+ purple_xfer_prpl_ready(xfer);
}
else if (slpmsg->size && slpmsg->buffer)
{
@@ -613,29 +622,37 @@ msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg)
slpcall = msn_slp_process_msg(slplink, slpmsg);
- if (slpmsg->flags == 0x100)
- {
- MsnDirectConn *directconn;
+ if (slpcall == NULL) {
+ msn_slpmsg_destroy(slpmsg);
+ return;
+ }
+
+ if (!slpcall->wasted) {
+ if (slpmsg->flags == 0x100)
+ {
+ MsnDirectConn *directconn;
- directconn = slplink->directconn;
+ directconn = slplink->directconn;
#if 0
- if (!directconn->acked)
- msn_directconn_send_handshake(directconn);
+ if (!directconn->acked)
+ msn_directconn_send_handshake(directconn);
#endif
- }
- else if (slpmsg->flags == 0x00 || slpmsg->flags == 0x1000000 ||
- slpmsg->flags == 0x20 || slpmsg->flags == 0x1000020 ||
- slpmsg->flags == 0x1000030)
- {
- /* Release all the messages and send the ACK */
+ }
+ else if (slpmsg->flags == 0x00 || slpmsg->flags == 0x1000000 ||
+ slpmsg->flags == 0x20 || slpmsg->flags == 0x1000020 ||
+ slpmsg->flags == 0x1000030)
+ {
+ /* Release all the messages and send the ACK */
+
+ msn_slplink_send_ack(slplink, msg);
+ msn_slplink_send_queued_slpmsgs(slplink);
+ }
- msn_slplink_send_ack(slplink, msg);
- msn_slplink_send_queued_slpmsgs(slplink);
}
msn_slpmsg_destroy(slpmsg);
- if (slpcall != NULL && slpcall->wasted)
+ if (slpcall->wasted)
msn_slpcall_destroy(slpcall);
}
}
@@ -652,9 +669,8 @@ typedef struct
#define MAX_FILE_NAME_LEN 0x226
static gchar *
-gen_context(const char *file_name, const char *file_path)
+gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path)
{
- struct stat st;
gsize size = 0;
MsnContextHeader header;
gchar *u8 = NULL;
@@ -666,8 +682,7 @@ gen_context(const char *file_name, const char *file_path)
glong uni_len = 0;
gsize len;
- if (g_stat(file_path, &st) == 0)
- size = st.st_size;
+ size = purple_xfer_get_size(xfer);
if(!file_name) {
gchar *basename = g_path_get_basename(file_path);
@@ -732,7 +747,6 @@ msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer)
slpcall->session_init_cb = send_file_cb;
slpcall->end_cb = msn_xfer_end_cb;
- slpcall->progress_cb = msn_xfer_progress_cb;
slpcall->cb = msn_xfer_completed_cb;
slpcall->xfer = xfer;
purple_xfer_ref(slpcall->xfer);
@@ -740,10 +754,12 @@ msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer)
slpcall->pending = TRUE;
purple_xfer_set_cancel_send_fnc(xfer, msn_xfer_cancel);
+ purple_xfer_set_read_fnc(xfer, msn_xfer_read);
+ purple_xfer_set_write_fnc(xfer, msn_xfer_write);
xfer->data = slpcall;
- context = gen_context(fn, fp);
+ context = gen_context(xfer, fn, fp);
msn_slpcall_invite(slpcall, MSN_FT_GUID, 2, context);
diff --git a/libpurple/protocols/msn/slplink.h b/libpurple/protocols/msn/slplink.h
index 2f11c97e5b..ea8ca2e5f6 100644
--- a/libpurple/protocols/msn/slplink.h
+++ b/libpurple/protocols/msn/slplink.h
@@ -84,6 +84,9 @@ void msn_slplink_send_queued_slpmsgs(MsnSlpLink *slplink);
void msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg);
void msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer);
+/* Only exported for msn_xfer_write */
+void msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
+
void msn_slplink_request_object(MsnSlpLink *slplink,
const char *info,
MsnSlpCb cb,
diff --git a/libpurple/protocols/msn/slpmsg.c b/libpurple/protocols/msn/slpmsg.c
index 919f5de910..3864ae1159 100644
--- a/libpurple/protocols/msn/slpmsg.c
+++ b/libpurple/protocols/msn/slpmsg.c
@@ -60,9 +60,6 @@ msn_slpmsg_destroy(MsnSlpMessage *slpmsg)
slplink = slpmsg->slplink;
- if (slpmsg->fp != NULL)
- fclose(slpmsg->fp);
-
purple_imgstore_unref(slpmsg->img);
/* We don't want to free the data of the PurpleStoredImage,
@@ -96,7 +93,7 @@ msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
/* We can only have one data source at a time. */
g_return_if_fail(slpmsg->buffer == NULL);
g_return_if_fail(slpmsg->img == NULL);
- g_return_if_fail(slpmsg->fp == NULL);
+ g_return_if_fail(slpmsg->ft == FALSE);
if (body != NULL)
slpmsg->buffer = g_memdup(body, size);
@@ -112,7 +109,7 @@ msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img)
/* We can only have one data source at a time. */
g_return_if_fail(slpmsg->buffer == NULL);
g_return_if_fail(slpmsg->img == NULL);
- g_return_if_fail(slpmsg->fp == NULL);
+ g_return_if_fail(slpmsg->ft == FALSE);
slpmsg->img = purple_imgstore_ref(img);
slpmsg->buffer = (guchar *)purple_imgstore_get_data(img);
diff --git a/libpurple/protocols/msn/slpmsg.h b/libpurple/protocols/msn/slpmsg.h
index 6f1349aa4c..893022f72d 100644
--- a/libpurple/protocols/msn/slpmsg.h
+++ b/libpurple/protocols/msn/slpmsg.h
@@ -54,7 +54,7 @@ struct _MsnSlpMessage
gboolean sip; /**< A flag that states if this is a SIP slp message. */
long flags;
- FILE *fp;
+ gboolean ft;
PurpleStoredImage *img;
guchar *buffer;
long long offset;
diff --git a/libpurple/protocols/msn/switchboard.c b/libpurple/protocols/msn/switchboard.c
index 1f6cd22d2a..6b255355de 100644
--- a/libpurple/protocols/msn/switchboard.c
+++ b/libpurple/protocols/msn/switchboard.c
@@ -222,13 +222,28 @@ msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user)
{
MsnCmdProc *cmdproc;
PurpleAccount *account;
+ char *semicolon;
+ char *passport;
g_return_if_fail(swboard != NULL);
cmdproc = swboard->cmdproc;
account = cmdproc->session->account;
- swboard->users = g_list_prepend(swboard->users, g_strdup(user));
+ semicolon = strchr(user, ';');
+ /* We don't really care about the machine ID. */
+ if (semicolon)
+ passport = g_strndup(user, semicolon - user);
+ else
+ passport = g_strdup(user);
+
+ /* Don't add multiple endpoints to the conversation. */
+ if (g_list_find_custom(swboard->users, passport, (GCompareFunc)strcmp)) {
+ g_free(passport);
+ return;
+ }
+
+ swboard->users = g_list_prepend(swboard->users, passport);
swboard->current_users++;
swboard->empty = FALSE;
diff --git a/libpurple/protocols/msn/userlist.c b/libpurple/protocols/msn/userlist.c
index 85a9cf246b..4822643742 100644
--- a/libpurple/protocols/msn/userlist.c
+++ b/libpurple/protocols/msn/userlist.c
@@ -210,6 +210,7 @@ msn_got_lst_user(MsnSession *session, MsnUser *user,
if (list_op & MSN_LIST_PL_OP)
{
+ user->authorized = TRUE;
got_new_entry(gc, passport, store, message);
}
}
diff --git a/libpurple/protocols/mxit/splashscreen.c b/libpurple/protocols/mxit/splashscreen.c
index a78dd3e7d6..9706e33f82 100644
--- a/libpurple/protocols/mxit/splashscreen.c
+++ b/libpurple/protocols/mxit/splashscreen.c
@@ -24,7 +24,6 @@
*/
#include "internal.h"
-#include <glib/gstdio.h>
#include "purple.h"
#include "imgstore.h"
diff --git a/libpurple/protocols/myspace/user.c b/libpurple/protocols/myspace/user.c
index 3b9175818c..63577741ce 100644
--- a/libpurple/protocols/myspace/user.c
+++ b/libpurple/protocols/myspace/user.c
@@ -70,6 +70,9 @@ void msim_user_free(MsimUser *user)
if (!user)
return;
+ if (user->url_data != NULL)
+ purple_util_fetch_url_cancel(user->url_data);
+
g_free(user->client_info);
g_free(user->gender);
g_free(user->location);
@@ -212,6 +215,8 @@ msim_downloaded_buddy_icon(PurpleUtilFetchUrlData *url_data,
const char *name = purple_buddy_get_name(user->buddy);
PurpleAccount *account;
+ user->url_data = NULL;
+
purple_debug_info("msim_downloaded_buddy_icon",
"Downloaded %" G_GSIZE_FORMAT " bytes\n", len);
@@ -375,7 +380,9 @@ msim_store_user_info_each(const gchar *key_str, gchar *value_str, MsimUser *user
/* Only download if URL changed */
if (!previous_url || !g_str_equal(previous_url, user->image_url)) {
- purple_util_fetch_url(user->image_url, TRUE, NULL, TRUE, msim_downloaded_buddy_icon, (gpointer)user);
+ if (user->url_data != NULL)
+ purple_util_fetch_url_cancel(user->url_data);
+ user->url_data = purple_util_fetch_url(user->image_url, TRUE, NULL, TRUE, msim_downloaded_buddy_icon, (gpointer)user);
}
} else if (g_str_equal(key_str, "LastImageUpdated")) {
/* TODO: use somewhere */
diff --git a/libpurple/protocols/myspace/user.h b/libpurple/protocols/myspace/user.h
index d1a8b59970..acc0c2604d 100644
--- a/libpurple/protocols/myspace/user.h
+++ b/libpurple/protocols/myspace/user.h
@@ -40,6 +40,7 @@ typedef struct _MsimUser
gchar *image_url;
guint last_image_updated;
gboolean temporary_user;
+ PurpleUtilFetchUrlData *url_data;
} MsimUser;
/* Callback function pointer type for when a user's information is received,
diff --git a/libpurple/protocols/oscar/oscar.c b/libpurple/protocols/oscar/oscar.c
index c254c3334a..02787f54de 100644
--- a/libpurple/protocols/oscar/oscar.c
+++ b/libpurple/protocols/oscar/oscar.c
@@ -378,12 +378,12 @@ oscar_encoding_to_utf8(PurpleAccount *account, const char *encoding, const char
}
static gchar *
-oscar_utf8_try_convert(PurpleAccount *account, const gchar *msg)
+oscar_utf8_try_convert(PurpleAccount *account, OscarData *od, const gchar *msg)
{
const char *charset = NULL;
char *ret = NULL;
- if(oscar_util_valid_name_icq(purple_account_get_username(account)))
+ if (od->icq)
charset = purple_account_get_string(account, "encoding", NULL);
if(charset && *charset)
@@ -798,24 +798,24 @@ oscar_user_info_add_pair(PurpleNotifyUserInfo *user_info, const char *name, cons
}
static void
-oscar_user_info_convert_and_add_pair(PurpleAccount *account, PurpleNotifyUserInfo *user_info,
+oscar_user_info_convert_and_add_pair(PurpleAccount *account, OscarData *od, PurpleNotifyUserInfo *user_info,
const char *name, const char *value)
{
gchar *utf8;
- if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, value))) {
+ if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, od, value))) {
purple_notify_user_info_add_pair(user_info, name, utf8);
g_free(utf8);
}
}
static void
-oscar_user_info_convert_and_add(PurpleAccount *account, PurpleNotifyUserInfo *user_info,
+oscar_user_info_convert_and_add(PurpleAccount *account, OscarData *od, PurpleNotifyUserInfo *user_info,
const char *name, const char *value)
{
gchar *utf8;
- if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, value))) {
+ if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, od, value))) {
purple_notify_user_info_add_pair(user_info, name, utf8);
g_free(utf8);
}
@@ -1022,7 +1022,7 @@ static void oscar_user_info_append_extra_info(PurpleConnection *gc, PurpleNotify
char *tmp2 = g_markup_escape_text(tmp, strlen(tmp));
g_free(tmp);
- oscar_user_info_convert_and_add_pair(account, user_info, _("Buddy Comment"), tmp2);
+ oscar_user_info_convert_and_add_pair(account, od, user_info, _("Buddy Comment"), tmp2);
g_free(tmp2);
}
}
@@ -2450,7 +2450,7 @@ static int incomingim_chan1(OscarData *od, FlapConnection *conn, aim_userinfo_t
* Note: There *may* be some clients which send messages as HTML formatted -
* they need to be special-cased somehow.
*/
- if (oscar_util_valid_name_icq(purple_account_get_username(account)) && oscar_util_valid_name_icq(userinfo->bn)) {
+ if (od->icq && oscar_util_valid_name_icq(userinfo->bn)) {
/* being recevied by ICQ from ICQ - escape HTML so it is displayed as sent */
gchar *tmp2 = g_markup_escape_text(tmp, -1);
g_free(tmp);
@@ -4173,7 +4173,7 @@ static int purple_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ..
bi = NULL;
purple_notify_user_info_add_pair(user_info, _("UIN"), who);
- oscar_user_info_convert_and_add(account, user_info, _("Nick"), info->nick);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Nick"), info->nick);
if ((bi != NULL) && (bi->ipaddr != 0)) {
char *tstr = g_strdup_printf("%hhu.%hhu.%hhu.%hhu",
(bi->ipaddr & 0xff000000) >> 24,
@@ -4183,9 +4183,9 @@ static int purple_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ..
purple_notify_user_info_add_pair(user_info, _("IP Address"), tstr);
g_free(tstr);
}
- oscar_user_info_convert_and_add(account, user_info, _("First Name"), info->first);
- oscar_user_info_convert_and_add(account, user_info, _("Last Name"), info->last);
- if (info->email && info->email[0] && (utf8 = oscar_utf8_try_convert(account, info->email))) {
+ oscar_user_info_convert_and_add(account, od, user_info, _("First Name"), info->first);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Last Name"), info->last);
+ if (info->email && info->email[0] && (utf8 = oscar_utf8_try_convert(account, od, info->email))) {
buf = g_strdup_printf("<a href=\"mailto:%s\">%s</a>", utf8, utf8);
purple_notify_user_info_add_pair(user_info, _("Email Address"), buf);
g_free(buf);
@@ -4194,7 +4194,7 @@ static int purple_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ..
if (info->numaddresses && info->email2) {
int i;
for (i = 0; i < info->numaddresses; i++) {
- if (info->email2[i] && info->email2[i][0] && (utf8 = oscar_utf8_try_convert(account, info->email2[i]))) {
+ if (info->email2[i] && info->email2[i][0] && (utf8 = oscar_utf8_try_convert(account, od, info->email2[i]))) {
buf = g_strdup_printf("<a href=\"mailto:%s\">%s</a>", utf8, utf8);
purple_notify_user_info_add_pair(user_info, _("Email Address"), buf);
g_free(buf);
@@ -4202,7 +4202,7 @@ static int purple_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ..
}
}
}
- oscar_user_info_convert_and_add(account, user_info, _("Mobile Phone"), info->mobile);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Mobile Phone"), info->mobile);
if (info->gender != 0)
purple_notify_user_info_add_pair(user_info, _("Gender"), (info->gender == 1 ? _("Female") : _("Male")));
@@ -4222,14 +4222,14 @@ static int purple_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ..
* feel free to remove it. --rlaager */
mktime(tm);
- oscar_user_info_convert_and_add(account, user_info, _("Birthday"), purple_date_format_short(tm));
+ oscar_user_info_convert_and_add(account, od, user_info, _("Birthday"), purple_date_format_short(tm));
}
if ((info->age > 0) && (info->age < 255)) {
char age[5];
snprintf(age, sizeof(age), "%hhd", info->age);
purple_notify_user_info_add_pair(user_info, _("Age"), age);
}
- if (info->personalwebpage && info->personalwebpage[0] && (utf8 = oscar_utf8_try_convert(account, info->personalwebpage))) {
+ if (info->personalwebpage && info->personalwebpage[0] && (utf8 = oscar_utf8_try_convert(account, od, info->personalwebpage))) {
buf = g_strdup_printf("<a href=\"%s\">%s</a>", utf8, utf8);
purple_notify_user_info_add_pair(user_info, _("Personal Web Page"), buf);
g_free(buf);
@@ -4239,33 +4239,33 @@ static int purple_icqinfo(OscarData *od, FlapConnection *conn, FlapFrame *fr, ..
if (buddy != NULL)
oscar_user_info_append_status(gc, user_info, buddy, /* aim_userinfo_t */ NULL, /* strip_html_tags */ FALSE);
- oscar_user_info_convert_and_add(account, user_info, _("Additional Information"), info->info);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Additional Information"), info->info);
purple_notify_user_info_add_section_break(user_info);
if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) {
purple_notify_user_info_add_section_header(user_info, _("Home Address"));
- oscar_user_info_convert_and_add(account, user_info, _("Address"), info->homeaddr);
- oscar_user_info_convert_and_add(account, user_info, _("City"), info->homecity);
- oscar_user_info_convert_and_add(account, user_info, _("State"), info->homestate);
- oscar_user_info_convert_and_add(account, user_info, _("Zip Code"), info->homezip);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Address"), info->homeaddr);
+ oscar_user_info_convert_and_add(account, od, user_info, _("City"), info->homecity);
+ oscar_user_info_convert_and_add(account, od, user_info, _("State"), info->homestate);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Zip Code"), info->homezip);
}
if ((info->workaddr && info->workaddr[0]) || (info->workcity && info->workcity[0]) || (info->workstate && info->workstate[0]) || (info->workzip && info->workzip[0])) {
purple_notify_user_info_add_section_header(user_info, _("Work Address"));
- oscar_user_info_convert_and_add(account, user_info, _("Address"), info->workaddr);
- oscar_user_info_convert_and_add(account, user_info, _("City"), info->workcity);
- oscar_user_info_convert_and_add(account, user_info, _("State"), info->workstate);
- oscar_user_info_convert_and_add(account, user_info, _("Zip Code"), info->workzip);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Address"), info->workaddr);
+ oscar_user_info_convert_and_add(account, od, user_info, _("City"), info->workcity);
+ oscar_user_info_convert_and_add(account, od, user_info, _("State"), info->workstate);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Zip Code"), info->workzip);
}
if ((info->workcompany && info->workcompany[0]) || (info->workdivision && info->workdivision[0]) || (info->workposition && info->workposition[0]) || (info->workwebpage && info->workwebpage[0])) {
purple_notify_user_info_add_section_header(user_info, _("Work Information"));
- oscar_user_info_convert_and_add(account, user_info, _("Company"), info->workcompany);
- oscar_user_info_convert_and_add(account, user_info, _("Division"), info->workdivision);
- oscar_user_info_convert_and_add(account, user_info, _("Position"), info->workposition);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Company"), info->workcompany);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Division"), info->workdivision);
+ oscar_user_info_convert_and_add(account, od, user_info, _("Position"), info->workposition);
- if (info->workwebpage && info->workwebpage[0] && (utf8 = oscar_utf8_try_convert(account, info->workwebpage))) {
+ if (info->workwebpage && info->workwebpage[0] && (utf8 = oscar_utf8_try_convert(account, od, info->workwebpage))) {
char *webpage = g_strdup_printf("<a href=\"%s\">%s</a>", utf8, utf8);
purple_notify_user_info_add_pair(user_info, _("Web Page"), webpage);
g_free(webpage);
@@ -4296,7 +4296,7 @@ static int purple_icqalias(OscarData *od, FlapConnection *conn, FlapFrame *fr, .
info = va_arg(ap, struct aim_icq_info *);
va_end(ap);
- if (info->uin && info->nick && info->nick[0] && (utf8 = oscar_utf8_try_convert(account, info->nick))) {
+ if (info->uin && info->nick && info->nick[0] && (utf8 = oscar_utf8_try_convert(account, od, info->nick))) {
g_snprintf(who, sizeof(who), "%u", info->uin);
serv_got_alias(gc, who, utf8);
if ((b = purple_find_buddy(account, who))) {
@@ -4751,7 +4751,7 @@ oscar_send_im(PurpleConnection *gc, const char *name, const char *message, Purpl
/* Messaging an SMS (mobile) user */
tmp2 = purple_markup_strip_html(tmp1);
is_html = FALSE;
- } else if (oscar_util_valid_name_icq(purple_account_get_username(account))) {
+ } else if (od->icq) {
if (oscar_util_valid_name_icq(name)) {
/* From ICQ to ICQ */
tmp2 = purple_markup_strip_html(tmp1);
@@ -5047,6 +5047,9 @@ oscar_set_status_icq(PurpleAccount *account)
void
oscar_set_status(PurpleAccount *account, PurpleStatus *status)
{
+ PurpleConnection *pc;
+ OscarData *od;
+
purple_debug_info("oscar", "Set status to %s\n", purple_status_get_name(status));
if (!purple_status_is_active(status))
@@ -5055,11 +5058,14 @@ oscar_set_status(PurpleAccount *account, PurpleStatus *status)
if (!purple_account_is_connected(account))
return;
+ pc = purple_account_get_connection(account);
+ od = purple_connection_get_protocol_data(pc);
+
/* Set the AIM-style away message for both AIM and ICQ accounts */
oscar_set_info_and_status(account, FALSE, NULL, TRUE, status);
/* Set the ICQ status for ICQ accounts only */
- if (oscar_util_valid_name_icq(purple_account_get_username(account)))
+ if (od->icq)
oscar_set_status_icq(account);
}
@@ -5404,7 +5410,7 @@ static int purple_ssi_parselist(OscarData *od, FlapConnection *conn, FlapFrame *
if (g_utf8_validate(gname, -1, NULL))
gname_utf8 = g_strdup(gname);
else
- gname_utf8 = oscar_utf8_try_convert(account, gname);
+ gname_utf8 = oscar_utf8_try_convert(account, od, gname);
} else
gname_utf8 = NULL;
@@ -5419,7 +5425,7 @@ static int purple_ssi_parselist(OscarData *od, FlapConnection *conn, FlapFrame *
if (g_utf8_validate(alias, -1, NULL))
alias_utf8 = g_strdup(alias);
else
- alias_utf8 = oscar_utf8_try_convert(account, alias);
+ alias_utf8 = oscar_utf8_try_convert(account, od, alias);
g_free(alias);
} else
alias_utf8 = NULL;
@@ -5468,7 +5474,7 @@ static int purple_ssi_parselist(OscarData *od, FlapConnection *conn, FlapFrame *
if (g_utf8_validate(gname, -1, NULL))
gname_utf8 = g_strdup(gname);
else
- gname_utf8 = oscar_utf8_try_convert(account, gname);
+ gname_utf8 = oscar_utf8_try_convert(account, od, gname);
} else
gname_utf8 = NULL;
@@ -5636,7 +5642,7 @@ purple_ssi_parseaddmod(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
return 1;
gname = aim_ssi_itemlist_findparentname(od->ssi.local, name);
- gname_utf8 = gname ? oscar_utf8_try_convert(account, gname) : NULL;
+ gname_utf8 = gname ? oscar_utf8_try_convert(account, od, gname) : NULL;
alias = aim_ssi_getalias(od->ssi.local, gname, name);
if (alias != NULL)
@@ -5644,7 +5650,7 @@ purple_ssi_parseaddmod(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
if (g_utf8_validate(alias, -1, NULL))
alias_utf8 = g_strdup(alias);
else
- alias_utf8 = oscar_utf8_try_convert(account, alias);
+ alias_utf8 = oscar_utf8_try_convert(account, od, alias);
}
else
alias_utf8 = NULL;
@@ -6417,7 +6423,7 @@ static void oscar_buddycb_edit_comment(PurpleBlistNode *node, gpointer ignore) {
data = g_new(struct name_data, 1);
comment = aim_ssi_getcomment(od->ssi.local, purple_group_get_name(g), name);
- comment_utf8 = comment ? oscar_utf8_try_convert(account, comment) : NULL;
+ comment_utf8 = comment ? oscar_utf8_try_convert(account, od, comment) : NULL;
data->gc = gc;
data->name = g_strdup(name);
diff --git a/libpurple/purple-uninstalled.pc.in b/libpurple/purple-uninstalled.pc.in
index 9450e9210f..22a554ec37 100644
--- a/libpurple/purple-uninstalled.pc.in
+++ b/libpurple/purple-uninstalled.pc.in
@@ -6,9 +6,12 @@ datarootdir=@datarootdir@
datadir=@datadir@
sysconfdir=@sysconfdir@
+abs_srcdir=@abs_srcdir@
+abs_builddir=@abs_builddir@
+
Name: libpurple
Description: libpurple is a GLib-based instant messenger library.
Version: @VERSION@
Requires: glib-2.0
-Cflags: -I${pcfiledir}
-Libs: ${pcfiledir}/libpurple.la
+Cflags: -I${abs_srcdir} -I${abs_builddir}
+Libs: ${abs_builddir}/libpurple.la
diff --git a/libpurple/tests/Makefile.am b/libpurple/tests/Makefile.am
index 3bdd12c8a7..4ad51538f8 100644
--- a/libpurple/tests/Makefile.am
+++ b/libpurple/tests/Makefile.am
@@ -27,11 +27,11 @@ check_libpurple_CFLAGS=\
-DBUILDDIR=\"$(top_builddir)\"
check_libpurple_LDADD=\
- @CHECK_LIBS@ \
- $(GLIB_LIBS) \
$(top_builddir)/libpurple/protocols/jabber/libjabber.la \
$(top_builddir)/libpurple/protocols/qq/libqq.la \
$(top_builddir)/libpurple/protocols/yahoo/libymsg.la \
- $(top_builddir)/libpurple/libpurple.la
+ $(top_builddir)/libpurple/libpurple.la \
+ @CHECK_LIBS@ \
+ $(GLIB_LIBS)
endif
diff --git a/libpurple/tests/check_libpurple.c b/libpurple/tests/check_libpurple.c
index f0a398ed9e..fb6bb73849 100644
--- a/libpurple/tests/check_libpurple.c
+++ b/libpurple/tests/check_libpurple.c
@@ -44,7 +44,7 @@ purple_check_init(void) {
purple_eventloop_set_ui_ops(&eventloop_ui_ops);
/* build our fake home directory */
- home_dir = g_build_path(BUILDDIR, "libpurple", "tests", "home", NULL);
+ home_dir = g_build_path(G_DIR_SEPARATOR_S, BUILDDIR, "libpurple", "tests", "home", NULL);
purple_util_set_user_dir(home_dir);
g_free(home_dir);
@@ -67,6 +67,9 @@ int main(void)
int number_failed;
SRunner *sr;
+ if (g_getenv("PURPLE_CHECK_DEBUG"))
+ purple_debug_set_enabled(TRUE);
+
/* Make g_return_... functions fatal, ALWAYS.
* As this is the test code, this is NOT controlled
* by PURPLE_FATAL_ASSERTS. */
diff --git a/libpurple/tests/test_cipher.c b/libpurple/tests/test_cipher.c
index 38853d5bdd..adb176dd0b 100644
--- a/libpurple/tests/test_cipher.c
+++ b/libpurple/tests/test_cipher.c
@@ -142,12 +142,13 @@ END_TEST
PurpleCipherContext *context = NULL; \
gchar cdigest[41]; \
gboolean ret = FALSE; \
+ gchar *input = data; \
\
cipher = purple_ciphers_find_cipher("sha1"); \
context = purple_cipher_context_new(cipher, NULL); \
\
- if((data)) { \
- purple_cipher_context_append(context, (guchar *)(data), strlen((data))); \
+ if (input) { \
+ purple_cipher_context_append(context, (guchar *)input, strlen(input)); \
} else { \
gint j; \
guchar buff[1000]; \
@@ -202,12 +203,13 @@ END_TEST
PurpleCipherContext *context = NULL; \
gchar cdigest[65]; \
gboolean ret = FALSE; \
+ gchar *input = data; \
\
cipher = purple_ciphers_find_cipher("sha256"); \
context = purple_cipher_context_new(cipher, NULL); \
\
- if((data)) { \
- purple_cipher_context_append(context, (guchar *)(data), strlen((data))); \
+ if (input) { \
+ purple_cipher_context_append(context, (guchar *)input, strlen(input)); \
} else { \
gint j; \
guchar buff[1000]; \
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
index 13626e8bda..0f22dc4caf 100644
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -5493,10 +5493,12 @@ received_im_msg_cb(PurpleAccount *account, char *sender, char *message,
}
/* Somebody wants to keep this conversation around, so don't time it out */
- timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer"));
- if (timer) {
- purple_timeout_remove(timer);
- purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(0));
+ if (conv) {
+ timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer"));
+ if (timer) {
+ purple_timeout_remove(timer);
+ purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(0));
+ }
}
}
@@ -7622,16 +7624,24 @@ account_signing_off(PurpleConnection *gc)
}
}
+struct _status_timeout_user {
+ gchar *name;
+ PurpleAccount *account;
+};
+
static gboolean
-update_buddy_status_timeout(PurpleBuddy *buddy)
+update_buddy_status_timeout(struct _status_timeout_user *user)
{
/* To remove the signing-on/off door icon */
PurpleConversation *conv;
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, buddy->name, buddy->account);
+ conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, user->name, user->account);
if (conv)
pidgin_conv_update_fields(conv, PIDGIN_CONV_TAB_ICON);
+ g_free(user->name);
+ g_free(user);
+
return FALSE;
}
@@ -7640,6 +7650,7 @@ update_buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus
{
PidginConversation *gtkconv;
PurpleConversation *conv;
+ struct _status_timeout_user *user;
gtkconv = get_gtkconv_with_contact(purple_buddy_get_contact(buddy));
if (gtkconv)
@@ -7652,8 +7663,12 @@ update_buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus
pidgin_conv_update_fields(conv, PIDGIN_CONV_MENU);
}
+ user = g_malloc(sizeof(struct _status_timeout_user));
+ user->name = g_strdup(buddy->name);
+ user->account = buddy->account;
+
/* In case a conversation is started after the buddy has signed-on/off */
- purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, buddy);
+ purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, user);
}
static void
diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c
index e91e4e10d3..08c0163b21 100644
--- a/pidgin/gtkdialogs.c
+++ b/pidgin/gtkdialogs.c
@@ -197,7 +197,6 @@ static const struct translator translators[] = {
{N_("Kurdish"), "ku", "Amed Ç. Jiyan", "amedcj@hotmail.com"},
{N_("Kurdish"), "ku", "Rizoyê Xerzî", "rizoxerzi@hotmail.com"},
{N_("Lao"), "lo", "Anousak Souphavah", "anousak@gmail.com"},
- {N_("Lithuanian"), "lt", "Laurynas Biveinis", "laurynas.biveinis@gmail.com"},
{N_("Macedonian"), "mk", "Arangel Angov ", "arangel@linux.net.mk"},
{N_("Macedonian"), "mk", "Ivana Kirkovska", "ivana.kirkovska@gmail.com"},
{N_("Macedonian"), "mk", "Jovan Naumovski", "jovan@lugola.net"},
@@ -276,8 +275,9 @@ static const struct translator past_translators[] = {
{N_("Georgian"), "ka", "Temuri Doghonadze", NULL},
{N_("Korean"), "ko", "Sang-hyun S, A Ho-seok Lee", NULL},
{N_("Korean"), "ko", "Kyeong-uk Son", NULL},
- {N_("Lithuanian"), "lt", "Andrius Štikonas", NULL},
+ {N_("Lithuanian"), "lt", "Laurynas Biveinis", "laurynas.biveinis@gmail.com"},
{N_("Lithuanian"), "lt", "Gediminas Čičinskas", NULL},
+ {N_("Lithuanian"), "lt", "Andrius Štikonas", NULL},
{N_("Macedonian"), "mk", "Tomislav Markovski", NULL},
{N_("Bokmål Norwegian"), "nb", "Hallvard Glad", "hallvard.glad@gmail.com"},
{N_("Bokmål Norwegian"), "nb", "Petter Johan Olsen", NULL},
diff --git a/pidgin/gtkft.c b/pidgin/gtkft.c
index cd4e21610a..3f0b529a7f 100644
--- a/pidgin/gtkft.c
+++ b/pidgin/gtkft.c
@@ -730,6 +730,7 @@ pidgin_xfer_dialog_new(void)
GtkWidget *sw;
GtkWidget *button;
GtkWidget *expander;
+ GtkWidget *alignment;
GtkWidget *table;
GtkWidget *checkbox;
@@ -787,9 +788,15 @@ pidgin_xfer_dialog_new(void)
gtk_widget_set_sensitive(expander, FALSE);
+ /* Small indent make table fall under GtkExpander's label */
+ alignment = gtk_alignment_new(1, 0, 1, 1);
+ gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 20, 0);
+ gtk_container_add(GTK_CONTAINER(expander), alignment);
+ gtk_widget_show(alignment);
+
/* The table of information. */
table = make_info_table(dialog);
- gtk_container_add(GTK_CONTAINER(expander), table);
+ gtk_container_add(GTK_CONTAINER(alignment), table);
gtk_widget_show(table);
/* Open button */
diff --git a/pidgin/gtkimhtml.c b/pidgin/gtkimhtml.c
index c6c5d34920..9161fb8358 100644
--- a/pidgin/gtkimhtml.c
+++ b/pidgin/gtkimhtml.c
@@ -549,6 +549,7 @@ gtk_imhtml_tip (gpointer data)
imhtml->tip_timer = 0;
imhtml->tip_window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_set_app_paintable (imhtml->tip_window, TRUE);
+ gtk_window_set_title(GTK_WINDOW(imhtml->tip_window), "GtkIMHtml");
gtk_window_set_resizable (GTK_WINDOW (imhtml->tip_window), FALSE);
gtk_widget_set_name (imhtml->tip_window, "gtk-tooltips");
#if GTK_CHECK_VERSION(2,10,0)
diff --git a/pidgin/gtklog.c b/pidgin/gtklog.c
index aed4f054e0..4a759db21e 100644
--- a/pidgin/gtklog.c
+++ b/pidgin/gtklog.c
@@ -423,6 +423,7 @@ static gboolean search_find_cb(gpointer data)
{
PidginLogViewer *viewer = data;
gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search);
+ g_object_steal_data(G_OBJECT(viewer->entry), "search-find-cb");
return FALSE;
}
@@ -475,8 +476,11 @@ static void log_select_cb(GtkTreeSelection *sel, PidginLogViewer *viewer) {
g_free(read);
if (viewer->search != NULL) {
+ guint source;
gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml));
- g_idle_add(search_find_cb, viewer);
+ source = g_idle_add(search_find_cb, viewer);
+ g_object_set_data_full(G_OBJECT(viewer->entry), "search-find-cb",
+ GINT_TO_POINTER(source), (GDestroyNotify)g_source_remove);
}
pidgin_clear_cursor(viewer->window);
diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c
index 42227c0dcd..a51b9f20cd 100644
--- a/pidgin/gtkprefs.c
+++ b/pidgin/gtkprefs.c
@@ -70,27 +70,33 @@ struct theme_info {
gchar *original_name;
};
-static int sound_row_sel = 0;
-static GtkWidget *prefsnotebook;
-
-static GtkWidget *sound_entry = NULL;
-
+/* Main dialog */
static GtkWidget *prefs = NULL;
-static GtkWidget *debugbutton = NULL;
+
+/* Notebook */
+static GtkWidget *prefsnotebook = NULL;
static int notebook_page = 0;
-static GtkListStore *prefs_sound_themes;
-static GtkListStore *prefs_blist_themes;
-static GtkListStore *prefs_status_icon_themes;
-static GtkListStore *prefs_smiley_themes;
+/* Conversations page */
+static GtkWidget *sample_imhtml = NULL;
+/* Themes page */
static GtkWidget *prefs_sound_themes_combo_box;
static GtkWidget *prefs_blist_themes_combo_box;
static GtkWidget *prefs_status_themes_combo_box;
static GtkWidget *prefs_smiley_themes_combo_box;
+/* Sound theme specific */
+static GtkWidget *sound_entry = NULL;
+static int sound_row_sel = 0;
static gboolean prefs_sound_themes_loading;
+/* These exist outside the lifetime of the prefs dialog */
+static GtkListStore *prefs_sound_themes;
+static GtkListStore *prefs_blist_themes;
+static GtkListStore *prefs_status_icon_themes;
+static GtkListStore *prefs_smiley_themes;
+
/*
* PROTOTYPES
*/
@@ -334,10 +340,21 @@ delete_prefs(GtkWidget *asdf, void *gdsa)
/* Unregister callbacks. */
purple_prefs_disconnect_by_handle(prefs);
- prefs = NULL;
+ /* NULL-ify globals */
sound_entry = NULL;
- debugbutton = NULL;
+ sound_row_sel = 0;
+ prefs_sound_themes_loading = FALSE;
+
+ prefs_sound_themes_combo_box = NULL;
+ prefs_blist_themes_combo_box = NULL;
+ prefs_status_themes_combo_box = NULL;
+ prefs_smiley_themes_combo_box = NULL;
+
+ sample_imhtml = NULL;
+
notebook_page = 0;
+ prefsnotebook = NULL;
+ prefs = NULL;
}
static gchar *
@@ -949,6 +966,7 @@ prefs_set_smiley_theme_cb(GtkComboBox *combo_box, gpointer user_data)
gtk_tree_model_get(GTK_TREE_MODEL(prefs_smiley_themes), &new_iter, 2, &new_theme, -1);
purple_prefs_set_string(PIDGIN_PREFS_ROOT "/smileys/theme", new_theme);
+ pidgin_themes_smiley_themeize(sample_imhtml);
g_free(new_theme);
}
@@ -1537,7 +1555,7 @@ conv_page(void)
G_CALLBACK(formatting_toggle_cb), toolbar);
g_signal_connect_after(G_OBJECT(imhtml), "format_function_clear",
G_CALLBACK(formatting_clear_cb), NULL);
-
+ sample_imhtml = imhtml;
gtk_widget_show(ret);
@@ -2842,7 +2860,7 @@ pidgin_prefs_init(void)
purple_prefs_add_string(PIDGIN_PREFS_ROOT "/smileys/theme", "Default");
/* Smiley Callbacks */
- purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/smileys/theme",
+ purple_prefs_connect_callback(&prefs, PIDGIN_PREFS_ROOT "/smileys/theme",
smiley_theme_pref_cb, NULL);
pidgin_prefs_update_old();
diff --git a/pidgin/pidgin-uninstalled.pc.in b/pidgin/pidgin-uninstalled.pc.in
index 72d65bc0d4..f37f368a12 100644
--- a/pidgin/pidgin-uninstalled.pc.in
+++ b/pidgin/pidgin-uninstalled.pc.in
@@ -6,8 +6,11 @@ datarootdir=@datarootdir@
datadir=@datadir@
sysconfdir=@sysconfdir@
+abs_srcdir=@abs_srcdir@
+abs_builddir=@abs_builddir@
+
Name: Pidgin
Description: Pidgin is a GTK2-based instant messenger application.
Version: @VERSION@
Requires: gtk+-2.0 purple
-Cflags: -I${pcfiledir}
+Cflags: -I${abs_srcdir}
diff --git a/po/ChangeLog b/po/ChangeLog
index 1de7fcf486..64f94c64de 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,9 +1,12 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
-version 2.6.5
+version 2.6.6
* Norwegian Nynorsk win32 translation added (Yngve Spjeld Landro)
* Russian translation updated (Антон Самохвалов)
+version 2.6.5
+ * No changes
+
version 2.6.4
* Afrikaans translation updated (Friedel Wolff)
* Chinese (Hong Kong) translation updated (Ambrose C. Li, Paladin R. Liu)
diff --git a/po/de.po b/po/de.po
index 0c50aa648d..79dde4d6a7 100644
--- a/po/de.po
+++ b/po/de.po
@@ -2,7 +2,7 @@
# Pidgin German translation
# Copyright (C) 2001, Daniel Seifert <Pidgin-translation@dseifert.de>
# Copyright (C) 2002, Karsten Weiss <knweiss@gmx.de>
-# Copyright (C) 2002-2009, Björn Voigt <bjoern@cs.tu-berlin.de>,
+# Copyright (C) 2002-2010, Björn Voigt <bjoern@cs.tu-berlin.de>,
# Jochen Kemnade <jochenkemnade@web.de>
#
# This file is distributed under the same license as the Pidgin package.
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-30 11:50+0100\n"
-"PO-Revision-Date: 2009-11-30 11:45+0100\n"
+"POT-Creation-Date: 2010-01-08 16:32+0100\n"
+"PO-Revision-Date: 2010-01-08 16:30+0100\n"
"Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
"Language-Team: Deutsch <de@li.org>\n"
"MIME-Version: 1.0\n"
@@ -1960,6 +1960,9 @@ msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
msgstr ""
"%s ist keine reguläre Datei. Pidgin wird die Datei nicht überschreiben.\n"
+msgid "File is not readable."
+msgstr "Datei ist nicht lesbar."
+
#, c-format
msgid "%s wants to send you %s (%s)"
msgstr "%s möchte Ihnen %s (%s) senden"
@@ -3827,6 +3830,13 @@ msgstr ""
"Der Server erfordert eine Klartext-Authentifizierung über einen "
"unverschlüsselten Kanal"
+#. This should never happen!
+msgid "Invalid response from server"
+msgstr "Ungültige Serverantwort"
+
+msgid "Server does not use any supported authentication method"
+msgstr "Der Server benutzt keine der unterstützten Authentifizierungsmethoden"
+
#, c-format
msgid ""
"%s requires plaintext authentication over an unencrypted connection. Allow "
@@ -3839,15 +3849,6 @@ msgstr ""
msgid "Plaintext Authentication"
msgstr "Klartext-Authentifizierung"
-msgid "SASL authentication failed"
-msgstr "SASL-Authentifizierung fehlgeschlagen"
-
-msgid "Invalid response from server"
-msgstr "Ungültige Serverantwort"
-
-msgid "Server does not use any supported authentication method"
-msgstr "Der Server benutzt keine der unterstützten Authentifizierungsmethoden"
-
msgid "You require encryption, but it is not available on this server."
msgstr ""
"Sie fordern Verschlüsselung, aber diese ist auf dem Server nicht verfügbar."
@@ -3855,10 +3856,30 @@ msgstr ""
msgid "Invalid challenge from server"
msgstr "Ungültige Challenge vom Server"
+msgid "Server thinks authentication is complete, but client does not"
+msgstr ""
+"Der Server ist der Meinung, dass die Authentifizierung vollständig ist, der "
+"Client aber nicht"
+
+msgid "SASL authentication failed"
+msgstr "SASL-Authentifizierung fehlgeschlagen"
+
#, c-format
msgid "SASL error: %s"
msgstr "SASL-Fehler: %s"
+msgid "Unable to canonicalize username"
+msgstr "Benutzername konnte nicht in Normalform gebracht werden"
+
+msgid "Unable to canonicalize password"
+msgstr "Passwort konnte nicht in Normalform gebracht werden"
+
+msgid "Malicious challenge from server"
+msgstr "Bösartige Challenge vom Server"
+
+msgid "Unexpected response from server"
+msgstr "Unerwartete Antwort vom Server"
+
msgid "The BOSH connection manager terminated your session."
msgstr "Der BOSH-Verbindungsmanager hat Ihre Sitzung beendet."
@@ -3959,13 +3980,16 @@ msgstr "Priorität"
msgid "Resource"
msgstr "Ressource"
-#, c-format
-msgid "%s ago"
-msgstr "vor %s"
+msgid "Uptime"
+msgstr "Betriebszeit"
msgid "Logged Off"
msgstr "Abgemeldet"
+#, c-format
+msgid "%s ago"
+msgstr "vor %s"
+
msgid "Middle Name"
msgstr "Zweiter Name"
@@ -4158,13 +4182,6 @@ msgstr "Rollen:"
msgid "Ping timed out"
msgstr "Ping-Zeitüberschreitung"
-msgid ""
-"Unable to find alternative XMPP connection methods after failing to connect "
-"directly."
-msgstr ""
-"Nach dem Fehlschlagen einer direkten XMPP-Verbindung können keine "
-"alternativen Verbindungsmethoden gefunden werden."
-
msgid "Invalid XMPP ID"
msgstr "Ungültige XMPP-ID"
@@ -5140,6 +5157,10 @@ msgstr "E-Mail-Adresse..."
msgid "Your new MSN friendly name is too long."
msgstr "Ihr neuer MSN-Benutzername zu lang."
+#, c-format
+msgid "Set friendly name for %s."
+msgstr "Setze Spitznamen für %s."
+
msgid "Set your friendly name."
msgstr "Setze Ihren Spitznamen."
@@ -12075,9 +12096,6 @@ msgstr "Kurdisch"
msgid "Lao"
msgstr "Laotisch"
-msgid "Lithuanian"
-msgstr "Litauisch"
-
msgid "Macedonian"
msgstr "Makedonisch"
@@ -12180,6 +12198,9 @@ msgstr "Traditionelles Chinesisch"
msgid "Amharic"
msgstr "Amharisch"
+msgid "Lithuanian"
+msgstr "Litauisch"
+
#, c-format
msgid "About %s"
msgstr "Über %s"
@@ -12229,7 +12250,12 @@ msgstr ""
"a>)<br/>Wir können nicht bei Problemen mit Drittanbieter-Protokollen oder "
"Plugins helfen!<br/>Die Hauptsprache dieser Liste ist <b>Englisch</b>. Sie "
"können gern in einer anderen Sprache schreiben, aber die Antworten könnten "
-"weniger hilfreich sein.<br/><br/>"
+"weniger hilfreich sein.<br/>Deutschsprachige Benutzer können auch das Portal "
+"<a href=\"http://www.pidgin-im.de/\">Pidgin-IM.de</a> nutzen. Dort finden "
+"Sie aktuelle Informationen zu Pidgin, können mit anderen Benutzern im <a "
+"href=\"http://forum.pidgin-im.de/\">Forum</a> diskutieren und Hilfe zu "
+"Problemen finden. Beachten Sie, dass dieses Portal unabhängig vom "
+"offiziellen Pidgin-Projekt ist.<br/><br/>"
#, c-format
msgid ""