qt6-bb10/src/dbus/qdbusargument_p.h

200 lines
5.5 KiB
C++

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#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 <QtDBus/private/qtdbusglobal_p.h>
#include <qdbusargument.h>
#include "qdbusconnection.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
{
Q_DISABLE_COPY_MOVE(QDBusArgumentPrivate)
public:
enum class Direction { Marshalling, Demarshalling };
virtual ~QDBusArgumentPrivate();
static bool checkRead(QDBusArgumentPrivate *d);
static bool checkReadAndDetach(QDBusArgumentPrivate *&d);
static bool checkWrite(QDBusArgumentPrivate *&d);
QDBusMarshaller *marshaller();
QDBusDemarshaller *demarshaller();
static QByteArray createSignature(QMetaType type);
static inline QDBusArgument create(QDBusArgumentPrivate *d)
{
QDBusArgument q(d);
return q;
}
static inline QDBusArgumentPrivate *d(QDBusArgument &q)
{ return q.d; }
DBusMessage *message = nullptr;
QAtomicInt ref = 1;
QDBusConnection::ConnectionCapabilities capabilities;
Direction direction;
protected:
explicit QDBusArgumentPrivate(Direction direction,
QDBusConnection::ConnectionCapabilities flags = {})
: capabilities(flags), direction(direction)
{
}
};
class QDBusMarshaller final : public QDBusArgumentPrivate
{
public:
explicit QDBusMarshaller(QDBusConnection::ConnectionCapabilities flags = {})
: QDBusArgumentPrivate(Direction::Marshalling, flags)
{
}
~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(QMetaType id);
QDBusMarshaller *endArray();
QDBusMarshaller *beginMap(QMetaType kid, QMetaType 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);
DBusMessageIter iterator;
QDBusMarshaller *parent = nullptr;
QByteArray *ba = nullptr;
QString errorString;
char closeCode = 0;
bool ok = true;
bool skipSignature = false;
private:
Q_DECL_COLD_FUNCTION void unregisteredTypeError(QMetaType t);
Q_DISABLE_COPY_MOVE(QDBusMarshaller)
};
class QDBusDemarshaller final : public QDBusArgumentPrivate
{
public:
explicit QDBusDemarshaller(QDBusConnection::ConnectionCapabilities flags = {})
: QDBusArgumentPrivate(Direction::Demarshalling, flags)
{
}
~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();
DBusMessageIter iterator;
QDBusDemarshaller *parent = nullptr;
private:
Q_DISABLE_COPY_MOVE(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