blob: 7669da8c44f0409b5b2abfd4fdc5dca3b26347d5 [file] [log] [blame]
// 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_ADAPTER_INTERFACE_HANDLER_H_
#define BLUETOOTH_NEWBLUED_ADAPTER_INTERFACE_HANDLER_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <base/macros.h>
#include <base/memory/ref_counted.h>
#include <base/values.h>
#include <brillo/errors/error.h>
#include <dbus/bus.h>
#include <dbus/message.h>
#include "bluetooth/common/dbus_client.h"
#include "bluetooth/common/exported_object_manager_wrapper.h"
#include "bluetooth/newblued/device_interface_handler.h"
#include "bluetooth/newblued/newblue.h"
#include "bluetooth/newblued/scan_manager.h"
namespace bluetooth {
// Suspend and resume state. Corresponded BlueZ suspend/resume state names are
// SUS_RES_STATE_RUNNING, SUS_RES_STATE_SUS_IMMINT,
// SUS_RES_STATE_SUS_IMMINT_ACKED, and SUS_RES_STATE_SUS_DONE
enum SuspendResumeState : uint8_t {
// System is running normally (awake)
RUNNING,
// Preparing for suspend upon suspend imminent signal sent by powerd
SUSPEND_IMMINT,
// Ack on suspend preparations sent to powerd
SUSPEND_IMMINT_ACKED,
// Resuming from suspend (notified by powerd)
SUSPEND_DONE
};
// Lists the tasks that need to be done upon suspend and resume
enum SuspendResumeTask : uint8_t {
NONE = (0),
// Pause/unpause discovery
PAUSE_UNPAUSE_DISCOVERY = (1 << 0),
};
// Handles org.bluez.Adapter1 interface.
class AdapterInterfaceHandler {
public:
// |newblue| and |exported_object_manager_wrapper| not owned, caller must make
// sure it outlives this object.
AdapterInterfaceHandler(
scoped_refptr<dbus::Bus> bus,
ExportedObjectManagerWrapper* exported_object_manager_wrapper);
virtual ~AdapterInterfaceHandler() = default;
// Starts exposing org.bluez.Adapter1 interface on object /org/bluez/hci0.
// The properties of this object will be ignored by btdispatch, but the object
// still has to be exposed to be able to receive org.bluez.Adapter1 method
// calls, e.g. StartDiscovery(), StopDiscovery().
void Init(DeviceInterfaceHandler* device_interface_handler, Newblue* newblue);
private:
// D-Bus method handlers for adapter object.
bool HandleSetDiscoveryFilter(brillo::ErrorPtr* error,
dbus::Message* message,
const brillo::VariantDictionary& properties);
bool HandleStartDiscovery(brillo::ErrorPtr* error, dbus::Message* message);
bool HandleStopDiscovery(brillo::ErrorPtr* error, dbus::Message* message);
bool HandleRemoveDevice(brillo::ErrorPtr* error,
dbus::Message* message,
const dbus::ObjectPath& device_path);
// Called when a client is disconnected from D-Bus.
void OnClientUnavailable(const std::string& client_address);
// D-Bus method handlers for suspend/resume related methods
void HandleSuspendImminent(
std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response,
dbus::Message* message,
const std::string& action);
void HandleSuspendDone(
std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> response,
dbus::Message* message,
const std::string& action);
// Perform pause/unpause discovery action
void PauseUnpauseDiscovery(void);
// Update suspend/resume task status
void UpdateSuspendResumeTasks(SuspendResumeTask task, bool is_completed);
// Update suspend/resume state machine
void UpdateSuspendResumeState(SuspendResumeState new_state);
scoped_refptr<dbus::Bus> bus_;
DeviceInterfaceHandler* device_interface_handler_;
// All scanning-related requests must be delegated to |scan_manager_|.
// TODO(b/140810173): |scan_manager_| should be owned by
// AdapterInterfaceHandler instead of Adapter.
std::unique_ptr<ScanManager> scan_manager_;
ExportedObjectManagerWrapper* exported_object_manager_wrapper_;
Newblue::DeviceDiscoveredCallback device_discovered_callback_;
// Clients which currently have active discovery mapped by its D-Bus address.
// (D-Bus address -> DBusClient object).
std::map<std::string, std::unique_ptr<DBusClient>> discovery_clients_;
bool is_in_suspension_ = false;
// A bit map holding all suspend/resume related task status
uint8_t suspend_resume_tasks_;
SuspendResumeState suspend_resume_state_;
std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<>> suspend_response_;
// Must come last so that weak pointers will be invalidated before other
// members are destroyed.
base::WeakPtrFactory<AdapterInterfaceHandler> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(AdapterInterfaceHandler);
};
} // namespace bluetooth
#endif // BLUETOOTH_NEWBLUED_ADAPTER_INTERFACE_HANDLER_H_