[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