File:  [ELWIX - Embedded LightWeight unIX -] / gpl / axl / py-axl / py_axl_dtd.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 8 07:09:12 2011 UTC (13 years, 1 month ago) by misho
Branches: axl, MAIN
CVS tags: HEAD, AXL0_6_7, AXL0_6_1
3th party - XML

    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>