Annotation of gpl/axl/py-axl/py_axl_doc.c, revision 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_doc.h>
! 39:
! 40: #define LOG_DOMAIN "py-axl-doc"
! 41:
! 42: struct _PyAxlDoc {
! 43: /* header required to initialize python required bits for
! 44: every python object */
! 45: PyObject_HEAD
! 46:
! 47: /* pointer to the axl doc */
! 48: axlDoc * doc;
! 49: /* release the document on gc */
! 50: axl_bool finish_on_gc;
! 51: };
! 52:
! 53: static int py_axl_doc_init_type (PyAxlDoc *self, PyObject *args, PyObject *kwds)
! 54: {
! 55: return 0;
! 56: }
! 57:
! 58: /**
! 59: * @brief Function used to allocate memory required by the object
! 60: * axl.Doc
! 61: */
! 62: static PyObject * py_axl_doc_new (PyTypeObject *type, PyObject *args, PyObject *kwds)
! 63: {
! 64: PyAxlDoc * self;
! 65: const char * version = NULL;
! 66: const char * encoding = NULL;
! 67: axl_bool stand_alone = axl_true;
! 68:
! 69: /* now parse arguments */
! 70: static char *kwlist[] = {"version", "encoding", "standalone", NULL};
! 71:
! 72: /* create the object */
! 73: self = (PyAxlDoc *)type->tp_alloc(type, 0);
! 74:
! 75: /* in the case the constructor was called with arguments,
! 76: * check them */
! 77: if (! PyArg_ParseTupleAndKeywords(args, kwds, "|ssi", kwlist, &version, &encoding, &stand_alone))
! 78: return NULL;
! 79:
! 80: /* create the document */
! 81: self->finish_on_gc = axl_true;
! 82: self->doc = axl_doc_create (version, encoding, stand_alone);
! 83:
! 84: /* return reference created */
! 85: return (PyObject *)self;
! 86: }
! 87:
! 88: /**
! 89: * @brief Function used to finish and dealloc memory used by the
! 90: * object axl.Doc
! 91: */
! 92: static void py_axl_doc_dealloc (PyAxlDoc* self)
! 93: {
! 94: /* free document and nullfy pointer */
! 95: if (self->finish_on_gc)
! 96: axl_doc_free (self->doc);
! 97: self->doc = NULL;
! 98:
! 99: /* free the node it self */
! 100: self->ob_type->tp_free ((PyObject*)self);
! 101:
! 102: return;
! 103: }
! 104:
! 105: /**
! 106: * @brief This function implements the generic attribute getting that
! 107: * allows to perform complex member resolution (not merely direct
! 108: * member access).
! 109: */
! 110: PyObject * py_axl_doc_get_attr (PyObject *o, PyObject *attr_name) {
! 111: const char * attr = NULL;
! 112: PyObject * result;
! 113: PyAxlDoc * self = (PyAxlDoc *) o;
! 114:
! 115: /* now implement other attributes */
! 116: if (! PyArg_Parse (attr_name, "s", &attr))
! 117: return NULL;
! 118:
! 119: __axl_log (LOG_DOMAIN, AXL_LEVEL_DEBUG, "received request to report doc attr name %s (self: %p)",
! 120: attr, o);
! 121: if (axl_cmp (attr, "encoding")) {
! 122: /* encoding */
! 123: return Py_BuildValue ("s", axl_doc_get_encoding (self->doc));
! 124: } else if (axl_cmp (attr, "standalone") || axl_cmp (attr, "stand_alone")) {
! 125: /* standalone */
! 126: return Py_BuildValue ("i", axl_doc_get_standalone (self->doc));
! 127: } else if (axl_cmp (attr, "root")) {
! 128: if (axl_doc_get_root (self->doc) == NULL) {
! 129: Py_INCREF (Py_None);
! 130: return Py_None;
! 131: }
! 132:
! 133: /* return root axl node: signaling to not finish the
! 134: * internal copy once it is collected the reference */
! 135: return py_axl_node_create (axl_doc_get_root (self->doc), axl_false);
! 136: }
! 137:
! 138: /* first implement generic attr already defined */
! 139: result = PyObject_GenericGetAttr (o, attr_name);
! 140: if (result)
! 141: return result;
! 142:
! 143: return NULL;
! 144: }
! 145:
! 146: /**
! 147: * @brief Implements attribute set operation.
! 148: */
! 149: int py_axl_doc_set_attr (PyObject *o, PyObject *attr_name, PyObject *v)
! 150: {
! 151: const char * attr = NULL;
! 152: PyAxlDoc * self = (PyAxlDoc *) o;
! 153: PyObject * py_node = NULL;
! 154:
! 155: /* now implement other attributes */
! 156: if (! PyArg_Parse (attr_name, "s", &attr))
! 157: return -1;
! 158:
! 159: if (axl_cmp (attr, "root")) {
! 160: if (! PyArg_Parse (v, "O", &py_node))
! 161: return -1;
! 162:
! 163: /* configure the node */
! 164: axl_doc_set_root (self->doc, py_axl_node_get (py_node));
! 165: return 0;
! 166: }
! 167:
! 168: /* now implement generic setter */
! 169: return PyObject_GenericSetAttr (o, attr_name, v);
! 170: }
! 171:
! 172: static PyObject * py_axl_doc_get_node (PyObject * _self, PyObject * args)
! 173: {
! 174: PyAxlDoc * self = (PyAxlDoc *) _self;
! 175: const char * path = NULL;
! 176: axlNode * node = NULL;
! 177:
! 178: /* parse and check result */
! 179: if (! PyArg_ParseTuple (args, "s", &path))
! 180: return NULL;
! 181:
! 182: /* get next called */
! 183: node = axl_doc_get (self->doc, path);
! 184: if (node == NULL) {
! 185: Py_INCREF (Py_None);
! 186: return Py_None;
! 187: } /* end if */
! 188:
! 189: /* create node result */
! 190: return py_axl_node_create (node, axl_false);
! 191: }
! 192:
! 193: static PyObject * py_axl_doc_dump (PyObject * _self, PyObject * args, PyObject * kwds)
! 194: {
! 195: PyAxlDoc * self = (PyAxlDoc *) _self;
! 196: int tabular = 0;
! 197: char * content = NULL;
! 198: int size = 0;
! 199: PyObject * result;
! 200:
! 201:
! 202: /* parse and check result */
! 203: if (PyTuple_Size (args) == 0) {
! 204: /* simple dump operation */
! 205: /* dump content */
! 206: if (! axl_doc_dump (self->doc, &content, &size)) {
! 207: /* failed to dump */
! 208: PyErr_SetString (PyExc_TypeError, "axl_doc_dump operation failed, unable to produce dumped content");
! 209: return NULL;
! 210: } /* end if */
! 211:
! 212: /* create the tuple */
! 213: result = PyTuple_New (2);
! 214: PyTuple_SetItem (result, 0, Py_BuildValue ("s", content));
! 215: axl_free (content);
! 216: PyTuple_SetItem (result, 1, Py_BuildValue ("i", size));
! 217: } else {
! 218: /* dump with tabular configuration */
! 219: if (! PyArg_ParseTuple (args, "i", &tabular))
! 220: return NULL;
! 221:
! 222: /* check tabular value */
! 223: if (tabular < 0) {
! 224: PyErr_SetString (PyExc_ValueError, "failed to produce dump operation, received a non-positive (including 0) tabular value");
! 225: return NULL;
! 226: } /* end if */
! 227:
! 228: /* dump content with tabular configured */
! 229: if (! axl_doc_dump_pretty (self->doc, &content, &size, tabular)) {
! 230: /* failed to dump */
! 231: PyErr_SetString (PyExc_TypeError, "axl_doc_dump operation failed, unable to produce dumped content");
! 232: return NULL;
! 233: } /* end if */
! 234:
! 235: /* create the tuple */
! 236: result = PyTuple_New (2);
! 237: PyTuple_SetItem (result, 0, Py_BuildValue ("s", content));
! 238: axl_free (content);
! 239: PyTuple_SetItem (result, 1, Py_BuildValue ("i", size));
! 240: } /* end if */
! 241:
! 242: /* return tuple */
! 243: return result;
! 244: }
! 245:
! 246: static PyObject * py_axl_doc_file_dump (PyObject * _self, PyObject * args, PyObject * kwds)
! 247: {
! 248: PyAxlDoc * self = (PyAxlDoc *) _self;
! 249: int tabular = 0;
! 250: char * file = NULL;
! 251:
! 252: /* parse and check result */
! 253: if (PyTuple_Size (args) == 1) {
! 254:
! 255: /* dump with tabular configuration */
! 256: if (! PyArg_ParseTuple (args, "s", &file))
! 257: return NULL;
! 258:
! 259: /* simple dump operation */
! 260: /* dump content */
! 261: if (! axl_doc_dump_to_file (self->doc, file)) {
! 262: /* failed to dump */
! 263: PyErr_SetString (PyExc_TypeError, "axl_doc_dump_to_file operation failed, unable to produce dumped content");
! 264: return NULL;
! 265: } /* end if */
! 266:
! 267: } else if (PyTuple_Size (args) == 2) {
! 268:
! 269: /* dump with tabular configuration */
! 270: if (! PyArg_ParseTuple (args, "si", &file, &tabular))
! 271: return NULL;
! 272:
! 273: /* simple dump operation */
! 274: /* dump content */
! 275: if (! axl_doc_dump_pretty_to_file (self->doc, file, tabular)) {
! 276: /* failed to dump */
! 277: PyErr_SetString (PyExc_TypeError, "axl_doc_dump_pretty_to_file operation failed, unable to produce dumped content");
! 278: return NULL;
! 279: } /* end if */
! 280:
! 281: } /* end if */
! 282:
! 283: /* return ok operation */
! 284: return Py_BuildValue ("i", 1);
! 285: }
! 286:
! 287: static PyObject * py_axl_doc_has_pi (PyObject * _self, PyObject * args)
! 288: {
! 289: PyAxlDoc * self = (PyAxlDoc *) _self;
! 290: char * pi_name = NULL;
! 291:
! 292: /* parse and check result */
! 293: if (! PyArg_ParseTuple (args, "s", &pi_name))
! 294: return NULL;
! 295:
! 296: return Py_BuildValue ("i", axl_doc_has_pi_target (self->doc, pi_name));
! 297: }
! 298:
! 299: static PyObject * py_axl_doc_pi_value (PyObject * _self, PyObject * args)
! 300: {
! 301: PyAxlDoc * self = (PyAxlDoc *) _self;
! 302: char * pi_name = NULL;
! 303:
! 304: /* parse and check result */
! 305: if (! PyArg_ParseTuple (args, "s", &pi_name))
! 306: return NULL;
! 307:
! 308: return Py_BuildValue ("z", axl_doc_get_pi_target_content (self->doc, pi_name));
! 309: }
! 310:
! 311: static PyMethodDef py_axl_doc_methods[] = {
! 312: /* next_called */
! 313: {"get", (PyCFunction) py_axl_doc_get_node, METH_VARARGS,
! 314: "Allows to get a node found at a particular path (method wrapper of axl_doc_get)"},
! 315: /* next_called */
! 316: {"dump", (PyCFunction) py_axl_doc_dump, METH_VARARGS | METH_KEYWORDS,
! 317: "Allows to perform a dump operation returning the content and the size that result in a tuple."},
! 318: {"file_dump", (PyCFunction) py_axl_doc_file_dump, METH_VARARGS | METH_KEYWORDS,
! 319: "Allows to perform a dump operation sending the content to a file."},
! 320: /* has_pi */
! 321: {"has_pi", (PyCFunction) py_axl_doc_has_pi, METH_VARARGS,
! 322: "Allows to check if the provided doc has the given process instruction."},
! 323: /* pi */
! 324: {"pi", (PyCFunction) py_axl_doc_pi_value, METH_VARARGS,
! 325: "Allows to get the value of the given process instruction on the provided doc."},
! 326: {NULL, NULL, 0, NULL}
! 327: };
! 328:
! 329: static PyTypeObject PyAxlDocType = {
! 330: PyObject_HEAD_INIT(NULL)
! 331: 0, /* ob_size*/
! 332: "axl.Doc", /* tp_name*/
! 333: sizeof(PyAxlDoc), /* tp_basicsize*/
! 334: 0, /* tp_itemsize*/
! 335: (destructor)py_axl_doc_dealloc, /* tp_dealloc*/
! 336: 0, /* tp_print*/
! 337: 0, /* tp_getattr*/
! 338: 0, /* tp_setattr*/
! 339: 0, /* tp_compare*/
! 340: 0, /* tp_repr*/
! 341: 0, /* tp_as_number*/
! 342: 0, /* tp_as_sequence*/
! 343: 0, /* tp_as_mapping*/
! 344: 0, /* tp_hash */
! 345: 0, /* tp_call*/
! 346: 0, /* tp_str*/
! 347: py_axl_doc_get_attr, /* tp_getattro*/
! 348: py_axl_doc_set_attr, /* tp_setattro*/
! 349: 0, /* tp_as_buffer*/
! 350: Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags*/
! 351: "Document object; wrapper of axlDoc API type", /* tp_doc */
! 352: 0, /* tp_traverse */
! 353: 0, /* tp_clear */
! 354: 0, /* tp_richcompare */
! 355: 0, /* tp_weaklistoffset */
! 356: 0, /* tp_iter */
! 357: 0, /* tp_iternext */
! 358: py_axl_doc_methods, /* tp_methods */
! 359: 0, /* py_axl_doc_members, */ /* tp_members */
! 360: 0, /* tp_getset */
! 361: 0, /* tp_base */
! 362: 0, /* tp_dict */
! 363: 0, /* tp_descr_get */
! 364: 0, /* tp_descr_set */
! 365: 0, /* tp_dictoffset */
! 366: (initproc)py_axl_doc_init_type, /* tp_init */
! 367: 0, /* tp_alloc */
! 368: py_axl_doc_new, /* tp_new */
! 369:
! 370: };
! 371:
! 372:
! 373: /**
! 374: * @brief Allows to check if the PyObject received represents a
! 375: * PyAxlDoc reference.
! 376: */
! 377: axl_bool py_axl_doc_check (PyObject * obj)
! 378: {
! 379: /* check null references */
! 380: if (obj == NULL)
! 381: return axl_false;
! 382:
! 383: /* return check result */
! 384: return PyObject_TypeCheck (obj, &PyAxlDocType);
! 385: }
! 386:
! 387: PyObject * py_axl_doc_create (axlDoc * doc, axl_bool finish_on_gc)
! 388: {
! 389: /* return a new instance */
! 390: PyAxlDoc * obj = (PyAxlDoc *) PyObject_CallObject ((PyObject *) &PyAxlDocType, NULL);
! 391:
! 392: /* check ref created */
! 393: if (obj == NULL) {
! 394: __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, "Failed to create PyAxlDoc object, returning NULL");
! 395: return NULL;
! 396: } /* end if */
! 397:
! 398: /* configure finish handling */
! 399: obj->finish_on_gc = finish_on_gc;
! 400:
! 401: /* set doc if defined */
! 402: if (doc) {
! 403: /* clear previous reference */
! 404: axl_doc_free (obj->doc);
! 405: obj->doc = doc;
! 406: }
! 407:
! 408: return __PY_OBJECT (obj);
! 409: }
! 410:
! 411: axlDoc * py_axl_doc_get (PyObject * doc)
! 412: {
! 413: PyAxlDoc * _doc = (PyAxlDoc *) doc;
! 414:
! 415: if (! py_axl_doc_check (doc))
! 416: return NULL;
! 417: /* return doc reference */
! 418: return _doc->doc;
! 419: }
! 420:
! 421: void init_axl_doc (PyObject * module)
! 422: {
! 423: /* register type */
! 424: if (PyType_Ready(&PyAxlDocType) < 0)
! 425: return;
! 426:
! 427: Py_INCREF (&PyAxlDocType);
! 428: PyModule_AddObject(module, "Doc", (PyObject *)&PyAxlDocType);
! 429:
! 430: }
! 431:
! 432:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>