From 1a232d736617da3c4c4f09d2d91924347cb0f9ce Mon Sep 17 00:00:00 2001 From: Johan Dahlin Date: Mon, 11 Oct 2004 09:24:15 +0000 Subject: [PATCH] gst/: Original commit message from CVS: * gst/arg-types.py: * gst/gst.defs: * gst/gst.override: GstXML support, based on patch by poelzi. --- ChangeLog | 8 +++++ gst/arg-types.py | 56 ++++++++++++++++++++++++++++++++++ gst/gst.defs | 2 +- gst/gst.override | 79 ++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 142 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8c81e6fd1e..47ae7407ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-10-11 Johan Dahlin + + * gst/arg-types.py: + * gst/gst.defs: + * gst/gst.override: + + GstXML support, based on patch by poelzi. + 2004-10-10 Zaheer Abbas Merali * gst/gstmodule.c: (init_gst): diff --git a/gst/arg-types.py b/gst/arg-types.py index 47f7a7ca90..7355867a8f 100644 --- a/gst/arg-types.py +++ b/gst/arg-types.py @@ -48,10 +48,66 @@ class GstDataPtrArg(ArgType): info.arglist.append(pname) info.codebefore.append(self.normal % {'name': pname}) +class XmlNodeArg(ArgType): + """libxml2 node generator""" + + names = {"xobj":"xmlNode", + "xptr":"xmlNodePtr", + "xwrap":"libxml_xmlNodePtrWrap"} + + parm = (' if(xml == NULL) return NULL;\n' + ' xobj = PyObject_GetAttrString(xml, "%(xobj)s");\n' + ' if(!PyObject_IsInstance(py%(name)s, xobj)) {\n' + ' PyErr_Clear();\n' + ' PyErr_SetString(PyExc_RuntimeError,"%(name)s is not a %(xobj)s instance");\n' + ' Py_DECREF(xobj);Py_DECREF(xml);\n' + ' return NULL;\n' + ' }\n' + ' o = PyObject_GetAttrString(py%(name)s, "_o");\n' + ' %(name)s = PyCObject_AsVoidPtr(o);\n') + parmp = (' Py_DECREF(o); Py_DECREF(xobj);Py_DECREF(xml);\n') + + ret = (' if(xml == NULL) return NULL;\n') + retp = (' xargs = PyTuple_New(1);\n' + ' xobj = PyObject_GetAttrString(xml, "%(xobj)s");\n' + ' o = %(xwrap)s(ret);\n' + ' PyTuple_SetItem(xargs, 0, o);\n' + ' return PyInstance_New(xobj, xargs, PyDict_New());\n') + + def write_param(self, ptype, pname, pdflt, pnull, info): + info.varlist.add('PyObject', '*xml = _gst_get_libxml2_module()') + info.varlist.add('PyObject', '*o') + info.varlist.add('PyObject', '*xobj') + info.varlist.add('PyObject', '*py' + pname) + info.varlist.add(self.names["xptr"], pname) + #if pnull: + info.add_parselist('O', ['&py'+pname], [pname]) + info.arglist.append(pname) + self.names["name"] = pname + info.codebefore.append(self.parm %self.names) + info.codeafter.append(self.parmp % self.names); + def write_return(self, ptype, ownsreturn, info): + info.varlist.add('PyObject', '*xml = _gst_get_libxml2_module()') + info.varlist.add('PyObject', '*xargs') + info.varlist.add('PyObject', '*xobj') + info.varlist.add('PyObject', '*o') + info.varlist.add(self.names["xptr"], 'ret') + info.codebefore.append(self.ret % self.names) + info.codeafter.append(self.retp % self.names) + +class XmlDocArg(XmlNodeArg): + """libxml2 doc generator""" + names = {"xobj":"xmlDoc", + "xptr":"xmlDocPtr", + "xwrap":"libxml_xmlDocPtrWrap"} + + arg = GstDataPtrArg() matcher.register('GstData*', arg) matcher.register('GstClockTime', UInt64Arg()) matcher.register('GstClockTimeDiff', Int64Arg()) +matcher.register('xmlNodePtr', XmlNodeArg()) +matcher.register('xmlDocPtr', XmlDocArg()) arg = PointerArg('gpointer', 'G_TYPE_POINTER') matcher.register('GstClockID', arg) diff --git a/gst/gst.defs b/gst/gst.defs index e0c3e471b1..1a60252016 100644 --- a/gst/gst.defs +++ b/gst/gst.defs @@ -6024,7 +6024,7 @@ (define-function xml_new (c-name "gst_xml_new") - (is-constructor-of "GstXml") + (is-constructor-of "GstXML") (return-type "GstXML*") ) diff --git a/gst/gst.override b/gst/gst.override index d4fdf5765a..8b2fdf1b9d 100644 --- a/gst/gst.override +++ b/gst/gst.override @@ -27,7 +27,6 @@ headers #endif #include "common.h" -#include "gstmain.h" #include #include @@ -89,7 +88,6 @@ ignore-glob gst_interface_* gst_tag_list_get_* gst_value_* - gst_xml_* %% ignore gst_alloc_trace_list @@ -1167,3 +1165,80 @@ _wrap_gst_registry_pool_feature_list(PyGObject *self, PyObject *args) return list; } +%% +override gst_xml_new noargs + +/* libxml2 available check */ +static PyObject * +_gst_get_libxml2_module(void) +{ + PyObject *xml = NULL; + + xml = PyImport_ImportModule("libxml2"); + if (!xml) { + PyErr_Clear(); + PyErr_SetString(PyExc_RuntimeError,"libxml2 bindings required"); + return NULL; + } + + return xml; + } + +static int +_wrap_gst_xml_new(PyGObject *self) +{ + PyObject *xml = _gst_get_libxml2_module(); + + if(!xml) + return -1; + + self->obj = (GObject *)gst_xml_new(); + + if (!self->obj) { + PyErr_SetString(PyExc_RuntimeError, "could not create GstXML object"); + return -1; + } + + pygobject_register_wrapper((PyObject *)self); + + return 0; +} +%% +override gst_xml_get_topelements noargs +static PyObject * +_wrap_gst_xml_get_topelements(PyGObject *self) +{ + GList *l, *xml_elements; + PyObject *py_list; + + py_list = PyList_New(0); + + xml_elements = gst_xml_get_topelements(GST_XML(self->obj)); + for (l = xml_elements; l; l = l->next) { + GstElement *element = (GstElement*)l->data; + + PyList_Append(py_list, pygobject_new(G_OBJECT(element))); + } + + return py_list; +} +%% +override gst_xml_parse_memory kwargs +static PyObject * +_wrap_gst_xml_parse_memory(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "buffer", "root", NULL }; + int buffer_len, ret; + char *root = NULL; + guchar *buffer; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "s#|s:GstXML.parse_memory", + kwlist, &buffer, &buffer_len, &root)) + return NULL; + + ret = gst_xml_parse_memory(GST_XML(self->obj), + buffer, buffer_len, root); + + return PyBool_FromLong(ret); +}