From 26e45be10730d10f9d04b1c6548ac545106ce643 Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Wed, 27 Apr 2011 15:02:38 -0300 Subject: Implemented stream operator for PyObjectWrapper. Fixes bug #829. Reviewer: Marcelo Lira Hugo Parente Lima --- libpyside/signalmanager.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ libpyside/signalmanager.h | 4 ++++ 2 files changed, 46 insertions(+) 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(PYTHON_TYPE); + qRegisterMetaTypeStreamOperators(PYTHON_TYPE); TypeResolver::createValueTypeResolver(PYTHON_TYPE); TypeResolver::createValueTypeResolver("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 #include #include +#include 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: -- cgit v1.2.3