OLD | NEW |
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 |
OLD | NEW |