diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 90825e2392b2d70e43c7a25b8a3752299a933894 (patch) | |
tree | e33aa27f02b74604afbfd0ea4f1cfca8833d882a /dcoppython/shell/marshaller.cpp | |
download | tdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.tar.gz tdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebindings@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'dcoppython/shell/marshaller.cpp')
-rw-r--r-- | dcoppython/shell/marshaller.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/dcoppython/shell/marshaller.cpp b/dcoppython/shell/marshaller.cpp new file mode 100644 index 00000000..f2dd4d03 --- /dev/null +++ b/dcoppython/shell/marshaller.cpp @@ -0,0 +1,169 @@ +/*************************************************************************** + * Copyright (C) 2003 by Julian Rockey * + * linux@jrockey.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#include "marshaller.h" + +#include "pcop.h" +#include "importedmodules.h" + +#include <qdatastream.h> + +#include <qrect.h> +#include <qfont.h> +#include <qcolor.h> +#include <qpointarray.h> +#include <qdatetime.h> +#include <dcopref.h> + +#include <kurl.h> + +#if PY_VERSION_HEX < 0x02050000 +typedef int Py_ssize_t; +#endif + +namespace PythonDCOP { + +#include "marshal_funcs.h" + + Marshaller::Marshaller() + { + initFuncs(); + } + + Marshaller::~Marshaller() + { + } + + bool Marshaller::marsh_private(const PCOPType &type, + PyObject *obj, + QDataStream *str) const + { + + QString ty = type.type(); + + if (ty=="QStringList") + return marshalList(PCOPType("QString"), obj, str); + if (ty=="QCStringList") + return marshalList(PCOPType("QCString"), obj, str); + if (ty=="QValueList" && type.leftType()) + return marshalList(*type.leftType(), obj, str); + if (ty=="QMap" && type.leftType() && type.rightType()) + return marshalDict(*type.leftType(), *type.rightType(), obj, str); + + if (!m_marsh_funcs.contains(ty)) return false; + return m_marsh_funcs[ty](obj,str); + } + + PyObject *Marshaller::demarsh_private(const PCOPType &type, + QDataStream *str) const + { + QString ty = type.type(); + + if (ty=="QStringList") + return demarshalList(PCOPType("QString"), str); + if (ty=="QCStringList") + return demarshalList(PCOPType("QCString"), str); + if (ty=="QValueList" && type.leftType()) + return demarshalList(*type.leftType(), str); + if (ty=="QMap" && type.leftType() && type.rightType()) + return demarshalDict(*type.leftType(), *type.rightType(), str); + + if (!m_demarsh_funcs.contains(ty)) { + Py_INCREF(Py_None); + return Py_None; + } + + PyObject *result = m_demarsh_funcs[ty](str); + if (!result) { + Py_INCREF(Py_None); + return Py_None; + } + + return result; + } + + bool Marshaller::marshalList(const PCOPType &list_type, + PyObject *obj, + QDataStream *str) const { + if (!PyList_Check(obj)) return false; + + int count = PyList_Size(obj); + + for(int c=0;c<count;c++) + if (!list_type.isMarshallable( PyList_GetItem(obj,c) ) ) + return false; + + if (str) { + (*str) << (Q_INT32)count; + for(int c=0; c<count; c++) + list_type.marshal( PyList_GetItem(obj,c), *str ); + } + + return true; + } + + PyObject *Marshaller::demarshalList(const PCOPType &list_type, + QDataStream *str) const { + Q_UINT32 count; + (*str) >> count; + + PyObject *obj = PyList_New(count); + for(Q_UINT32 c=0;c<count;c++) { + PyList_SetItem(obj, c, list_type.demarshal(*str)); + } + return obj; + } + + bool Marshaller::marshalDict(const PCOPType &key_type, + const PCOPType &value_type, + PyObject *obj, + QDataStream *str) const { + if (!PyDict_Check(obj)) return false; + + + Py_ssize_t c=0; + PyObject *key, *val; + while (PyDict_Next(obj, &c, &key, &val)==1) + if (!key_type.isMarshallable(key) || + !value_type.isMarshallable(val)) + return false; + + if (str) { + Q_INT32 count = (Q_INT32)PyDict_Size(obj); + (*str) << count; + c=0; + while (PyDict_Next(obj, &c, &key, &val)==1) { + key_type.marshal(key,*str); + value_type.marshal(val,*str); + } + } + return true; + } + + PyObject *Marshaller::demarshalDict(const PCOPType &key_type, + const PCOPType &value_type, + QDataStream *str) const { + PyObject *obj = PyDict_New(); + Q_INT32 count; + (*str) >> count; + for(Q_INT32 c=0;c<count;c++) { + PyObject *key = key_type.demarshal(*str); + PyObject *value = value_type.demarshal(*str); + PyDict_SetItem(obj,key,value); + } + return obj; + } + + + Marshaller *Marshaller::m_instance = new Marshaller; + + +} + |