[Telepathy-commits] [telepathy-salut/master] file-transfer-channel: implement the exportable channel interface

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Fri Nov 21 03:46:34 PST 2008


---
 src/salut-file-transfer-channel.c |  159 ++++++++++++++++++++++++++++++++++---
 1 files changed, 148 insertions(+), 11 deletions(-)

diff --git a/src/salut-file-transfer-channel.c b/src/salut-file-transfer-channel.c
index 4a07662..cc4d6f9 100644
--- a/src/salut-file-transfer-channel.c
+++ b/src/salut-file-transfer-channel.c
@@ -58,6 +58,7 @@ G_DEFINE_TYPE_WITH_CODE (SalutFileTransferChannel, salut_file_transfer_channel,
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL, channel_iface_init);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES,
                            tp_dbus_properties_mixin_iface_init);
+    G_IMPLEMENT_INTERFACE (TP_TYPE_EXPORTABLE_CHANNEL, NULL);
     G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL);
     G_IMPLEMENT_INTERFACE (SALUT_TYPE_SVC_CHANNEL_TYPE_FILE_TRANSFER,
                            file_transfer_iface_init);
@@ -73,14 +74,21 @@ static const char *salut_file_transfer_channel_interfaces[] = { NULL };
 enum
 {
   PROP_OBJECT_PATH = 1,
+
+   /* org.freedesktop.Telepathy.Channel D-Bus properties */
   PROP_CHANNEL_TYPE,
-  PROP_HANDLE_TYPE,
-  PROP_HANDLE,
-  PROP_CONTACT,
-  PROP_CONNECTION,
   PROP_INTERFACES,
-  PROP_XMPP_CONNECTION_MANAGER,
-  PROP_INCOMING,
+  PROP_HANDLE,
+  PROP_TARGET_ID,
+  PROP_HANDLE_TYPE,
+  PROP_REQUESTED,
+  PROP_INITIATOR_HANDLE,
+  PROP_INITIATOR_ID,
+
+  PROP_CHANNEL_DESTROYED,
+  PROP_CHANNEL_PROPERTIES,
+
+  /* org.freedesktop.Telepathy.Channel.Type.FileTransfer D-Bus properties */
   PROP_STATE,
   PROP_CONTENT_TYPE,
   PROP_FILENAME,
@@ -88,9 +96,16 @@ enum
   PROP_CONTENT_HASH_TYPE,
   PROP_CONTENT_HASH,
   PROP_DESCRIPTION,
+  PROP_DATE,
   PROP_AVAILABLE_SOCKET_TYPES,
   PROP_TRANSFERRED_BYTES,
   PROP_INITIAL_OFFSET,
+
+  PROP_CONTACT,
+  PROP_CONNECTION,
+  PROP_XMPP_CONNECTION_MANAGER,
+  /* FIME: can wa remove incoming ? */
+  PROP_INCOMING,
   LAST_PROPERTY
 };
 
