summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac3
-rw-r--r--plugins/Makefile.am10
-rw-r--r--plugins/test.c204
-rw-r--r--plugins/test.h89
5 files changed, 306 insertions, 2 deletions
diff --git a/Makefile.am b/Makefile.am
index 8d3edc887..f12225f90 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = docs tools extensions lib src data m4 tests
+SUBDIRS = docs tools extensions lib src data m4 plugins tests
DISTCHECK_CONFIGURE_FLAGS = --disable-debug --enable-wocky-gtk-doc
diff --git a/configure.ac b/configure.ac
index d55a5980d..a35565f9c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -263,5 +263,6 @@ AC_OUTPUT( Makefile \
lib/Makefile \
lib/ext/Makefile \
lib/gibber/Makefile \
- lib/loudmouth/Makefile
+ lib/loudmouth/Makefile \
+ plugins/Makefile
)
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
new file mode 100644
index 000000000..43dfd3877
--- /dev/null
+++ b/plugins/Makefile.am
@@ -0,0 +1,10 @@
+plugindir = $(libdir)/telepathy/gabble-0
+
+noinst_LTLIBRARIES = \
+ test.la
+
+test_la_LDFLAGS = -module -avoid-version -rpath $(plugindir) -lm
+
+AM_CFLAGS = $(ERROR_CFLAGS) @DBUS_CFLAGS@ @GLIB_CFLAGS@ @WOCKY_CFLAGS@ \
+ @TP_GLIB_CFLAGS@ \
+ -I $(top_srcdir)/src -I $(top_builddir)/src
diff --git a/plugins/test.c b/plugins/test.c
new file mode 100644
index 000000000..626b6393e
--- /dev/null
+++ b/plugins/test.c
@@ -0,0 +1,204 @@
+#include "test.h"
+
+#include <stdio.h>
+
+#include <telepathy-glib/dbus.h>
+#include <telepathy-glib/util.h>
+#include <telepathy-glib/errors.h>
+
+#include "extensions/extensions.h"
+
+#include "plugin.h"
+
+#define DEBUG(msg, ...) \
+ g_debug ("%s: " msg, G_STRFUNC, ##__VA_ARGS__)
+
+/*****************************
+ * TestPlugin implementation *
+ *****************************/
+
+static void plugin_iface_init (
+ gpointer g_iface,
+ gpointer data);
+
+#define IFACE_TEST "org.freedesktop.Telepathy.Gabble.Plugin.Test"
+#define IFACE_TEST_PROPS IFACE_TEST ".Props"
+#define IFACE_TEST_BUGGY IFACE_TEST ".Buggy"
+
+static const gchar * const sidecar_interfaces[] = {
+ IFACE_TEST,
+ IFACE_TEST_PROPS,
+ IFACE_TEST_BUGGY,
+ NULL
+};
+
+G_DEFINE_TYPE_WITH_CODE (TestPlugin, test_plugin, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GABBLE_TYPE_PLUGIN, plugin_iface_init);
+ )
+
+static void
+test_plugin_init (TestPlugin *object)
+{
+ DEBUG ("%p", object);
+}
+
+static void
+test_plugin_class_init (TestPluginClass *klass)
+{
+}
+
+static void
+test_plugin_create_sidecar (
+ GabblePlugin *plugin,
+ const gchar *sidecar_interface,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *result = g_simple_async_result_new (G_OBJECT (plugin),
+ callback, user_data,
+ /* sic: all plugins share gabble_plugin_create_sidecar_finish() so we
+ * need to use the same source tag.
+ */
+ gabble_plugin_create_sidecar);
+ GabbleSidecar *sidecar = NULL;
+
+ if (!tp_strdiff (sidecar_interface, IFACE_TEST))
+ {
+ sidecar = g_object_new (TEST_TYPE_SIDECAR, NULL);
+ }
+ else if (!tp_strdiff (sidecar_interface, IFACE_TEST_PROPS))
+ {
+ sidecar = g_object_new (TEST_TYPE_SIDECAR_PROPS, NULL);
+ }
+ else
+ {
+ /* This deliberately doesn't check for IFACE_TEST_BUGGY, to test Gabble's
+ * reactions to buggy plugins. :)
+ */
+ g_simple_async_result_set_error (result, TP_ERRORS,
+ TP_ERROR_NOT_IMPLEMENTED, "'%s' not implemented", sidecar_interface);
+ }
+
+ if (sidecar != NULL)
+ g_simple_async_result_set_op_res_gpointer (result, sidecar, g_object_unref);
+
+ g_simple_async_result_complete_in_idle (result);
+ g_object_unref (result);
+}
+
+static void
+plugin_iface_init (
+ gpointer g_iface,
+ gpointer data G_GNUC_UNUSED)
+{
+ GabblePluginInterface *iface = g_iface;
+
+ iface->name = "Sidecar test plugin";
+ iface->sidecar_interfaces = sidecar_interfaces;
+ iface->create_sidecar = test_plugin_create_sidecar;
+}
+
+GabblePlugin *
+gabble_plugin_create ()
+{
+ return g_object_new (test_plugin_get_type (), NULL);
+}
+
+/******************************
+ * TestSidecar implementation *
+ ******************************/
+
+static void sidecar_iface_init (
+ gpointer g_iface,
+ gpointer data);
+
+G_DEFINE_TYPE_WITH_CODE (TestSidecar, test_sidecar, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GABBLE_TYPE_SIDECAR, sidecar_iface_init);
+ G_IMPLEMENT_INTERFACE (GABBLE_TYPE_SVC_GABBLE_PLUGIN_TEST, NULL);
+ )
+
+static void
+test_sidecar_init (TestSidecar *object)
+{
+ DEBUG ("%p", object);
+}
+
+static void
+test_sidecar_class_init (TestSidecarClass *klass)
+{
+}
+
+static void sidecar_iface_init (
+ gpointer g_iface,
+ gpointer data)
+{
+ GabbleSidecarInterface *iface = g_iface;
+
+ iface->interface = IFACE_TEST;
+ iface->get_immutable_properties = NULL;
+}
+
+/***********************************
+ * TestSidecarProps implementation *
+ ***********************************/
+
+static void sidecar_props_iface_init (
+ gpointer g_iface,
+ gpointer data);
+
+G_DEFINE_TYPE_WITH_CODE (TestSidecarProps, test_sidecar_props, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GABBLE_TYPE_SIDECAR, sidecar_props_iface_init);
+ G_IMPLEMENT_INTERFACE (GABBLE_TYPE_SVC_GABBLE_PLUGIN_TEST, NULL);
+ )
+
+static void
+test_sidecar_props_init (TestSidecarProps *object)
+{
+ DEBUG ("%p", object);
+
+ object->props = tp_asv_new (
+ IFACE_TEST_PROPS ".Greeting", G_TYPE_STRING, "oh hai",
+ NULL);
+}
+
+static void
+test_sidecar_props_finalize (GObject *object)
+{
+ TestSidecarProps *self = TEST_SIDECAR_PROPS (object);
+ void (*chain_up) (GObject *) =
+ G_OBJECT_CLASS (test_sidecar_props_parent_class)->finalize;
+
+ g_hash_table_unref (self->props);
+
+ if (chain_up != NULL)
+ chain_up (object);
+}
+
+static void
+test_sidecar_props_class_init (TestSidecarPropsClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = test_sidecar_props_finalize;
+}
+
+static GHashTable *
+sidecar_props_get_immutable_properties (GabbleSidecar *sidecar)
+{
+ TestSidecarProps *self = TEST_SIDECAR_PROPS (sidecar);
+
+ return g_hash_table_ref (self->props);
+}
+
+static void sidecar_props_iface_init (
+ gpointer g_iface,
+ gpointer data)
+{
+ GabbleSidecarInterface *iface = g_iface;
+
+ iface->interface = IFACE_TEST_PROPS;
+ iface->get_immutable_properties = sidecar_props_get_immutable_properties;
+}
+
+
+
diff --git a/plugins/test.h b/plugins/test.h
new file mode 100644
index 000000000..d71c48415
--- /dev/null
+++ b/plugins/test.h
@@ -0,0 +1,89 @@
+#include <glib-object.h>
+
+/* Plugin */
+typedef struct _TestPluginClass TestPluginClass;
+typedef struct _TestPlugin TestPlugin;
+
+struct _TestPluginClass {
+ GObjectClass parent;
+};
+
+struct _TestPlugin {
+ GObject parent;
+};
+
+GType test_plugin_get_type (void);
+
+#define TEST_TYPE_PLUGIN \
+ (test_plugin_get_type ())
+#define TEST_PLUGIN(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), TEST_TYPE_PLUGIN, TestPlugin))
+#define TEST_PLUGIN_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_PLUGIN, \
+ TestPluginClass))
+#define TEST_IS_PLUGIN(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), TEST_TYPE_PLUGIN))
+#define TEST_IS_PLUGIN_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_PLUGIN))
+#define TEST_PLUGIN_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_PLUGIN, \
+ TestPluginClass))
+
+/* Sidecar */
+typedef struct _TestSidecarClass TestSidecarClass;
+typedef struct _TestSidecar TestSidecar;
+
+struct _TestSidecarClass {
+ GObjectClass parent;
+};
+
+struct _TestSidecar {
+ GObject parent;
+};
+
+GType test_sidecar_get_type (void);
+
+#define TEST_TYPE_SIDECAR \
+ (test_sidecar_get_type ())
+#define TEST_SIDECAR(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), TEST_TYPE_SIDECAR, TestSidecar))
+#define TEST_SIDECAR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_SIDECAR, \
+ TestSidecarClass))
+#define TEST_IS_SIDECAR(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), TEST_TYPE_SIDECAR))
+#define TEST_IS_SIDECAR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_SIDECAR))
+#define TEST_SIDECAR_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_SIDECAR, \
+ TestSidecarClass))
+
+/* Sidecar with properties */
+typedef struct _TestSidecarPropsClass TestSidecarPropsClass;
+typedef struct _TestSidecarProps TestSidecarProps;
+
+struct _TestSidecarPropsClass {
+ GObjectClass parent;
+};
+
+struct _TestSidecarProps {
+ GObject parent;
+ GHashTable *props;
+};
+
+GType test_sidecar_props_get_type (void);
+
+#define TEST_TYPE_SIDECAR_PROPS \
+ (test_sidecar_props_get_type ())
+#define TEST_SIDECAR_PROPS(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), TEST_TYPE_SIDECAR_PROPS, TestSidecarProps))
+#define TEST_SIDECAR_PROPS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_SIDECAR_PROPS, \
+ TestSidecarPropsClass))
+#define TEST_IS_SIDECAR_PROPS(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), TEST_TYPE_SIDECAR_PROPS))
+#define TEST_IS_SIDECAR_PROPS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_SIDECAR_PROPS))
+#define TEST_SIDECAR_PROPS_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_SIDECAR_PROPS, \
+ TestSidecarPropsClass))