[libpeas] Move the "extension-type" property to PeasExtension.



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]