Annotation of gpl/axl/py-axl/py_axl_doc.c, revision 1.1.1.2

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 */
1.1.1.2 ! misho     135:                __axl_log (LOG_DOMAIN, AXL_LEVEL_DEBUG, "reporting root node (doc ref: %p, ref count: %d)",
        !           136:                           self, self->ob_refcnt);
        !           137:                return py_axl_node_create (axl_doc_get_root (self->doc), axl_false, o);
1.1       misho     138:        }
                    139: 
                    140:        /* first implement generic attr already defined */
                    141:        result = PyObject_GenericGetAttr (o, attr_name);
                    142:        if (result)
                    143:                return result;
                    144:        
                    145:        return NULL;
                    146: }
                    147: 
                    148: /** 
                    149:  * @brief Implements attribute set operation.
                    150:  */
                    151: int py_axl_doc_set_attr (PyObject *o, PyObject *attr_name, PyObject *v)
                    152: {
                    153:        const char      * attr    = NULL;
                    154:        PyAxlDoc        * self    = (PyAxlDoc *) o; 
                    155:        PyObject        * py_node = NULL;
                    156: 
                    157:        /* now implement other attributes */
                    158:        if (! PyArg_Parse (attr_name, "s", &attr))
                    159:                return -1;
                    160: 
                    161:        if (axl_cmp (attr, "root")) {
                    162:                if (! PyArg_Parse (v, "O", &py_node))
                    163:                        return -1;
                    164: 
                    165:                /* configure the node */
                    166:                axl_doc_set_root (self->doc, py_axl_node_get (py_node));
1.1.1.2 ! misho     167: 
        !           168:                /* set the node to not dealloc internal node */
        !           169:                py_axl_node_set_dealloc (py_node, axl_false);
        !           170: 
1.1       misho     171:                return 0;
                    172:        }
                    173: 
                    174:        /* now implement generic setter */
                    175:        return PyObject_GenericSetAttr (o, attr_name, v);
                    176: }
                    177: 
                    178: static PyObject * py_axl_doc_get_node (PyObject * _self, PyObject * args)
                    179: {
                    180:        PyAxlDoc  * self = (PyAxlDoc *) _self;
                    181:        const char * path = NULL;
                    182:        axlNode    * node = NULL;
                    183: 
                    184:        /* parse and check result */
                    185:        if (! PyArg_ParseTuple (args, "s", &path))
                    186:                return NULL;
                    187:        
                    188:        /* get next called */
                    189:        node = axl_doc_get (self->doc, path);
                    190:        if (node == NULL) {
                    191:                Py_INCREF (Py_None);
                    192:                return Py_None;
                    193:        } /* end if */
                    194:        
                    195:        /* create node result */
1.1.1.2 ! misho     196:        return py_axl_node_create (node, axl_false, _self);
1.1       misho     197: }
                    198: 
                    199: static PyObject * py_axl_doc_dump (PyObject * _self, PyObject * args, PyObject * kwds)
                    200: {
                    201:        PyAxlDoc   * self    = (PyAxlDoc *) _self;
                    202:        int          tabular = 0;
                    203:        char       * content = NULL;
                    204:        int          size    = 0;
                    205:        PyObject   * result;
                    206:        
                    207: 
                    208:        /* parse and check result */
                    209:        if (PyTuple_Size (args) == 0) {
                    210:                /* simple dump operation */
                    211:                /* dump content */
                    212:                if (! axl_doc_dump (self->doc, &content, &size)) {
                    213:                        /* failed to dump */
                    214:                        PyErr_SetString (PyExc_TypeError, "axl_doc_dump operation failed, unable to produce dumped content");
                    215:                        return NULL;
                    216:                } /* end if */
                    217: 
                    218:                /* create the tuple */
                    219:                result = PyTuple_New (2);
                    220:                PyTuple_SetItem (result, 0, Py_BuildValue ("s", content));
                    221:                axl_free (content);
                    222:                PyTuple_SetItem (result, 1, Py_BuildValue ("i", size));
                    223:        } else {
                    224:                /* dump with tabular configuration */
                    225:                if (! PyArg_ParseTuple (args, "i", &tabular))
                    226:                        return NULL;
                    227:                
                    228:                /* check tabular value */
                    229:                if (tabular < 0) {
                    230:                        PyErr_SetString (PyExc_ValueError, "failed to produce dump operation, received a non-positive (including 0) tabular value");
                    231:                        return NULL;
                    232:                } /* end if */
                    233:                
                    234:                /* dump content with tabular configured */
                    235:                if (! axl_doc_dump_pretty (self->doc, &content, &size, tabular)) {
                    236:                        /* failed to dump */
                    237:                        PyErr_SetString (PyExc_TypeError, "axl_doc_dump operation failed, unable to produce dumped content");
                    238:                        return NULL;
                    239:                } /* end if */
                    240: 
                    241:                /* create the tuple */
                    242:                result = PyTuple_New (2);
                    243:                PyTuple_SetItem (result, 0, Py_BuildValue ("s", content));
                    244:                axl_free (content);
                    245:                PyTuple_SetItem (result, 1, Py_BuildValue ("i", size));
                    246:        } /* end if */
                    247: 
                    248:        /* return tuple */
                    249:        return result;
                    250: }
                    251: 
                    252: static PyObject * py_axl_doc_file_dump (PyObject * _self, PyObject * args, PyObject * kwds)
                    253: {
                    254:        PyAxlDoc   * self    = (PyAxlDoc *) _self;
                    255:        int          tabular = 0;
                    256:        char       * file    = NULL;
                    257: 
                    258:        /* parse and check result */
                    259:        if (PyTuple_Size (args) == 1) {
                    260: 
                    261:                /* dump with tabular configuration */
                    262:                if (! PyArg_ParseTuple (args, "s", &file))
                    263:                        return NULL;
                    264: 
                    265:                /* simple dump operation */
                    266:                /* dump content */
                    267:                if (! axl_doc_dump_to_file (self->doc, file)) {
                    268:                        /* failed to dump */
                    269:                        PyErr_SetString (PyExc_TypeError, "axl_doc_dump_to_file operation failed, unable to produce dumped content");
                    270:                        return NULL;
                    271:                } /* end if */
                    272:                
                    273:        } else if (PyTuple_Size (args) == 2) {
                    274: 
                    275:                /* dump with tabular configuration */
                    276:                if (! PyArg_ParseTuple (args, "si", &file, &tabular))
                    277:                        return NULL;
                    278: 
                    279:                /* simple dump operation */
                    280:                /* dump content */
                    281:                if (! axl_doc_dump_pretty_to_file (self->doc, file, tabular)) {
                    282:                        /* failed to dump */
                    283:                        PyErr_SetString (PyExc_TypeError, "axl_doc_dump_pretty_to_file operation failed, unable to produce dumped content");
                    284:                        return NULL;
                    285:                } /* end if */
                    286: 
                    287:        } /* end if */
                    288: 
                    289:        /* return ok operation */
                    290:        return Py_BuildValue ("i", 1);
                    291: }
                    292: 
                    293: static PyObject * py_axl_doc_has_pi (PyObject * _self, PyObject * args)
                    294: {
                    295:        PyAxlDoc  * self      = (PyAxlDoc *) _self;
                    296:        char      * pi_name   = NULL;
                    297: 
                    298:        /* parse and check result */
                    299:        if (! PyArg_ParseTuple (args, "s", &pi_name))
                    300:                return NULL;
                    301:        
                    302:        return Py_BuildValue ("i", axl_doc_has_pi_target (self->doc, pi_name));
                    303: }
                    304: 
                    305: static PyObject * py_axl_doc_pi_value (PyObject * _self, PyObject * args)
                    306: {
                    307:        PyAxlDoc  * self    = (PyAxlDoc *) _self;
                    308:        char      * pi_name = NULL;
                    309: 
                    310:        /* parse and check result */
                    311:        if (! PyArg_ParseTuple (args, "s", &pi_name))
                    312:                return NULL;
                    313:        
                    314:        return Py_BuildValue ("z", axl_doc_get_pi_target_content (self->doc, pi_name));
                    315: }
                    316: 
                    317: static PyMethodDef py_axl_doc_methods[] = { 
                    318:        /* next_called */
                    319:        {"get", (PyCFunction) py_axl_doc_get_node, METH_VARARGS,
                    320:         "Allows to get a node found at a particular path (method wrapper of axl_doc_get)"},
                    321:        /* next_called */
                    322:        {"dump", (PyCFunction) py_axl_doc_dump, METH_VARARGS | METH_KEYWORDS,
                    323:         "Allows to perform a dump operation returning the content and the size that result in a tuple."},
                    324:        {"file_dump", (PyCFunction) py_axl_doc_file_dump, METH_VARARGS | METH_KEYWORDS,
                    325:         "Allows to perform a dump operation sending the content to a file."},
                    326:        /* has_pi */
                    327:        {"has_pi", (PyCFunction) py_axl_doc_has_pi, METH_VARARGS,
                    328:         "Allows to check if the provided doc has the given process instruction."},
                    329:        /* pi */
                    330:        {"pi", (PyCFunction) py_axl_doc_pi_value, METH_VARARGS,
                    331:         "Allows to get the value of the given process instruction on the provided doc."},
                    332:        {NULL, NULL, 0, NULL}  
                    333: }; 
                    334: 
