Fixed PySide custom conversions to work with newer versions of shiboken generator.

This commit is contained in:
Hugo Lima 2010-03-15 14:46:30 -03:00
commit 781bdbe632
12 changed files with 97 additions and 163 deletions

View file

@ -1,25 +1,30 @@
namespace Shiboken { namespace Shiboken {
inline bool Shiboken::Converter<QChar >::isConvertible(PyObject* pyObj)
inline bool Shiboken::Converter<QChar >::isConvertible(PyObject* pyobj)
{ {
return SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyobj) return PyObject_TypeCheck(pyObj, SbkType<QChar>())
|| SbkQLatin1Char_Check(pyobj) || SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyObj)
|| (PyString_Check(pyobj) && (PyString_Size(pyobj) == 1)) || SbkQLatin1Char_Check(pyObj)
|| PyInt_Check(pyobj); || (PyString_Check(pyObj) && (PyString_Size(pyObj) == 1))
|| PyInt_Check(pyObj);
} }
inline QChar Shiboken::Converter<QChar >::toCpp(PyObject* pyobj) inline QChar Shiboken::Converter<QChar >::toCpp(PyObject* pyObj)
{ {
if (!Shiboken_TypeCheck(pyobj, QChar)) { if (!Shiboken_TypeCheck(pyObj, QChar)) {
if (SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyobj)) if (SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyObj))
return QChar(Shiboken::Converter<QChar::SpecialCharacter >::toCpp(pyobj)); return QChar(Shiboken::Converter<QChar::SpecialCharacter >::toCpp(pyObj));
else if (SbkQLatin1Char_Check(pyobj)) else if (SbkQLatin1Char_Check(pyObj))
return QChar(Shiboken::Converter<QLatin1Char >::toCpp(pyobj)); return QChar(Shiboken::Converter<QLatin1Char >::toCpp(pyObj));
else if (PyString_Check(pyobj) && PyString_Size(pyobj) == 1) else if (PyString_Check(pyObj) && PyString_Size(pyObj) == 1)
return QChar(Shiboken::Converter<char >::toCpp(pyobj)); return QChar(Shiboken::Converter<char >::toCpp(pyObj));
else if (PyInt_Check(pyobj)) else if (PyInt_Check(pyObj))
return QChar(Shiboken::Converter<int >::toCpp(pyobj)); return QChar(Shiboken::Converter<int >::toCpp(pyObj));
} }
return *Converter<QChar*>::toCpp(pyobj); return *Converter<QChar*>::toCpp(pyObj);
}
inline PyObject* Converter<QChar>::toPython(const QChar& cppObj)
{
return ValueTypeConverter<QChar>::toPython(cppObj);
} }
} }

View file

@ -1,46 +1,4 @@
namespace Shiboken { namespace Shiboken {
template <typename qhash>
struct Converter_qhash
{
static bool isConvertible(PyObject* pyobj) {
return PyDict_Check(pyobj);
}
static PyObject* toPython(const qhash& hash)
{
PyObject* result = PyDict_New();
QHashIterator<typename qhash::key_type, typename qhash::mapped_type> it(hash);
while (it.hasNext()) {
it.next();
PyDict_SetItem(result,
Converter<typename qhash::key_type>::toPython(it.key()),
Converter<typename qhash::mapped_type>::toPython(it.value()));
}
return result;
}
static qhash toCpp(PyObject* pyobj)
{
qhash result;
PyObject* key;
PyObject* value;
Py_ssize_t pos = 0;
Py_INCREF(pyobj);
while (PyDict_Next(pyobj, &pos, &key, &value)) {
result.insert(Converter<typename qhash::key_type>::toCpp(key),
Converter<typename qhash::mapped_type>::toCpp(value));
}
Py_DECREF(pyobj);
return result;
}
};
template<typename KT, typename VT> template<typename KT, typename VT>
struct Converter<QHash<KT, VT> > : Converter_qhash<QHash<KT, VT> > {}; struct Converter<QHash<KT, VT> > : QtDictConverter<QHash<KT, VT> > {};
} }

View file

@ -1,4 +1,4 @@
namespace Shiboken { namespace Shiboken {
template<typename T> template<typename T>
struct Converter<QList<T> > : Converter_std_list<QList<T> > {}; struct Converter<QList<T> > : StdListConverter<QList<T> > {};
} }

View file

