| // Copyright 2019 The Chromium OS 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 BLUETOOTH_NEWBLUED_GATT_INTERFACE_HANDLER_H_ |
| #define BLUETOOTH_NEWBLUED_GATT_INTERFACE_HANDLER_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include <base/memory/ref_counted.h> |
| #include <dbus/bus.h> |
| |
| #include "bluetooth/common/exported_object_manager_wrapper.h" |
| #include "bluetooth/newblued/gatt.h" |
| |
| namespace bluetooth { |
| |
| class GattInterfaceHandler final : public Gatt::GattObserver { |
| public: |
| GattInterfaceHandler( |
| scoped_refptr<dbus::Bus> bus, |
| Newblue* newblue, |
| ExportedObjectManagerWrapper* exported_object_manager_wrapper, |
| Gatt* gatt); |
| ~GattInterfaceHandler() = default; |
| |
| void Init(); |
| |
| // Overrides of Gatt::GattObserver. |
| void OnGattServiceAdded(const GattService& service) override; |
| void OnGattServiceRemoved(const GattService& service) override; |
| void OnGattServiceChanged(const GattService& service) override; |
| void OnGattCharacteristicAdded( |
| const GattCharacteristic& characteristic) override; |
| void OnGattCharacteristicRemoved( |
| const GattCharacteristic& characteristic) override; |
| void OnGattCharacteristicChanged( |
| const GattCharacteristic& characteristic) override; |
| void OnGattDescriptorAdded(const GattDescriptor& descriptor) override; |
| void OnGattDescriptorRemoved(const GattDescriptor& descriptor) override; |
| void OnGattDescriptorChanged(const GattDescriptor& descriptor) override; |
| |
| private: |
| // Represents a GATT client request from D-Bus client and respond to the |
| // request based on |type|. |
| struct GattClientRequest { |
| std::string object_path; |
| GattClientRequestType type; |
| std::unique_ptr< |
| brillo::dbus_utils::DBusMethodResponse<std::vector<uint8_t>>> |
| read_value_response; |
| }; |
| |
| // Helpers to export GATT service characteristic and descriptor interfaces. |
| void AddGattCharacteristicMethodHandlers(ExportedInterface* char_interface); |
| void AddGattDescriptorMethodHandlers(ExportedInterface* desc_interface); |
| void ExportGattServiceProperties(bool is_new, |
| ExportedInterface* service_interface, |
| const GattService& service); |
| void ExportGattCharacteristicProperties( |
| bool is_new, |
| ExportedInterface* char_interface, |
| const GattCharacteristic& characteristic); |
| void ExportGattDescriptorProperties(bool is_new, |
| ExportedInterface* desc_interface, |
| const GattDescriptor& descriptor); |
| void ExportGattServiceInterface(const GattService& service); |
| void ExportGattCharacteristicInterface( |
| const GattCharacteristic& characteristic); |
| void ExportGattDescriptorInterface(const GattDescriptor& descriptor); |
| |
| // D-Bus method handlers for GATT characteristic interface. |
| void HandleCharacteristicReadValue( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse< |
| std::vector<uint8_t>>> response, |
| dbus::Message* message, |
| const brillo::VariantDictionary& options); |
| void HandleCharacteristicWriteValue( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response, |
| dbus::Message* message); |
| void HandleCharacteristicStartNotify( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response, |
| dbus::Message* message); |
| void HandleCharacteristicStopNotify( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response, |
| dbus::Message* message); |
| void HandleCharacteristicPrepareWriteValue( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response, |
| dbus::Message* message); |
| |
| // D-Bus method handlers for GATT descriptor interface. |
| void HandleDescriptorReadValue( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse< |
| std::vector<uint8_t>>> response, |
| dbus::Message* message, |
| const brillo::VariantDictionary& options); |
| void HandleDescriptorWriteValue( |
| std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response, |
| dbus::Message* message); |
| |
| // Called when GATT client read characteristic value request is done. |
| void OnReadCharacteristicValue(UniqueId transaction_id, |
| const std::string& device_address, |
| uint16_t service_handle, |
| uint16_t char_handle, |
| GattClientOperationError error, |
| const std::vector<uint8_t>& value); |
| |
| // Called when GATT client read descriptor value request is done. |
| void OnReadDescriptorValue(UniqueId transaction_id, |
| const std::string& device_address, |
| uint16_t service_handle, |
| uint16_t char_handle, |
| uint16_t desc_handle, |
| GattClientOperationError error, |
| const std::vector<uint8_t>& value); |
| |
| scoped_refptr<dbus::Bus> bus_; |
| Newblue* newblue_; |
| ExportedObjectManagerWrapper* exported_object_manager_wrapper_; |
| Gatt* gatt_; |
| |
| // Contains pairs of <transaction ID, GATT client request info>. |
| std::map<UniqueId, GattClientRequest> gatt_client_requests_; |
| |
| // Must come last so that weak pointers will be invalidated before other |
| // members are destroyed. |
| base::WeakPtrFactory<GattInterfaceHandler> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GattInterfaceHandler); |
| }; |
| |
| } // namespace bluetooth |
| |
| #endif // BLUETOOTH_NEWBLUED_GATT_INTERFACE_HANDLER_H_ |