[pygobject/gsoc2009: 138/160] Register introspected interfaces



commit bf2367c170f84478886b90ea0161e7f09f7224e0
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Wed Aug 12 15:25:44 2009 +0200

    Register introspected interfaces

 gi/pygi-info.c          |   69 +++++++++++++----------------------------------
 gi/types.py             |    3 ++
 gobject/gobjectmodule.c |    5 +++-
 gobject/pyginterface.c  |   15 ++++++++--
 gobject/pyginterface.h  |    2 +
 gobject/pygobject.h     |    7 +++++
 6 files changed, 47 insertions(+), 54 deletions(-)
---
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index bc3a3c3..93e6518 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -1330,66 +1330,35 @@ _wrap_g_interface_info_get_methods (PyGIBaseInfo *self)
     return infos;
 }
 
-static void
-initialize_interface (GTypeInterface *iface,
-                      PyTypeObject   *pytype)
+static PyObject *
+_wrap_g_interface_info_register_type (PyGIBaseInfo *self,
+                                      PyObject     *args,
+                                      PyObject     *kwargs)
 {
-    // TODO: Implement this when g-i adds supports for vfunc offsets:
-    // http://bugzilla.gnome.org/show_bug.cgi?id=560281
-    /*
-    GIRepository *repo = g_irepository_get_default();
-    GIBaseInfo *iface_info = g_irepository_find_by_gtype(repo, G_TYPE_FROM_INTERFACE(iface));
-    int length, i;
-    GTypeInterface *parent_iface = g_type_interface_peek_parent(iface);
-
-    length = g_interface_info_get_n_methods((GIInterfaceInfo *) iface_info);
-
-    for (i = 0; i < length; i++) {
-        GIFunctionInfo *method = g_interface_info_get_method((GIInterfaceInfo *) iface_info, i);
-        const gchar *method_name = g_base_info_get_name((GIBaseInfo *) method);
-        gchar pymethod_name[250];
-        PyObject *py_method;
-        void *method_ptr = iface + i * sizeof(void*);
-
-        printf("%s\n", method_name);
-
-        g_snprintf(pymethod_name, sizeof(pymethod_name), "do_%s", pymethod_name);
-        py_method = PyObject_GetAttrString((PyObject *) pytype, pymethod_name);
-        if (py_method && !PyObject_TypeCheck(py_method, &PyCFunction_Type)) {
-            method_ptr = interface_method;
-        } else {
-            PyErr_Clear();
-            if (parent_iface) {
-                method_ptr = parent_iface + i * sizeof(void*);
-            }
-            Py_XDECREF(py_method);
-        }
+    static char *kwlist[] = { "type", NULL };
+    PyTypeObject *type;
+    GType g_type;
 
-        g_base_info_unref((GIBaseInfo *) method);
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+                "O!:InterfaceInfo.register_type",
+                kwlist, &PyType_Type, &type)) {
+        return NULL;
     }
-    */
-}
 
-static PyObject *
-_wrap_g_interface_info_register (PyGIBaseInfo *self)
-{
-    GType gtype;
-    GInterfaceInfo *info_struct = g_new0(GInterfaceInfo, 1);
-
-    info_struct->interface_init = (GInterfaceInitFunc) initialize_interface;
-    info_struct->interface_finalize = NULL;
-    info_struct->interface_data = NULL;
+    if (!PyType_IsSubtype(type, &PyGInterface_Type)) {
+        PyErr_SetString(PyExc_TypeError, "argument 1: Must be a subtype of gobject.GInterface");
+        return NULL;
+    }
 
-    gtype = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *) self->info);
-    pyg_register_interface_info(gtype, info_struct);
+    g_type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)self->info);
+    pyg_register_interface_type(g_type, type);
 
