#pragma once
#include <gio/gio.h>
#include <string>
#include <vector>
#include <list>
#include <memory>
#include "../include/Gobbledegook.h"
#include "DBusObject.h"
namespace ggk {
struct GattProperty;
struct GattCharacteristic;
struct DBusInterface;
struct DBusObjectPath;
struct Server
{
typedef std::list<DBusObject> Objects;
const Objects &getObjects() const { return objects; }
bool getEnableBREDR() const { return enableBREDR; }
bool getEnableSecureConnection() const { return enableSecureConnection; }
bool getEnableConnectable() const { return enableConnectable; }
bool getEnableAdvertising() const { return enableAdvertising; }
bool getEnableBondable() const { return enableBondable; }
GGKServerDataGetter getDataGetter() const { return dataGetter; }
GGKServerDataSetter getDataSetter() const { return dataSetter; }
const std::string &getAdvertisingName() const { return advertisingName; }
const std::string &getAdvertisingShortName() const { return advertisingShortName; }
const std::string &getServiceName() const { return serviceName; }
std::string getOwnedName() const { return std::string("com.") + getServiceName(); }
Server(const std::string &serviceName, const std::string &advertisingName, const std::string &advertisingShortName,
GGKServerDataGetter getter, GGKServerDataSetter setter);
std::shared_ptr<const DBusInterface> findInterface(const DBusObjectPath &objectPath, const std::string &interfaceName) const;
bool callMethod(const DBusObjectPath &objectPath, const std::string &interfaceName, const std::string &methodName, GDBusConnection *pConnection, GVariant *pParameters, GDBusMethodInvocation *pInvocation, gpointer pUserData) const;
const GattProperty *findProperty(const DBusObjectPath &objectPath, const std::string &interfaceName, const std::string &propertyName) const;
private:
Objects objects;
bool enableBREDR;
bool enableSecureConnection;
bool enableConnectable;
bool enableAdvertising;
bool enableBondable;
GGKServerDataGetter dataGetter;
GGKServerDataSetter dataSetter;
std::string advertisingName;
std::string advertisingShortName;
std::string serviceName;
};
extern std::shared_ptr<Server> TheServer;
};