[Telepathy-commits] [telepathy-salut/master] Send iq offer only 1 time

Alban Crequy alban.crequy at collabora.co.uk
Tue Nov 25 03:59:10 PST 2008


20080424150218-a41c0-c88977311240702d9fa54b8bdb9f0db99e6fe47a.gz
---
 src/salut-tubes-channel.c |    2 +-
 src/tube-dbus.c           |    1 +
 src/tube-iface.c          |    9 +++++++++
 src/tube-iface.h          |    5 +++++
 src/tube-stream.c         |   19 +++++++++++++++++++
 5 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index f29773c..2e2f58a 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -1787,7 +1787,7 @@ _send_channel_iq_tube (gpointer key,
                 NULL);
 
   DEBUG ("called for tube id %d", tube_id);
-  if (state == TP_TUBE_STATE_REMOTE_PENDING)
+  if (salut_tube_iface_offer_needed(tube))
     {
       GError *error = NULL;
 
diff --git a/src/tube-dbus.c b/src/tube-dbus.c
index a45fa3c..d594697 100644
--- a/src/tube-dbus.c
+++ b/src/tube-dbus.c
@@ -1210,6 +1210,7 @@ tube_iface_init (gpointer g_iface,
   SalutTubeIfaceClass *klass = (SalutTubeIfaceClass *) g_iface;
 
   klass->accept = salut_tube_dbus_accept;
+  klass->offer_needed = NULL;
   klass->close = salut_tube_dbus_close;
   klass->add_bytestream = salut_tube_dbus_add_bytestream;
 }
diff --git a/src/tube-iface.c b/src/tube-iface.c
index 0762037..63b02c9 100644
--- a/src/tube-iface.c
+++ b/src/tube-iface.c
@@ -33,6 +33,15 @@ salut_tube_iface_accept (SalutTubeIface *self,
   return virtual_method (self, error);
 }
 
+gboolean
+salut_tube_iface_offer_needed (SalutTubeIface *self)
+{
+  gboolean (*virtual_method)(SalutTubeIface *) =
+    SALUT_TUBE_IFACE_GET_CLASS (self)->offer_needed;
+  g_assert (virtual_method != NULL);
+  return virtual_method (self);
+}
+
 void
 salut_tube_iface_close (SalutTubeIface *self)
 {
diff --git a/src/tube-iface.h b/src/tube-iface.h
index db55ae3..6e0af49 100644
--- a/src/tube-iface.h
+++ b/src/tube-iface.h
@@ -33,6 +33,7 @@ struct _SalutTubeIfaceClass {
   GTypeInterface parent;
 
   gboolean (*accept) (SalutTubeIface *tube, GError **error);
+  gboolean (*offer_needed) (SalutTubeIface *tube);
   void (*close) (SalutTubeIface *tube);
   void (*add_bytestream) (SalutTubeIface *tube,
       GibberBytestreamIface *bytestream);
@@ -51,6 +52,10 @@ GType salut_tube_iface_get_type (void);
   (G_TYPE_INSTANCE_GET_INTERFACE ((obj), SALUT_TYPE_TUBE_IFACE,\
                               SalutTubeIfaceClass))
 
+/* return TRUE if the <iq> to offer the tube has never been sent */
+gboolean
+salut_tube_iface_offer_needed (SalutTubeIface *tube);
+
 gboolean
 salut_tube_iface_accept (SalutTubeIface *tube, GError **error);
 
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 68b1ac3..a6dfbea 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -131,6 +131,8 @@ struct _SalutTubeStreamPrivate
   guint listen_io_channel_source_id;
   gboolean closed;
 
+  gboolean offer_needed;
+
   gboolean dispose_has_run;
 };
 
@@ -815,6 +817,7 @@ salut_tube_stream_init (SalutTubeStream *self)
   priv->access_control = TP_SOCKET_ACCESS_CONTROL_LOCALHOST;
   priv->access_control_param = NULL;
   priv->closed = FALSE;
+  priv->offer_needed = FALSE;
 
   priv->dispose_has_run = FALSE;
 }
@@ -1096,6 +1099,7 @@ salut_tube_stream_constructor (GType type,
       if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
         {
           /* Private tube */
+          priv->offer_needed = TRUE;
           priv->state = TP_TUBE_STATE_REMOTE_PENDING;
         }
       else
@@ -1305,6 +1309,20 @@ salut_tube_stream_accept (SalutTubeIface *tube,
 }
 
 /**
+ * salut_tube_stream_offer_needed
+ *
+ * Implements salut_tube_iface_offer_needed on SalutTubeIface
+ */
+static gboolean
+salut_tube_stream_offer_needed (SalutTubeIface *tube)
+{
+  SalutTubeStream *self = SALUT_TUBE_STREAM (tube);
+  SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
+
+  return priv->offer_needed;
+}
+
+/**
  * salut_tube_stream_close
  *
  * Implements salut_tube_iface_close on SalutTubeIface
@@ -1611,6 +1629,7 @@ tube_iface_init (gpointer g_iface,
   SalutTubeIfaceClass *klass = (SalutTubeIfaceClass *) g_iface;
 
   klass->accept = salut_tube_stream_accept;
+  klass->offer_needed = salut_tube_stream_offer_needed;
   klass->close = salut_tube_stream_close;
   klass->add_bytestream = salut_tube_stream_add_bytestream;
 }
-- 
1.5.6.5




More information about the Telepathy-commits mailing list