summaryrefslogtreecommitdiff
path: root/gobject/pygi-external.h
blob: b369dca45e27ac1a2745dd9744e5dc11d86e052a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* -*- Mode: C; c-basic-offset: 4 -*-
 * vim: tabstop=4 shiftwidth=4 expandtab
 */

#ifndef _PYGI_EXTERNAL_H_
#define _PYGI_EXTERNAL_H_

#include <Python.h>
#include <glib.h>

struct PyGI_API {
    PyObject* (*type_import_by_g_type) (GType g_type);
};

static struct PyGI_API *PyGI_API = NULL;

static int
_pygi_import (void)
{
#if ENABLE_PYGI
    PyObject *module;
    PyObject *api;

    if (PyGI_API != NULL) {
        return 1;
    }

    module = PyImport_ImportModule("gi");
    if (module == NULL) {
        PyErr_Clear();
        return -1;
    }

    api = PyObject_GetAttrString(module, "_API");
    if (api == NULL) {
        PyErr_Clear();
        Py_DECREF(module);
        return -1;
    }
    if (!PyCObject_Check(api)) {
        Py_DECREF(module);
        Py_DECREF(api);
        PyErr_Format(PyExc_TypeError, "gi._API must be cobject, not %s",
            api->ob_type->tp_name);
        return -1;
    }

    PyGI_API = (struct PyGI_API *)PyCObject_AsVoidPtr(api);

    Py_DECREF(module);

    return 0;
#else
    return -1;
#endif /* ENABLE_PYGI */
}

static inline PyObject *
pygi_type_import_by_g_type (GType g_type)
{
   if (_pygi_import() < 0) {
       return NULL;
   }
   return PyGI_API->type_import_by_g_type(g_type);
}

#endif /* _PYGI_EXTERNAL_H_ */