diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2011-04-14 19:56:12 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:54:11 -0300 |
commit | ea5dd4f257f45b41984dd83640c6b7abf57a663d (patch) | |
tree | fc857931edb6dd83507731340e9e634cabb8edc2 | |
parent | e14378b1265d622a3ed82fbfe4e42fd0a4c0f0cd (diff) |
Fix bug 717 - "QByteArray doesn't honor \0 inside strings."
Reviewer: Renato Araújo <renato.filho@openbossa.org>
Marcelo Lira <marcelo.lira@openbossa.org>
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 80 | ||||
-rw-r--r-- | tests/QtCore/qbytearray_concatenation_operator_test.py | 15 | ||||
-rw-r--r-- | tests/QtCore/qbytearray_test.py | 2 |
3 files changed, 80 insertions, 17 deletions
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index ca36ba518..4817df312 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -1532,14 +1532,82 @@ <extra-includes> <include file-name="QNoImplicitBoolCast" location="global"/> </extra-includes> + + <!-- ### These overloads must be removed accept strings with \x00 in their contents --> + <modify-function signature="append(const char*,int)" remove="all" /> + <modify-function signature="append(const char*)" remove="all" /> + <modify-function signature="append(QString)" remove="all" /> + <modify-function signature="contains(const char*)const" remove="all" /> + <modify-function signature="count(const char*)const" remove="all" /> + <modify-function signature="endsWith(const char*)const" remove="all" /> + <modify-function signature="indexOf(const char*,int)const" remove="all" /> + <modify-function signature="indexOf(char,int)const" remove="all" /> + <modify-function signature="indexOf(QString,int)const" remove="all" /> + <modify-function signature="insert(int,const char*)" remove="all" /> + <modify-function signature="insert(int,char)" remove="all" /> + <modify-function signature="insert(int,const char*,int)" remove="all" /> + <modify-function signature="insert(int,QString)" remove="all" /> + <modify-function signature="lastIndexOf(const char*,int)const" remove="all" /> + <modify-function signature="lastIndexOf(QString,int)const" remove="all" /> + <modify-function signature="lastIndexOf(char,int)const" remove="all" /> + <modify-function signature="prepend(const char*)" remove="all" /> + <modify-function signature="prepend(const char*,int)" remove="all" /> + <modify-function signature="replace(QByteArray,const char*)" remove="all" /> + <modify-function signature="replace(const char*,int,const char*,int)" remove="all"/> + <modify-function signature="replace(QString,const char*)" remove="all" /> + <modify-function signature="replace(const char*,QByteArray)" remove="all" /> + <modify-function signature="replace(const char*,const char*)" remove="all" /> + <modify-function signature="replace(int,int,const char*)" remove="all" /> + <modify-function signature="replace(int,int,const char*,int)" remove="all" /> + <modify-function signature="replace(char,const char*)" remove="all" /> + <modify-function signature="replace(char,QString)" remove="all" /> + <modify-function signature="startsWith(const char*)const" remove="all" /> + <modify-function signature="operator==(QString)const" remove="all" /> + <modify-function signature="operator>(QString)const" remove="all" /> + <modify-function signature="operator>=(QString)const" remove="all" /> + <modify-function signature="operator<(QString)const" remove="all" /> + <modify-function signature="operator<=(QString)const" remove="all" /> + <modify-function signature="operator!=(QString)const" remove="all" /> + <modify-function signature="operator+=(QString)" remove="all" /> + <modify-function signature="operator+(QByteArray,const char*)" remove="all" /> + <modify-function signature="operator+(const char*,QByteArray)" remove="all" /> + <modify-function signature="operator+(QString,QByteArray)" remove="all" /> + <modify-function signature="operator+(QByteArray,QString)" remove="all" /> + <add-function signature="operator+(PyUnicode)"> + <inject-code> + Shiboken::AutoDecRef str(PyUnicode_AsASCIIString(arg)); + if (!str.isNull()) { + QByteArray b(PyString_AS_STRING(str.object()), PyString_GET_SIZE(str.object())); + b.prepend(*%CPPSELF); + %PYARG_0 = %CONVERTTOPYTHON[QByteArray](b); + } + </inject-code> + </add-function> + <add-function signature="operator+(PyUnicode, QByteArray)"> + <inject-code> + Shiboken::AutoDecRef str(PyUnicode_AsASCIIString(arg)); + if (!str.isNull()) { + QByteArray b(PyString_AS_STRING(str.object()), PyString_GET_SIZE(str.object())); + b.append(*%CPPSELF); + %PYARG_0 = %CONVERTTOPYTHON[QByteArray](b); + } + </inject-code> + </add-function> + <add-function signature="operator+(PyString, QByteArray)"> + <inject-code> + QByteArray b(PyString_AS_STRING(arg), PyString_GET_SIZE(arg)); + %PYARG_0 = %CONVERTTOPYTHON[QByteArray](b + *%CPPSELF); + </inject-code> + </add-function> + <!-- ### --> + <add-function signature="__repr__" return-type="PyObject*"> <inject-code class="target" position="beginning"> QByteArray b(((PyObject*)%PYSELF)->ob_type->tp_name); - b += "(\""; - QByteArray contents(*%CPPSELF); - contents.replace("\"", "\\\""); - b += contents; - b += "\")"; + b += '('; + Shiboken::AutoDecRef contents(PyObject_Repr(PyString_FromStringAndSize(%CPPSELF.constData(), %CPPSELF.size()))); + b += PyString_AS_STRING(contents.object()); + b += ")"; %PYARG_0 = PyString_FromStringAndSize(b.constData(), b.size()); </inject-code> </add-function> @@ -1684,8 +1752,6 @@ </modify-function> <!-- QByteArray(const char *) do the job of this constructor --> <modify-function signature="QByteArray(const char*,int)" remove="all"/> - <!-- QByteArray(const char*, const char*) do the job of this function --> - <modify-function signature="replace(const char*,int,const char*,int)" remove="all"/> <modify-function signature="fromRawData(const char*,int)"> <modify-argument index="2"> <remove-argument /> diff --git a/tests/QtCore/qbytearray_concatenation_operator_test.py b/tests/QtCore/qbytearray_concatenation_operator_test.py index b9a01ff63..13fd231f7 100644 --- a/tests/QtCore/qbytearray_concatenation_operator_test.py +++ b/tests/QtCore/qbytearray_concatenation_operator_test.py @@ -12,20 +12,17 @@ class QByteArrayConcatenationOperatorTest(unittest.TestCase): def testConcatQByteArrayAndPythonString(self): #Test concatenation of a QByteArray with a Python string, in this order qba = QByteArray('foo') - result = qba + 'bar' - self.assert_(isinstance(result, QByteArray)) - self.assertEqual(result, 'foobar') - # NOTICE: the standard behavior of PyQt is to return a QString object - # for this case. As this is a minor issue the assertion will be left commented. - #self.assertEqual(result.__class__.__name__, 'QString') + result = qba + '\x00bar' + self.assertEqual(type(result), QByteArray) + self.assertEqual(result, 'foo\x00bar') def testConcatPythonStringAndQByteArray(self): #Test concatenation of a Python string with a QByteArray, in this order concat_python_string_add_qbytearray_worked = True qba = QByteArray('foo') - result = 'bar' + qba - self.assert_(isinstance(result, QByteArray)) - self.assertEqual(result, 'barfoo') + result = 'bar\x00' + qba + self.assertEqual(type(result), QByteArray) + self.assertEqual(result, 'bar\x00foo') # NOTICE: Does not makes sense concat a unicode string with a QByteArray, because the # user does not know nothing about the internal representation of the unicode string. diff --git a/tests/QtCore/qbytearray_test.py b/tests/QtCore/qbytearray_test.py index 330a7d09f..38ed2ab1c 100644 --- a/tests/QtCore/qbytearray_test.py +++ b/tests/QtCore/qbytearray_test.py @@ -152,7 +152,7 @@ class QByteArrayBug720(unittest.TestCase): def testIt(self): ba = QByteArray("32\"1\x00123") self.assertEqual(str(ba), "32\"1\x00123") - self.assertEqual(repr(ba), "PySide.QtCore.QByteArray(\"32\\\"1\x00123\")") + self.assertEqual(repr(ba), "PySide.QtCore.QByteArray('32\"1\\x00123')") if __name__ == '__main__': |