aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy/empathy-tp-file.c46
1 files changed, 38 insertions, 8 deletions
diff --git a/libempathy/empathy-tp-file.c b/libempathy/empathy-tp-file.c
index 2d43cbba6..2b657007b 100644
--- a/libempathy/empathy-tp-file.c
+++ b/libempathy/empathy-tp-file.c
@@ -36,6 +36,7 @@
#include <gio/gunixoutputstream.h>
#include <telepathy-glib/proxy-subclass.h>
+#include <telepathy-glib/util.h>
#include "empathy-tp-file.h"
#include "empathy-contact-factory.h"
@@ -297,7 +298,7 @@ struct _EmpathyTpFilePriv {
gboolean incoming;
TpFileTransferStateChangeReason state_change_reason;
time_t start_time;
- gchar *unix_socket_path;
+ GValue *socket_address;
GCancellable *cancellable;
};
@@ -370,7 +371,8 @@ tp_file_finalize (GObject *object)
}
g_free (tp_file->priv->filename);
- g_free (tp_file->priv->unix_socket_path);
+ if (tp_file->priv->socket_address != NULL)
+ tp_g_value_slice_free (tp_file->priv->socket_address);
g_free (tp_file->priv->description);
g_free (tp_file->priv->content_hash);
g_free (tp_file->priv->content_type);
@@ -394,8 +396,8 @@ static void
tp_file_start_transfer (EmpathyTpFile *tp_file)
{
gint fd;
- size_t path_len;
struct sockaddr_un addr;
+ GArray *array;
fd = socket (PF_UNIX, SOCK_STREAM, 0);
if (fd < 0)
@@ -405,10 +407,11 @@ tp_file_start_transfer (EmpathyTpFile *tp_file)
return;
}
+ array = g_value_get_boxed (tp_file->priv->socket_address);
+
memset (&addr, 0, sizeof (addr));
addr.sun_family = AF_UNIX;
- path_len = strlen (tp_file->priv->unix_socket_path);
- strncpy (addr.sun_path, tp_file->priv->unix_socket_path, path_len);
+ strncpy (addr.sun_path, array->data, array->len);
if (connect (fd, (struct sockaddr*) &addr, sizeof (addr)) < 0)
{
@@ -466,7 +469,7 @@ tp_file_state_changed_cb (TpChannel *channel,
* transfer. The socket path could be NULL if we are not doing the actual
* data transfer but are just an observer for the channel. */
if (state == TP_FILE_TRANSFER_STATE_OPEN &&
- tp_file->priv->unix_socket_path != NULL)
+ tp_file->priv->socket_address != NULL)
tp_file_start_transfer (tp_file);
tp_file->priv->state = state;
@@ -742,6 +745,7 @@ tp_file_method_cb (TpChannel *channel,
GObject *weak_object)
{
EmpathyTpFile *tp_file = (EmpathyTpFile *) weak_object;
+ GArray *array;
if (error)
{
@@ -750,9 +754,35 @@ tp_file_method_cb (TpChannel *channel,
return;
}
- tp_file->priv->unix_socket_path = g_value_dup_string (address);
+ if (G_VALUE_TYPE (address) == DBUS_TYPE_G_UCHAR_ARRAY)
+ {
+ tp_file->priv->socket_address = tp_g_value_slice_dup (address);
+ }
+ else if (G_VALUE_TYPE (address) == G_TYPE_STRING)
+ {
+ /* Old bugged version of telepathy-salut used to store the address
+ * as a 's' instead of an 'ay' */
+ const gchar *path;
+
+ path = g_value_get_string (address);
+ array = g_array_sized_new (TRUE, FALSE, sizeof (gchar), strlen (path));
+ g_array_insert_vals (array, 0, path, strlen (path));
+
+ tp_file->priv->socket_address = tp_g_value_slice_new (
+ DBUS_TYPE_G_UCHAR_ARRAY);
+ g_value_set_boxed (tp_file->priv->socket_address, array);
+
+ g_array_free (array, TRUE);
+ }
+ else
+ {
+ DEBUG ("Wrong address type: %s", G_VALUE_TYPE_NAME (address));
+ empathy_tp_file_cancel (tp_file);
+ return;
+ }
- DEBUG ("Got unix socket path: %s", tp_file->priv->unix_socket_path);
+ array = g_value_get_boxed (tp_file->priv->socket_address);
+ DEBUG ("Got unix socket path: %s", array->data);
if (tp_file->priv->state == TP_FILE_TRANSFER_STATE_OPEN)
tp_file_start_transfer (tp_file);