Annotation of gpl/axl/py-axl/py_axl_dtd.c, revision 1.1.1.1
1.1 misho 1: /**
2: * PyAxl: Axl Library python bindings
3: * Copyright (C) 2009 Advanced Software Production Line, S.L.
4: *
5: * This program is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU Lesser General Public License
7: * as published by the Free Software Foundation; either version 2.1
8: * of the License, or (at your option) any later version.
9: *
10: * This program is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this program; if not, write to the Free
17: * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18: * 02111-1307 USA
19: *
20: * You may find a copy of the license under this software is released
21: * at COPYING file. This is LGPL software: you are welcome to develop
22: * proprietary applications using this library without any royalty or
23: * fee but returning back any change, improvement or addition in the
24: * form of source code, project image, documentation patches, etc.
25: *
26: * For commercial support for XML enabled solutions contact us:
27: *
28: * Postal address:
29: * Advanced Software Production Line, S.L.
30: * C/ Antonio Suarez Nº 10,
31: * Edificio Alius A, Despacho 102
32: * Alcalá de Henares 28802 (Madrid)
33: * Spain
34: *
35: * Email address:
36: * info@aspl.es - http://www.aspl.es/axl
37: */
38: #include <py_axl_dtd.h>
39:
40: #define LOG_DOMAIN "py-axl-dtd"
41:
42: struct _PyAxlDtd {
43: /* header required to initialize python required bits for
44: every python object */
45: PyObject_HEAD
46:
47: /* pointer to the axl dtd */
48: axlDtd * dtd;
49: };
50:
51: static int py_axl_dtd_init_type (PyAxlDtd *self, PyObject *args, PyObject *kwds)
52: {
53: return 0;
54: }
55:
56: /**
57: * @brief Function used to allocate memory required by the object
58: * axl.Dtd
59: */
60: static PyObject * py_axl_dtd_new (PyTypeObject *type, PyObject *args, PyObject *kwds)
61: {
62: PyAxlDtd *self;
63:
64: /* create the object */
65: self = (PyAxlDtd *)type->tp_alloc(type, 0);
66:
67: return (PyObject *)self;
68: }
69:
70: /**
71: * @brief Function used to finish and dealloc memory used by the
72: * object axl.Dtd
73: */
74: static void py_axl_dtd_dealloc (PyAxlDtd* self)
75: {
76:
77: axl_dtd_free (self->dtd);
78: self->dtd = NULL;
79:
80: /* free the dtd it self */
81: self->ob_type->tp_free ((PyObject*)self);
82:
83: return;
84: }
85:
86: /**
87: * @brief This function implements the generic attribute getting that
88: * allows to perform complex member resolution (not merely direct
89: * member access).
90: */
91: PyObject * py_axl_dtd_get_attr (PyObject *o, PyObject *attr_name) {
92: const char * attr = NULL;
93: PyObject * result;
94: /* PyAxlDtd * self = (PyAxlDtd *) o; */
95:
96: /* now implement other attributes */
97: if (! PyArg_Parse (attr_name, "s", &attr))
98: return NULL;
99:
100: __axl_log (LOG_DOMAIN, AXL_LEVEL_DEBUG, "received request to report dtd attr name %s (self: %p)",
101: attr, o);
102:
103: /* first implement generic attr already defined */
104: result = PyObject_GenericGetAttr (o, attr_name);
105: if (result)
106: return result;
107:
108: return NULL;
109: }
110:
111: /**
112: * @brief Implements attribute set operation.
113: */
114: int py_axl_dtd_set_attr (PyObject *o, PyObject *attr_name, PyObject *v)
115: {
116: const char * attr = NULL;
117: /* PyAxlDtd * self = (PyAxlDtd *) o; */
118: /* axl_bool boolean_value = axl_false; */
119:
120: /* now implement other attributes */
121: if (! PyArg_Parse (attr_name, "s", &attr))
122: return -1;
123:
124: /* now implement generic setter */
125: return PyObject_GenericSetAttr (o, attr_name, v);
126: }
127:
128: static PyObject * py_axl_dtd_validate (PyObject * _self, PyObject * args)
129: {
130: PyAxlDtd * self = (PyAxlDtd *) _self;
131: PyAxlDoc * doc = NULL;
132: axlError * error = NULL;
133:
134: /* parse and check result */
135: if (! PyArg_ParseTuple (args, "O", &doc))
136: return NULL;
137:
138: /* check doc object */
139: if (! py_axl_doc_check (__PY_OBJECT (doc))) {
140: /* set exception */
141: PyErr_SetString (PyExc_TypeError, "Expected to receive a axl.Doc object but received something different");
142: return NULL;
143: } /* end if */
144:
145: /* return none to signal no error */
146: if (axl_dtd_validate (py_axl_doc_get (__PY_OBJECT (doc)), self->dtd, &error)) {
147: Py_INCREF (Py_None);
148: return Py_None;
149: } /* end if */
150:
151: /* error found */
152: return py_axl_error_create (error);
153: }
154:
155:
156: static PyMethodDef py_axl_dtd_methods[] = {
157: /* next_called */
158: {"validate", (PyCFunction) py_axl_dtd_validate, METH_VARARGS,
159: "Allows to validate a document returning an axl.Error in the case or error or None if validates ok."},
160: {NULL, NULL, 0, NULL}
161: };
162:
163: static PyTypeObject PyAxlDtdType = {
164: PyObject_HEAD_INIT(NULL)
165: 0, /* ob_size*/
166: "axl.Dtd", /* tp_name*/
167: sizeof(PyAxlDtd), /* tp_basicsize*/
168: 0, /* tp_itemsize*/
169: (destructor)py_axl_dtd_dealloc, /* tp_dealloc*/
170: 0, /* tp_print*/
171: 0, /* tp_getattr*/
172: 0, /* tp_setattr*/
173: 0, /* tp_compare*/
174: 0, /* tp_repr*/
175: 0, /* tp_as_number*/
176: 0, /* tp_as_sequence*/
177: 0, /* tp_as_mapping*/
178: 0, /* tp_hash */
179: 0, /* tp_call*/
180: 0, /* tp_str*/
181: py_axl_dtd_get_attr, /* tp_getattro*/
182: py_axl_dtd_set_attr, /* tp_setattro*/
183: 0, /* tp_as_buffer*/
184: Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags*/
185: "Dtd object; wrapper of axlDtd API type", /* tp_doc */
186: 0, /* tp_traverse */
187: 0, /* tp_clear */
188: 0, /* tp_richcompare */
189: 0, /* tp_weaklistoffset */
190: 0, /* tp_iter */
191: 0, /* tp_iternext */
192: py_axl_dtd_methods, /* tp_methods */
193: 0, /* py_axl_dtd_members, */ /* tp_members */
194: 0, /* tp_getset */
195: 0, /* tp_base */
196: 0, /* tp_dict */
197: 0, /* tp_descr_get */
198: 0, /* tp_descr_set */
199: 0, /* tp_dictoffset */
200: (initproc)py_axl_dtd_init_type, /* tp_init */
201: 0, /* tp_alloc */
202: py_axl_dtd_new, /* tp_new */
203:
204: };
205:
206:
207: /**
208: * @brief Allows to check if the PyObject received represents a
209: * PyAxlDtd reference.
210: */
211: axl_bool py_axl_dtd_check (PyObject * obj)
212: {
213: /* check null references */
214: if (obj == NULL)
215: return axl_false;
216:
217: /* return check result */
218: return PyObject_TypeCheck (obj, &PyAxlDtdType);
219: }
220:
221: PyObject * py_axl_dtd_create (axlDtd * dtd)
222: {
223: /* return a new instance */
224: PyAxlDtd * obj = (PyAxlDtd *) PyObject_CallObject ((PyObject *) &PyAxlDtdType, NULL);
225:
226: /* check ref created */
227: if (obj == NULL) {
228: __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, "Failed to create PyAxlDtd object, returning NULL");
229: return NULL;
230: } /* end if */
231:
232: /* set dtd if defined */
233: if (dtd)
234: obj->dtd = dtd;
235:
236: return __PY_OBJECT (obj);
237: }
238:
239: void init_axl_dtd (PyObject * module)
240: {
241: /* register type */
242: if (PyType_Ready(&PyAxlDtdType) < 0)
243: return;
244:
245: Py_INCREF (&PyAxlDtdType);
246: PyModule_AddObject(module, "Dtd", (PyObject *)&PyAxlDtdType);
247:
248: }
249:
250:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>