root/trunk/midgard/apis/python/py_midgard_reflection_property.c

Revision 16511, 7.8 kB (checked in by piotras, 6 months ago)

Defined NO_IMPORT_PYGOBJECT

Line 
1 /*
2  * Copyright (C) 2007 Piotr Pokora <piotrek.pokora@gmail.com>
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License as published
6  * by the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23 #define NO_IMPORT_PYGOBJECT
24 #include "py_midgard.h"
25
26 PyTypeObject G_GNUC_INTERNAL Pymidgard_rp_Type;
27
28 #define MRP_DEBUG(__name) \
29         CHECK_MGD; \
30         CLASS_METHOD_DEBUG(Pymidgard_rp_Type.tp_name, __name);
31
32 static int
33 __reflection_property_constructor(PyGObject *self, PyObject *args, PyObject *kwargs)
34 {
35         MRP_DEBUG("__init__");
36         const gchar *classname;
37        
38         if(!PyArg_ParseTuple(args, "s", &classname))
39                 return -1;
40
41         GObjectClass *klass = g_type_class_peek(g_type_from_name(classname));
42         if(klass == NULL)
43                 return -1; /* FIXME throw exception */
44
45         MidgardReflectionProperty *mrp =
46                 midgard_reflection_property_new(MIDGARD_DBOBJECT_CLASS(klass));
47
48         if(!mrp) return -1;
49
50         self->obj = G_OBJECT(mrp);
51
52         return 0;
53 }
54
55 static PyObject *
56 pymidgard_reflection_property_get_midgard_type(PyGObject *self, PyObject *args)
57 {
58         MRP_DEBUG("get_midgard_type");
59         const gchar *name;
60
61         if(!PyArg_ParseTuple(args, "s", &name))
62                 return NULL;
63
64         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
65         GType mtype = midgard_reflection_property_get_midgard_type(mrp, name);
66        
67         return Py_BuildValue("i", (int)mtype);
68 }
69
70 static PyObject *
71 pymidgard_reflection_property_is_link(PyGObject *self, PyObject *args)
72 {
73         MRP_DEBUG("is_link");
74         const gchar *name;
75
76         if(!PyArg_ParseTuple(args, "s", &name))
77                 return NULL;
78
79         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
80         if(midgard_reflection_property_is_link(mrp, name))
81                 Py_RETURN_TRUE;
82        
83         Py_RETURN_FALSE;
84 }
85
86 static PyObject *
87 pymidgard_reflection_property_is_linked(PyGObject *self, PyObject *args)
88 {
89         MRP_DEBUG("is_linked");
90         const gchar *name;
91
92         if(!PyArg_ParseTuple(args, "s", &name))
93                 return NULL;
94
95         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
96         if(midgard_reflection_property_is_linked(mrp, name))
97                 Py_RETURN_TRUE;
98        
99         Py_RETURN_FALSE;
100 }
101
102 static PyObject *
103 pymidgard_reflection_property_get_link_class(PyGObject *self, PyObject *args)
104 {
105         MRP_DEBUG("get_link_class");
106         const gchar *name;
107
108         if(!PyArg_ParseTuple(args, "s", &name))
109                 return NULL;
110
111         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
112         MidgardDBObjectClass *klass =
113                 midgard_reflection_property_get_link_class(mrp, name);
114        
115         if(klass == NULL)
116                 Py_RETURN_NONE;
117        
118         return Py_BuildValue("s", G_OBJECT_CLASS_NAME(klass));
119 }
120
121 static PyObject *
122 pymidgard_reflection_property_get_link_name(PyGObject *self, PyObject *args)
123 {
124         MRP_DEBUG("get_link_name");
125         const gchar *name;
126
127         if(!PyArg_ParseTuple(args, "s", &name))
128                 return NULL;
129
130         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
131         const gchar *lname =
132                 midgard_reflection_property_get_link_name(mrp, name);
133
134         if(lname == NULL)
135                 Py_RETURN_NONE;
136
137         return Py_BuildValue("s", lname);
138 }
139
140 static PyObject *
141 pymidgard_reflection_property_get_link_target(PyGObject *self, PyObject *args)
142 {
143         MRP_DEBUG("get_link_target");
144         const gchar *name;
145
146         if(!PyArg_ParseTuple(args, "s", &name))
147                 return NULL;
148
149         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
150         const gchar *target =
151                 midgard_reflection_property_get_link_target(mrp, name);
152
153         if(target == NULL)
154                 Py_RETURN_NONE;
155
156         return Py_BuildValue("s", target);
157 }
158
159 static PyObject *
160 pymidgard_reflection_property_description(PyGObject *self, PyObject *args)
161 {
162         MRP_DEBUG("description");
163         const gchar *name;
164
165         if(!PyArg_ParseTuple(args, "s", &name))
166                 return NULL;
167
168         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
169         const gchar *description =
170                 midgard_reflection_property_description(mrp, name);
171
172         if(description == NULL)
173                 Py_RETURN_NONE;
174
175         return Py_BuildValue("s", description);
176 }
177
178 static PyObject *
179 pymidgard_reflection_property_is_multilang(PyGObject *self, PyObject *args)
180 {
181         MRP_DEBUG("is_multilang");
182         const gchar *name;
183
184         if(!PyArg_ParseTuple(args, "s", &name))
185                 return NULL;
186
187         MidgardReflectionProperty *mrp = MIDGARD_REFLECTION_PROPERTY(self->obj);
188         if(midgard_reflection_property_is_multilang(mrp, name))
189                 Py_RETURN_TRUE;
190
191         Py_RETURN_FALSE;
192 }
193
194 static PyMethodDef pymidgard_rp_methods[] = {
195         { "get_midgard_type", (PyCFunction)pymidgard_reflection_property_get_midgard_type, METH_VARARGS },
196         { "is_link", (PyCFunction)pymidgard_reflection_property_is_link, METH_VARARGS },
197         { "is_linked", (PyCFunction)pymidgard_reflection_property_is_linked, METH_VARARGS },
198         { "get_link_class", (PyCFunction)pymidgard_reflection_property_get_link_class, METH_VARARGS },
199         { "get_link_name", (PyCFunction)pymidgard_reflection_property_get_link_name, METH_VARARGS },
200         { "get_link_target", (PyCFunction)pymidgard_reflection_property_get_link_target, METH_VARARGS },
201         { "description", (PyCFunction)pymidgard_reflection_property_description, METH_VARARGS },
202         { "is_multilang", (PyCFunction)pymidgard_reflection_property_is_multilang, METH_VARARGS },
203         { NULL, NULL, 0 }
204 };
205
206 PyTypeObject G_GNUC_INTERNAL Pymidgard_rp_Type = {
207     PyObject_HEAD_INIT(NULL)
208     0,                                 /* ob_size */
209     "reflection_property",                   /* tp_name */
210     sizeof(PyGObject),          /* tp_basicsize */
211     0,                                 /* tp_itemsize */
212     /* methods */
213     (destructor)0,        /* tp_dealloc */
214     (printfunc)0,                      /* tp_print */
215     (getattrfunc)0,       /* tp_getattr */
216     (setattrfunc)0,       /* tp_setattr */
217     (cmpfunc)0,           /* tp_compare */
218     (reprfunc)0,             /* tp_repr */
219     (PyNumberMethods*)0,     /* tp_as_number */
220     (PySequenceMethods*)0, /* tp_as_sequence */
221     (PyMappingMethods*)0,   /* tp_as_mapping */
222     (hashfunc)0,             /* tp_hash */
223     (ternaryfunc)0,          /* tp_call */
224     (reprfunc)0,              /* tp_str */
225     (getattrofunc)0,     /* tp_getattro */
226     (setattrofunc)0,     /* tp_setattro */
227     (PyBufferProcs*)0,  /* tp_as_buffer */
228     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,                      /* tp_flags */
229     NULL,                        /* Documentation string */
230     (traverseproc)0,     /* tp_traverse */
231     (inquiry)0,             /* tp_clear */
232     (richcmpfunc)0,   /* tp_richcompare */
233     offsetof(PyGObject, weakreflist),             /* tp_weaklistoffset */
234     (getiterfunc)0,          /* tp_iter */
235     (iternextfunc)0,     /* tp_iternext */
236     pymidgard_rp_methods, /* tp_methods */
237     (struct PyMemberDef*)0,              /* tp_members */
238     (struct PyGetSetDef*)0,  /* tp_getset */
239     NULL,                              /* tp_base */
240     NULL,                              /* tp_dict */
241     (descrgetfunc)0,    /* tp_descr_get */
242     (descrsetfunc)0,    /* tp_descr_set */
243     offsetof(PyGObject, inst_dict),                 /* tp_dictoffset */
244     (initproc)__reflection_property_constructor,             /* tp_init */
245     (allocfunc)0,           /* tp_alloc */
246     (newfunc)0,               /* tp_new */
247     (freefunc)0,             /* tp_free */
248     (inquiry)0              /* tp_is_gc */
249 };
250
251 void py_midgard_reflection_property_register_class(
252                 PyObject *d, gpointer pygobject_type)
253 {
254         pygobject_register_class(d,
255                         "reflection_property",
256                         MIDGARD_TYPE_REFLECTION_PROPERTY,
257                         &Pymidgard_rp_Type,
258                         Py_BuildValue("(O)", pygobject_type));
259 }
Note: See TracBrowser for help on using the browser.