[Telepathy-commits] [telepathy-salut/master] GibberBytestreams: implement block_read as a virtual function on the bytestream iface.

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


---
 lib/gibber/gibber-bytestream-direct.c |    6 ++++--
 lib/gibber/gibber-bytestream-direct.h |    3 ---
 lib/gibber/gibber-bytestream-iface.c  |   11 +++++++++++
 lib/gibber/gibber-bytestream-iface.h  |    4 ++++
 lib/gibber/gibber-bytestream-oob.c    |    6 ++++--
 lib/gibber/gibber-bytestream-oob.h    |    3 ---
 src/tube-stream.c                     |   30 ++++--------------------------
 7 files changed, 27 insertions(+), 36 deletions(-)

diff --git a/lib/gibber/gibber-bytestream-direct.c b/lib/gibber/gibber-bytestream-direct.c
index 8d06d0e..e22b387 100644
--- a/lib/gibber/gibber-bytestream-direct.c
+++ b/lib/gibber/gibber-bytestream-direct.c
@@ -522,10 +522,11 @@ gibber_bytestream_direct_accept_socket (GibberBytestreamIface *bytestream,
   return TRUE;
 }
 
-void
-gibber_bytestream_direct_block_read (GibberBytestreamDirect *self,
+static void
+gibber_bytestream_direct_block_read (GibberBytestreamIface *bytestream,
                                      gboolean block)
 {
+  GibberBytestreamDirect *self = GIBBER_BYTESTREAM_DIRECT (bytestream);
   GibberBytestreamDirectPrivate *priv =
       GIBBER_BYTESTREAM_DIRECT_GET_PRIVATE (self);
 
@@ -689,4 +690,5 @@ bytestream_iface_init (gpointer g_iface,
   klass->send = gibber_bytestream_direct_send;
   klass->close = gibber_bytestream_direct_close;
   klass->accept = gibber_bytestream_direct_accept;
+  klass->block_read = gibber_bytestream_direct_block_read;
 }
diff --git a/lib/gibber/gibber-bytestream-direct.h b/lib/gibber/gibber-bytestream-direct.h
index efa7787..837a94b 100644
--- a/lib/gibber/gibber-bytestream-direct.h
+++ b/lib/gibber/gibber-bytestream-direct.h
@@ -69,9 +69,6 @@ void gibber_bytestream_direct_set_check_addr_func (
 gboolean gibber_bytestream_direct_accept_socket (
     GibberBytestreamIface *bytestream, int listen_fd);
 
-void gibber_bytestream_direct_block_read (GibberBytestreamDirect *self,
-    gboolean block);
-
 G_END_DECLS
 
 #endif /* #ifndef __GIBBER_BYTESTREAM_DIRECT_H__ */
diff --git a/lib/gibber/gibber-bytestream-iface.c b/lib/gibber/gibber-bytestream-iface.c
index d926b05..2b52632 100644
--- a/lib/gibber/gibber-bytestream-iface.c
+++ b/lib/gibber/gibber-bytestream-iface.c
@@ -63,6 +63,17 @@ gibber_bytestream_iface_accept (GibberBytestreamIface *self,
   virtual_method (self, func, user_data);
 }
 
+void
+gibber_bytestream_iface_block_read (GibberBytestreamIface *self,
+                                    gboolean block)
+{
+  void (*virtual_method)(GibberBytestreamIface *, gboolean) =
+    GIBBER_BYTESTREAM_IFACE_GET_CLASS (self)->block_read;
+  if (virtual_method != NULL)
+    virtual_method (self, block);
+  /* else: do nothing. Some bytestreams like IBB does not have read_block. */
+}
+
 static void
 gibber_bytestream_iface_base_init (gpointer klass)
 {
diff --git a/lib/gibber/gibber-bytestream-iface.h b/lib/gibber/gibber-bytestream-iface.h
index c6acc2d..612ce82 100644
--- a/lib/gibber/gibber-bytestream-iface.h
+++ b/lib/gibber/gibber-bytestream-iface.h
@@ -58,6 +58,7 @@ struct _GibberBytestreamIfaceClass {
   void (*close) (GibberBytestreamIface *bytestream, GError *error);
   void (*accept) (GibberBytestreamIface *bytestream,
       GibberBytestreamAugmentSiAcceptReply func, gpointer user_data);
+  void (*block_read) (GibberBytestreamIface *bytestream, gboolean block);
 };
 
 GType gibber_bytestream_iface_get_type (void);
@@ -85,6 +86,9 @@ void gibber_bytestream_iface_close (GibberBytestreamIface *bytestream,
 void gibber_bytestream_iface_accept (GibberBytestreamIface *bytestream,
     GibberBytestreamAugmentSiAcceptReply func, gpointer user_data);
 
+void gibber_bytestream_iface_block_read (GibberBytestreamIface *bytestream,
+    gboolean block);
+
 G_END_DECLS
 
 #endif /* #ifndef __GIBBER_BYTESTREAM_IFACE_H__ */
diff --git a/lib/gibber/gibber-bytestream-oob.c b/lib/gibber/gibber-bytestream-oob.c
index 4d838dd..750ea6d 100644
--- a/lib/gibber/gibber-bytestream-oob.c
+++ b/lib/gibber/gibber-bytestream-oob.c
@@ -1168,10 +1168,11 @@ gibber_bytestream_oob_set_check_addr_func (
   priv->check_addr_func_data = user_data;
 }
 
-void
-gibber_bytestream_oob_block_read (GibberBytestreamOOB *self,
+static void
+gibber_bytestream_oob_block_read (GibberBytestreamIface *bytestream,
                                   gboolean block)
 {
+  GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (bytestream);
   GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self);
 
   if (priv->read_blocked == block)
@@ -1193,4 +1194,5 @@ bytestream_iface_init (gpointer g_iface,
   klass->send = gibber_bytestream_oob_send;
   klass->close = gibber_bytestream_oob_close;
   klass->accept = gibber_bytestream_oob_accept;
+  klass->block_read = gibber_bytestream_oob_block_read;
 }
diff --git a/lib/gibber/gibber-bytestream-oob.h b/lib/gibber/gibber-bytestream-oob.h
index 8834d92..14499d7 100644
--- a/lib/gibber/gibber-bytestream-oob.h
+++ b/lib/gibber/gibber-bytestream-oob.h
@@ -69,9 +69,6 @@ void gibber_bytestream_oob_set_check_addr_func (
     GibberBytestreamOOB *bytestream, GibberBytestreamOOBCheckAddrFunc func,
     gpointer user_data);
 
-void gibber_bytestream_oob_block_read (GibberBytestreamOOB *bytestream,
-    gboolean block);
-
 G_END_DECLS
 
 #endif /* #ifndef __GIBBER_BYTESTREAM_OOB_H__ */
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 0978f55..8681336 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -268,19 +268,8 @@ transport_buffer_empty_cb (GibberTransport *transport,
     }
 
   /* Buffer is empty so we can unblock the buffer if it was blocked */
-  /* FIXME: Should we move this as bytestream-iface method? */
-  if (GIBBER_IS_BYTESTREAM_OOB (bytestream))
-      {
-        DEBUG ("tube buffer isn't empty. Block the bytestream");
-        gibber_bytestream_oob_block_read (
-          GIBBER_BYTESTREAM_OOB (bytestream), FALSE);
-      }
-  else if (GIBBER_IS_BYTESTREAM_DIRECT (bytestream))
-      {
-        DEBUG ("tube buffer isn't empty. Block the bytestream");
-        gibber_bytestream_direct_block_read (
-          GIBBER_BYTESTREAM_DIRECT (bytestream), FALSE);
-      }
+  DEBUG ("tube buffer isn't empty. Block the bytestream");
+  gibber_bytestream_iface_block_read (bytestream, FALSE);
 }
 
 static void
@@ -1606,19 +1595,8 @@ data_received_cb (GibberBytestreamIface *bytestream,
   if (!gibber_transport_buffer_is_empty (transport))
     {
       /* We don't want to send more data while the buffer isn't empty */
-      /* FIXME: Should we move this as bytestream-iface method? */
-      if (GIBBER_IS_BYTESTREAM_OOB (bytestream))
-          {
-            DEBUG ("tube buffer isn't empty. Block the bytestream");
-            gibber_bytestream_oob_block_read (
-              GIBBER_BYTESTREAM_OOB (bytestream), TRUE);
-          }
-      else if (GIBBER_IS_BYTESTREAM_DIRECT (bytestream))
-          {
-            DEBUG ("tube buffer isn't empty. Block the bytestream");
-            gibber_bytestream_direct_block_read (
-              GIBBER_BYTESTREAM_DIRECT (bytestream), TRUE);
-          }
+      DEBUG ("tube buffer isn't empty. Block the bytestream");
+      gibber_bytestream_iface_block_read (bytestream, TRUE);
     }
 }
 
-- 
1.5.6.5




More information about the Telepathy-commits mailing list