Annotation of gpl/axl/py-axl/py_axl.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.h>
39:
40: #define LOG_DOMAIN "py-axl"
41:
42:
43: static PyObject * py_axl_doc_parse (PyObject * self, PyObject * args)
44: {
45: const char * document = NULL;
46: int size = -1;
47: PyObject * doc;
48: axlDoc * _doc;
49: axlError * _error = NULL;
50: PyObject * result;
51: PyObject * error;
52:
53: /* parse and check result */
54: if (! PyArg_ParseTuple (args, "s|i", &document, &size))
55: return NULL;
56:
57: /* parse document */
58: _doc = axl_doc_parse (document, size, &_error);
59: result = PyTuple_New (2);
60: if (_doc == NULL) {
61: /* set none document */
62: Py_INCREF (Py_None);
63: PyTuple_SetItem (result, 0, Py_None);
64:
65: /* create error */
66: error = py_axl_error_create (_error);
67:
68: /* set error */
69: PyTuple_SetItem (result, 1, error);
70:
71: /* return result tuple */
72: return result;
73: } /* end if */
74:
75: /* document parsed ok */
76: doc = py_axl_doc_create (_doc, axl_true);
77: PyTuple_SetItem (result, 0, doc);
78: PyTuple_SetItem (result, 1, Py_None);
79: Py_INCREF (Py_None);
80:
81: return result;
82: }
83:
84: static PyObject * py_axl_doc_parse_from_file (PyObject * self, PyObject * args)
85: {
86: const char * path = NULL;
87: PyObject * doc;
88: axlDoc * _doc;
89: axlError * _error = NULL;
90: PyObject * result;
91: PyObject * error;
92:
93: /* parse and check result */
94: if (! PyArg_ParseTuple (args, "s", &path))
95: return NULL;
96:
97: /* parse document */
98: _doc = axl_doc_parse_from_file (path, &_error);
99: result = PyTuple_New (2);
100: if (_doc == NULL) {
101: /* set none document */
102: Py_INCREF (Py_None);
103: PyTuple_SetItem (result, 0, Py_None);
104:
105: /* create error */
106: error = py_axl_error_create (_error);
107:
108: /* set error */
109: PyTuple_SetItem (result, 1, error);
110:
111: /* return result tuple */
112: return result;
113: } /* end if */
114:
115: /* document parsed ok */
116: doc = py_axl_doc_create (_doc, axl_true);
117: PyTuple_SetItem (result, 0, doc);
118: PyTuple_SetItem (result, 1, Py_None);
119: Py_INCREF (Py_None);
120:
121: return result;
122: }
123:
124: static PyObject * py_axl_dtd_parse_from_file (PyObject * self, PyObject * args)
125: {
126: const char * path = NULL;
127: PyObject * dtd;
128: axlDtd * _dtd;
129: axlError * _error = NULL;
130: PyObject * result;
131: PyObject * error;
132:
133: /* parse and check result */
134: if (! PyArg_ParseTuple (args, "s", &path))
135: return NULL;
136:
137: /* parse document */
138: _dtd = axl_dtd_parse_from_file (path, &_error);
139: result = PyTuple_New (2);
140: if (_dtd == NULL) {
141: /* set none document */
142: Py_INCREF (Py_None);
143: PyTuple_SetItem (result, 0, Py_None);
144:
145: /* create error */
146: error = py_axl_error_create (_error);
147:
148: /* set error */
149: PyTuple_SetItem (result, 1, error);
150:
151: /* return result tuple */
152: return result;
153: } /* end if */
154:
155: /* document parsed ok */
156: dtd = py_axl_dtd_create (_dtd);
157: PyTuple_SetItem (result, 0, dtd);
158: PyTuple_SetItem (result, 1, Py_None);
159: Py_INCREF (Py_None);
160:
161: return result;
162: }
163:
164: static PyObject * py_axl_version (PyObject * self)
165: {
166: return Py_BuildValue ("s", VERSION);
167: }
168:
169: static PyMethodDef py_axl_methods[] = {
170: /* parse */
171: {"parse", (PyCFunction) py_axl_doc_parse, METH_VARARGS,
172: "Parse an string provided returning a new reference to (axl.Doc, axl.Error)"},
173: /* file_parse */
174: {"file_parse", (PyCFunction) py_axl_doc_parse_from_file, METH_VARARGS,
175: "Parse the document found in the file path provided returning a new reference to (axl.Doc, axl.Error)"},
176: /* dtd_file_parse */
177: {"dtd_file_parse", (PyCFunction) py_axl_dtd_parse_from_file, METH_VARARGS,
178: "Parse the DTD document found in the file path provided returning a new reference to (axl.Dtd, axl.Error)"},
179: /* version */
180: {"version", (PyCFunction) py_axl_version, METH_NOARGS,
181: "Returns current py-axl version (with is the same as Axl Library)"},
182: {NULL, NULL, 0, NULL} /* sentinel */
183: };
184:
185: /**
186: * @internal Function that inits all axl modules and classes.
187: */
188: PyMODINIT_FUNC initlibpy_axl (void)
189: {
190: PyObject * module;
191:
192: /* call to initilize threading API and to acquire the lock */
193: PyEval_InitThreads();
194:
195: /* register axl module */
196: module = Py_InitModule3 ("libpy_axl", py_axl_methods,
197: "Base module that implements wrapper functions for base Axl Library");
198: if (module == NULL)
199: return;
200:
201: /* call to register all axl modules and types */
202: init_axl_doc (module);
203: init_axl_error (module);
204: init_axl_node (module);
205: init_axl_attr_cursor (module);
206: init_axl_dtd (module);
207: init_axl_list (module);
208: init_axl_hash (module);
209: init_axl_stack (module);
210: init_axl_stream (module);
211: return;
212: }
213:
214: /**
215: * @internal Handler used to notify exception catched and handled by
216: * py_axl_handle_and_clear_exception.
217: */
218: PyAxlExceptionHandler py_axl_exception_handler = NULL;
219:
220: /**
221: * @brief Allows to check, handle and clear exception state.
222: */
223: void py_axl_handle_and_clear_exception (void)
224: {
225: PyObject * ptype = NULL;
226: PyObject * pvalue = NULL;
227: PyObject * ptraceback = NULL;
228: PyObject * list;
229: PyObject * string;
230: PyObject * mod;
231: int iterator;
232: char * str;
233: char * str_aux;
234:
235:
236: /* check exception */
237: if (PyErr_Occurred()) {
238: __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, "found exception...handling..");
239:
240: /* fetch exception state */
241: PyErr_Fetch(&ptype, &pvalue, &ptraceback);
242:
243: /* import traceback module */
244: mod = PyImport_ImportModule("traceback");
245: if (! mod) {
246: __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, "failed to import traceback module, printing error to console");
247: /* print exception */
248: PyErr_Print ();
249: goto clean_up;
250: } /* end if */
251:
252: /* list of backtrace items */
253: __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, "formating exception: ptype:%p pvalue:%p ptraceback:%p",
254: ptype, pvalue, ptraceback);
255:
256: /* check ptraceback */
257: if (ptraceback == NULL) {
258: ptraceback = Py_None;
259: Py_INCREF (Py_None);
260: } /* end if */
261:
262: list = PyObject_CallMethod (mod, "format_exception", "OOO", ptype, pvalue, ptraceback);
263: iterator = 0;
264: if (py_axl_exception_handler)
265: str = axl_strdup ("");
266: else
267: str = axl_strdup ("PyAxl found exception inside: \n");
268: while (iterator < PyList_Size (list)) {
269: /* get the string */
270: string = PyList_GetItem (list, iterator);
271:
272: str_aux = str;
273: str = axl_strdup_printf ("%s%s", str_aux, PyString_AsString (string));
274: axl_free (str_aux);
275:
276: /* next iterator */
277: iterator++;
278: }
279:
280: /* drop a log */
281: __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, str);
282: if (py_axl_exception_handler) {
283: /* remove trailing \n */
284: str[strlen (str) - 1] = 0;
285: py_axl_exception_handler (str);
286: }
287: /* free message */
288: axl_free (str);
289:
290: /* create an empty string \n */
291: Py_XDECREF (list);
292: Py_DECREF (mod);
293:
294:
295: clean_up:
296: /* call to finish retrieved vars .. */
297: Py_XDECREF (ptype);
298: Py_XDECREF (pvalue);
299: Py_XDECREF (ptraceback);
300:
301: } /* end if */
302:
303: /* clear exception */
304: PyErr_Clear ();
305: return;
306: }
307:
308: /**
309: * @brief Allows to configure a handler that will receive the
310: * exception message created.
311: *
312: * @param handler The handler to configure to receive all exception
313: * handling.
314: */
315: void py_axl_set_exception_handler (PyAxlExceptionHandler handler)
316: {
317: /* configure the handler */
318: py_axl_exception_handler = handler;
319:
320: return;
321: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>