1.1.1.2 ! misho     335: static PyObject * py_axl_doc_str (PyObject * _self)
        !           336: {
        !           337:        char      * dump   = NULL;
        !           338:        int         size   = 0;
        !           339:        PyAxlDoc  * self   = (PyAxlDoc *) _self;
        !           340:        PyObject  * result = NULL;
        !           341: 
        !           342:        if (self == NULL || self->doc == NULL) {
        !           343:                Py_INCREF (Py_None);
        !           344:                return Py_None;
        !           345:        }
        !           346:        
        !           347:        if (! axl_doc_dump_pretty (self->doc, &dump, &size, 4)) {
        !           348:                Py_INCREF (Py_None);
        !           349:                return Py_None;
        !           350:        }
        !           351: 
        !           352:        result = Py_BuildValue ("z", dump);
        !           353:        axl_free (dump);
        !           354:        return result;
        !           355: }
        !           356: 
1.1       misho     357: static PyTypeObject PyAxlDocType = {
                    358:     PyObject_HEAD_INIT(NULL)
                    359:     0,                         /* ob_size*/
                    360:     "axl.Doc",                 /* tp_name*/
                    361:     sizeof(PyAxlDoc),       /* tp_basicsize*/
                    362:     0,                         /* tp_itemsize*/
                    363:     (destructor)py_axl_doc_dealloc, /* tp_dealloc*/
                    364:     0,                         /* tp_print*/
                    365:     0,                         /* tp_getattr*/
                    366:     0,                         /* tp_setattr*/
                    367:     0,                         /* tp_compare*/
                    368:     0,                         /* tp_repr*/
                    369:     0,                         /* tp_as_number*/
                    370:     0,                         /* tp_as_sequence*/
                    371:     0,                         /* tp_as_mapping*/
                    372:     0,                         /* tp_hash */
                    373:     0,                         /* tp_call*/
1.1.1.2 ! misho     374:     py_axl_doc_str,            /* tp_str*/
1.1       misho     375:     py_axl_doc_get_attr,    /* tp_getattro*/
                    376:     py_axl_doc_set_attr,    /* tp_setattro*/
                    377:     0,                         /* tp_as_buffer*/
                    378:     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /* tp_flags*/
                    379:     "Document object; wrapper of axlDoc API type",           /* tp_doc */
                    380:     0,                        /* tp_traverse */
                    381:     0,                        /* tp_clear */
                    382:     0,                        /* tp_richcompare */
                    383:     0,                        /* tp_weaklistoffset */
                    384:     0,                        /* tp_iter */
                    385:     0,                        /* tp_iternext */
                    386:     py_axl_doc_methods,     /* tp_methods */
                    387:     0, /* py_axl_doc_members, */     /* tp_members */
                    388:     0,                         /* tp_getset */
                    389:     0,                         /* tp_base */
                    390:     0,                         /* tp_dict */
                    391:     0,                         /* tp_descr_get */
                    392:     0,                         /* tp_descr_set */
                    393:     0,                         /* tp_dictoffset */
                    394:     (initproc)py_axl_doc_init_type,      /* tp_init */
                    395:     0,                         /* tp_alloc */
                    396:     py_axl_doc_new,         /* tp_new */
                    397: 
                    398: };
                    399: 
                    400: 
                    401: /** 
                    402:  * @brief Allows to check if the PyObject received represents a
                    403:  * PyAxlDoc reference.
                    404:  */
                    405: axl_bool             py_axl_doc_check    (PyObject          * obj)
                    406: {
                    407:        /* check null references */
                    408:        if (obj == NULL)
                    409:                return axl_false;
                    410: 
                    411:        /* return check result */
                    412:        return PyObject_TypeCheck (obj, &PyAxlDocType);
                    413: }
                    414: 
                    415: PyObject   * py_axl_doc_create    (axlDoc * doc, axl_bool finish_on_gc)
                    416: {
                    417:        /* return a new instance */
                    418:        PyAxlDoc * obj = (PyAxlDoc *) PyObject_CallObject ((PyObject *) &PyAxlDocType, NULL); 
                    419: 
                    420:        /* check ref created */
                    421:        if (obj == NULL) {
                    422:                __axl_log (LOG_DOMAIN, AXL_LEVEL_CRITICAL, "Failed to create PyAxlDoc object, returning NULL");
                    423:                return NULL;
                    424:        } /* end if */
                    425: 
                    426:        /* configure finish handling */
                    427:        obj->finish_on_gc = finish_on_gc;
                    428: 
                    429:        /* set doc if defined */
                    430:        if (doc) {
1.1.1.2 ! misho     431:                __axl_log (LOG_DOMAIN, AXL_LEVEL_DEBUG, "Created axl.Doc reference (%p), refcount: %d",
        !           432:                           obj, obj->ob_refcnt);
1.1       misho     433:                /* clear previous reference */
                    434:                axl_doc_free (obj->doc);
                    435:                obj->doc = doc;
                    436:        }
                    437: 
                    438:        return __PY_OBJECT (obj);
                    439: }
                    440: 
                    441: axlDoc     * py_axl_doc_get      (PyObject * doc)
                    442: {
                    443:        PyAxlDoc * _doc = (PyAxlDoc *) doc;
                    444:        
                    445:        if (! py_axl_doc_check (doc))
                    446:                return NULL;
                    447:        /* return doc reference */
                    448:        return _doc->doc;
                    449: }
                    450: 
                    451: void        init_axl_doc      (PyObject * module)
                    452: {
                    453:        /* register type */
                    454:        if (PyType_Ready(&PyAxlDocType) < 0)
                    455:                return;
                    456:        
                    457:        Py_INCREF (&PyAxlDocType);
                    458:        PyModule_AddObject(module, "Doc", (PyObject *)&PyAxlDocType);
                    459: 
                    460: }
                    461: 
                    462: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>