diff options
Diffstat (limited to 'src/dbus/qdbusargument.h')
-rw-r--r-- | src/dbus/qdbusargument.h | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h new file mode 100644 index 0000000..6491f0f --- /dev/null +++ b/src/dbus/qdbusargument.h @@ -0,0 +1,383 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtDBus module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDBUSARGUMENT_H +#define QDBUSARGUMENT_H + +#include <QtCore/qbytearray.h> +#include <QtCore/qhash.h> +#include <QtCore/qglobal.h> +#include <QtCore/qlist.h> +#include <QtCore/qmap.h> +#include <QtCore/qstring.h> +#include <QtCore/qstringlist.h> +#include <QtCore/qvariant.h> +#include <QtDBus/qdbusextratypes.h> +#include <QtDBus/qdbusmacros.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(DBus) + +class QDBusArgumentPrivate; +class QDBusDemarshaller; +class QDBusMarshaller; +class QDBUS_EXPORT QDBusArgument +{ +public: + enum ElementType { + BasicType, + VariantType, + ArrayType, + StructureType, + MapType, + MapEntryType, + UnknownType = -1 + }; + + QDBusArgument(); + QDBusArgument(const QDBusArgument &other); + QDBusArgument &operator=(const QDBusArgument &other); + ~QDBusArgument(); + + // used for marshalling (Qt -> D-BUS) + QDBusArgument &operator<<(uchar arg); + QDBusArgument &operator<<(bool arg); + QDBusArgument &operator<<(short arg); + QDBusArgument &operator<<(ushort arg); + QDBusArgument &operator<<(int arg); + QDBusArgument &operator<<(uint arg); + QDBusArgument &operator<<(qlonglong arg); + QDBusArgument &operator<<(qulonglong arg); + QDBusArgument &operator<<(double arg); + QDBusArgument &operator<<(const QString &arg); + QDBusArgument &operator<<(const QDBusVariant &arg); + QDBusArgument &operator<<(const QDBusObjectPath &arg); + QDBusArgument &operator<<(const QDBusSignature &arg); + QDBusArgument &operator<<(const QStringList &arg); + QDBusArgument &operator<<(const QByteArray &arg); + + void beginStructure(); + void endStructure(); + void beginArray(int elementMetaTypeId); + void endArray(); + void beginMap(int keyMetaTypeId, int valueMetaTypeId); + void endMap(); + void beginMapEntry(); + void endMapEntry(); + + void appendVariant(const QVariant &v); + + // used for de-marshalling (D-BUS -> Qt) + QString currentSignature() const; + ElementType currentType() const; + + const QDBusArgument &operator>>(uchar &arg) const; + const QDBusArgument &operator>>(bool &arg) const; + const QDBusArgument &operator>>(short &arg) const; + const QDBusArgument &operator>>(ushort &arg) const; + const QDBusArgument &operator>>(int &arg) const; + const QDBusArgument &operator>>(uint &arg) const; + const QDBusArgument &operator>>(qlonglong &arg) const; + const QDBusArgument &operator>>(qulonglong &arg) const; + const QDBusArgument &operator>>(double &arg) const; + const QDBusArgument &operator>>(QString &arg) const; + const QDBusArgument &operator>>(QDBusVariant &arg) const; + const QDBusArgument &operator>>(QDBusObjectPath &arg) const; + const QDBusArgument &operator>>(QDBusSignature &arg) const; + const QDBusArgument &operator>>(QStringList &arg) const; + const QDBusArgument &operator>>(QByteArray &arg) const; + + void beginStructure() const; + void endStructure() const; + void beginArray() const; + void endArray() const; + void beginMap() const; + void endMap() const; + void beginMapEntry() const; + void endMapEntry() const; + bool atEnd() const; + + QVariant asVariant() const; + +protected: + QDBusArgument(QDBusArgumentPrivate *d); + friend class QDBusArgumentPrivate; + mutable QDBusArgumentPrivate *d; +}; + +template<typename T> inline T qdbus_cast(const QDBusArgument &arg +#ifndef Q_QDOC +, T * = 0 +#endif + ) +{ + T item; + arg >> item; + return item; +} + +template<typename T> inline T qdbus_cast(const QVariant &v +#ifndef Q_QDOC +, T * = 0 +#endif + ) +{ + int id = v.userType(); + if (id == qMetaTypeId<QDBusArgument>()) + return qdbus_cast<T>(qvariant_cast<QDBusArgument>(v)); + else + return qvariant_cast<T>(v); +} + +// specialise for QVariant, allowing it to be used in place of QDBusVariant +template<> inline QVariant qdbus_cast<QVariant>(const QDBusArgument &arg, QVariant *) +{ + QDBusVariant item; + arg >> item; + return item.variant(); +} +template<> inline QVariant qdbus_cast<QVariant>(const QVariant &v, QVariant *) +{ + return qdbus_cast<QDBusVariant>(v).variant(); +} + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QVariant &v); + +// QVariant types +#ifndef QDBUS_NO_SPECIALTYPES + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QDate &date); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QDate &date); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QTime &time); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QTime &time); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QDateTime &dt); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QDateTime &dt); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QRect &rect); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QRect &rect); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QRectF &rect); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QRectF &rect); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QSize &size); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QSize &size); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QSizeF &size); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QSizeF &size); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QPoint &pt); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QPoint &pt); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QPointF &pt); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QPointF &pt); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QLine &line); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QLine &line); + +QDBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QLineF &line); +QDBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QLineF &line); +#endif + +template<template <typename> class Container, typename T> +inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<T> &list) +{ + int id = qMetaTypeId<T>(); + arg.beginArray(id); + typename Container<T>::const_iterator it = list.begin(); + typename Container<T>::const_iterator end = list.end(); + for ( ; it != end; ++it) + arg << *it; + arg.endArray(); + return arg; +} + +template<template <typename> class Container, typename T> +inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<T> &list) +{ + arg.beginArray(); + list.clear(); + while (!arg.atEnd()) { + T item; + arg >> item; + list.push_back(item); + } + + arg.endArray(); + return arg; +} + +// QList specializations +template<typename T> +inline QDBusArgument &operator<<(QDBusArgument &arg, const QList<T> &list) +{ + int id = qMetaTypeId<T>(); + arg.beginArray(id); + typename QList<T>::ConstIterator it = list.constBegin(); + typename QList<T>::ConstIterator end = list.constEnd(); + for ( ; it != end; ++it) + arg << *it; + arg.endArray(); + return arg; +} + +template<typename T> +inline const QDBusArgument &operator>>(const QDBusArgument &arg, QList<T> &list) +{ + arg.beginArray(); + list.clear(); + while (!arg.atEnd()) { + T item; + arg >> item; + list.push_back(item); + } + arg.endArray(); + + return arg; +} + +inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantList &list) +{ + int id = qMetaTypeId<QDBusVariant>(); + arg.beginArray(id); + QVariantList::ConstIterator it = list.constBegin(); + QVariantList::ConstIterator end = list.constEnd(); + for ( ; it != end; ++it) + arg << QDBusVariant(*it); + arg.endArray(); + return arg; +} + +// QMap specializations +template<typename Key, typename T> +inline QDBusArgument &operator<<(QDBusArgument &arg, const QMap<Key, T> &map) +{ + int kid = qMetaTypeId<Key>(); + int vid = qMetaTypeId<T>(); + arg.beginMap(kid, vid); + typename QMap<Key, T>::ConstIterator it = map.constBegin(); + typename QMap<Key, T>::ConstIterator end = map.constEnd(); + for ( ; it != end; ++it) { + arg.beginMapEntry(); + arg << it.key() << it.value(); + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + +template<typename Key, typename T> +inline const QDBusArgument &operator>>(const QDBusArgument &arg, QMap<Key, T> &map) +{ + arg.beginMap(); + map.clear(); + while (!arg.atEnd()) { + Key key; + T value; + arg.beginMapEntry(); + arg >> key >> value; + map.insertMulti(key, value); + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + +inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantMap &map) +{ + arg.beginMap(QVariant::String, qMetaTypeId<QDBusVariant>()); + QVariantMap::ConstIterator it = map.constBegin(); + QVariantMap::ConstIterator end = map.constEnd(); + for ( ; it != end; ++it) { + arg.beginMapEntry(); + arg << it.key() << QDBusVariant(it.value()); + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + +// QHash specializations +template<typename Key, typename T> +inline QDBusArgument &operator<<(QDBusArgument &arg, const QHash<Key, T> &map) +{ + int kid = qMetaTypeId<Key>(); + int vid = qMetaTypeId<T>(); + arg.beginMap(kid, vid); + typename QHash<Key, T>::ConstIterator it = map.constBegin(); + typename QHash<Key, T>::ConstIterator end = map.constEnd(); + for ( ; it != end; ++it) { + arg.beginMapEntry(); + arg << it.key() << it.value(); + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + +template<typename Key, typename T> +inline const QDBusArgument &operator>>(const QDBusArgument &arg, QHash<Key, T> &map) +{ + arg.beginMap(); + map.clear(); + while (!arg.atEnd()) { + Key key; + T value; + arg.beginMapEntry(); + arg >> key >> value; + map.insertMulti(key, value); + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QDBusArgument) + +QT_END_HEADER + +#endif |