| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_DRIVERS_BLUETOOTH_LIB_GATT_GENERIC_ATTRIBUTE_SERVICE_H_ |
| #define GARNET_DRIVERS_BLUETOOTH_LIB_GATT_GENERIC_ATTRIBUTE_SERVICE_H_ |
| |
| #include <unordered_set> |
| |
| #include <lib/fit/function.h> |
| |
| #include "garnet/drivers/bluetooth/lib/gatt/local_service_manager.h" |
| #include "garnet/drivers/bluetooth/lib/att/att.h" |
| #include "garnet/drivers/bluetooth/lib/common/byte_buffer.h" |
| |
| namespace btlib { |
| namespace gatt { |
| |
| // Callback called to signal that an indication payload should be sent. Used to |
| // inject the GATT object's notification sending functionality (avoiding this |
| // service from carrying a reference to GATT or Server). |
| using SendIndicationCallback = fit::function<void( |
| const std::string& peer_id, |
| att::Handle handle, |
| const common::ByteBuffer& value)>; |
| |
| // Implements the "Generic Attribute Profile Service" containing the "Service |
| // Changed" characteristic that is "...used to indicate to connected devices |
| // that services have changed (Vol 3, Part G, 7)." |
| class GenericAttributeService final { |
| public: |
| // Registers this service and makes this service the callee of the Service |
| // Changed callback. GATT remote clients must still request that they be sent |
| // indications for the Service Changed characteristic. Holds the |
| // LocalServiceManager pointer for the duration of this object. Do not |
| // register this with multiple LocalServiceManagers. |
| GenericAttributeService(LocalServiceManager* local_service_manager, |
| SendIndicationCallback send_indication_callback); |
| ~GenericAttributeService(); |
| |
| private: |
| void Register(); |
| |
| // Send indications to subscribed clients when a service has changed. |
| void OnServiceChanged(IdType service_id, att::Handle start, att::Handle end); |
| |
| // Data store against which to register and unregister this service. It must |
| // outlive this instance. |
| LocalServiceManager* const local_service_manager_; |
| const SendIndicationCallback send_indication_callback_; |
| |
| // Peers that have subscribed to indications. |
| std::unordered_set<std::string> subscribed_peers_; |
| |
| // Handle for the Service Changed characteristic that is read when it is first |
| // configured for indications. |
| att::Handle svc_changed_handle_ = att::kInvalidHandle; |
| |
| // Local service ID; hidden because registration is tied to instance lifetime. |
| IdType service_id_ = kInvalidId; |
| }; |
| |
| } // namespace gatt |
| } // namespace btlib |
| |
| #endif // GARNET_DRIVERS_BLUETOOTH_LIB_GATT_GENERIC_ATTRIBUTE_SERVICE_H_ |