-    Py_INCREF(Py_None);
-    return Py_None;
+    Py_RETURN_NONE;
 }
 
 static PyMethodDef _PyGIInterfaceInfo_methods[] = {
     { "get_methods", (PyCFunction)_wrap_g_interface_info_get_methods, METH_NOARGS },
-    { "register", (PyCFunction)_wrap_g_interface_info_register, METH_NOARGS },
+    { "register_type", (PyCFunction)_wrap_g_interface_info_register_type, METH_VARARGS | METH_KEYWORDS },
     { NULL, NULL, 0 }
 };
 
diff --git a/gi/types.py b/gi/types.py
index c27119f..64e9a8c 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -99,6 +99,9 @@ class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
             if hasattr(cls, '__gtype__'):
                 setObjectHasNewConstructor(cls.__gtype__)
 
+        if (isinstance(cls.__info__, InterfaceInfo)):
+            cls.__info__.register_type(cls)
+
 
 class StructMeta(type, MetaClassHelper):
 
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index e877711..929153a 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2576,7 +2576,10 @@ struct _PyGObject_Functions pygobject_api_functions = {
   &PyGObject_Type,
   &PyGTypeWrapper_Type,
 
-  pygobject_new_from_type
+  pygobject_new_from_type,
+
+  &PyGInterface_Type,
+  pyg_register_interface_type
 };
 
 /* for addon libraries ... */
diff --git a/gobject/pyginterface.c b/gobject/pyginterface.c
index 29af546..4f43d92 100644
--- a/gobject/pyginterface.c
+++ b/gobject/pyginterface.c
@@ -53,6 +53,14 @@ pyg_interface_free(PyObject *op)
     PyObject_FREE(op);
 }
 
+void
+pyg_register_interface_type (GType         g_type,
+							 PyTypeObject *type)
+{
+	Py_INCREF((PyObject *)type);
+    g_type_set_qdata(g_type, pyginterface_type_key, type);
+}
+
 /**
  * pyg_register_interface:
  * @dict: a module dictionary.
@@ -84,10 +92,11 @@ pyg_register_interface(PyObject *dict, const gchar *class_name,
         Py_DECREF(o);
     }
 
-    g_type_set_qdata(gtype, pyginterface_type_key, type);
-    
+	pyg_register_interface_type(type, gtype);
+
     PyDict_SetItemString(dict, (char *)class_name, (PyObject *)type);
-    
+
+	Py_DECREF(type);
 }
 
 void
diff --git a/gobject/pyginterface.h b/gobject/pyginterface.h
index 0f390c2..20eb382 100644
--- a/gobject/pyginterface.h
+++ b/gobject/pyginterface.h
@@ -28,6 +28,8 @@ extern GQuark pyginterface_info_key;
 
 extern PyTypeObject PyGInterface_Type;
 
+void pyg_register_interface_type (GType         g_type,
+                                  PyTypeObject *type);
 void pyg_register_interface(PyObject *dict,
 			    const gchar *class_name,
 			    GType gtype,
diff --git a/gobject/pygobject.h b/gobject/pygobject.h
index 2db7cd7..14987f1 100644
--- a/gobject/pygobject.h
+++ b/gobject/pygobject.h
@@ -205,6 +205,10 @@ struct _PyGObject_Functions {
     PyObject *(*object_new_from_type) (PyTypeObject *type,
                                        GObject *obj,
                                        gboolean sink);
+
+    PyTypeObject *interface_type;
+    void      (*register_interface_type) (GType        g_type,
+                                          PyTypeObject *type);
 };
 
 #ifndef _INSIDE_PYGOBJECT_
@@ -275,6 +279,9 @@ struct _PyGObject_Functions *_PyGObject_API;
 #define PyGTypeWrapper_Type        (*_PyGObject_API->type_wrapper_type)
 #define pygobject_new_from_type    (_PyGObject_API->object_new_from_type)
 
+#define PyGInterface_Type          (*_PyGObject_API->interface_type)
+#define pyg_register_interface_type (_PyGObject_API->register_interface_type)
+
 #define pyg_block_threads()   G_STMT_START {   \
     if (_PyGObject_API->block_threads != NULL) \
       (* _PyGObject_API->block_threads)();     \



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]