/* * Author: Sven Gothel * Copyright (c) 2020 Gothel Software e.K. * Copyright (c) 2020 ZAFENA AB * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef GATT_SERVICE_HPP_ #define GATT_SERVICE_HPP_ #include #include #include #include #include #include #include #include #include "UUID.hpp" #include "BTTypes.hpp" #include "OctetTypes.hpp" #include "ATTPDUTypes.hpp" #include "DBTTypes.hpp" #include "GATTCharacteristic.hpp" /** * - - - - - - - - - - - - - - - * * Module GATTService: * * - BT Core Spec v5.2: Vol 3, Part G Generic Attribute Protocol (GATT) * - BT Core Spec v5.2: Vol 3, Part G GATT: 2.6 GATT Profile Hierarchy */ namespace direct_bt { class GATTHandler; // forward class DBTDevice; // forward /** * Representing a complete [Primary] Service Declaration * including its list of Characteristic Declarations, * which also may include its client config if available. */ class GATTService : public DBTObject { private: /** Service's GATTHandler weak back-reference */ std::weak_ptr wbr_handler; std::string toShortString() const noexcept; public: const bool isPrimary; /** * Service start handle *

* Attribute handles are unique for each device (server) (BT Core Spec v5.2: Vol 3, Part F Protocol..: 3.2.2 Attribute Handle). *

*/ const uint16_t startHandle; /** * Service end handle *

* Attribute handles are unique for each device (server) (BT Core Spec v5.2: Vol 3, Part F Protocol..: 3.2.2 Attribute Handle). *

*/ const uint16_t endHandle; /** Service type UUID */ std::shared_ptr type; /** List of Characteristic Declarations as shared reference */ std::vector characteristicList; GATTService(const std::shared_ptr &handler_, const bool isPrimary_, const uint16_t startHandle_, const uint16_t endHandle_, std::shared_ptr type_) noexcept : wbr_handler(handler_), isPrimary(isPrimary_), startHandle(startHandle_), endHandle(endHandle_), type(type_), characteristicList() { characteristicList.reserve(10); } std::string get_java_class() const noexcept override { return java_class(); } static std::string java_class() noexcept { return std::string(JAVA_DBT_PACKAGE "DBTGattService"); } std::shared_ptr getGATTHandlerUnchecked() const noexcept { return wbr_handler.lock(); } std::shared_ptr getGATTHandlerChecked() const; std::shared_ptr getDeviceUnchecked() const noexcept; std::shared_ptr getDeviceChecked() const; std::string toString() const noexcept override; }; inline bool operator==(const GATTService& lhs, const GATTService& rhs) noexcept { return lhs.startHandle == rhs.startHandle && lhs.endHandle == rhs.endHandle; /** unique attribute handles */ } inline bool operator!=(const GATTService& lhs, const GATTService& rhs) noexcept { return !(lhs == rhs); } } // namespace direct_bt #endif /* GATT_SERVICE_HPP_ */