From 06f646aec4dbce64d28bae1be6111bd833f8e79e Mon Sep 17 00:00:00 2001 From: Paul Nettle Date: Fri, 25 Aug 2017 09:30:39 -0500 Subject: Initial version 1.0 --- src/Server.h | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/Server.h (limited to 'src/Server.h') diff --git a/src/Server.h b/src/Server.h new file mode 100644 index 0000000..8880f22 --- /dev/null +++ b/src/Server.h @@ -0,0 +1,146 @@ +// Copyright 2017 Paul Nettle. +// +// This file is part of Gobbledegook. +// +// Gobbledegook is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Gobbledegook is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Gobbledegook. If not, see . + +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// >> +// >>> INSIDE THIS FILE +// >> +// +// This is the top-level interface for the server. There is only one of these stored in the global `TheServer`. Use this object +// to configure your server's settings (there are surprisingly few of them.) It also contains the full server description and +// implementation. +// +// >> +// >>> DISCUSSION +// >> +// +// See the discussion at the top of Server.cpp +// +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#pragma once + +#include +#include +#include + +#include "DBusInterface.h" +#include "DBusObject.h" + +// +// Forward declarations +// + +struct GattProperty; + +// +// Implementation +// + +struct Server +{ + // + // Types + // + + // Our server is a collection of D-Bus objects + typedef std::list Objects; + + // + // Accessors + // + + // Returns the set of objects that each represent the root of an object tree describing a group of services we are providing + const Objects &getObjects() const { return objects; } + + // Returns the requested setting for BR/EDR (true = enabled, false = disabled) + bool getEnableBREDR() const { return enableBREDR; } + + // Returns the requested setting for secure connections (true = enabled, false = disabled) + bool getEnableSecureConnection() const { return enableSecureConnection; } + + // Returns the requested setting the connectable state (true = enabled, false = disabled) + bool getEnableConnectable() const { return enableConnectable; } + + // Returns the requested setting the LE advertising state (true = enabled, false = disabled) + bool getEnableAdvertising() const { return enableAdvertising; } + + // Returns the requested setting the bondable state (true = enabled, false = disabled) + bool getEnableBondable() const { return enableBondable; } + + // Returns our registered data getter + GGKServerDataGetter getDataGetter() const { return dataGetter; } + + // Returns our registered data setter + GGKServerDataSetter getDataSetter() const { return dataSetter; } + + // + // Initialization + // + + // Our constructor builds our entire server description + Server(GGKServerDataGetter getter, GGKServerDataSetter setter); + + // + // Utilitarian + // + + // Find and call a D-Bus method within the given D-Bus object on the given D-Bus interface + // + // If the method was called, this method returns true, otherwise false. There is no result from the method call itself. + std::shared_ptr findInterface(const DBusObjectPath &objectPath, const std::string &interfaceName) const; + + // Find a D-Bus method within the given D-Bus object on the given D-Bus interface + // + // If the method was found, it is returned, otherwise nullptr is returned + bool callMethod(const DBusObjectPath &objectPath, const std::string &interfaceName, const std::string &methodName, GDBusConnection *pConnection, GVariant *pParameters, GDBusMethodInvocation *pInvocation, gpointer pUserData) const; + + // Find a GATT Property within the given D-Bus object on the given D-Bus interface + // + // If the property was found, it is returned, otherwise nullptr is returned + const GattProperty *findProperty(const DBusObjectPath &objectPath, const std::string &interfaceName, const std::string &propertyName) const; + +private: + + // Our server's objects + Objects objects; + + // BR/EDR requested state + bool enableBREDR; + + // Secure connection requested state + bool enableSecureConnection; + + // Connectable requested state + bool enableConnectable; + + // LE advertising requested state + bool enableAdvertising; + + // Bondable requested state + bool enableBondable; + + // The getter callback that is responsible for returning current server data that is shared over Bluetooth + GGKServerDataGetter dataGetter; + + // The setter callback that is responsible for storing current server data that is shared over Bluetooth + GGKServerDataSetter dataSetter; +}; + +// Our one and only server. It's a global. +extern std::shared_ptr TheServer; -- cgit v1.2.3