2 * types.c: converter functions between the internal representation
3 * and the Python objects
5 * Copyright (C) 2005-2019 Red Hat, Inc.
7 * Daniel Veillard <veillard@redhat.com>
10 /* Horrible kludge to work around even more horrible name-space pollution
11 * via Python.h. That file includes /usr/include/python3.x/pyconfig*.h,
12 * which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
17 #include "typewrappers.h"
18 #include "libvirt-utils.h"
21 libvirt_buildPyObject(void *cobj
,
23 PyCapsule_Destructor destr
)
25 return PyCapsule_New(cobj
, name
, destr
);
29 libvirt_intWrap(int val
)
31 return PyLong_FromLong(val
);
35 libvirt_uintWrap(unsigned int val
)
37 return PyLong_FromUnsignedLong(val
);
41 libvirt_longWrap(long val
)
43 return PyLong_FromLong(val
);
47 libvirt_ulongWrap(unsigned long val
)
49 return PyLong_FromLong(val
);
53 libvirt_longlongWrap(long long val
)
55 return PyLong_FromLongLong(val
);
59 libvirt_ulonglongWrap(unsigned long long val
)
61 return PyLong_FromUnsignedLongLong(val
);
65 libvirt_charPtrSizeWrap(char *str
, Py_ssize_t size
)
70 return PyBytes_FromStringAndSize(str
, size
);
74 libvirt_charPtrWrap(char *str
)
79 return PyUnicode_FromString(str
);
83 libvirt_constcharPtrWrap(const char *str
)
88 return PyUnicode_FromString(str
);
92 libvirt_boolWrap(int val
)
101 libvirt_intUnwrap(PyObject
*obj
,
107 PyErr_SetString(PyExc_TypeError
, "unexpected type");
111 /* If obj is type of PyInt_Type, PyInt_AsLong converts it
112 * to C long type directly. If it is of PyLong_Type, PyInt_AsLong
113 * will call PyLong_AsLong() to deal with it automatically.
115 long_val
= PyLong_AsLong(obj
);
116 if ((long_val
== -1) && PyErr_Occurred())
119 #if LONG_MAX != INT_MAX
120 if (long_val
>= INT_MIN
&& long_val
<= INT_MAX
) {
123 PyErr_SetString(PyExc_OverflowError
,
124 "Python int too large to convert to C int");
134 libvirt_uintUnwrap(PyObject
*obj
,
137 unsigned long long_val
;
140 PyErr_SetString(PyExc_TypeError
, "unexpected type");
144 long_val
= PyLong_AsUnsignedLong(obj
);
145 if ((long_val
== (unsigned long)-1) && PyErr_Occurred())
148 if (long_val
<= UINT_MAX
) {
151 PyErr_SetString(PyExc_OverflowError
,
152 "Python int too large to convert to C unsigned int");
159 libvirt_longUnwrap(PyObject
*obj
,
165 PyErr_SetString(PyExc_TypeError
, "unexpected type");
169 long_val
= PyLong_AsLong(obj
);
170 if ((long_val
== -1) && PyErr_Occurred())
178 libvirt_ulongUnwrap(PyObject
*obj
,
184 PyErr_SetString(PyExc_TypeError
, "unexpected type");
188 long_val
= PyLong_AsLong(obj
);
189 if ((long_val
== -1) && PyErr_Occurred())
195 PyErr_SetString(PyExc_OverflowError
,
196 "negative Python int cannot be converted to C unsigned long");
203 libvirt_longlongUnwrap(PyObject
*obj
,
206 long long llong_val
= -1;
209 PyErr_SetString(PyExc_TypeError
, "unexpected type");
213 if (PyLong_Check(obj
))
214 llong_val
= PyLong_AsLongLong(obj
);
216 PyErr_SetString(PyExc_TypeError
, "an integer is required");
218 if ((llong_val
== -1) && PyErr_Occurred())
226 libvirt_ulonglongUnwrap(PyObject
*obj
,
227 unsigned long long *val
)
229 unsigned long long ullong_val
= -1;
232 PyErr_SetString(PyExc_TypeError
, "unexpected type");
236 if (PyLong_Check(obj
)) {
237 ullong_val
= PyLong_AsUnsignedLongLong(obj
);
239 PyErr_SetString(PyExc_TypeError
, "an integer is required");
242 if ((ullong_val
== (unsigned long long)-1) && PyErr_Occurred())
250 libvirt_doubleUnwrap(PyObject
*obj
,
256 PyErr_SetString(PyExc_TypeError
, "unexpected type");
260 double_val
= PyFloat_AsDouble(obj
);
261 if ((double_val
== -1) && PyErr_Occurred())
269 libvirt_boolUnwrap(PyObject
*obj
,
275 PyErr_SetString(PyExc_TypeError
, "unexpected type");
279 if ((ret
= PyObject_IsTrue(obj
)) < 0)
287 libvirt_charPtrUnwrap(PyObject
*obj
,
294 PyErr_SetString(PyExc_TypeError
, "unexpected type");
298 if (!(bytes
= PyUnicode_AsUTF8String(obj
)))
300 ret
= PyBytes_AsString(bytes
);
307 return ret
&& *str
? 0 : -1;
311 libvirt_charPtrSizeUnwrap(PyObject
*obj
,
318 PyErr_SetString(PyExc_TypeError
, "unexpected type");
322 return PyBytes_AsStringAndSize(obj
, str
, size
);
326 libvirt_virDomainPtrWrap(virDomainPtr node
)
334 ret
= libvirt_buildPyObject(node
, "virDomainPtr", NULL
);
339 libvirt_virNetworkPtrWrap(virNetworkPtr node
)
347 ret
= libvirt_buildPyObject(node
, "virNetworkPtr", NULL
);
352 libvirt_virNetworkPortPtrWrap(virNetworkPortPtr node
)
360 ret
= libvirt_buildPyObject(node
, "virNetworkPortPtr", NULL
);
365 libvirt_virInterfacePtrWrap(virInterfacePtr node
)
373 ret
= libvirt_buildPyObject(node
, "virInterfacePtr", NULL
);
378 libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node
)
386 ret
= libvirt_buildPyObject(node
, "virStoragePoolPtr", NULL
);
391 libvirt_virStorageVolPtrWrap(virStorageVolPtr node
)
399 ret
= libvirt_buildPyObject(node
, "virStorageVolPtr", NULL
);
404 libvirt_virConnectPtrWrap(virConnectPtr node
)
412 ret
= libvirt_buildPyObject(node
, "virConnectPtr", NULL
);
417 libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node
)
425 ret
= libvirt_buildPyObject(node
, "virNodeDevicePtr", NULL
);
430 libvirt_virSecretPtrWrap(virSecretPtr node
)
438 ret
= libvirt_buildPyObject(node
, "virSecretPtr", NULL
);
443 libvirt_virNWFilterPtrWrap(virNWFilterPtr node
)
451 ret
= libvirt_buildPyObject(node
, "virNWFilterPtr", NULL
);
456 libvirt_virNWFilterBindingPtrWrap(virNWFilterBindingPtr node
)
464 ret
= libvirt_buildPyObject(node
, "virNWFilterBindingPtr", NULL
);
469 libvirt_virStreamPtrWrap(virStreamPtr node
)
477 ret
= libvirt_buildPyObject(node
, "virStreamPtr", NULL
);
482 libvirt_virDomainCheckpointPtrWrap(virDomainCheckpointPtr node
)
490 ret
= libvirt_buildPyObject(node
, "virDomainCheckpointPtr", NULL
);
495 libvirt_virDomainSnapshotPtrWrap(virDomainSnapshotPtr node
)
503 ret
= libvirt_buildPyObject(node
, "virDomainSnapshotPtr", NULL
);
508 libvirt_virEventHandleCallbackWrap(virEventHandleCallback node
)
513 printf("%s: WARNING - Wrapping None\n", __func__
);
517 ret
= libvirt_buildPyObject(node
, "virEventHandleCallback", NULL
);
522 libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node
)
527 printf("%s: WARNING - Wrapping None\n", __func__
);
531 ret
= libvirt_buildPyObject(node
, "virEventTimeoutCallback", NULL
);
536 libvirt_virFreeCallbackWrap(virFreeCallback node
)
544 ret
= libvirt_buildPyObject(node
, "virFreeCallback", NULL
);
549 libvirt_virVoidPtrWrap(void* node
)
557 ret
= libvirt_buildPyObject(node
, "void*", NULL
);