@ -1,46 +1,5 @@
namespace Shiboken { namespace Shiboken {
template <typename qmap>
struct Converter_qmap
{
static bool isConvertible(PyObject* pyobj) {
return PyDict_Check(pyobj);
}
static PyObject* toPython(const qmap& map)
{
PyObject* result = PyDict_New();
QMapIterator<typename qmap::key_type, typename qmap::mapped_type> it(map);
while (it.hasNext()) {
it.next();
PyDict_SetItem(result,
Converter<typename qmap::key_type>::toPython(it.key()),
Converter<typename qmap::mapped_type>::toPython(it.value()));
}
return result;
}
static qmap toCpp(PyObject* pyobj)
{
qmap result;
PyObject* key;
PyObject* value;
Py_ssize_t pos = 0;
Py_INCREF(pyobj);
while (PyDict_Next(pyobj, &pos, &key, &value)) {
result.insert(Converter<typename qmap::key_type>::toCpp(key),
Converter<typename qmap::mapped_type>::toCpp(value));
}
Py_DECREF(pyobj);
return result;
}
};
template<typename KT, typename VT> template<typename KT, typename VT>
struct Converter<QMap<KT, VT> > : Converter_qmap<QMap<KT, VT> > {}; struct Converter<QMap<KT, VT> > : QtDictConverter<QMap<KT, VT> > {
};
} }

View file

@ -1,4 +1,4 @@
namespace Shiboken { namespace Shiboken {
template<typename FT, typename ST> template<typename FT, typename ST>
struct Converter<QPair<FT, ST> > : Converter_std_pair<QPair<FT, ST> > {}; struct Converter<QPair<FT, ST> > : StdPairConverter<QPair<FT, ST> > {};
} }

View file

@ -1,51 +1,52 @@
namespace Shiboken { namespace Shiboken {
inline bool Converter< QString >::isConvertible(PyObject* pyobj) inline bool Converter<QString>::isConvertible(PyObject* pyObj)
{ {
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>()); SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>());
return PyString_Check(pyobj) return PyString_Check(pyObj)
|| PyUnicode_Check(pyobj) || PyObject_TypeCheck(pyObj, SbkType<QString>())
|| SbkQByteArray_Check(pyobj) || PyUnicode_Check(pyObj)
|| SbkQLatin1String_Check(pyobj) || SbkQByteArray_Check(pyObj)
|| SbkQLatin1String_Check(pyObj)
#if PY_VERSION_HEX < 0x03000000 #if PY_VERSION_HEX < 0x03000000
|| (pyobj->ob_type->tp_as_buffer || (pyObj->ob_type->tp_as_buffer
&& PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) && PyType_HasFeature(pyObj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER)
&& pyobj->ob_type->tp_as_buffer->bf_getcharbuffer) && pyObj->ob_type->tp_as_buffer->bf_getcharbuffer)
#endif #endif
|| SbkQChar_Check(pyobj) || SbkQChar_Check(pyObj)
|| (shiboType->ext_isconvertible && shiboType->ext_isconvertible(pyobj)); || (shiboType->ext_isconvertible && shiboType->ext_isconvertible(pyObj));
} }
inline QString Converter< QString >::toCpp(PyObject* pyobj) inline QString Converter<QString>::toCpp(PyObject* pyObj)
{ {
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>()); SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>());
if (SbkQChar_Check(pyobj)) { if (SbkQChar_Check(pyObj)) {
return QString(Converter< QChar >::toCpp(pyobj)); return QString(Converter< QChar >::toCpp(pyObj));
} else if (SbkQByteArray_Check(pyobj)) { } else if (SbkQByteArray_Check(pyObj)) {
return QString(Converter< QByteArray >::toCpp(pyobj)); return QString(Converter< QByteArray >::toCpp(pyObj));
} else if (SbkQLatin1String_Check(pyobj)) { } else if (SbkQLatin1String_Check(pyObj)) {
return QString(Converter< QLatin1String >::toCpp(pyobj)); return QString(Converter< QLatin1String >::toCpp(pyObj));
} else if (PyUnicode_Check(pyobj)) { } else if (PyUnicode_Check(pyObj)) {
Py_UNICODE* unicode = PyUnicode_AS_UNICODE(pyobj); Py_UNICODE* unicode = PyUnicode_AS_UNICODE(pyObj);
#if defined(Py_UNICODE_WIDE) #if defined(Py_UNICODE_WIDE)
// cast as Py_UNICODE can be a different type // cast as Py_UNICODE can be a different type
return QString::fromUcs4(reinterpret_cast<const uint*>(unicode)); return QString::fromUcs4(reinterpret_cast<const uint*>(unicode));
#else #else
return QString::fromUtf16(unicode, PyUnicode_GET_SIZE(pyobj)); return QString::fromUtf16(unicode, PyUnicode_GET_SIZE(pyObj));
#endif #endif
} else if (PyString_Check(pyobj)) { } else if (PyString_Check(pyObj)) {
return QString(Converter< char * >::toCpp(pyobj)); return QString(Converter< char * >::toCpp(pyObj));
} }
#if PY_VERSION_HEX < 0x03000000 #if PY_VERSION_HEX < 0x03000000
// Support for buffer objects on QString constructor // Support for buffer objects on QString constructor
else if (pyobj->ob_type->tp_as_buffer else if (pyObj->ob_type->tp_as_buffer
&& PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) && PyType_HasFeature(pyObj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER)
&& pyobj->ob_type->tp_as_buffer->bf_getcharbuffer) { && pyObj->ob_type->tp_as_buffer->bf_getcharbuffer) {
QByteArray data; QByteArray data;
PyBufferProcs* bufferProcs = pyobj->ob_type->tp_as_buffer; PyBufferProcs* bufferProcs = pyObj->ob_type->tp_as_buffer;
int segments = bufferProcs->bf_getsegcount(pyobj, 0); int segments = bufferProcs->bf_getsegcount(pyObj, 0);
for (int i = 0; i < segments; ++i) { for (int i = 0; i < segments; ++i) {
char* segmentData; char* segmentData;
int length = bufferProcs->bf_getcharbuffer(pyobj, i, &segmentData); int length = bufferProcs->bf_getcharbuffer(pyObj, i, &segmentData);
if (length == -1) if (length == -1)
break; break;
data.append(segmentData, length); data.append(segmentData, length);
@ -53,11 +54,16 @@ inline QString Converter< QString >::toCpp(PyObject* pyobj)
return QString(data); return QString(data);
} }
#endif #endif
else if (shiboType->ext_isconvertible && shiboType->ext_tocpp && shiboType->ext_isconvertible(pyobj)) { else if (shiboType->ext_isconvertible && shiboType->ext_tocpp && shiboType->ext_isconvertible(pyObj)) {
QString* cptr = reinterpret_cast<QString*>(shiboType->ext_tocpp(pyobj)); QString* cptr = reinterpret_cast<QString*>(shiboType->ext_tocpp(pyObj));
std::auto_ptr<QString> cptr_auto_ptr(cptr); std::auto_ptr<QString> cptr_auto_ptr(cptr);
return *cptr; return *cptr;
} }
return *Converter<QString*>::toCpp(pyobj); return *Converter<QString*>::toCpp(pyObj);
}
inline PyObject* Converter<QString>::toPython(const QString& cppObj)
{
return ValueTypeConverter<QString>::toPython(cppObj);
} }
} }

