| // Copyright 2018 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_AGENT_MANAGER_INTERFACE_HANDLER_H_ |
| #define BLUETOOTH_NEWBLUED_AGENT_MANAGER_INTERFACE_HANDLER_H_ |
| |
| #include <map> |
| #include <string> |
| |
| #include <base/macros.h> |
| #include <base/memory/ref_counted.h> |
| #include <base/memory/weak_ptr.h> |
| #include <dbus/bus.h> |
| #include <dbus/message.h> |
| |
| #include "bluetooth/common/exported_object_manager_wrapper.h" |
| #include "bluetooth/newblued/newblue.h" |
| |
| namespace bluetooth { |
| |
| // Handles org.bluez.AgentManager1 interface. |
| class AgentManagerInterfaceHandler : public PairingAgent { |
| public: |
| // |exported_object_manager_wrapper| not owned, caller must make sure it |
| // outlives this object. |
| AgentManagerInterfaceHandler( |
| scoped_refptr<dbus::Bus> bus, |
| ExportedObjectManagerWrapper* exported_object_manager_wrapper); |
| virtual ~AgentManagerInterfaceHandler() = default; |
| |
| // Starts exposing org.bluez.AgentManager1 interface. |
| void Init(); |
| |
| // PairingAgent overrides. |
| void DisplayPasskey(const std::string& device_address, |
| uint32_t passkey) override; |
| |
| void RequestAuthorization(const std::string& device_address) override; |
| |
| private: |
| scoped_refptr<dbus::Bus> bus_; |
| |
| // Client D-Bus address -> Agent object path. |
| std::map<std::string, dbus::ObjectPath> agent_object_paths_; |
| // The default agent, should be one of the keys of |agent_object_paths_|. |
| std::string default_agent_client_; |
| |
| ExportedObjectManagerWrapper* exported_object_manager_wrapper_; |
| |
| void OnDisplayPasskeySent(dbus::Response* response); |
| |
| void OnRequestAuthorizationResponse(dbus::Response* response); |
| |
| void OnRequestAuthorizationError(dbus::ErrorResponse* response); |
| |
| // D-Bus method handlers for agent manager. |
| // Right now we only support 1 agent path per client, since that's how Chrome |
| // and bluetoothctl uses this. |
| // TODO(sonnysasaka): Add support for multiple agent path per client when |
| // needed. |
| bool HandleRegisterAgent(brillo::ErrorPtr* error, |
| dbus::Message* message, |
| dbus::ObjectPath agent_object_path, |
| std::string capability); |
| bool HandleUnregisterAgent(brillo::ErrorPtr* error, |
| dbus::Message* message, |
| dbus::ObjectPath agent_object_path); |
| bool HandleRequestDefaultAgent(brillo::ErrorPtr* error, |
| dbus::Message* message, |
| dbus::ObjectPath agent_object_path); |
| |
| // Must come last so that weak pointers will be invalidated before other |
| // members are destroyed. |
| base::WeakPtrFactory<AgentManagerInterfaceHandler> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AgentManagerInterfaceHandler); |
| }; |
| |
| } // namespace bluetooth |
| |
| #endif // BLUETOOTH_NEWBLUED_AGENT_MANAGER_INTERFACE_HANDLER_H_ |