[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