View file

@ -1,22 +1,17 @@
namespace Shiboken namespace Shiboken
{ {
inline bool Converter<QStringList>::checkType(PyObject* pyObj)
{
return Converter_std_list<QStringList>::checkType(pyObj);
}
inline bool Converter<QStringList>::isConvertible(PyObject* pyObj) inline bool Converter<QStringList>::isConvertible(PyObject* pyObj)
{ {
return Converter_std_list<QStringList>::isConvertible(pyObj); return StdListConverter<QStringList>::isConvertible(pyObj);
} }
inline QStringList Converter<QStringList>::toCpp(PyObject* pyObj) inline QStringList Converter<QStringList>::toCpp(PyObject* pyObj)
{ {
return Converter_std_list<QStringList>::toCpp(pyObj); return StdListConverter<QStringList>::toCpp(pyObj);
} }
inline PyObject* Converter<QStringList>::toPython(const QStringList& cppObj) inline PyObject* Converter<QStringList>::toPython(const QStringList& cppObj)
{ {
return Converter_std_list<QStringList>::toPython(cppObj); return StdListConverter<QStringList>::toPython(cppObj);
} }
} }

View file

@ -30,6 +30,7 @@ struct QMetaTypeId< PyObjectHolder >
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Shiboken { namespace Shiboken {
// all types are convertible to QVariant // all types are convertible to QVariant
inline bool Converter<QVariant>::isConvertible(PyObject* pyobj) inline bool Converter<QVariant>::isConvertible(PyObject* pyobj)
{ {
@ -84,4 +85,10 @@ inline QVariant Converter<QVariant>::toCpp(PyObject* pyobj)
return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyobj)->cptr); return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyobj)->cptr);
} }
} }
inline PyObject* Converter<QVariant>::toPython(const QVariant& cppObj)
{
return ValueTypeConverter<QVariant>::toPython(cppObj);
}
} }

View file

@ -1,4 +1,4 @@
namespace Shiboken { namespace Shiboken {
template<typename T> template<typename T>
struct Converter<QVector<T> > : Converter_std_list<QVector<T> > {}; struct Converter<QVector<T> > : StdListConverter<QVector<T> > {};
} }

View file

