1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// found in the LICENSE file.
4e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_characteristic_service_provider.h"
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/logging.h"
8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/strings/string_util.h"
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/dbus_thread_manager.h"
10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_manager_client.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace chromeos {
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattCharacteristicServiceProvider::
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattCharacteristicServiceProvider(
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const dbus::ObjectPath& object_path,
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        Delegate* delegate,
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const std::string& uuid,
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const std::vector<std::string>& flags,
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const std::vector<std::string>& permissions,
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const dbus::ObjectPath& service_path)
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        : object_path_(object_path),
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          uuid_(uuid),
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          service_path_(service_path),
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          delegate_(delegate) {
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "Creating Bluetooth GATT characteristic: " << object_path_.value();
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(object_path_.IsValid());
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(service_path_.IsValid());
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(!uuid.empty());
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(delegate_);
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(StartsWithASCII(
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      object_path_.value(), service_path_.value() + "/", true));
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // TODO(armansito): Do something with |flags| and |permissions|.
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      static_cast<FakeBluetoothGattManagerClient*>(
39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          DBusThreadManager::Get()->GetBluetoothGattManagerClient());
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  fake_bluetooth_gatt_manager_client->
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      RegisterCharacteristicServiceProvider(this);
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattCharacteristicServiceProvider::
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ~FakeBluetoothGattCharacteristicServiceProvider() {
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "Cleaning up Bluetooth GATT characteristic: "
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << object_path_.value();
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      static_cast<FakeBluetoothGattManagerClient*>(
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          DBusThreadManager::Get()->GetBluetoothGattManagerClient());
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  fake_bluetooth_gatt_manager_client->
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      UnregisterCharacteristicServiceProvider(this);
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattCharacteristicServiceProvider::SendValueChanged(
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const std::vector<uint8>& value) {
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "Sent characteristic value changed: " << object_path_.value()
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << " UUID: " << uuid_;
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattCharacteristicServiceProvider::GetValue(
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const Delegate::ValueCallback& callback,
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const Delegate::ErrorCallback& error_callback) {
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "GATT characteristic value Get request: " << object_path_.value()
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << " UUID: " << uuid_;
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Check if this characteristic is registered.
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      static_cast<FakeBluetoothGattManagerClient*>(
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          DBusThreadManager::Get()->GetBluetoothGattManagerClient());
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!fake_bluetooth_gatt_manager_client->IsServiceRegistered(service_path_)) {
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    VLOG(1) << "GATT characteristic not registered.";
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    error_callback.Run();
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Pass on to the delegate.
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(delegate_);
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  delegate_->GetCharacteristicValue(callback, error_callback);
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattCharacteristicServiceProvider::SetValue(
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const std::vector<uint8>& value,
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const base::Closure& callback,
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const Delegate::ErrorCallback& error_callback) {
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "GATT characteristic value Set request: " << object_path_.value()
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << " UUID: " << uuid_;
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Check if this characteristic is registered.
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      static_cast<FakeBluetoothGattManagerClient*>(
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          DBusThreadManager::Get()->GetBluetoothGattManagerClient());
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!fake_bluetooth_gatt_manager_client->IsServiceRegistered(service_path_)) {
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    VLOG(1) << "GATT characteristic not registered.";
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    error_callback.Run();
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Pass on to the delegate.
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(delegate_);
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  delegate_->SetCharacteristicValue(value, callback, error_callback);
103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace chromeos
106