[libpeas] Move the "extension-type" property to PeasExtension.
- From: Steve Frécinaux <sfre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libpeas] Move the "extension-type" property to PeasExtension.
- Date: Mon, 16 Aug 2010 20:16:43 +0000 (UTC)
commit a3087d025dbf25212af60e4c22ebe266bdbe38c2
Author: Steve Frécinaux <code istique net>
Date: Mon Aug 16 22:11:23 2010 +0200
Move the "extension-type" property to PeasExtension.
An "extension-type" property was previously implemented or emulated in
every PeasExtension subclasses. Moving it to PeasExtension allows one
to be able to rely on that property.
docs/reference/libpeas-sections.txt | 1 +
libpeas/peas-extension.c | 82 ++++++++++++++++++++++++++++++++
libpeas/peas-extension.h | 11 ++++-
loaders/c/peas-extension-c.c | 10 +++-
loaders/c/peas-extension-c.h | 1 -
loaders/python/peas-extension-python.c | 9 ++-
loaders/python/peas-extension-python.h | 2 -
loaders/seed/peas-extension-seed.c | 21 ++------
loaders/seed/peas-extension-seed.h | 1 -
9 files changed, 111 insertions(+), 27 deletions(-)
---
diff --git a/docs/reference/libpeas-sections.txt b/docs/reference/libpeas-sections.txt
index c7cebbb..33515b6 100644
--- a/docs/reference/libpeas-sections.txt
+++ b/docs/reference/libpeas-sections.txt
@@ -176,6 +176,7 @@ PEAS_EXTENSION_BASE_GET_CLASS
<TITLE>PeasExtension</TITLE>
PeasExtension
PeasExtensionClass
+peas_extension_get_extension_type
peas_extension_call
peas_extension_call_valist
<SUBSECTION Standard>
diff --git a/libpeas/peas-extension.c b/libpeas/peas-extension.c
index 8a8e559..a2c5803 100644
--- a/libpeas/peas-extension.c
+++ b/libpeas/peas-extension.c
@@ -62,14 +62,96 @@
G_DEFINE_ABSTRACT_TYPE (PeasExtension, peas_extension, G_TYPE_OBJECT);
+/* Properties */
+enum {
+ PROP_0,
+ PROP_EXTENSION_TYPE
+};
+
+struct _PeasExtensionPrivate {
+ GType exten_type;
+};
+
static void
peas_extension_init (PeasExtension *exten)
{
+ exten->priv = G_TYPE_INSTANCE_GET_PRIVATE (exten,
+ PEAS_TYPE_EXTENSION,
+ PeasExtensionPrivate);
+}
+
+static void
+peas_extension_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PeasExtension *exten = PEAS_EXTENSION (object);
+
+ switch (prop_id)
+ {
+ case PROP_EXTENSION_TYPE:
+ exten->priv->exten_type = g_value_get_gtype (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+peas_extension_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ PeasExtension *exten = PEAS_EXTENSION (object);
+
+ switch (prop_id)
+ {
+ case PROP_EXTENSION_TYPE:
+ g_value_set_gtype (value, exten->priv->exten_type);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
peas_extension_class_init (PeasExtensionClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->set_property = peas_extension_set_property;
+ object_class->get_property = peas_extension_get_property;
+
+ g_object_class_install_property (object_class, PROP_EXTENSION_TYPE,
+ g_param_spec_gtype ("extension-type",
+ "Extension Type",
+ "The GType of this extesion",
+ G_TYPE_NONE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_type_class_add_private (klass, sizeof (PeasExtensionPrivate));
+}
+
+/**
+ * peas_extension_get_extension_type:
+ * @exten: A #PeasExtension.
+ *
+ * Get the type of the extension interface of the object proxied by @exten.
+ *
+ * Return value: The #Gtype proxied by @exten.
+ */
+GType
+peas_extension_get_extension_type (PeasExtension *exten)
+{
+ g_return_val_if_fail (PEAS_IS_EXTENSION (exten), G_TYPE_INVALID);
+
+ return exten->priv->exten_type;
}
/**
diff --git a/libpeas/peas-extension.h b/libpeas/peas-extension.h
index e5ee981..d74487e 100644
--- a/libpeas/peas-extension.h
+++ b/libpeas/peas-extension.h
@@ -36,8 +36,9 @@ G_BEGIN_DECLS
#define PEAS_IS_EXTENSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PEAS_TYPE_EXTENSION))
#define PEAS_EXTENSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PEAS_TYPE_EXTENSION, PeasExtensionClass))
-typedef struct _PeasExtension PeasExtension;
-typedef struct _PeasExtensionClass PeasExtensionClass;
+typedef struct _PeasExtension PeasExtension;
+typedef struct _PeasExtensionClass PeasExtensionClass;
+typedef struct _PeasExtensionPrivate PeasExtensionPrivate;
/**
* PeasExtension:
@@ -47,6 +48,9 @@ typedef struct _PeasExtensionClass PeasExtensionClass;
*/
struct _PeasExtension {
GObject parent;
+
+ /*< private >*/
+ PeasExtensionPrivate *priv;
};
/**
@@ -70,6 +74,9 @@ struct _PeasExtensionClass {
*/
GType peas_extension_get_type (void) G_GNUC_CONST;
+GType peas_extension_get_extension_type
+ (PeasExtension *exten);
+
gboolean peas_extension_call (PeasExtension *exten,
const gchar *method_name,
...);
diff --git a/loaders/c/peas-extension-c.c b/loaders/c/peas-extension-c.c
index 8f6a6a1..60556ce 100644
--- a/loaders/c/peas-extension-c.c
+++ b/loaders/c/peas-extension-c.c
@@ -46,8 +46,11 @@ peas_extension_c_call (PeasExtension *exten,
va_list args)
{
PeasExtensionC *cexten = PEAS_EXTENSION_C (exten);
+ GType gtype;
- return peas_method_apply_valist (cexten->instance, cexten->gtype, method_name, args);
+ gtype = peas_extension_get_extension_type (exten);
+
+ return peas_method_apply_valist (cexten->instance, gtype, method_name, args);
}
static void
@@ -83,8 +86,9 @@ peas_extension_c_new (GType gtype,
{
PeasExtensionC *cexten;
- cexten = PEAS_EXTENSION_C (g_object_new (PEAS_TYPE_EXTENSION_C, NULL));
- cexten->gtype = gtype;
+ cexten = PEAS_EXTENSION_C (g_object_new (PEAS_TYPE_EXTENSION_C,
+ "extension-type", gtype,
+ NULL));
cexten->instance = instance;
return PEAS_EXTENSION (cexten);
diff --git a/loaders/c/peas-extension-c.h b/loaders/c/peas-extension-c.h
index 59d3582..71dd045 100644
--- a/loaders/c/peas-extension-c.h
+++ b/loaders/c/peas-extension-c.h
@@ -39,7 +39,6 @@ typedef struct _PeasExtensionCClass PeasExtensionCClass;
struct _PeasExtensionC {
PeasExtension parent;
- GType gtype;
GObject *instance;
};
diff --git a/loaders/python/peas-extension-python.c b/loaders/python/peas-extension-python.c
index 707a2d0..8a505a7 100644
--- a/loaders/python/peas-extension-python.c
+++ b/loaders/python/peas-extension-python.c
@@ -51,11 +51,13 @@ peas_extension_python_call (PeasExtension *exten,
va_list args)
{
PeasExtensionPython *pyexten = PEAS_EXTENSION_PYTHON (exten);
+ GType gtype;
GObject *instance;
+ gtype = peas_extension_get_extension_type (exten);
instance = pygobject_get (pyexten->instance);
- return peas_method_apply_valist (instance, pyexten->gtype, method_name, args);
+ return peas_method_apply_valist (instance, gtype, method_name, args);
}
static void
@@ -93,8 +95,9 @@ peas_extension_python_new (GType gtype,
{
PeasExtensionPython *pyexten;
- pyexten = PEAS_EXTENSION_PYTHON (g_object_new (PEAS_TYPE_EXTENSION_PYTHON, NULL));
- pyexten->gtype = gtype;
+ pyexten = PEAS_EXTENSION_PYTHON (g_object_new (PEAS_TYPE_EXTENSION_PYTHON,
+ "extension-type", gtype,
+ NULL));
pyexten->instance = instance;
Py_INCREF (instance);
diff --git a/loaders/python/peas-extension-python.h b/loaders/python/peas-extension-python.h
index 21e3006..d8699e0 100644
--- a/loaders/python/peas-extension-python.h
+++ b/loaders/python/peas-extension-python.h
@@ -44,8 +44,6 @@ typedef struct _PeasExtensionPythonClass PeasExtensionPythonClass;
struct _PeasExtensionPython {
PeasExtension parent;
- /* maybe add this to PeasExtension? */
- GType gtype;
PyObject *instance;
};
diff --git a/loaders/seed/peas-extension-seed.c b/loaders/seed/peas-extension-seed.c
index b2fa8a7..b7b4274 100644
--- a/loaders/seed/peas-extension-seed.c
+++ b/loaders/seed/peas-extension-seed.c
@@ -56,9 +56,6 @@ peas_extension_seed_set_property (GObject *object,
switch (prop_id)
{
- case PROP_EXTEN_TYPE:
- sexten->exten_type = g_value_get_gtype (value);
- break;
case PROP_JS_CONTEXT:
sexten->js_context = g_value_get_pointer (value);
break;
@@ -229,6 +226,7 @@ peas_extension_seed_call (PeasExtension *exten,
va_list args)
{
PeasExtensionSeed *sexten = PEAS_EXTENSION_SEED (exten);
+ GType exten_type;
SeedValue js_method;
GICallableInfo *func_info;
guint n_args, n_in_args, n_out_args, i;
@@ -241,6 +239,8 @@ peas_extension_seed_call (PeasExtension *exten,
g_return_val_if_fail (sexten->js_context != NULL, FALSE);
g_return_val_if_fail (sexten->js_object != NULL, FALSE);
+ exten_type = peas_extension_get_extension_type (exten);
+
/* Fetch the JS method we want to call */
js_method = seed_object_get_property (sexten->js_context,
sexten->js_object,
@@ -248,7 +248,7 @@ peas_extension_seed_call (PeasExtension *exten,
if (seed_value_is_undefined (sexten->js_context, js_method))
{
g_warning ("Method '%s.%s' is not defined",
- g_type_name (sexten->exten_type), method_name);
+ g_type_name (exten_type), method_name);
return FALSE;
}
@@ -256,12 +256,12 @@ peas_extension_seed_call (PeasExtension *exten,
if (!seed_value_is_function (sexten->js_context, js_method))
{
g_warning ("Method '%s.%s' is not a function",
- g_type_name (sexten->exten_type), method_name);
+ g_type_name (exten_type), method_name);
return FALSE;
}
/* Prepare the arguments */
- func_info = peas_method_get_info (sexten->exten_type, method_name);
+ func_info = peas_method_get_info (exten_type, method_name);
n_args = g_callable_info_get_n_args (func_info);
n_in_args = 0;
n_out_args = 0;
@@ -360,15 +360,6 @@ peas_extension_seed_class_init (PeasExtensionSeedClass *klass)
extension_class->call = peas_extension_seed_call;
g_object_class_install_property (object_class,
- PROP_EXTEN_TYPE,
- g_param_spec_gtype ("extension-type",
- "The extension type",
- "The type we need to proxy",
- G_TYPE_NONE,
- G_PARAM_WRITABLE |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class,
PROP_JS_CONTEXT,
g_param_spec_pointer ("js-context",
"JavaScript Context",
diff --git a/loaders/seed/peas-extension-seed.h b/loaders/seed/peas-extension-seed.h
index 01da382..862831f 100644
--- a/loaders/seed/peas-extension-seed.h
+++ b/loaders/seed/peas-extension-seed.h
@@ -40,7 +40,6 @@ typedef struct _PeasExtensionSeedClass PeasExtensionSeedClass;
struct _PeasExtensionSeed {
PeasExtension parent;
- GType exten_type;
SeedContext js_context;
SeedObject js_object;
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]