Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: chromeos/dbus/fake_bluetooth_media_transport_client.cc

Issue 939753004: device/bluetooth: Implement Unregister() of BlueotoothAudioSinkChromeOS and disconnection-related c… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/dbus/fake_bluetooth_media_transport_client.h" 5 #include "chromeos/dbus/fake_bluetooth_media_transport_client.h"
6 6
7 #include <sstream>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/stl_util.h"
8 #include "chromeos/dbus/bluetooth_media_client.h" 11 #include "chromeos/dbus/bluetooth_media_client.h"
9 #include "chromeos/dbus/dbus_thread_manager.h" 12 #include "chromeos/dbus/dbus_thread_manager.h"
13 #include "chromeos/dbus/fake_bluetooth_adapter_client.h"
10 #include "chromeos/dbus/fake_bluetooth_media_client.h" 14 #include "chromeos/dbus/fake_bluetooth_media_client.h"
15 #include "chromeos/dbus/fake_bluetooth_media_endpoint_service_provider.h"
11 16
12 using dbus::ObjectPath; 17 using dbus::ObjectPath;
13 18
14 namespace { 19 namespace {
15 20
16 // TODO(mcchou): Remove this constants once it is in cros_system_api. 21 // TODO(mcchou): Remove this constants once it is in cros_system_api.
17 const char kBluetoothMediaTransportInterface[] = "org.bluez.MediaTransport1"; 22 const char kBluetoothMediaTransportInterface[] = "org.bluez.MediaTransport1";
18 const char kNotImplemented[] = "org.bluez.NotImplemented"; 23 const char kNotImplemented[] = "org.bluez.NotImplemented";
19 24
25 ObjectPath GenerateTransportPath() {
26 static unsigned int sequence_number = 0;
27 ++sequence_number;
28 std::stringstream path;
29 path << chromeos::FakeBluetoothAdapterClient::kAdapterPath
30 << chromeos::FakeBluetoothMediaTransportClient::kTransportDevicePath
31 << "/fd" << sequence_number;
32 return ObjectPath(path.str());
33 }
34
20 } // namespace 35 } // namespace
21 36
22 namespace chromeos { 37 namespace chromeos {
23 38
24 // static 39 // static
25 const char FakeBluetoothMediaTransportClient::kTransportPath[] =
26 "/fake/hci0/dev_00_00_00_00_00_00/fd0";
27 const char FakeBluetoothMediaTransportClient::kTransportDevicePath[] = 40 const char FakeBluetoothMediaTransportClient::kTransportDevicePath[] =
28 "/fake/hci0/dev_00_00_00_00_00_00"; 41 "/fake_audio_source";
29 const uint8_t FakeBluetoothMediaTransportClient::kTransportCodec = 0x00; 42 const uint8_t FakeBluetoothMediaTransportClient::kTransportCodec = 0x00;
30 const std::vector<uint8_t> 43 const std::vector<uint8_t>
31 FakeBluetoothMediaTransportClient::kTransportConfiguration = { 44 FakeBluetoothMediaTransportClient::kTransportConfiguration = {
32 0x21, 0x15, 0x33, 0x2C}; 45 0x21, 0x15, 0x33, 0x2C};
33 const uint16_t FakeBluetoothMediaTransportClient::kTransportDelay = 5; 46 const uint16_t FakeBluetoothMediaTransportClient::kTransportDelay = 5;
34 const uint16_t FakeBluetoothMediaTransportClient::kTransportVolume = 10; 47 const uint16_t FakeBluetoothMediaTransportClient::kTransportVolume = 50;
35 48
36 FakeBluetoothMediaTransportClient::Properties::Properties( 49 FakeBluetoothMediaTransportClient::Properties::Properties(
37 const PropertyChangedCallback& callback) 50 const PropertyChangedCallback& callback)
38 : BluetoothMediaTransportClient::Properties( 51 : BluetoothMediaTransportClient::Properties(
39 nullptr, 52 nullptr,
40 kBluetoothMediaTransportInterface, 53 kBluetoothMediaTransportInterface,
41 callback) { 54 callback) {
42 } 55 }
43 56
44 FakeBluetoothMediaTransportClient::Properties::~Properties() { 57 FakeBluetoothMediaTransportClient::Properties::~Properties() {
45 } 58 }
46 59
47 // dbus::PropertySet overrides.
48
49 void FakeBluetoothMediaTransportClient::Properties::Get( 60 void FakeBluetoothMediaTransportClient::Properties::Get(
50 dbus::PropertyBase* property, 61 dbus::PropertyBase* property,
51 dbus::PropertySet::GetCallback callback) { 62 dbus::PropertySet::GetCallback callback) {
52 VLOG(1) << "Get " << property->name(); 63 VLOG(1) << "Get " << property->name();
53 callback.Run(false); 64 callback.Run(false);
54 } 65 }
55 66
56 void FakeBluetoothMediaTransportClient::Properties::GetAll() { 67 void FakeBluetoothMediaTransportClient::Properties::GetAll() {
57 VLOG(1) << "GetAll called."; 68 VLOG(1) << "GetAll called.";
58 } 69 }
59 70
60 void FakeBluetoothMediaTransportClient::Properties::Set( 71 void FakeBluetoothMediaTransportClient::Properties::Set(
61 dbus::PropertyBase* property, 72 dbus::PropertyBase* property,
62 dbus::PropertySet::SetCallback callback) { 73 dbus::PropertySet::SetCallback callback) {
63 VLOG(1) << "Set " << property->name(); 74 VLOG(1) << "Set " << property->name();
64 callback.Run(false); 75 callback.Run(false);
65 } 76 }
66 77
67 FakeBluetoothMediaTransportClient::FakeBluetoothMediaTransportClient() 78 FakeBluetoothMediaTransportClient::Transport::Transport(
68 : object_path_(ObjectPath(kTransportPath)) { 79 const ObjectPath& transport_path,
69 // TODO(mcchou): Multiple endpoints are sharing one property set for now. 80 Properties* transport_properties)
70 // Add property sets accordingly to separate the 81 : path(transport_path) {
71 // MediaTransportPropertiesChanged events for different endpoints. 82 properties.reset(transport_properties);
83 }
72 84
73 // Sets fake property set with default values. 85 FakeBluetoothMediaTransportClient::Transport::~Transport() {
74 properties_.reset(new Properties( 86 }
75 base::Bind(&FakeBluetoothMediaTransportClient::OnPropertyChanged, 87
76 base::Unretained(this)))); 88 FakeBluetoothMediaTransportClient::FakeBluetoothMediaTransportClient() {
77 properties_->device.ReplaceValue(ObjectPath(kTransportDevicePath));
78 properties_->uuid.ReplaceValue(BluetoothMediaClient::kBluetoothAudioSinkUUID);
79 properties_->codec.ReplaceValue(kTransportCodec);
80 properties_->configuration.ReplaceValue(kTransportConfiguration);
81 properties_->state.ReplaceValue(BluetoothMediaTransportClient::kStateIdle);
82 properties_->delay.ReplaceValue(kTransportDelay);
83 properties_->volume.ReplaceValue(kTransportVolume);
84 } 89 }
85 90
86 FakeBluetoothMediaTransportClient::~FakeBluetoothMediaTransportClient() { 91 FakeBluetoothMediaTransportClient::~FakeBluetoothMediaTransportClient() {
92 for (auto& it : endpoint_to_transport_map_)
93 delete it.second;
94 endpoint_to_transport_map_.clear();
87 } 95 }
88 96
89 // DBusClient override. 97 // DBusClient override.
90 void FakeBluetoothMediaTransportClient::Init(dbus::Bus* bus) { 98 void FakeBluetoothMediaTransportClient::Init(dbus::Bus* bus) {
91 } 99 }
92 100
93 // BluetoothMediaTransportClient overrides.
94
95 void FakeBluetoothMediaTransportClient::AddObserver( 101 void FakeBluetoothMediaTransportClient::AddObserver(
96 BluetoothMediaTransportClient::Observer* observer) { 102 BluetoothMediaTransportClient::Observer* observer) {
97 observers_.AddObserver(observer); 103 observers_.AddObserver(observer);
98 } 104 }
99 105
100 void FakeBluetoothMediaTransportClient::RemoveObserver( 106 void FakeBluetoothMediaTransportClient::RemoveObserver(
101 BluetoothMediaTransportClient::Observer* observer) { 107 BluetoothMediaTransportClient::Observer* observer) {
102 observers_.RemoveObserver(observer); 108 observers_.RemoveObserver(observer);
103 } 109 }
104 110
105 FakeBluetoothMediaTransportClient::Properties* 111 FakeBluetoothMediaTransportClient::Properties*
106 FakeBluetoothMediaTransportClient::GetProperties( 112 FakeBluetoothMediaTransportClient::GetProperties(
107 const ObjectPath& object_path) { 113 const ObjectPath& object_path) {
108 return nullptr; 114 ObjectPath endpoint_path = GetEndpointPath(object_path);
115 if (!endpoint_path.IsValid() ||
116 !ContainsKey(endpoint_to_transport_map_, endpoint_path))
117 return nullptr;
118 return endpoint_to_transport_map_[endpoint_path]->properties.get();
109 } 119 }
110 120
111 void FakeBluetoothMediaTransportClient::Acquire( 121 void FakeBluetoothMediaTransportClient::Acquire(
112 const ObjectPath& object_path, 122 const ObjectPath& object_path,
113 const AcquireCallback& callback, 123 const AcquireCallback& callback,
114 const ErrorCallback& error_callback) { 124 const ErrorCallback& error_callback) {
115 error_callback.Run(kNotImplemented, ""); 125 error_callback.Run(kNotImplemented, "");
116 } 126 }
117 127
118 void FakeBluetoothMediaTransportClient::TryAcquire( 128 void FakeBluetoothMediaTransportClient::TryAcquire(
119 const ObjectPath& object_path, 129 const ObjectPath& object_path,
120 const AcquireCallback& callback, 130 const AcquireCallback& callback,
121 const ErrorCallback& error_callback) { 131 const ErrorCallback& error_callback) {
122 error_callback.Run(kNotImplemented, ""); 132 error_callback.Run(kNotImplemented, "");
123 } 133 }
124 134
125 void FakeBluetoothMediaTransportClient::Release( 135 void FakeBluetoothMediaTransportClient::Release(
126 const ObjectPath& object_path, 136 const ObjectPath& object_path,
127 const base::Closure& callback, 137 const base::Closure& callback,
128 const ErrorCallback& error_callback) { 138 const ErrorCallback& error_callback) {
129 error_callback.Run(kNotImplemented, ""); 139 error_callback.Run(kNotImplemented, "");
130 } 140 }
131 141
132 void FakeBluetoothMediaTransportClient::SetValid( 142 void FakeBluetoothMediaTransportClient::SetValid(
133 const ObjectPath& endpoint_path, 143 FakeBluetoothMediaEndpointServiceProvider* endpoint,
134 bool valid) { 144 bool valid) {
145 FakeBluetoothMediaClient* media = static_cast<FakeBluetoothMediaClient*>(
146 DBusThreadManager::Get()->GetBluetoothMediaClient());
147 DCHECK(media);
148
149 ObjectPath endpoint_path(endpoint->object_path());
150 if (!media->IsRegistered(endpoint_path))
151 return;
152
135 if (valid) { 153 if (valid) {
136 endpoints_[endpoint_path] = valid; 154 ObjectPath transport_path = GenerateTransportPath();
155 VLOG(1) << "New transport, " << transport_path.value()
156 << " is created for endpoint " << endpoint_path.value();
157
158 // Sets the fake property set with default values.
159 scoped_ptr<Properties> properties(new Properties(
160 base::Bind(&FakeBluetoothMediaTransportClient::OnPropertyChanged,
161 base::Unretained(this))));
162 properties->device.ReplaceValue(ObjectPath(kTransportDevicePath));
163 properties->uuid.ReplaceValue(
164 BluetoothMediaClient::kBluetoothAudioSinkUUID);
165 properties->codec.ReplaceValue(kTransportCodec);
166 properties->configuration.ReplaceValue(kTransportConfiguration);
167 properties->state.ReplaceValue(BluetoothMediaTransportClient::kStateIdle);
168 properties->delay.ReplaceValue(kTransportDelay);
169 properties->volume.ReplaceValue(kTransportVolume);
170
171 endpoint_to_transport_map_[endpoint_path] =
172 new Transport(transport_path, properties.release());
173 transport_to_endpoint_map_[transport_path] = endpoint_path;
137 return; 174 return;
138 } 175 }
139 endpoints_.erase(endpoint_path);
140 176
141 // TODO(mcchou): Since there is only one transport path, all observers will 177 if (!ContainsKey(endpoint_to_transport_map_, endpoint_path))
142 // be notified. Shades irrelevant observers. 178 return;
143 179
144 // Notifies observers about the state change of the transport. 180 // Notifies observers about the state change of the transport.
145 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_, 181 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_,
146 MediaTransportRemoved(object_path_)); 182 MediaTransportRemoved(GetTransportPath(endpoint_path)));
183
184 endpoint->ClearConfiguration(GetTransportPath(endpoint_path));
185 transport_to_endpoint_map_.erase(GetTransportPath(endpoint_path));
186 delete endpoint_to_transport_map_[endpoint_path];
187 endpoint_to_transport_map_.erase(endpoint_path);
188 }
189
190 void FakeBluetoothMediaTransportClient::SetState(
191 const dbus::ObjectPath& endpoint_path,
192 const std::string& state) {
193 if (!ContainsKey(endpoint_to_transport_map_, endpoint_path))
194 return;
195
196 endpoint_to_transport_map_[endpoint_path]
197 ->properties->state.ReplaceValue(state);
198 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_,
199 MediaTransportPropertyChanged(
200 GetTransportPath(endpoint_path),
201 BluetoothMediaTransportClient::kStateProperty));
202 }
203
204 void FakeBluetoothMediaTransportClient::SetVolume(
205 const dbus::ObjectPath& endpoint_path,
206 const uint16_t& volume) {
207 if (!ContainsKey(endpoint_to_transport_map_, endpoint_path))
208 return;
209
210 endpoint_to_transport_map_[endpoint_path]->properties->volume.ReplaceValue(
211 volume);
212 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_,
213 MediaTransportPropertyChanged(
214 GetTransportPath(endpoint_path),
215 BluetoothMediaTransportClient::kVolumeProperty));
216 }
217
218 ObjectPath FakeBluetoothMediaTransportClient::GetTransportPath(
219 const ObjectPath& endpoint_path) {
220 if (ContainsKey(endpoint_to_transport_map_, endpoint_path))
221 return endpoint_to_transport_map_[endpoint_path]->path;
222 return ObjectPath("");
223 }
224
225 ObjectPath FakeBluetoothMediaTransportClient::GetEndpointPath(
226 const ObjectPath& transport_path) {
227 if (ContainsKey(transport_to_endpoint_map_, transport_path))
228 return transport_to_endpoint_map_[transport_path];
229 return ObjectPath("");
147 } 230 }
148 231
149 void FakeBluetoothMediaTransportClient::OnPropertyChanged( 232 void FakeBluetoothMediaTransportClient::OnPropertyChanged(
150 const std::string& property_name) { 233 const std::string& property_name) {
151 VLOG(1) << "Property " << property_name << " changed"; 234 VLOG(1) << "Property " << property_name << " changed";
152 } 235 }
153 236
154 } // namespace chromeos 237 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/dbus/fake_bluetooth_media_transport_client.h ('k') | device/bluetooth/bluetooth_audio_sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698