@@ -108,6 +123,7 @@ struct _SalutFileTransferChannelPrivate {
   glong last_transferred_bytes_emitted;
   gchar *socket_path;
   gboolean incoming;
+  TpHandle initiator;
 
   /* properties */
   SalutFileTransferState state;
@@ -120,6 +136,7 @@ struct _SalutFileTransferChannelPrivate {
   GHashTable *available_socket_types;
   guint64 transferred_bytes;
   guint64 initial_offset;
+  guint64 date;
 };
 
 static void
@@ -156,6 +173,7 @@ salut_file_transfer_channel_get_property (GObject    *object,
                                  GParamSpec *pspec)
 {
   SalutFileTransferChannel *self = SALUT_FILE_TRANSFER_CHANNEL (object);
+  TpBaseConnection *base_conn = (TpBaseConnection *) self->priv->connection;
 
   switch (property_id)
     {
@@ -169,9 +187,35 @@ salut_file_transfer_channel_get_property (GObject    *object,
       case PROP_HANDLE_TYPE:
         g_value_set_uint (value, TP_HANDLE_TYPE_CONTACT);
         break;
+      case PROP_TARGET_ID:
+        {
+           TpHandleRepoIface *repo = tp_base_connection_get_handles (base_conn,
+             TP_HANDLE_TYPE_CONTACT);
+
+           g_value_set_string (value, tp_handle_inspect (repo,
+                 self->priv->handle));
+        }
+        break;
       case PROP_HANDLE:
         g_value_set_uint (value, self->priv->handle);
         break;
+      case PROP_REQUESTED:
+        g_value_set_boolean (value, (self->priv->initiator ==
+              base_conn->self_handle));
+        break;
+      case PROP_INITIATOR_HANDLE:
+        g_value_set_uint (value, self->priv->initiator);
+        break;
+      case PROP_INITIATOR_ID:
+          {
+            TpHandleRepoIface *repo = tp_base_connection_get_handles (
+                base_conn, TP_HANDLE_TYPE_CONTACT);
+
+            g_assert (self->priv->initiator != 0);
+            g_value_set_string (value,
+                tp_handle_inspect (repo, self->priv->initiator));
+          }
+        break;
       case PROP_CONTACT:
         g_value_set_object (value, self->priv->contact);
         break;
@@ -217,6 +261,37 @@ salut_file_transfer_channel_get_property (GObject    *object,
       case PROP_INITIAL_OFFSET:
         g_value_set_uint64 (value, self->priv->initial_offset);
         break;
+      case PROP_DATE:
+        g_value_set_uint64 (value, self->priv->date);
+        break;
+     case PROP_CHANNEL_DESTROYED:
+        /* FIXME: what's the right value of this ? */
+        g_value_set_boolean (value, TRUE);
+        break;
+      case PROP_CHANNEL_PROPERTIES:
+        g_value_set_boxed (value,
+            tp_dbus_properties_mixin_make_properties_hash (object,
+                TP_IFACE_CHANNEL, "ChannelType",
+                TP_IFACE_CHANNEL, "Interfaces",
+                TP_IFACE_CHANNEL, "TargetHandle",
+                TP_IFACE_CHANNEL, "TargetID",
+                TP_IFACE_CHANNEL, "TargetHandleType",
+                TP_IFACE_CHANNEL, "Requested",
+                TP_IFACE_CHANNEL, "InitiatorHandle",
+                TP_IFACE_CHANNEL, "InitiatorID",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "State",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "ContentType",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "Filename",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "Size",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "ContentHashType",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "ContentHash",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "Description",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "Date",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "AvailableSocketTypes",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "TransferredBytes",
+                SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "InitialOffset",
+                NULL));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -230,7 +305,6 @@ salut_file_transfer_channel_set_property (GObject *object,
                                  GParamSpec *pspec)
 {
   SalutFileTransferChannel *self = SALUT_FILE_TRANSFER_CHANNEL (object);
-  const gchar *tmp;
 
   switch (property_id)
     {
@@ -252,10 +326,8 @@ salut_file_transfer_channel_set_property (GObject *object,
                   || g_value_get_uint (value) == TP_HANDLE_TYPE_CONTACT);
         break;
       case PROP_CHANNEL_TYPE:
-        tmp = g_value_get_string (value);
-        g_assert (tmp == NULL
-                  || !tp_strdiff (g_value_get_string (value),
-                         SALUT_IFACE_CHANNEL_TYPE_FILE_TRANSFER));
+        /* these properties are writable in the interface, but not actually
+         * meaningfully changeable on this channel, so we do nothing */
         break;
       case PROP_XMPP_CONNECTION_MANAGER:
         self->priv->xmpp_connection_manager = g_value_dup_object (value);
@@ -271,6 +343,7 @@ salut_file_transfer_channel_set_property (GObject *object,
         break;
       case PROP_CONTENT_TYPE:
         /* This should not be writeable with the new request API */
+        /* FIXME: check */
         self->priv->content_type = g_value_dup_string (value);
         break;
       case PROP_FILENAME:
@@ -296,6 +369,16 @@ salut_file_transfer_channel_set_property (GObject *object,
       case PROP_AVAILABLE_SOCKET_TYPES:
         self->priv->available_socket_types = g_value_get_boxed (value);
         break;
+      case PROP_INITIATOR_HANDLE:
+        self->priv->initiator = g_value_get_uint (value);
+        g_assert (self->priv->initiator != 0);
+        break;
+      case PROP_DATE:
+        self->priv->date = g_value_get_uint64 (value);
+        break;
+      case PROP_INITIAL_OFFSET:
+        self->priv->initial_offset = g_value_get_uint64 (value);
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -333,6 +416,7 @@ salut_file_transfer_channel_constructor (GType type, guint n_props,
   /* Initialise the available socket types hash table */
   self->priv->available_socket_types = g_hash_table_new (g_int_hash,
       g_int_equal);
+  /* FIXME: fill this hash table */
 
   self->priv->last_transferred_bytes_emitted = 0;
 
@@ -353,8 +437,12 @@ salut_file_transfer_channel_class_init (SalutFileTransferChannelClass *salut_fil
   static TpDBusPropertiesMixinPropImpl channel_props[] = {
     { "TargetHandleType", "handle-type", NULL },
     { "TargetHandle", "handle", NULL },
+    { "TargetID", "target-id", NULL },
     { "ChannelType", "channel-type", NULL },
     { "Interfaces", "interfaces", NULL },
+    { "Requested", "requested", NULL },
+    { "InitiatorHandle", "initiator-handle", NULL },
+    { "InitiatorID", "initiator-id", NULL },
     { NULL }
   };
 
@@ -366,9 +454,11 @@ salut_file_transfer_channel_class_init (SalutFileTransferChannelClass *salut_fil
     { "ContentHashType", "content-hash-type", "content-hash-type" },
     { "ContentHash", "content-hash", "content-hash" },
     { "Description", "description", "description" },
+    { "Description", "date", "date" },
     { "AvailableSocketTypes", "available-socket-types", NULL },
     { "TransferredBytes", "transferred-bytes", NULL },
     { "InitialOffset", "initial-offset", NULL },
+    { "Date", "date", "date" },
     { NULL }
   };
 
@@ -403,6 +493,39 @@ salut_file_transfer_channel_class_init (SalutFileTransferChannelClass *salut_fil
   g_object_class_override_property (object_class, PROP_HANDLE_TYPE,
       "handle-type");
   g_object_class_override_property (object_class, PROP_HANDLE, "handle");
+  g_object_class_override_property (object_class, PROP_CHANNEL_DESTROYED,
+      "channel-destroyed");
+  g_object_class_override_property (object_class, PROP_CHANNEL_PROPERTIES,
+      "channel-properties");
+
+  param_spec = g_param_spec_string ("target-id", "Target JID",
+      "The string obtained by inspecting this channel's handle",
+      NULL,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+  g_object_class_install_property (object_class, PROP_TARGET_ID, param_spec);
+
+  param_spec = g_param_spec_boolean ("requested", "Requested?",
+      "True if this channel was requested by the local user",
+      FALSE,
+      G_PARAM_READABLE |
+      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+  g_object_class_install_property (object_class, PROP_REQUESTED, param_spec);
+
+ param_spec = g_param_spec_uint ("initiator-handle", "Initiator's handle",
+      "The contact who initiated the channel",
+      0, G_MAXUINT32, 0,
+      G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
+      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+  g_object_class_install_property (object_class, PROP_INITIATOR_HANDLE,
+      param_spec);
+
+  param_spec = g_param_spec_string ("initiator-id", "Initiator's bare JID",
+      "The string obtained by inspecting the initiator-handle",
+      NULL,
+      G_PARAM_READABLE |
+      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+  g_object_class_install_property (object_class, PROP_INITIATOR_ID,
+      param_spec);
 
   param_spec = g_param_spec_object ("contact",
       "SalutContact object",
@@ -598,6 +721,19 @@ salut_file_transfer_channel_class_init (SalutFileTransferChannelClass *salut_fil
   g_object_class_install_property (object_class, PROP_INITIAL_OFFSET,
       param_spec);
 
+  param_spec = g_param_spec_uint64 (
+      "date",
+      "Epoch time",
+      "the last modification time of the file being transferred",
+      0,
+      G_MAXUINT64,
+      0,
+      G_PARAM_READWRITE |
+      G_PARAM_STATIC_NICK |
+      G_PARAM_STATIC_BLURB);
+  g_object_class_install_property (object_class, PROP_DATE,
+      param_spec);
+
   salut_file_transfer_channel_class->dbus_props_class.interfaces = prop_interfaces;
   tp_dbus_properties_mixin_class_init (object_class,
       G_STRUCT_OFFSET (SalutFileTransferChannelClass, dbus_props_class));
@@ -997,6 +1133,7 @@ salut_file_transfer_channel_offer_file (SalutSvcChannelTypeFileTransfer *iface,
       return;
     }
 
+  /* FIXME: we should probably remove some of these tests */
   if (CHECK_STR_EMPTY (channel->priv->content_type))
     {
       DEBUG ("ContentType property not set");
-- 
1.5.6.5




More information about the Telepathy-commits mailing list