[Telepathy-commits] [telepathy-mission-control/master] Add new API for registering channel filters

Alberto Mardegan alberto.mardegan at nokia.com
Mon Nov 10 03:56:48 PST 2008


Deprecate mcd_dispatcher_register_filters and add a similar API which doesn't
consider the channel type or direction.
---
 .../libmissioncontrol-server-sections.txt          |    2 +
 .../tmpl/mcd-dispatcher.sgml                       |   20 ++++++
 src/mcd-dispatcher-context.h                       |    9 ++-
 src/mcd-dispatcher.c                               |   69 ++++++++++++++++++--
 4 files changed, 94 insertions(+), 6 deletions(-)

diff --git a/doc/reference/libmissioncontrol-server/libmissioncontrol-server-sections.txt b/doc/reference/libmissioncontrol-server/libmissioncontrol-server-sections.txt
index bd6a29a..64b2b18 100644
--- a/doc/reference/libmissioncontrol-server/libmissioncontrol-server-sections.txt
+++ b/doc/reference/libmissioncontrol-server/libmissioncontrol-server-sections.txt
@@ -237,6 +237,8 @@ mcd_dispatcher_new
 mcd_dispatcher_send
 mcd_dispatcher_get_channel_type_usage
 mcd_dispatcher_get_channel_capabilities
+mcd_dispatcher_add_filter
+mcd_dispatcher_add_filters
 <SUBSECTION Standard>
 MCD_DISPATCHER
 MCD_IS_DISPATCHER
diff --git a/doc/reference/libmissioncontrol-server/tmpl/mcd-dispatcher.sgml b/doc/reference/libmissioncontrol-server/tmpl/mcd-dispatcher.sgml
index 2f5edee..ad020f1 100644
--- a/doc/reference/libmissioncontrol-server/tmpl/mcd-dispatcher.sgml
+++ b/doc/reference/libmissioncontrol-server/tmpl/mcd-dispatcher.sgml
@@ -114,3 +114,23 @@ McdDispatcher
 @Returns: 
 
 
+<!-- ##### FUNCTION mcd_dispatcher_add_filter ##### -->
+<para>
+
+</para>
+
+ at dispatcher: 
+ at filter: 
+ at priority: 
+ at user_data: 
+
+
+<!-- ##### FUNCTION mcd_dispatcher_add_filters ##### -->
+<para>
+
+</para>
+
+ at dispatcher: 
+ at filters: 
+
+
diff --git a/src/mcd-dispatcher-context.h b/src/mcd-dispatcher-context.h
index 65f1b24..b2f2bbd 100644
--- a/src/mcd-dispatcher-context.h
+++ b/src/mcd-dispatcher-context.h
@@ -58,6 +58,13 @@ typedef struct filter_t {
     gpointer user_data;
 } McdFilter;
 
+void mcd_dispatcher_add_filter (McdDispatcher *dispatcher,
+                                McdFilterFunc filter,
+                                guint priority,
+                                gpointer user_data);
+void mcd_dispatcher_add_filters (McdDispatcher *dispatcher,
+                                 const McdFilter *filters);
+
 void mcd_dispatcher_register_filter (McdDispatcher *dispatcher,
 				     McdFilterFunc filter,
 				     GQuark channel_type_quark,
@@ -73,7 +80,7 @@ void mcd_dispatcher_unregister_filter (McdDispatcher *dispatcher,
 void mcd_dispatcher_register_filters (McdDispatcher *dispatcher,
 				      McdFilter *filters,
 				      GQuark channel_type_quark,
-				      guint filter_flags);
+				      guint filter_flags) G_GNUC_DEPRECATED;
 
 /* Context API section
  *
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 377b1cc..2eecdd5 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -148,6 +148,9 @@ struct _McdDispatcherPrivate
      * performance reasons */
     GPtrArray *channel_handler_caps;
 
+    /* list of McdFilter elements */
+    GList *filters;
+
     /* each element is a McdClient struct */
     GList *clients;
 
@@ -1438,11 +1441,7 @@ _mcd_dispatcher_enter_state_machine (McdDispatcher *dispatcher,
     priv = dispatcher->priv;
 
     /* old-style filters cannot probably handle more than one channel; so,
-     * invoke them only if we have one single channel to dispatch.
-     *
-     * FIXME: design a plugin filter API to handle the multi-channel case (it
-     * might be as simple as just removing the channel type quark from the
-     * registration function */
+     * invoke them only if we have one single channel to dispatch. */
     n_channels = g_list_length (channels);
     if (n_channels == 1)
     {
@@ -1463,6 +1462,13 @@ _mcd_dispatcher_enter_state_machine (McdDispatcher *dispatcher,
         chain = NULL;
     }
 
+    /* invoke in-process channel filters */
+    /* FIXME: once old-style filters support is removed, we'll just have:
+     *
+     *  chain = priv->filters
+     */
+    chain = g_list_concat (chain, priv->filters);
+
     /* Preparing and filling the context */
     context = g_new0 (McdDispatcherContext, 1);
     context->ref_count = 1;
@@ -1668,6 +1674,14 @@ _mcd_dispatcher_finalize (GObject * object)
 {
     McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (object);
 
+    if (priv->filters)
+    {
+        GList *list;
+        for (list = priv->filters; list != NULL; list = list->next)
+            g_free (list->data);
+        g_list_free (priv->filters);
+    }
+
     g_hash_table_destroy (priv->channel_handler_hash);
 
     G_OBJECT_CLASS (mcd_dispatcher_parent_class)->finalize (object);
@@ -2446,3 +2460,48 @@ _mcd_dispatcher_send_channels (McdDispatcher *dispatcher, GList *channels,
     _mcd_dispatcher_enter_state_machine (dispatcher, channels, requested);
 }
 
+/**
+ * mcd_dispatcher_add_filter:
+ * @dispatcher: The #McdDispatcher.
+ * @filter: the filter function to be registered.
+ * @priority: The priority of the filter.
+ * @user_data: user data to be passed to @filter on invocation.
+ *
+ * Register a filter into the dispatcher chain: @filter will be invoked
+ * whenever channels need to be dispatched.
+ */
+void
+mcd_dispatcher_add_filter (McdDispatcher *dispatcher,
+                           McdFilterFunc filter,
+                           guint priority,
+                           gpointer user_data)
+{
+    McdDispatcherPrivate *priv;
+
+    g_return_if_fail (MCD_IS_DISPATCHER (dispatcher));
+    priv = dispatcher->priv;
+    priv->filters =
+        chain_add_filter (priv->filters, filter, priority, user_data);
+}
+
+/**
+ * mcd_dispatcher_add_filters:
+ * @dispatcher: The #McdDispatcher.
+ * @filters: a zero-terminated array of #McdFilter elements.
+ *
+ * Convenience function to add a batch of filters at once.
+ */
+void
+mcd_dispatcher_add_filters (McdDispatcher *dispatcher,
+                            const McdFilter *filters)
+{
+    const McdFilter *filter;
+
+    g_return_if_fail (filters != NULL);
+
+    for (filter = filters; filter->func != NULL; filter++)
+        mcd_dispatcher_add_filter (dispatcher, filter->func,
+                                   filter->priority,
+                                   filter->user_data);
+}
+
-- 
1.5.6.5




More information about the Telepathy-commits mailing list