summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuannan Ren <gren@redhat.com>2012-03-28 09:41:04 -0600
committerDaniel Veillard <veillard@redhat.com>2012-04-05 11:37:43 +0800
commit804d6c4cf70f1884902f5cf3f9273e3e68c5ed7d (patch)
treebb14f650dbc8ac0ce4e6d680f3cbd50f86b7f032
parent058d05bb617cb48b21967e4c57e8a3d09ddc75e0 (diff)
downloadlibvirt-python-v6-804d6c4cf70f1884902f5cf3f9273e3e68c5ed7d.tar.gz
libvirt-python-v6-804d6c4cf70f1884902f5cf3f9273e3e68c5ed7d.tar.xz
libvirt-python-v6-804d6c4cf70f1884902f5cf3f9273e3e68c5ed7d.zip
python: Add new helper functions for python to C integral conversion
https://bugzilla.redhat.com/show_bug.cgi?id=807751 int libvirt_intUnwrap(PyObject *obj, int *val); int libvirt_uintUnwrap(PyObject *obj, unsigned int *val); int libvirt_longUnwrap(PyObject *obj, long *val); int libvirt_ulongUnwrap(PyObject *obj, unsigned long *val); int libvirt_longlongUnwrap(PyObject *obj, long long *val); int libvirt_ulonglongUnwrap(PyObject *obj, unsigned long long *val); int libvirt_doubleUnwrap(PyObject *obj, double *val); int libvirt_boolUnwrap(PyObject *obj, bool *val); (cherry picked from commit 384ebd3fc5deec035d6894352a25fd2b7f637cf0)
-rw-r--r--typewrappers.c132
-rw-r--r--typewrappers.h9
2 files changed, 141 insertions, 0 deletions
diff --git a/typewrappers.c b/typewrappers.c
index 3f200b3..8b9df75 100644
--- a/typewrappers.c
+++ b/typewrappers.c
@@ -119,6 +119,138 @@ libvirt_constcharPtrWrap(const char *str)
return (ret);
}
+int
+libvirt_intUnwrap(PyObject *obj, int *val)
+{
+ long long_val;
+
+ /* If obj is type of PyInt_Type, PyInt_AsLong converts it
+ * to C long type directly. If it is of PyLong_Type, PyInt_AsLong
+ * will call PyLong_AsLong() to deal with it automatically.
+ */
+ long_val = PyInt_AsLong(obj);
+ if ((long_val == -1) && PyErr_Occurred())
+ return -1;
+
+ if ((int)long_val == long_val) {
+ *val = long_val;
+ } else {
+ PyErr_SetString(PyExc_OverflowError,
+ "Python int too large to convert to C int");
+ return -1;
+ }
+ return 0;
+}
+
+int
+libvirt_uintUnwrap(PyObject *obj, unsigned int *val)
+{
+ long long_val;
+
+ long_val = PyInt_AsLong(obj);
+ if ((long_val == -1) && PyErr_Occurred())
+ return -1;
+
+ if ((unsigned int)long_val == long_val) {
+ *val = long_val;
+ } else {
+ PyErr_SetString(PyExc_OverflowError,
+ "Python int too large to convert to C unsigned int");
+ return -1;
+ }
+ return 0;
+}
+
+int
+libvirt_longUnwrap(PyObject *obj, long *val)
+{
+ long long_val;
+
+ long_val = PyInt_AsLong(obj);
+ if ((long_val == -1) && PyErr_Occurred())
+ return -1;
+
+ *val = long_val;
+ return 0;
+}
+
+int
+libvirt_ulongUnwrap(PyObject *obj, unsigned long *val)
+{
+ long long_val;
+
+ long_val = PyInt_AsLong(obj);
+ if ((long_val == -1) && PyErr_Occurred())
+ return -1;
+
+ *val = long_val;
+ return 0;
+}
+
+int
+libvirt_longlongUnwrap(PyObject *obj, long long *val)
+{
+ long long llong_val;
+
+ /* If obj is of PyInt_Type, PyLong_AsLongLong
+ * will call PyInt_AsLong() to handle it automatically.
+ */
+ llong_val = PyLong_AsLongLong(obj);
+ if ((llong_val == -1) && PyErr_Occurred())
+ return -1;
+
+ *val = llong_val;
+ return 0;
+}
+
+int
+libvirt_ulonglongUnwrap(PyObject *obj, unsigned long long *val)
+{
+ unsigned long long ullong_val = -1;
+
+ /* The PyLong_AsUnsignedLongLong doesn't check the type of
+ * obj, only accept argument of PyLong_Type, so we check it instead.
+ */
+ if (PyInt_Check(obj))
+ ullong_val = PyInt_AsLong(obj);
+ else if (PyLong_Check(obj))
+ ullong_val = PyLong_AsUnsignedLongLong(obj);
+ else
+ PyErr_SetString(PyExc_TypeError, "an integer is required");
+
+ if ((ullong_val == -1) && PyErr_Occurred())
+ return -1;
+
+ *val = ullong_val;
+ return 0;
+}
+
+int
+libvirt_doubleUnwrap(PyObject *obj, double *val)
+{
+ double double_val;
+
+ double_val = PyFloat_AsDouble(obj);
+ if ((double_val == -1) && PyErr_Occurred())
+ return -1;
+
+ *val = double_val;
+ return 0;
+}
+
+int
+libvirt_boolUnwrap(PyObject *obj, bool *val)
+{
+ int ret;
+
+ ret = PyObject_IsTrue(obj);
+ if (ret < 0)
+ return ret;
+
+ *val = ret > 0;
+ return 0;
+}
+
PyObject *
libvirt_virDomainPtrWrap(virDomainPtr node)
{
diff --git a/typewrappers.h b/typewrappers.h
index 1e34dfa..af68bce 100644
--- a/typewrappers.h
+++ b/typewrappers.h
@@ -7,6 +7,7 @@
*/
#include <Python.h>
+#include <stdbool.h>
#include "libvirt/libvirt.h"
#include "libvirt/virterror.h"
@@ -163,6 +164,14 @@ PyObject * libvirt_ulonglongWrap(unsigned long long val);
PyObject * libvirt_charPtrWrap(char *str);
PyObject * libvirt_charPtrSizeWrap(char *str, Py_ssize_t size);
PyObject * libvirt_constcharPtrWrap(const char *str);
+int libvirt_intUnwrap(PyObject *obj, int *val);
+int libvirt_uintUnwrap(PyObject *obj, unsigned int *val);
+int libvirt_longUnwrap(PyObject *obj, long *val);
+int libvirt_ulongUnwrap(PyObject *obj, unsigned long *val);
+int libvirt_longlongUnwrap(PyObject *obj, long long *val);
+int libvirt_ulonglongUnwrap(PyObject *obj, unsigned long long *val);
+int libvirt_doubleUnwrap(PyObject *obj, double *val);
+int libvirt_boolUnwrap(PyObject *obj, bool *val);
PyObject * libvirt_virConnectPtrWrap(virConnectPtr node);
PyObject * libvirt_virDomainPtrWrap(virDomainPtr node);
PyObject * libvirt_virNetworkPtrWrap(virNetworkPtr node);