diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-01-21 14:44:36 -0200 |
---|---|---|
committer | Hugo Lima <hugo.lima@openbossa.org> | 2010-01-21 15:18:07 -0200 |
commit | d0cd206f37b707cf73a389d815080690082f70da (patch) | |
tree | 46b52ae65608ed692d225862430a2367f843dd49 /PySide/QtCore/qstring_conversions.h | |
parent | 1a7cbb2473327abad936447c47818ee13df2992c (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.h | 26 |
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); } |