#pragma once
#include <gio/gio.h>
#include <string>
#include <list>
#include "TickEvent.h"
#include "DBusMethod.h"
namespace ggk {
struct DBusInterface;
struct GattProperty;
struct DBusObject;
struct DBusObjectPath;
#define INTERFACE_METHOD_CALLBACK_LAMBDA [] \
( \
const DBusInterface &self, \
GDBusConnection *pConnection, \
const std::string &methodName, \
GVariant *pParameters, \
GDBusMethodInvocation *pInvocation, \
void *pUserData \
)
#define TRY_GET_INTERFACE_OF_TYPE(pInterface, type) \
(pInterface->getInterfaceType() == type::kInterfaceType ? \
std::static_pointer_cast<type>(pInterface) : \
nullptr)
#define TRY_GET_CONST_INTERFACE_OF_TYPE(pInterface, type) \
(pInterface->getInterfaceType() == type::kInterfaceType ? \
std::static_pointer_cast<const type>(pInterface) : \
nullptr)
struct DBusInterface
{
static constexpr const char *kInterfaceType = "DBusInterface";
typedef void (*MethodCallback)(const DBusInterface &self, GDBusConnection *pConnection, const std::string &methodName, GVariant *pParameters, GDBusMethodInvocation *pInvocation, void *pUserData);
typedef void (*EventCallback)(const DBusInterface &self, const TickEvent &event, GDBusConnection *pConnection, void *pUserData);
DBusInterface(DBusObject &owner, const std::string &name);
virtual ~DBusInterface();
virtual const std::string getInterfaceType() const { return DBusInterface::kInterfaceType; }
const std::string &getName() const;
DBusInterface &setName(const std::string &name);
DBusObject &getOwner() const;
DBusObjectPath getPathNode() const;
DBusObjectPath getPath() const;
DBusInterface &addMethod(const std::string &name, const char *pInArgs[], const char *pOutArgs, DBusMethod::Callback callback);
virtual bool callMethod(const std::string &methodName, GDBusConnection *pConnection, GVariant *pParameters, GDBusMethodInvocation *pInvocation, gpointer pUserData) const;
DBusInterface &onEvent(int tickFrequency, void *pUserData, TickEvent::Callback callback);
virtual void tickEvents(GDBusConnection *pConnection, void *pUserData) const;
virtual std::string generateIntrospectionXML(int depth) const;
protected:
DBusObject &owner;
std::string name;
std::list<DBusMethod> methods;
std::list<TickEvent> events;
};
};