@ -435,6 +435,7 @@
<container-type name="QHash" type="hash"> <container-type name="QHash" type="hash">
<conversion-rule file="qhash_conversions.h"/> <conversion-rule file="qhash_conversions.h"/>
<include file-name="QHash" location="global"/> <include file-name="QHash" location="global"/>
<include file-name="pysideconversions.h" location="global"/>
</container-type> </container-type>
<container-type name="QLinkedList" type="linked-list"/> <container-type name="QLinkedList" type="linked-list"/>
<container-type name="QMap" type="map"> <container-type name="QMap" type="map">

View file

@ -1,6 +1,8 @@
namespace Shiboken { namespace Shiboken {
inline bool Converter< QPixmap >::isConvertible(PyObject* pyobj) inline bool Converter< QPixmap >::isConvertible(PyObject* pyobj)
{ {
if (ValueTypeConverter<QPixmap>::isConvertible(pyobj))
return true;
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QPixmap>()); SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QPixmap>());
bool isVariant = SbkQVariant_Check(pyobj); bool isVariant = SbkQVariant_Check(pyobj);
if (isVariant) { if (isVariant) {
@ -34,4 +36,9 @@ inline QPixmap Converter< QPixmap >::toCpp(PyObject* pyobj)
return *Converter<QPixmap*>::toCpp(pyobj); return *Converter<QPixmap*>::toCpp(pyobj);
} }
inline PyObject* Converter<QPixmap>::toPython(const QPixmap& cppObj)
{
return ValueTypeConverter<QPixmap>::toPython(cppObj);
}
} }

View file

@ -35,11 +35,14 @@
#ifndef PYSIDECONVERSIONS_H #ifndef PYSIDECONVERSIONS_H
#define PYSIDECONVERSIONS_H #define PYSIDECONVERSIONS_H
template <typename StdMap> template <typename QtDict>
struct QtDictConverter struct QtDictConverter
{ {
static inline bool checkType(PyObject* pyObj) static inline bool isConvertible(PyObject* pyObj)
{ {
if (PyObject_TypeCheck(pyObj, Shiboken::SbkType<QtDict>()))
return true;
if (!PyDict_Check(pyObj)) if (!PyDict_Check(pyObj))
return false; return false;
@ -48,44 +51,37 @@ struct QtDictConverter
Py_ssize_t pos = 0; Py_ssize_t pos = 0;
while (PyDict_Next(pyObj, &pos, &key, &value)) { while (PyDict_Next(pyObj, &pos, &key, &value)) {
if (!Shiboken::Converter<typename StdMap::key_type>::checkType(key) if (!Shiboken::Converter<typename QtDict::key_type>::isConvertible(key)
&& !Shiboken::Converter<typename StdMap::mapped_type>::checkType(value) && !Shiboken::Converter<typename QtDict::mapped_type>::isConvertible(value)) {
&& !Shiboken::Converter<typename StdMap::key_type>::isConvertible(key)
&& !Shiboken::Converter<typename StdMap::mapped_type>::isConvertible(value)) {
return false; return false;
} }
} }
return true; return true;
} }
static inline bool isConvertible(PyObject* pyObj) static inline PyObject* toPython(const QtDict& cppobj)
{
return checkType(pyObj);
}
static inline PyObject* toPython(const StdMap& cppobj)
{ {
PyObject* result = PyDict_New(); PyObject* result = PyDict_New();
typename StdMap::const_iterator it = cppobj.begin(); typename QtDict::const_iterator it = cppobj.begin();
for (; it != cppobj.end(); ++it) { for (; it != cppobj.end(); ++it) {
PyDict_SetItem(result, PyDict_SetItem(result,
Shiboken::Converter<typename StdMap::key_type>::toPython(it.key()), Shiboken::Converter<typename QtDict::key_type>::toPython(it.key()),
Shiboken::Converter<typename StdMap::mapped_type>::toPython(it.value())); Shiboken::Converter<typename QtDict::mapped_type>::toPython(it.value()));
} }
return result; return result;
} }
static inline StdMap toCpp(PyObject* pyobj) static inline QtDict toCpp(PyObject* pyobj)
{ {
StdMap result; QtDict result;
PyObject* key; PyObject* key;
PyObject* value; PyObject* value;
Py_ssize_t pos = 0; Py_ssize_t pos = 0;
while (PyDict_Next(pyobj, &pos, &key, &value)) while (PyDict_Next(pyobj, &pos, &key, &value))
result[Shiboken::Converter<typename StdMap::key_type>::toCpp(key)] = Shiboken::Converter<typename StdMap::mapped_type>::toCpp(value); result[Shiboken::Converter<typename QtDict::key_type>::toCpp(key)] = Shiboken::Converter<typename QtDict::mapped_type>::toCpp(value);
return result; return result;
} }
}; };