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>