aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2011-04-27 15:02:38 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:54:16 -0300
commit26e45be10730d10f9d04b1c6548ac545106ce643 (patch)
tree16f94746a44eab5e94b4f68a8e3222dbe579b0c4 /libpyside
parentea4968f5f31efba2df21514ae08beb1bef29031c (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.cpp42
-rw-r--r--libpyside/signalmanager.h4
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: