#pragma once
#include <gio/gio.h>
#include <string>
#include <list>
#include <memory>
#include "DBusObjectPath.h"
namespace ggk {
struct GattProperty;
struct GattService;
struct GattUuid;
struct DBusInterface;
struct DBusObject
{
typedef std::list<std::shared_ptr<DBusInterface> > InterfaceList;
DBusObject(const DBusObjectPath &path, bool publish = true);
DBusObject(DBusObject *pParent, const DBusObjectPath &pathElement);
bool isPublished() const;
const DBusObjectPath &getPathNode() const;
DBusObjectPath getPath() const;
DBusObject &getParent();
const std::list<DBusObject> &getChildren() const;
DBusObject &addChild(const DBusObjectPath &pathElement);
const InterfaceList &getInterfaces() const;
template<typename T>
std::shared_ptr<T> addInterface(std::shared_ptr<T> interface)
{
interfaces.push_back(interface);
return std::static_pointer_cast<T>(interfaces.back());
}
std::string generateIntrospectionXML(int depth = 0) const;
GattService &gattServiceBegin(const std::string &pathElement, const GattUuid &uuid);
std::shared_ptr<const DBusInterface> findInterface(const DBusObjectPath &path, const std::string &interfaceName, const DBusObjectPath &basePath = DBusObjectPath()) const;
bool callMethod(const DBusObjectPath &path, const std::string &interfaceName, const std::string &methodName, GDBusConnection *pConnection, GVariant *pParameters, GDBusMethodInvocation *pInvocation, gpointer pUserData, const DBusObjectPath &basePath = DBusObjectPath()) const;
void tickEvents(GDBusConnection *pConnection, void *pUserData = nullptr) const;
void emitSignal(GDBusConnection *pBusConnection, const std::string &interfaceName, const std::string &signalName, GVariant *pParameters);
private:
bool publish;
DBusObjectPath path;
InterfaceList interfaces;
std::list<DBusObject> children;
DBusObject *pParent;
};
};