[telepathy-gabble/master] Add API to request a sidecar from the plugin loader

Will Thompson will.thompson at collabora.co.uk
Sun Nov 15 13:57:00 PST 2009


---
 src/plugin-loader.c |   80 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/plugin-loader.h |   15 +++++++++
 2 files changed, 95 insertions(+), 0 deletions(-)

diff --git a/src/plugin-loader.c b/src/plugin-loader.c
index e8affd4..243f9d9 100644
--- a/src/plugin-loader.c
+++ b/src/plugin-loader.c
@@ -26,6 +26,8 @@
 # include <gmodule.h>
 #endif
 
+#include <telepathy-glib/errors.h>
+
 #define DEBUG_FLAG GABBLE_DEBUG_PLUGINS
 #include "debug.h"
 #include "plugin.h"
@@ -212,3 +214,81 @@ gabble_plugin_loader_dup ()
 {
   return g_object_new (GABBLE_TYPE_PLUGIN_LOADER, NULL);
 }
+
+static void
+create_sidecar_cb (
+    GObject *plugin_obj,
+    GAsyncResult *nested_result,
+    gpointer user_data)
+{
+  GSimpleAsyncResult *result = user_data;
+  GabbleSidecar *sidecar;
+  GError *error = NULL;
+
+  sidecar = gabble_plugin_create_sidecar_finish (GABBLE_PLUGIN (plugin_obj),
+      nested_result, &error);
+
+  if (sidecar == NULL)
+    {
+      g_simple_async_result_set_from_error (result, error);
+      g_clear_error (&error);
+    }
+  else
+    {
+      g_simple_async_result_set_op_res_gpointer (result, sidecar,
+          g_object_unref);
+    }
+
+  g_simple_async_result_complete (result);
+  g_object_unref (result);
+}
+
+void
+gabble_plugin_loader_create_sidecar (
+    GabblePluginLoader *self,
+    const gchar *sidecar_interface,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  GabblePluginLoaderPrivate *priv = self->priv;
+  guint i;
+
+  for (i = 0; i < priv->plugins->len; i++)
+    {
+      GabblePlugin *p = g_ptr_array_index (priv->plugins, i);
+
+      if (gabble_plugin_implements_sidecar (p, sidecar_interface))
+        {
+          GSimpleAsyncResult *res = g_simple_async_result_new (G_OBJECT (self),
+              callback, user_data, gabble_plugin_loader_create_sidecar);
+
+          gabble_plugin_create_sidecar (p, sidecar_interface, create_sidecar_cb,
+              res);
+          return;
+        }
+    }
+
+  g_simple_async_report_error_in_idle (G_OBJECT (self), callback, user_data,
+      TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED, "No plugin implements sidecar '%s'",
+      sidecar_interface);
+}
+
+GabbleSidecar *
+gabble_plugin_loader_create_sidecar_finish (
+    GabblePluginLoader *self,
+    GAsyncResult *result,
+    GError **error)
+{
+  GabbleSidecar *sidecar;
+
+  if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
+          error))
+    return NULL;
+
+  g_return_val_if_fail (g_simple_async_result_is_valid (result,
+    G_OBJECT (self), gabble_plugin_loader_create_sidecar), NULL);
+
+  sidecar = GABBLE_SIDECAR (g_simple_async_result_get_op_res_gpointer (
+      G_SIMPLE_ASYNC_RESULT (result)));
+  return g_object_ref (sidecar);
+}
diff --git a/src/plugin-loader.h b/src/plugin-loader.h
index 84b57b8..fc86067 100644
--- a/src/plugin-loader.h
+++ b/src/plugin-loader.h
@@ -22,6 +22,10 @@
 
 #include <glib-object.h>
 
+#include <gio/gio.h>
+
+#include "sidecar.h"
+
 typedef struct _GabblePluginLoader GabblePluginLoader;
 typedef struct _GabblePluginLoaderClass GabblePluginLoaderClass;
 typedef struct _GabblePluginLoaderPrivate GabblePluginLoaderPrivate;
@@ -57,4 +61,15 @@ GType gabble_plugin_loader_get_type (void);
 
 GabblePluginLoader *gabble_plugin_loader_dup (void);
 
+void gabble_plugin_loader_create_sidecar (
+    GabblePluginLoader *self,
+    const gchar *sidecar_interface,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+GabbleSidecar *gabble_plugin_loader_create_sidecar_finish (
+    GabblePluginLoader *self,
+    GAsyncResult *result,
+    GError **error);
+
 #endif /* #ifndef __PLUGIN_LOADER_H__ */
-- 
1.5.6.5




More information about the telepathy-commits mailing list