diff options
Diffstat (limited to 'libempathy/empathy-dispatcher.c')
-rw-r--r-- | libempathy/empathy-dispatcher.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/libempathy/empathy-dispatcher.c b/libempathy/empathy-dispatcher.c index 5f26eeeed..a110a2f94 100644 --- a/libempathy/empathy-dispatcher.c +++ b/libempathy/empathy-dispatcher.c @@ -927,3 +927,102 @@ empathy_dispatcher_chat_with_contact_id (McAccount *account, g_object_unref (factory); } +EmpathyTpFile * +empathy_dispatcher_send_file (EmpathyContact *contact, + GFile *gfile) +{ + GFileInfo *info; + guint64 size; + GInputStream *in_stream = NULL; + MissionControl *mc; + McAccount *account; + TpConnection *connection; + guint handle; + gchar *object_path; + TpChannel *channel; + EmpathyTpFile *tp_file; + GError *error = NULL; + GValue value = { 0 }; + gchar *filename; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + g_return_val_if_fail (G_IS_FILE (gfile), NULL); + + info = g_file_query_info (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 (gfile); + in_stream = G_INPUT_STREAM (g_file_read (gfile, NULL, NULL)); + mc = empathy_mission_control_new (); + account = empathy_contact_get_account (contact); + connection = mission_control_get_tpconnection (mc, account, NULL); + tp_connection_run_until_ready (connection, FALSE, NULL, NULL); + handle = empathy_contact_get_handle (contact); + + DEBUG ("Sending %s from a stream to %s (size %llu, content-type %s)", + filename, empathy_contact_get_name (contact), size, + g_file_info_get_content_type (info)); + + if (!tp_cli_connection_run_request_channel (connection, -1, + EMP_IFACE_CHANNEL_TYPE_FILE, + TP_HANDLE_TYPE_CONTACT, + handle, + TRUE, + &object_path, + &error, + NULL)) { + DEBUG ("Couldn't request channel: %s", + error ? error->message : "No error given"); + g_clear_error (&error); + g_object_unref (mc); + g_object_unref (connection); + return NULL; + } + + channel = tp_channel_new (connection, + object_path, + EMP_IFACE_CHANNEL_TYPE_FILE, + TP_HANDLE_TYPE_CONTACT, + 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, "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, "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, "Size", + &value, NULL, NULL, NULL, NULL); + g_value_unset (&value); + + tp_file = empathy_tp_file_new (channel); + + if (tp_file) { + empathy_tp_file_set_input_stream (tp_file, in_stream); + } + + empathy_tp_file_offer (tp_file); + + g_object_unref (mc); + g_object_unref (connection); + g_object_unref (channel); + g_free (object_path); + + return tp_file; +} |