blob: 28a3380fab4023791461f5b81bbf80c762b388d0 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtDBus module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** 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 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QDBUSARGUMENT_P_H
#define QDBUSARGUMENT_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of the QLibrary class. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
#include <qdbusargument.h>
#include "qdbusunixfiledescriptor.h"
#include "qdbus_symbols_p.h"
#ifndef QT_NO_DBUS
#ifndef DBUS_TYPE_UNIX_FD
# define DBUS_TYPE_UNIX_FD int('h')
# define DBUS_TYPE_UNIX_FD_AS_STRING "h"
#endif
QT_BEGIN_NAMESPACE
class QDBusMarshaller;
class QDBusDemarshaller;
class QDBusArgumentPrivate
{
public:
inline QDBusArgumentPrivate(int flags = 0)
: message(0), ref(1), capabilities(flags)
{ }
~QDBusArgumentPrivate();
static bool checkRead(QDBusArgumentPrivate *d);
static bool checkReadAndDetach(QDBusArgumentPrivate *&d);
static bool checkWrite(QDBusArgumentPrivate *&d);
QDBusMarshaller *marshaller();
QDBusDemarshaller *demarshaller();
static QByteArray createSignature(int id);
static inline QDBusArgument create(QDBusArgumentPrivate *d)
{
QDBusArgument q(d);
return q;
}
static inline QDBusArgumentPrivate *d(QDBusArgument &q)
{ return q.d; }
public:
DBusMessage *message;
QAtomicInt ref;
int capabilities;
enum Direction {
Marshalling,
Demarshalling
} direction;
};
class QDBusMarshaller: public QDBusArgumentPrivate
{
public:
QDBusMarshaller(int flags) : QDBusArgumentPrivate(flags), parent(0), ba(0), closeCode(0), ok(true), skipSignature(false)
{ direction = Marshalling; }
~QDBusMarshaller();
QString currentSignature();
void append(uchar arg);
void append(bool arg);
void append(short arg);
void append(ushort arg);
void append(int arg);
void append(uint arg);
void append(qlonglong arg);
void append(qulonglong arg);
void append(double arg);
void append(const QString &arg);
void append(const QDBusObjectPath &arg);
void append(const QDBusSignature &arg);
void append(const QDBusUnixFileDescriptor &arg);
void append(const QStringList &arg);
void append(const QByteArray &arg);
bool append(const QDBusVariant &arg); // this one can fail
QDBusMarshaller *beginStructure();
QDBusMarshaller *endStructure();
QDBusMarshaller *beginArray(int id);
QDBusMarshaller *endArray();
QDBusMarshaller *beginMap(int kid, int vid);
QDBusMarshaller *endMap();
QDBusMarshaller *beginMapEntry();
QDBusMarshaller *endMapEntry();
QDBusMarshaller *beginCommon(int code, const char *signature);
QDBusMarshaller *endCommon();
void open(QDBusMarshaller &sub, int code, const char *signature);
void close();
void error(const QString &message);
bool appendVariantInternal(const QVariant &arg);
bool appendRegisteredType(const QVariant &arg);
bool appendCrossMarshalling(QDBusDemarshaller *arg);
public:
DBusMessageIter iterator;
QDBusMarshaller *parent;
QByteArray *ba;
QString errorString;
char closeCode;
bool ok;
bool skipSignature;
private:
Q_DISABLE_COPY(QDBusMarshaller)
};
class QDBusDemarshaller: public QDBusArgumentPrivate
{
public:
inline QDBusDemarshaller(int flags) : QDBusArgumentPrivate(flags), parent(0)
{ direction = Demarshalling; }
~QDBusDemarshaller();
QString currentSignature();
uchar toByte();
bool toBool();
ushort toUShort();
short toShort();
int toInt();
uint toUInt();
qlonglong toLongLong();
qulonglong toULongLong();
double toDouble();
QString toString();
QDBusObjectPath toObjectPath();
QDBusSignature toSignature();
QDBusUnixFileDescriptor toUnixFileDescriptor();
QDBusVariant toVariant();
QStringList toStringList();
QByteArray toByteArray();
QDBusDemarshaller *beginStructure();
QDBusDemarshaller *endStructure();
QDBusDemarshaller *beginArray();
QDBusDemarshaller *endArray();
QDBusDemarshaller *beginMap();
QDBusDemarshaller *endMap();
QDBusDemarshaller *beginMapEntry();
QDBusDemarshaller *endMapEntry();
QDBusDemarshaller *beginCommon();
QDBusDemarshaller *endCommon();
QDBusArgument duplicate();
inline void close() { }
bool atEnd();
QVariant toVariantInternal();
QDBusArgument::ElementType currentType();
bool isCurrentTypeStringLike();
public:
DBusMessageIter iterator;
QDBusDemarshaller *parent;
private:
Q_DISABLE_COPY(QDBusDemarshaller)
QString toStringUnchecked();
QDBusObjectPath toObjectPathUnchecked();
QDBusSignature toSignatureUnchecked();
QStringList toStringListUnchecked();
QByteArray toByteArrayUnchecked();
};
inline QDBusMarshaller *QDBusArgumentPrivate::marshaller()
{ return static_cast<QDBusMarshaller *>(this); }
inline QDBusDemarshaller *QDBusArgumentPrivate::demarshaller()
{ return static_cast<QDBusDemarshaller *>(this); }
QT_END_NAMESPACE
#endif // QT_NO_DBUS
#endif