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_manager_client.h"
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/logging.h"
8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_characteristic_service_provider.h"
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_descriptor_service_provider.h"
10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_service_service_provider.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "third_party/cros_system_api/dbus/service_constants.h"
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace chromeos {
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::FakeBluetoothGattManagerClient() {
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::~FakeBluetoothGattManagerClient() {
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// DBusClient override.
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::Init(dbus::Bus* bus) {
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// BluetoothGattManagerClient overrides.
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterService(
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const dbus::ObjectPath& service_path,
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const Options& options,
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const base::Closure& callback,
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const ErrorCallback& error_callback) {
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "Register GATT service: " << service_path.value();
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // If a service provider wasn't created before, return error.
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap::iterator iter = service_map_.find(service_path);
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter == service_map_.end()) {
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    error_callback.Run(bluetooth_gatt_manager::kErrorInvalidArguments,
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       "GATT service doesn't exist: " + service_path.value());
38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Check to see if this GATT service was already registered.
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceProvider* provider = &iter->second;
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (provider->first) {
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    error_callback.Run(
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        bluetooth_gatt_manager::kErrorAlreadyExists,
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        "GATT service already registered: " + service_path.value());
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Success!
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  provider->first = true;
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  callback.Run();
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterService(
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const dbus::ObjectPath& service_path,
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const base::Closure& callback,
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const ErrorCallback& error_callback) {
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  VLOG(1) << "Unregister GATT service: " << service_path.value();
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // If a service provider wasn't created before, return error.
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap::iterator iter = service_map_.find(service_path);
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter == service_map_.end()) {
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    error_callback.Run(bluetooth_gatt_manager::kErrorInvalidArguments,
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       "GATT service doesn't exist: " + service_path.value());
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Return error if the GATT service wasn't registered before.
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceProvider* provider = &iter->second;
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!provider->first) {
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    error_callback.Run(
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        bluetooth_gatt_manager::kErrorDoesNotExist,
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        "GATT service not registered: " + service_path.value());
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Success!
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  provider->first = false;
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  callback.Run();
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterServiceServiceProvider(
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattServiceServiceProvider* provider) {
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ignore, if a service provider is already registered for the object path.
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap::iterator iter = service_map_.find(provider->object_path());
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter != service_map_.end()) {
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    VLOG(1) << "GATT service service provider already registered for "
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            << "object path: " << provider->object_path().value();
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  service_map_[provider->object_path()] = std::make_pair(false, provider);
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterCharacteristicServiceProvider(
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattCharacteristicServiceProvider* provider) {
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ignore, if a service provider is already registered for the object path.
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  CharacteristicMap::iterator iter =
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      characteristic_map_.find(provider->object_path());
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter != characteristic_map_.end()) {
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    VLOG(1) << "GATT characteristic service provider already registered for "
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            << "object path: " << provider->object_path().value();
103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  characteristic_map_[provider->object_path()] = provider;
106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterDescriptorServiceProvider(
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattDescriptorServiceProvider* provider) {
110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ignore, if a service provider is already registered for the object path.
111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DescriptorMap::iterator iter =
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      descriptor_map_.find(provider->object_path());
113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter != descriptor_map_.end()) {
114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    VLOG(1) << "GATT descriptor service provider already registered for "
115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            << "object path: " << provider->object_path().value();
116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  descriptor_map_[provider->object_path()] = provider;
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterServiceServiceProvider(
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattServiceServiceProvider* provider) {
123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap::iterator iter =
124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      service_map_.find(provider->object_path());
125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter != service_map_.end() && iter->second.second == provider)
126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    service_map_.erase(iter);
127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterCharacteristicServiceProvider(
130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattCharacteristicServiceProvider* provider) {
131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  characteristic_map_.erase(provider->object_path());
132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterDescriptorServiceProvider(
135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    FakeBluetoothGattDescriptorServiceProvider* provider) {
136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  descriptor_map_.erase(provider->object_path());
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattServiceServiceProvider*
140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::GetServiceServiceProvider(
141e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const dbus::ObjectPath& object_path) const {
142e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap::const_iterator iter = service_map_.find(object_path);
143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter == service_map_.end())
144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return NULL;
145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return iter->second.second;
146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattCharacteristicServiceProvider*
149e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::GetCharacteristicServiceProvider(
150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const dbus::ObjectPath& object_path) const {
151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  CharacteristicMap::const_iterator iter =
152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      characteristic_map_.find(object_path);
153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter == characteristic_map_.end())
154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return NULL;
155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return iter->second;
156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattDescriptorServiceProvider*
159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::GetDescriptorServiceProvider(
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const dbus::ObjectPath& object_path) const {
161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DescriptorMap::const_iterator iter = descriptor_map_.find(object_path);
162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter == descriptor_map_.end())
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return NULL;
164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return iter->second;
165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool FakeBluetoothGattManagerClient::IsServiceRegistered(
168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const dbus::ObjectPath& object_path) const {
169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ServiceMap::const_iterator iter = service_map_.find(object_path);
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (iter == service_map_.end())
171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return false;
172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return iter->second.first;
173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace chromeos
176