• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 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_adapter_client.h"
6 
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/time/time.h"
11 #include "chromeos/dbus/dbus_thread_manager.h"
12 #include "chromeos/dbus/fake_bluetooth_device_client.h"
13 #include "dbus/object_path.h"
14 #include "third_party/cros_system_api/dbus/service_constants.h"
15 
16 namespace chromeos {
17 
18 const char FakeBluetoothAdapterClient::kAdapterPath[] =
19     "/fake/hci0";
20 const char FakeBluetoothAdapterClient::kAdapterName[] =
21     "Fake Adapter";
22 const char FakeBluetoothAdapterClient::kAdapterAddress[] =
23     "01:1a:2b:1a:2b:03";
24 
25 const char FakeBluetoothAdapterClient::kSecondAdapterPath[] =
26     "/fake/hci1";
27 const char FakeBluetoothAdapterClient::kSecondAdapterName[] =
28     "Second Fake Adapter";
29 const char FakeBluetoothAdapterClient::kSecondAdapterAddress[] =
30     "00:de:51:10:01:00";
31 
Properties(const PropertyChangedCallback & callback)32 FakeBluetoothAdapterClient::Properties::Properties(
33     const PropertyChangedCallback& callback)
34     : BluetoothAdapterClient::Properties(
35         NULL,
36         bluetooth_adapter::kBluetoothAdapterInterface,
37         callback) {
38 }
39 
~Properties()40 FakeBluetoothAdapterClient::Properties::~Properties() {
41 }
42 
Get(dbus::PropertyBase * property,dbus::PropertySet::GetCallback callback)43 void FakeBluetoothAdapterClient::Properties::Get(
44     dbus::PropertyBase* property,
45     dbus::PropertySet::GetCallback callback) {
46   VLOG(1) << "Get " << property->name();
47   callback.Run(false);
48 }
49 
GetAll()50 void FakeBluetoothAdapterClient::Properties::GetAll() {
51   VLOG(1) << "GetAll";
52 }
53 
Set(dbus::PropertyBase * property,dbus::PropertySet::SetCallback callback)54 void FakeBluetoothAdapterClient::Properties::Set(
55     dbus::PropertyBase *property,
56     dbus::PropertySet::SetCallback callback) {
57   VLOG(1) << "Set " << property->name();
58   if (property->name() == powered.name() || property->name() == alias.name()) {
59     callback.Run(true);
60     property->ReplaceValueWithSetValue();
61   } else {
62     callback.Run(false);
63   }
64 }
65 
FakeBluetoothAdapterClient()66 FakeBluetoothAdapterClient::FakeBluetoothAdapterClient()
67     : visible_(true),
68       second_visible_(false),
69       discovering_count_(0) {
70   properties_.reset(new Properties(base::Bind(
71       &FakeBluetoothAdapterClient::OnPropertyChanged, base::Unretained(this))));
72 
73   properties_->address.ReplaceValue(kAdapterAddress);
74   properties_->name.ReplaceValue("Fake Adapter (Name)");
75   properties_->alias.ReplaceValue(kAdapterName);
76   properties_->pairable.ReplaceValue(true);
77 
78   second_properties_.reset(new Properties(base::Bind(
79       &FakeBluetoothAdapterClient::OnPropertyChanged, base::Unretained(this))));
80 
81   second_properties_->address.ReplaceValue(kSecondAdapterAddress);
82   second_properties_->name.ReplaceValue("Second Fake Adapter (Name)");
83   second_properties_->alias.ReplaceValue(kSecondAdapterName);
84   second_properties_->pairable.ReplaceValue(true);
85 }
86 
~FakeBluetoothAdapterClient()87 FakeBluetoothAdapterClient::~FakeBluetoothAdapterClient() {
88 }
89 
Init(dbus::Bus * bus)90 void FakeBluetoothAdapterClient::Init(dbus::Bus* bus) {
91 }
92 
AddObserver(Observer * observer)93 void FakeBluetoothAdapterClient::AddObserver(Observer* observer) {
94   observers_.AddObserver(observer);
95 }
96 
RemoveObserver(Observer * observer)97 void FakeBluetoothAdapterClient::RemoveObserver(Observer* observer) {
98   observers_.RemoveObserver(observer);
99 }
100 
GetAdapters()101 std::vector<dbus::ObjectPath> FakeBluetoothAdapterClient::GetAdapters() {
102   std::vector<dbus::ObjectPath> object_paths;
103   if (visible_)
104     object_paths.push_back(dbus::ObjectPath(kAdapterPath));
105   if (second_visible_)
106     object_paths.push_back(dbus::ObjectPath(kSecondAdapterPath));
107   return object_paths;
108 }
109 
110 FakeBluetoothAdapterClient::Properties*
GetProperties(const dbus::ObjectPath & object_path)111 FakeBluetoothAdapterClient::GetProperties(const dbus::ObjectPath& object_path) {
112   if (object_path == dbus::ObjectPath(kAdapterPath))
113     return properties_.get();
114   else if (object_path == dbus::ObjectPath(kSecondAdapterPath))
115     return second_properties_.get();
116   else
117     return NULL;
118 }
119 
StartDiscovery(const dbus::ObjectPath & object_path,const base::Closure & callback,const ErrorCallback & error_callback)120 void FakeBluetoothAdapterClient::StartDiscovery(
121     const dbus::ObjectPath& object_path,
122     const base::Closure& callback,
123     const ErrorCallback& error_callback) {
124   if (object_path != dbus::ObjectPath(kAdapterPath)) {
125     error_callback.Run(kNoResponseError, "");
126     return;
127   }
128 
129   ++discovering_count_;
130   VLOG(1) << "StartDiscovery: " << object_path.value() << ", "
131           << "count is now " << discovering_count_;
132   callback.Run();
133 
134   if (discovering_count_ == 1) {
135     properties_->discovering.ReplaceValue(true);
136 
137     FakeBluetoothDeviceClient* device_client =
138         static_cast<FakeBluetoothDeviceClient*>(
139             DBusThreadManager::Get()->GetBluetoothDeviceClient());
140     device_client->BeginDiscoverySimulation(dbus::ObjectPath(kAdapterPath));
141   }
142 }
143 
StopDiscovery(const dbus::ObjectPath & object_path,const base::Closure & callback,const ErrorCallback & error_callback)144 void FakeBluetoothAdapterClient::StopDiscovery(
145     const dbus::ObjectPath& object_path,
146     const base::Closure& callback,
147     const ErrorCallback& error_callback) {
148   if (object_path != dbus::ObjectPath(kAdapterPath)) {
149     error_callback.Run(kNoResponseError, "");
150     return;
151   }
152 
153   if (!discovering_count_) {
154     LOG(WARNING) << "StopDiscovery called when not discovering";
155     error_callback.Run(kNoResponseError, "");
156     return;
157   }
158 
159   --discovering_count_;
160   VLOG(1) << "StopDiscovery: " << object_path.value() << ", "
161           << "count is now " << discovering_count_;
162   callback.Run();
163 
164   if (discovering_count_ == 0) {
165     FakeBluetoothDeviceClient* device_client =
166         static_cast<FakeBluetoothDeviceClient*>(
167             DBusThreadManager::Get()->GetBluetoothDeviceClient());
168     device_client->EndDiscoverySimulation(dbus::ObjectPath(kAdapterPath));
169 
170     properties_->discovering.ReplaceValue(false);
171   }
172 }
173 
RemoveDevice(const dbus::ObjectPath & object_path,const dbus::ObjectPath & device_path,const base::Closure & callback,const ErrorCallback & error_callback)174 void FakeBluetoothAdapterClient::RemoveDevice(
175     const dbus::ObjectPath& object_path,
176     const dbus::ObjectPath& device_path,
177     const base::Closure& callback,
178     const ErrorCallback& error_callback) {
179   if (object_path != dbus::ObjectPath(kAdapterPath)) {
180     error_callback.Run(kNoResponseError, "");
181     return;
182   }
183 
184   VLOG(1) << "RemoveDevice: " << object_path.value()
185           << " " << device_path.value();
186   callback.Run();
187 
188   FakeBluetoothDeviceClient* device_client =
189       static_cast<FakeBluetoothDeviceClient*>(
190           DBusThreadManager::Get()->GetBluetoothDeviceClient());
191   device_client->RemoveDevice(dbus::ObjectPath(kAdapterPath), device_path);
192 }
193 
SetVisible(bool visible)194 void FakeBluetoothAdapterClient::SetVisible(
195     bool visible) {
196   if (visible && !visible_) {
197     // Adapter becoming visible
198     visible_ = visible;
199 
200     FOR_EACH_OBSERVER(BluetoothAdapterClient::Observer, observers_,
201                       AdapterAdded(dbus::ObjectPath(kAdapterPath)));
202 
203   } else if (visible_ && !visible) {
204     // Adapter becoming invisible
205     visible_ = visible;
206 
207     FOR_EACH_OBSERVER(BluetoothAdapterClient::Observer, observers_,
208                       AdapterRemoved(dbus::ObjectPath(kAdapterPath)));
209   }
210 }
211 
SetSecondVisible(bool visible)212 void FakeBluetoothAdapterClient::SetSecondVisible(
213     bool visible) {
214   if (visible && !second_visible_) {
215     // Second adapter becoming visible
216     second_visible_ = visible;
217 
218     FOR_EACH_OBSERVER(BluetoothAdapterClient::Observer, observers_,
219                       AdapterAdded(dbus::ObjectPath(kSecondAdapterPath)));
220 
221   } else if (second_visible_ && !visible) {
222     // Second adapter becoming invisible
223     second_visible_ = visible;
224 
225     FOR_EACH_OBSERVER(BluetoothAdapterClient::Observer, observers_,
226                       AdapterRemoved(dbus::ObjectPath(kSecondAdapterPath)));
227   }
228 }
229 
OnPropertyChanged(const std::string & property_name)230 void FakeBluetoothAdapterClient::OnPropertyChanged(
231     const std::string& property_name) {
232   if (property_name == properties_->powered.name() &&
233       !properties_->powered.value()) {
234     VLOG(1) << "Adapter powered off";
235 
236     if (discovering_count_) {
237       discovering_count_ = 0;
238       properties_->discovering.ReplaceValue(false);
239     }
240   }
241 
242   FOR_EACH_OBSERVER(BluetoothAdapterClient::Observer, observers_,
243                     AdapterPropertyChanged(dbus::ObjectPath(kAdapterPath),
244                                            property_name));
245 }
246 
247 }  // namespace chromeos
248