aboutsummaryrefslogtreecommitdiffstats
path: root/PySide/QtCore/qstring_conversions.h
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-01-21 14:44:36 -0200
committerHugo Lima <hugo.lima@openbossa.org>2010-01-21 15:18:07 -0200
commitd0cd206f37b707cf73a389d815080690082f70da (patch)
tree46b52ae65608ed692d225862430a2367f843dd49 /PySide/QtCore/qstring_conversions.h
parent1a7cbb2473327abad936447c47818ee13df2992c (diff)
QString can now receive buffer objects on constructor, like boost-based PySide.
Reviewed by Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'PySide/QtCore/qstring_conversions.h')
-rw-r--r--PySide/QtCore/qstring_conversions.h26
1 files changed, 25 insertions, 1 deletions
diff --git a/PySide/QtCore/qstring_conversions.h b/PySide/QtCore/qstring_conversions.h
index c580415be..48f3b77e0 100644
--- a/PySide/QtCore/qstring_conversions.h
+++ b/PySide/QtCore/qstring_conversions.h
@@ -4,6 +4,11 @@ inline bool Converter< QString >::isConvertible(PyObject* pyobj)
|| PyUnicode_Check(pyobj)
|| SbkQByteArray_Check(pyobj)
|| SbkQLatin1String_Check(pyobj)
+#if PY_VERSION_HEX < 0x03000000
+ || (pyobj->ob_type->tp_as_buffer
+ && PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER)
+ && pyobj->ob_type->tp_as_buffer->bf_getcharbuffer)
+#endif
|| SbkQChar_Check(pyobj);
}
@@ -22,7 +27,26 @@ inline QString Converter< QString >::toCpp(PyObject* pyobj)
#else
return QString::fromUtf16(unicode, PyUnicode_GET_SIZE(pyobj));
#endif
- } else if (PyString_Check(pyobj))
+ } else if (PyString_Check(pyobj)) {
return QString(Converter< char * >::toCpp(pyobj));
+ }
+#if PY_VERSION_HEX < 0x03000000
+ // Support for buffer objects on QString constructor
+ else if (pyobj->ob_type->tp_as_buffer
+ && PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER)
+ && pyobj->ob_type->tp_as_buffer->bf_getcharbuffer) {
+ QByteArray data;
+ PyBufferProcs* bufferProcs = pyobj->ob_type->tp_as_buffer;
+ int segments = bufferProcs->bf_getsegcount(pyobj, 0);
+ for (int i = 0; i < segments; ++i) {
+ char* segmentData;
+ int length = bufferProcs->bf_getcharbuffer(pyobj, i, &segmentData);
+ if (length == -1)
+ break;
+ data.append(segmentData, length);
+ }
+ return QString(data);
+ }
+#endif
return *SbkQString_cptr(pyobj);
}