diff options
-rw-r--r-- | libempathy/empathy-client-factory.c | 6 | ||||
-rw-r--r-- | libempathy/empathy-ft-factory.c | 12 | ||||
-rw-r--r-- | libempathy/empathy-ft-handler.c | 15 | ||||
-rw-r--r-- | libempathy/empathy-tp-file.c | 150 | ||||
-rw-r--r-- | libempathy/empathy-tp-file.h | 12 | ||||
-rw-r--r-- | src/empathy-event-manager.c | 5 |
6 files changed, 54 insertions, 146 deletions
diff --git a/libempathy/empathy-client-factory.c b/libempathy/empathy-client-factory.c index 3794ef60d..f7529bf2e 100644 --- a/libempathy/empathy-client-factory.c +++ b/libempathy/empathy-client-factory.c @@ -24,6 +24,7 @@ #include "empathy-client-factory.h" #include "empathy-tp-chat.h" +#include "empathy-tp-file.h" #include "empathy-utils.h" #include <telepathy-yell/telepathy-yell.h> @@ -88,6 +89,11 @@ empathy_client_factory_create_channel (TpSimpleClientFactory *factory, return TP_CHANNEL (call_channel_new_with_factory ( TP_SIMPLE_CLIENT_FACTORY (factory), conn, path, properties, error)); } + else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER)) + { + return TP_CHANNEL (empathy_tp_file_new ( + TP_SIMPLE_CLIENT_FACTORY (factory), conn, path, properties, error)); + } return chainup->create_channel (factory, conn, path, properties, error); } diff --git a/libempathy/empathy-ft-factory.c b/libempathy/empathy-ft-factory.c index 472451fa0..5097f9b1e 100644 --- a/libempathy/empathy-ft-factory.c +++ b/libempathy/empathy-ft-factory.c @@ -179,22 +179,16 @@ handle_channels_cb (TpSimpleHandler *handler, for (l = channels; l != NULL; l = g_list_next (l)) { TpChannel *channel = l->data; - EmpathyTpFile *tp_file; if (tp_proxy_get_invalidated (channel) != NULL) continue; - if (tp_channel_get_channel_type_id (channel) != - TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER) + if (!EMPATHY_IS_TP_FILE (channel)) continue; - tp_file = empathy_tp_file_new (channel); - /* We handle only incoming FT */ - empathy_ft_handler_new_incoming (tp_file, ft_handler_incoming_ready_cb, - self); - - g_object_unref (tp_file); + empathy_ft_handler_new_incoming ((EmpathyTpFile *) channel, + ft_handler_incoming_ready_cb, self); } diff --git a/libempathy/empathy-ft-handler.c b/libempathy/empathy-ft-handler.c index 8654bdd20..83557d480 100644 --- a/libempathy/empathy-ft-handler.c +++ b/libempathy/empathy-ft-handler.c @@ -725,7 +725,7 @@ ft_handler_create_channel_cb (GObject *source, EmpathyFTHandler *handler = user_data; EmpathyFTHandlerPriv *priv = GET_PRIV (handler); GError *error = NULL; - TpChannel *channel = NULL; + TpChannel *channel; DEBUG ("Dispatcher create channel CB"); @@ -741,18 +741,16 @@ ft_handler_create_channel_cb (GObject *source, { emit_error_signal (handler, error); + g_clear_object (&channel); g_error_free (error); - goto out; + return; } - priv->tpfile = empathy_tp_file_new (channel); + priv->tpfile = EMPATHY_TP_FILE (channel); empathy_tp_file_offer (priv->tpfile, priv->gfile, priv->cancellable, ft_transfer_progress_callback, handler, ft_transfer_operation_callback, handler); - -out: - tp_clear_object (&channel); } static void @@ -1365,7 +1363,6 @@ empathy_ft_handler_new_incoming (EmpathyTpFile *tp_file, gpointer user_data) { EmpathyFTHandler *handler; - TpChannel *channel; CallbacksData *data; g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file)); @@ -1373,14 +1370,12 @@ empathy_ft_handler_new_incoming (EmpathyTpFile *tp_file, handler = g_object_new (EMPATHY_TYPE_FT_HANDLER, "tp-file", tp_file, NULL); - g_object_get (tp_file, "channel", &channel, NULL); - data = g_slice_new0 (CallbacksData); data->callback = callback; data->user_data = user_data; data->handler = g_object_ref (handler); - tp_cli_dbus_properties_call_get_all (channel, + tp_cli_dbus_properties_call_get_all (tp_file, -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, channel_get_all_properties_cb, data, NULL, G_OBJECT (handler)); } diff --git a/libempathy/empathy-tp-file.c b/libempathy/empathy-tp-file.c index 09e14ceb6..d6d565654 100644 --- a/libempathy/empathy-tp-file.c +++ b/libempathy/empathy-tp-file.c @@ -66,8 +66,6 @@ /* EmpathyTpFile object */ struct _EmpathyTpFilePrivate { - TpChannel *channel; - GInputStream *in_stream; GOutputStream *out_stream; @@ -97,13 +95,7 @@ struct _EmpathyTpFilePrivate { gboolean is_closed; }; -enum { - PROP_0, - PROP_CHANNEL, - PROP_INCOMING -}; - -G_DEFINE_TYPE (EmpathyTpFile, empathy_tp_file, G_TYPE_OBJECT); +G_DEFINE_TYPE (EmpathyTpFile, empathy_tp_file, TP_TYPE_FILE_TRANSFER_CHANNEL); /* private functions */ @@ -589,8 +581,7 @@ file_read_async_cb (GObject *source, */ initialize_empty_ac_variant (self->priv->socket_access_control, ¬hing); - tp_cli_channel_type_file_transfer_call_provide_file ( - self->priv->channel, -1, + tp_cli_channel_type_file_transfer_call_provide_file ((TpChannel *) self, -1, self->priv->socket_address_type, self->priv->socket_access_control, ¬hing, ft_operation_provide_or_accept_file_cb, NULL, NULL, G_OBJECT (self)); @@ -616,7 +607,7 @@ file_transfer_set_uri_cb (TpProxy *proxy, */ initialize_empty_ac_variant (self->priv->socket_access_control, ¬hing); - tp_cli_channel_type_file_transfer_call_accept_file (self->priv->channel, + tp_cli_channel_type_file_transfer_call_accept_file ((TpChannel *) self, -1, self->priv->socket_address_type, self->priv->socket_access_control, ¬hing, self->priv->offset, ft_operation_provide_or_accept_file_cb, NULL, NULL, weak_object); @@ -650,7 +641,7 @@ file_replace_async_cb (GObject *source, uri = g_file_get_uri (file); value = tp_g_value_slice_new_take_string (uri); - tp_cli_dbus_properties_call_set (self->priv->channel, -1, + tp_cli_dbus_properties_call_set ((TpChannel *) self, -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "URI", value, file_transfer_set_uri_cb, NULL, NULL, G_OBJECT (self)); @@ -682,7 +673,7 @@ close_channel_internal (EmpathyTpFile *self, self->priv->is_closing = TRUE; - tp_cli_channel_call_close (self->priv->channel, -1, + tp_cli_channel_call_close ((TpChannel *) self, -1, channel_closed_cb, GINT_TO_POINTER (cancel), NULL, G_OBJECT (self)); } @@ -700,13 +691,6 @@ do_dispose (GObject *object) { EmpathyTpFile *self = (EmpathyTpFile *) object; - if (self->priv->channel != NULL) - { - g_signal_handlers_disconnect_by_func (self->priv->channel, - tp_file_invalidated_cb, object); - tp_clear_object (&self->priv->channel); - } - tp_clear_object (&self->priv->in_stream); tp_clear_object (&self->priv->out_stream); tp_clear_object (&self->priv->cancellable); @@ -731,68 +715,28 @@ do_finalize (GObject *object) } static void -do_get_property (GObject *object, - guint param_id, - GValue *value, - GParamSpec *pspec) -{ - EmpathyTpFile *self = (EmpathyTpFile *) object; - - switch (param_id) - { - case PROP_CHANNEL: - g_value_set_object (value, self->priv->channel); - break; - case PROP_INCOMING: - g_value_set_boolean (value, self->priv->incoming); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); - break; - }; -} - -static void -do_set_property (GObject *object, - guint param_id, - const GValue *value, - GParamSpec *pspec) -{ - EmpathyTpFile *self = (EmpathyTpFile *) object; - - switch (param_id) - { - case PROP_CHANNEL: - self->priv->channel = g_object_ref (g_value_get_object (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); - break; - }; -} - -static void do_constructed (GObject *object) { EmpathyTpFile *self = (EmpathyTpFile *) object; + TpChannel *channel = (TpChannel *) self; - g_signal_connect (self->priv->channel, "invalidated", + g_signal_connect (self, "invalidated", G_CALLBACK (tp_file_invalidated_cb), self); - self->priv->incoming = !tp_channel_get_requested (self->priv->channel); + self->priv->incoming = !tp_channel_get_requested (channel); tp_cli_channel_type_file_transfer_connect_to_file_transfer_state_changed ( - self->priv->channel, tp_file_state_changed_cb, NULL, NULL, object, NULL); + channel, tp_file_state_changed_cb, NULL, NULL, object, NULL); tp_cli_channel_type_file_transfer_connect_to_transferred_bytes_changed ( - self->priv->channel, tp_file_transferred_bytes_changed_cb, + channel, tp_file_transferred_bytes_changed_cb, NULL, NULL, object, NULL); - tp_cli_dbus_properties_call_get (self->priv->channel, + tp_cli_dbus_properties_call_get (channel, -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "State", tp_file_get_state_cb, NULL, NULL, object); - tp_cli_dbus_properties_call_get (self->priv->channel, + tp_cli_dbus_properties_call_get (channel, -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "AvailableSocketTypes", tp_file_get_available_socket_types_cb, NULL, NULL, object); @@ -810,66 +754,32 @@ empathy_tp_file_class_init (EmpathyTpFileClass *klass) object_class->finalize = do_finalize; object_class->dispose = do_dispose; object_class->constructed = do_constructed; - object_class->get_property = do_get_property; - object_class->set_property = do_set_property; - - /* Construct-only properties */ - - /** - * EmpathyTpFile:channel: - * - * The #TpChannel requested for the file transfer. - */ - g_object_class_install_property (object_class, - PROP_CHANNEL, - g_param_spec_object ("channel", - "telepathy channel", - "The file transfer channel", - TP_TYPE_CHANNEL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - - /** - * EmpathyTpFile:incoming: - * - * %TRUE if the transfer is incoming, %FALSE if it's outgoing. - */ - g_object_class_install_property (object_class, - PROP_INCOMING, - g_param_spec_boolean ("incoming", - "direction of transfer", - "The direction of the file being transferred", - FALSE, - G_PARAM_READABLE)); g_type_class_add_private (object_class, sizeof (EmpathyTpFilePrivate)); } /* public methods */ -/** - * empathy_tp_file_new: - * @channel: a #TpChannel - * @incoming: whether the file transfer is incoming or not - * - * Creates a new #EmpathyTpFile wrapping @channel. - * The returned #EmpathyTpFile should be unrefed - * with g_object_unref() when finished with. - * - * Return value: a new #EmpathyTpFile - */ EmpathyTpFile * -empathy_tp_file_new (TpChannel *channel) +empathy_tp_file_new (TpSimpleClientFactory *factory, + TpConnection *conn, + const gchar *object_path, + const GHashTable *immutable_properties, + GError **error) { - EmpathyTpFile *self; - - g_return_val_if_fail (TP_IS_CHANNEL (channel), NULL); - - self = g_object_new (EMPATHY_TYPE_TP_FILE, - "channel", channel, - NULL); - - return self; + TpProxy *conn_proxy = (TpProxy *) conn; + + g_return_val_if_fail (TP_IS_CONNECTION (conn), NULL); + g_return_val_if_fail (immutable_properties != NULL, NULL); + + return g_object_new (EMPATHY_TYPE_TP_FILE, + "factory", factory, + "connection", conn, + "dbus-daemon", conn_proxy->dbus_daemon, + "bus-name", conn_proxy->bus_name, + "object-path", object_path, + "channel-properties", immutable_properties, + NULL); } /** diff --git a/libempathy/empathy-tp-file.h b/libempathy/empathy-tp-file.h index aca8a0f89..7d8520426 100644 --- a/libempathy/empathy-tp-file.h +++ b/libempathy/empathy-tp-file.h @@ -27,7 +27,7 @@ #include <gio/gio.h> #include <glib.h> -#include <telepathy-glib/channel.h> +#include <telepathy-glib/file-transfer-channel.h> G_BEGIN_DECLS @@ -60,12 +60,12 @@ typedef struct _EmpathyTpFilePrivate EmpathyTpFilePrivate; typedef struct _EmpathyTpFileClass EmpathyTpFileClass; struct _EmpathyTpFile { - GObject parent; + TpFileTransferChannel parent; EmpathyTpFilePrivate *priv; }; struct _EmpathyTpFileClass { - GObjectClass parent_class; + TpFileTransferChannelClass parent_class; }; /* prototypes for operation callbacks */ @@ -96,7 +96,11 @@ GType empathy_tp_file_get_type (void) G_GNUC_CONST; /* public methods */ -EmpathyTpFile * empathy_tp_file_new (TpChannel *channel); +EmpathyTpFile * empathy_tp_file_new (TpSimpleClientFactory *factory, + TpConnection *conn, + const gchar *object_path, + const GHashTable *immutable_properties, + GError **error); void empathy_tp_file_accept (EmpathyTpFile *tp_file, guint64 offset, diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c index a6ce22b18..1e22aa053 100644 --- a/src/empathy-event-manager.c +++ b/src/empathy-event-manager.c @@ -1115,12 +1115,11 @@ approve_channels (TpSimpleApprover *approver, event_manager_call_channel_got_contact_cb, approval, NULL, G_OBJECT (self)); } - else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER) + else if (EMPATHY_IS_TP_FILE (channel)) { TpHandle handle; - EmpathyTpFile *tp_file = empathy_tp_file_new (channel); - approval->handler_instance = G_OBJECT (tp_file); + approval->handler_instance = g_object_ref (channel); handle = tp_channel_get_handle (channel, NULL); |