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