summaryrefslogtreecommitdiff
path: root/_dbus_bindings/containers.c
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2011-12-15 06:57:21 -0500
committerBarry Warsaw <barry@python.org>2011-12-15 06:57:21 -0500
commit4c1c2eade1c5b383adad94a7a4fd6553873fecf0 (patch)
treeb9e0f45fc19539bcaddff69e661bf0c5d21bab5a /_dbus_bindings/containers.c
parent667082d0b4aef9c438a2e7fec89614b5b8ef960a (diff)
downloaddbus-python-4c1c2eade1c5b383adad94a7a4fd6553873fecf0.tar.gz
This is the big one; it adds Python 3 support.
Diffstat (limited to '_dbus_bindings/containers.c')
-rw-r--r--_dbus_bindings/containers.c59
1 files changed, 55 insertions, 4 deletions
diff --git a/_dbus_bindings/containers.c b/_dbus_bindings/containers.c
index e296406..9e57243 100644
--- a/_dbus_bindings/containers.c
+++ b/_dbus_bindings/containers.c
@@ -167,15 +167,42 @@ Array_tp_init (DBusPyArray *self, PyObject *args, PyObject *kwargs)
}
if (signature != Py_None) {
- const char *c_str = PyBytes_AS_STRING(signature);
+ const char *c_str;
+ PyObject *signature_as_bytes;
+
+ if (
+#ifdef PY3
+ !PyUnicode_Check(signature)
+#else
+ !PyBytes_Check(signature)
+#endif
+ )
+ {
+ PyErr_SetString(PyExc_TypeError, "str expected");
+ Py_CLEAR(signature);
+ return -1;
+ }
+#ifdef PY3
+ if (!(signature_as_bytes = PyUnicode_AsUTF8String(signature))) {
+ Py_CLEAR(signature);
+ return -1;
+ }
+#else
+ signature_as_bytes = signature;
+ Py_INCREF(signature_as_bytes);
+#endif
+
+ c_str = PyBytes_AS_STRING(signature_as_bytes);
if (!dbus_signature_validate_single(c_str, NULL)) {
Py_CLEAR(signature);
+ Py_CLEAR(signature_as_bytes);
PyErr_SetString(PyExc_ValueError,
"There must be exactly one complete type in "
"an Array's signature parameter");
return -1;
}
+ Py_CLEAR(signature_as_bytes);
}
tuple = Py_BuildValue("(O)", obj);
@@ -375,8 +402,25 @@ Dict_tp_init(DBusPyDict *self, PyObject *args, PyObject *kwargs)
}
if (signature != Py_None) {
- const char *c_str = PyBytes_AS_STRING(signature);
+ const char *c_str;
+ PyObject *signature_as_bytes;
+ if (!NATIVESTR_CHECK(signature)) {
+ PyErr_SetString(PyExc_TypeError, "str expected");
+ Py_CLEAR(signature);
+ return -1;
+ }
+#ifdef PY3
+ if (!(signature_as_bytes = PyUnicode_AsUTF8String(signature))) {
+ Py_CLEAR(signature);
+ return -1;
+ }
+#else
+ signature_as_bytes = signature;
+ Py_INCREF(signature_as_bytes);
+#endif
+
+ c_str = PyBytes_AS_STRING(signature_as_bytes);
switch (c_str[0]) {
case DBUS_TYPE_BYTE:
case DBUS_TYPE_BOOLEAN:
@@ -399,6 +443,7 @@ Dict_tp_init(DBusPyDict *self, PyObject *args, PyObject *kwargs)
break;
default:
Py_CLEAR(signature);
+ Py_CLEAR(signature_as_bytes);
PyErr_SetString(PyExc_ValueError,
"The key type in a Dictionary's signature "
"must be a primitive type");
@@ -407,11 +452,13 @@ Dict_tp_init(DBusPyDict *self, PyObject *args, PyObject *kwargs)
if (!dbus_signature_validate_single(c_str + 1, NULL)) {
Py_CLEAR(signature);
+ Py_CLEAR(signature_as_bytes);
PyErr_SetString(PyExc_ValueError,
"There must be exactly two complete types in "
"a Dictionary's signature parameter");
return -1;
}
+ Py_CLEAR(signature_as_bytes);
}
tuple = Py_BuildValue("(O)", obj);
@@ -526,7 +573,7 @@ Struct_tp_repr(PyObject *self)
variant_level = dbus_py_variant_level_get(self);
if (variant_level < 0)
goto finally;
-
+
if (variant_level > 0) {
my_repr = PyUnicode_FromFormat("%s(%V, signature=%V, "
"variant_level=%ld)",
@@ -653,6 +700,10 @@ Struct_tp_getattro(PyObject *obj, PyObject *name)
{
PyObject *key, *value;
+#ifdef PY3
+ if (PyUnicode_CompareWithASCIIString(name, "signature"))
+ return dbus_py_variant_level_getattro(obj, name);
+#else
if (PyBytes_Check(name)) {
Py_INCREF(name);
}
@@ -672,8 +723,8 @@ Struct_tp_getattro(PyObject *obj, PyObject *name)
Py_CLEAR(name);
return value;
}
-
Py_CLEAR(name);
+#endif /* PY3 */
key = PyLong_FromVoidPtr(obj);