/*
 * This file was generated by qdbusxml2cpp version 0.8
 * Command line was: qdbusxml2cpp -p gattdesc1_p.h:gattdesc1.cpp org.bluez.GattDescriptor1.xml
 *
 * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
 *
 * This is an auto-generated file.
 * Do not edit! All changes made to it will be lost.
 */

#ifndef GATTDESC1_P_H
#define GATTDESC1_P_H

#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>

/*
 * Proxy class for interface org.bluez.GattDescriptor1
 */
class OrgBluezGattDescriptor1Interface: public QDBusAbstractInterface
{
    Q_OBJECT
public:
    static inline const char *staticInterfaceName()
    { return "org.bluez.GattDescriptor1"; }

public:
    OrgBluezGattDescriptor1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);

    ~OrgBluezGattDescriptor1Interface();

    Q_PROPERTY(QDBusObjectPath Characteristic READ characteristic)
    inline QDBusObjectPath characteristic() const
    { return qvariant_cast< QDBusObjectPath >(property("Characteristic")); }

    Q_PROPERTY(QString UUID READ uUID)
    inline QString uUID() const
    { return qvariant_cast< QString >(property("UUID")); }

    Q_PROPERTY(QByteArray Value READ value)
    inline QByteArray value() const
    { return qvariant_cast< QByteArray >(property("Value")); }

public Q_SLOTS: // METHODS
    inline QDBusPendingReply<QByteArray> ReadValue(const QVariantMap &options)
    {
        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue(options);
        return asyncCallWithArgumentList(QStringLiteral("ReadValue"), argumentList);
    }

    inline QDBusPendingReply<> WriteValue(const QByteArray &value, const QVariantMap &options)
    {
        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue(value) << QVariant::fromValue(options);
        return asyncCallWithArgumentList(QStringLiteral("WriteValue"), argumentList);
    }

Q_SIGNALS: // SIGNALS
};

namespace org {
  namespace bluez {
    typedef ::OrgBluezGattDescriptor1Interface GattDescriptor1;
  }
}
#endif
