/*
 * This file was generated by qdbusxml2cpp version 0.8
 * Command line was: qdbusxml2cpp -v org.neard.Agent.xml -p agent_p -v
 *
 * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd.
 *
 * This is an auto-generated file.
 * Do not edit! All changes made to it will be lost.
 */

#ifndef AGENT_P_H_1410442485
#define AGENT_P_H_1410442485

#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.neard.HandoverAgent
 */
class OrgNeardHandoverAgentInterface: public QDBusAbstractInterface
{
    Q_OBJECT
public:
    static inline const char *staticInterfaceName()
    { return "org.neard.HandoverAgent"; }

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

    ~OrgNeardHandoverAgentInterface();

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

    inline QDBusPendingReply<> Release()
    {
        QList<QVariant> argumentList;
        return asyncCallWithArgumentList(QStringLiteral("Release"), argumentList);
    }

    inline QDBusPendingReply<QVariantMap> RequestOOB(const QVariantMap &values)
    {
        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue(values);
        return asyncCallWithArgumentList(QStringLiteral("RequestOOB"), argumentList);
    }

Q_SIGNALS: // SIGNALS
};

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

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

    ~OrgNeardNDEFAgentInterface();

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

    inline QDBusPendingReply<> Release()
    {
        QList<QVariant> argumentList;
        return asyncCallWithArgumentList(QStringLiteral("Release"), argumentList);
    }

Q_SIGNALS: // SIGNALS
};

namespace org {
  namespace neard {
    typedef ::OrgNeardHandoverAgentInterface HandoverAgent;
    typedef ::OrgNeardNDEFAgentInterface NDEFAgent;
  }
}
#endif
