On Thu, Dec 11, 2014 at 11:29:48AM +0000, Richard W.M. Jones wrote: > This returns the raw C pointer to the underlying object, eg: > > conn = libvirt.open(None) > print "0x%x" % conn.c_pointer() # returns virConnectPtr of the connection > dom = conn.lookupByName("test") > print "0x%x" % dom.c_pointer() # returns virDomainPtr of the domain > > The reason behind this is to allow us to transparently pass Python dom > objects through the libguestfs Python API. Yep, that makes sense, since the alternative is the poke around in private attributes. > > https://bugzilla.redhat.com/show_bug.cgi?id=1075164 > --- > generator.py | 32 ++++++++++++++++++++++++++++++++ > sanitytest.py | 2 ++ > 2 files changed, 34 insertions(+) > > diff --git a/generator.py b/generator.py > index 20df54f..cf044c9 100755 > --- a/generator.py > +++ b/generator.py > @@ -821,6 +821,27 @@ def print_function_wrapper(module, name, output, export, include): > return 0 > return 1 > > +def print_c_pointer(classname, output, export, include): > + output.write("PyObject *\n") > + output.write("libvirt_%s_pointer(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)\n" % classname) > + output.write("{\n") > + output.write(" %sPtr ptr;\n" % classname) > + output.write(" PyObject *pyptr;\n") > + output.write(" PyObject *pylong;\n") > + output.write("\n") > + output.write(" if (!PyArg_ParseTuple(args, (char *) \"O\", &pyptr))\n") > + output.write(" return NULL;\n") > + output.write(" ptr = (%sPtr) Py%s_Get(pyptr);\n" % (classname, classname)) > + output.write(" pylong = PyLong_FromVoidPtr(ptr);\n") > + output.write(" return pylong;\n") > + output.write("}\n") > + output.write("\n") > + > + include.write("PyObject *libvirt_%s_pointer(PyObject *self, PyObject *args);\n" % classname) > + > + export.write(" { (char *)\"%s_pointer\", libvirt_%s_pointer, METH_VARARGS, NULL },\n" % > + (classname, classname)) > + > def buildStubs(module, api_xml): > global py_types > global py_return_types > @@ -917,6 +938,12 @@ def buildStubs(module, api_xml): > del funcs[function] > if ret == 1: > nb_wrap = nb_wrap + 1 > + > + if module == "libvirt": > + # Write C pointer conversion functions. > + for classname in primary_classes: > + print_c_pointer(classname, wrapper, export, include) > + > include.close() > export.close() > wrapper.close() > @@ -1496,6 +1523,11 @@ def buildWrappers(module): > classes.write(" def domain(self):\n") > classes.write(" return self._dom\n\n") > > + classes.write(" def c_pointer(self):\n") > + classes.write(" \"\"\"Get C pointer to underlying object\"\"\"\n") > + classes.write(" return libvirtmod.%s_pointer(self._o)\n\n" % > + classname) > + > flist = function_classes[classname] > flist.sort(key=functionSortKey) > oldfile = "" > diff --git a/sanitytest.py b/sanitytest.py > index f5337fc..9907f3d 100644 > --- a/sanitytest.py > +++ b/sanitytest.py > @@ -109,6 +109,8 @@ for klassname in gottypes: > for name in dir(klassobj): > if name[0] == '_': > continue > + if name == 'c_pointer': > + continue > thing = getattr(klassobj, name) > if callable(thing): > gotfunctions[klassname].append(name) ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list