aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy')
-rw-r--r--libempathy/empathy-dispatcher.c110
1 files changed, 64 insertions, 46 deletions
diff --git a/libempathy/empathy-dispatcher.c b/libempathy/empathy-dispatcher.c
index 641975b24..942b5484f 100644
--- a/libempathy/empathy-dispatcher.c
+++ b/libempathy/empathy-dispatcher.c
@@ -934,16 +934,13 @@ typedef struct {
} FileChannelRequest;
static void
-file_channel_request_cb (TpConnection *connection,
+file_channel_create_cb (TpConnection *connection,
const gchar *object_path,
+ GHashTable *properties,
const GError *error,
gpointer user_data,
GObject *weak_object)
{
- GValue value = { 0 };
- GFileInfo *info;
- guint64 size;
- gchar *filename;
TpChannel *channel;
EmpathyTpFile *tp_file;
FileChannelRequest *request = (FileChannelRequest *) user_data;
@@ -953,18 +950,6 @@ file_channel_request_cb (TpConnection *connection,
return;
}
- info = g_file_query_info (request->gfile,
- G_FILE_ATTRIBUTE_STANDARD_SIZE ","
- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
- 0, NULL, NULL);
- size = info ? g_file_info_get_size (info) : EMPATHY_TP_FILE_UNKNOWN_SIZE;
- filename = g_file_get_basename (request->gfile);
- tp_connection_run_until_ready (connection, FALSE, NULL, NULL);
-
- DEBUG ("Sending %s from a stream to %s (size %llu, content-type %s)",
- filename, empathy_contact_get_name (request->contact), size,
- g_file_info_get_content_type (info));
-
channel = tp_channel_new (connection,
object_path,
EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER,
@@ -972,28 +957,6 @@ file_channel_request_cb (TpConnection *connection,
request->handle,
NULL);
- /* FIXME: this should go in CreateChannel in the new requests API */
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, g_filename_display_basename (filename));
- tp_cli_dbus_properties_call_set (TP_PROXY (channel), -1,
- EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "Filename",
- &value, NULL, NULL, NULL, NULL);
- g_value_reset (&value);
-
- g_value_set_string (&value, g_file_info_get_content_type (info));
- tp_cli_dbus_properties_call_set (TP_PROXY (channel), -1,
- EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "ContentType",
- &value, NULL, NULL, NULL, NULL);
-
- g_value_unset (&value);
-
- g_value_init (&value, G_TYPE_UINT64);
- g_value_set_uint64 (&value, size);
- tp_cli_dbus_properties_call_set (TP_PROXY (channel), -1,
- EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "Size",
- &value, NULL, NULL, NULL, NULL);
- g_value_unset (&value);
-
tp_file = empathy_tp_file_new (channel);
if (tp_file) {
@@ -1005,7 +968,6 @@ file_channel_request_cb (TpConnection *connection,
g_object_unref (request->gfile);
g_slice_free (FileChannelRequest, request);
g_object_unref (channel);
- g_free (filename);
}
void
@@ -1017,6 +979,11 @@ empathy_dispatcher_send_file (EmpathyContact *contact,
TpConnection *connection;
guint handle;
FileChannelRequest *request;
+ GHashTable *args;
+ GValue *value;
+ GFileInfo *info;
+ guint64 size;
+ gchar *filename;
g_return_if_fail (EMPATHY_IS_CONTACT (contact));
g_return_if_fail (G_IS_FILE (gfile));
@@ -1031,16 +998,67 @@ empathy_dispatcher_send_file (EmpathyContact *contact,
request->handle = handle;
request->contact = contact;
- tp_cli_connection_call_request_channel (connection, -1,
- EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER,
- TP_HANDLE_TYPE_CONTACT,
- handle,
- TRUE,
- file_channel_request_cb,
+ info = g_file_query_info (request->gfile,
+ G_FILE_ATTRIBUTE_STANDARD_SIZE ","
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ 0, NULL, NULL);
+ size = info ? g_file_info_get_size (info) : EMPATHY_TP_FILE_UNKNOWN_SIZE;
+ filename = g_file_get_basename (request->gfile);
+ tp_connection_run_until_ready (connection, FALSE, NULL, NULL);
+
+ DEBUG ("Sending %s from a stream to %s (size %llu, content-type %s)",
+ filename, empathy_contact_get_name (request->contact), size,
+ g_file_info_get_content_type (info));
+
+ args = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify) tp_g_value_slice_free);
+
+ /* org.freedesktop.Telepathy.Channel.ChannelType */
+ value = tp_g_value_slice_new (G_TYPE_STRING);
+ g_value_set_string (value, EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER);
+ g_hash_table_insert (args, TP_IFACE_CHANNEL ".ChannelType", value);
+
+ /* org.freedesktop.Telepathy.Channel.TargetHandleType */
+ value = tp_g_value_slice_new (G_TYPE_UINT);
+ g_value_set_uint (value, TP_HANDLE_TYPE_CONTACT);
+ g_hash_table_insert (args, TP_IFACE_CHANNEL ".TargetHandleType", value);
+
+ /* org.freedesktop.Telepathy.Channel.TargetHandle */
+ value = tp_g_value_slice_new (G_TYPE_UINT);
+ g_value_set_uint (value, handle);
+ g_hash_table_insert (args, TP_IFACE_CHANNEL ".TargetHandle", value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.ContentType */
+ value = tp_g_value_slice_new (G_TYPE_STRING);
+ g_value_set_string (value, g_file_info_get_content_type (info));
+ g_hash_table_insert (args,
+ EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentType", value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Filename */
+ value = tp_g_value_slice_new (G_TYPE_STRING);
+ g_value_set_string (value, g_filename_display_basename (filename));
+ g_hash_table_insert (args, EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Filename",
+ value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Size */
+ value = tp_g_value_slice_new (G_TYPE_UINT64);
+ g_value_set_uint64 (value, size);
+ g_hash_table_insert (args, EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Size",
+ value);
+
+ /* TODO: Description ? */
+ /* TODO: ContentHashType and ContentHash ? */
+ /* TODO: Date */
+
+ tp_cli_connection_interface_requests_call_create_channel (connection, -1,
+ args,
+ file_channel_create_cb,
request,
NULL,
NULL);
+ g_hash_table_destroy (args);
+ g_free (filename);
g_object_unref (mc);
g_object_unref (connection);
}