diff options
author | Renato Filho <renato.filho@openbossa.org> | 2011-04-27 15:02:38 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:54:16 -0300 |
commit | 26e45be10730d10f9d04b1c6548ac545106ce643 (patch) | |
tree | 16f94746a44eab5e94b4f68a8e3222dbe579b0c4 /libpyside | |
parent | ea4968f5f31efba2df21514ae08beb1bef29031c (diff) |
Implemented stream operator for PyObjectWrapper.
Fixes bug #829.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Hugo Parente Lima <hugo.pl@gmail.com>
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/signalmanager.cpp | 42 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 4 |
2 files changed, 46 insertions, 0 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 16fac5415..6ab84561f 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -87,6 +87,47 @@ PyObjectWrapper::operator PyObject*() const return m_me; } +QDataStream &operator<<(QDataStream &out, const PyObjectWrapper &myObj) +{ + static PyObject *reduce_func = 0; + + Shiboken::GilState gil; + if (!reduce_func) { + Shiboken::AutoDecRef pickleModule(PyImport_ImportModule("pickle")); + reduce_func = PyObject_GetAttrString(pickleModule, "dumps"); + } + Shiboken::AutoDecRef repr(PyObject_CallFunctionObjArgs(reduce_func, (PyObject*)myObj, NULL)); + if (repr.object()) { + char* buff; + Py_ssize_t size; + PyString_AsStringAndSize(repr.object(), &buff, &size); + QByteArray data(buff, size); + out << data; + } + return out; +} + +QDataStream &operator>>(QDataStream &in, PyObjectWrapper &myObj) +{ + static PyObject *eval_func = 0; + + Shiboken::GilState gil; + if (!eval_func) { + Shiboken::AutoDecRef pickleModule(PyImport_ImportModule("pickle")); + eval_func = PyObject_GetAttrString(pickleModule, "loads"); + } + + QByteArray repr; + in >> repr; + Shiboken::AutoDecRef pyCode(PyString_FromStringAndSize(repr.data(), repr.size())); + Shiboken::AutoDecRef value(PyObject_CallFunctionObjArgs(eval_func, pyCode.object(), 0)); + if (!value.object()) { + value = Py_None; + } + myObj = PyObjectWrapper(value); + return in; +} + }; namespace Shiboken { @@ -132,6 +173,7 @@ SignalManager::SignalManager() : m_d(new SignalManagerPrivate) // Register PyObject type to use in queued signal and slot connections qRegisterMetaType<PyObjectWrapper>(PYTHON_TYPE); + qRegisterMetaTypeStreamOperators<PyObjectWrapper>(PYTHON_TYPE); TypeResolver::createValueTypeResolver<PyObjectWrapper>(PYTHON_TYPE); TypeResolver::createValueTypeResolver<PyObjectWrapper>("object"); diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index f6ce1fb0c..5ea1366f0 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -28,6 +28,7 @@ #include <Qt> #include <QStringList> #include <QMetaMethod> +#include <QMetaType> class QObject; @@ -49,6 +50,9 @@ private: void* m_data; //future }; +PYSIDE_API QDataStream &operator<<(QDataStream& out, const PyObjectWrapper& myObj); +PYSIDE_API QDataStream &operator>>(QDataStream& in, PyObjectWrapper& myObj); + class PYSIDE_API SignalManager { public: |