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
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list