[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