Chromium Code Reviews| 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 (std::map<ObjectPath, Transport*>::iterator it = | |
| 93 endpoint_to_transport_map_.begin(); | |
| 94 it != endpoint_to_transport_map_.end(); ++it) | |
| 95 delete it->second; | |
|
armansito
2015/02/26 04:23:08
for (auto& it : endpoint_to_transport_map_)
dele
Miao
2015/02/26 04:41:50
That's a neat one.
| |
| 96 endpoint_to_transport_map_.clear(); | |
| 87 } | 97 } |
| 88 | 98 |
| 89 // DBusClient override. | 99 // DBusClient override. |
| 90 void FakeBluetoothMediaTransportClient::Init(dbus::Bus* bus) { | 100 void FakeBluetoothMediaTransportClient::Init(dbus::Bus* bus) { |
| 91 } | 101 } |
| 92 | 102 |
| 93 // BluetoothMediaTransportClient overrides. | |
| 94 | |
| 95 void FakeBluetoothMediaTransportClient::AddObserver( | 103 void FakeBluetoothMediaTransportClient::AddObserver( |
| 96 BluetoothMediaTransportClient::Observer* observer) { | 104 BluetoothMediaTransportClient::Observer* observer) { |
| 97 observers_.AddObserver(observer); | 105 observers_.AddObserver(observer); |
| 98 } | 106 } |
| 99 | 107 |
| 100 void FakeBluetoothMediaTransportClient::RemoveObserver( | 108 void FakeBluetoothMediaTransportClient::RemoveObserver( |
| 101 BluetoothMediaTransportClient::Observer* observer) { | 109 BluetoothMediaTransportClient::Observer* observer) { |
| 102 observers_.RemoveObserver(observer); | 110 observers_.RemoveObserver(observer); |
| 103 } | 111 } |
| 104 | 112 |
| 105 FakeBluetoothMediaTransportClient::Properties* | 113 FakeBluetoothMediaTransportClient::Properties* |
| 106 FakeBluetoothMediaTransportClient::GetProperties( | 114 FakeBluetoothMediaTransportClient::GetProperties( |
| 107 const ObjectPath& object_path) { | 115 const ObjectPath& object_path) { |
| 108 return nullptr; | 116 ObjectPath endpoint_path = GetEndpointPath(object_path); |
| 117 if (endpoint_path.value() == "" || | |
|
armansito
2015/02/26 04:23:08
Replace 'endpoint_path.value() == ""' with
endp
Miao
2015/02/26 04:41:50
Done.
| |
| 118 !ContainsKey(endpoint_to_transport_map_, endpoint_path)) | |
| 119 return nullptr; | |
| 120 return endpoint_to_transport_map_[endpoint_path]->properties.get(); | |
| 109 } | 121 } |
| 110 | 122 |
| 111 void FakeBluetoothMediaTransportClient::Acquire( | 123 void FakeBluetoothMediaTransportClient::Acquire( |
| 112 const ObjectPath& object_path, | 124 const ObjectPath& object_path, |
| 113 const AcquireCallback& callback, | 125 const AcquireCallback& callback, |
| 114 const ErrorCallback& error_callback) { | 126 const ErrorCallback& error_callback) { |
| 115 error_callback.Run(kNotImplemented, ""); | 127 error_callback.Run(kNotImplemented, ""); |
| 116 } | 128 } |
| 117 | 129 |
| 118 void FakeBluetoothMediaTransportClient::TryAcquire( | 130 void FakeBluetoothMediaTransportClient::TryAcquire( |
| 119 const ObjectPath& object_path, | 131 const ObjectPath& object_path, |
| 120 const AcquireCallback& callback, | 132 const AcquireCallback& callback, |
| 121 const ErrorCallback& error_callback) { | 133 const ErrorCallback& error_callback) { |
| 122 error_callback.Run(kNotImplemented, ""); | 134 error_callback.Run(kNotImplemented, ""); |
| 123 } | 135 } |
| 124 | 136 |
| 125 void FakeBluetoothMediaTransportClient::Release( | 137 void FakeBluetoothMediaTransportClient::Release( |
| 126 const ObjectPath& object_path, | 138 const ObjectPath& object_path, |
| 127 const base::Closure& callback, | 139 const base::Closure& callback, |
| 128 const ErrorCallback& error_callback) { | 140 const ErrorCallback& error_callback) { |
| 129 error_callback.Run(kNotImplemented, ""); | 141 error_callback.Run(kNotImplemented, ""); |
| 130 } | 142 } |
| 131 | 143 |
| 132 void FakeBluetoothMediaTransportClient::SetValid( | 144 void FakeBluetoothMediaTransportClient::SetValid( |
| 133 const ObjectPath& endpoint_path, | 145 FakeBluetoothMediaEndpointServiceProvider* endpoint, |
| 134 bool valid) { | 146 bool valid) { |
| 147 FakeBluetoothMediaClient* media = static_cast<FakeBluetoothMediaClient*>( | |
| 148 DBusThreadManager::Get()->GetBluetoothMediaClient()); | |
| 149 DCHECK(media); | |
| 150 | |
| 151 ObjectPath endpoint_path(endpoint->object_path()); | |
| 152 if (!media->IsRegistered(endpoint_path)) | |
| 153 return; | |
| 154 | |
| 135 if (valid) { | 155 if (valid) { |
| 136 endpoints_[endpoint_path] = valid; | 156 ObjectPath transport_path = GenerateTransportPath(); |
| 157 VLOG(1) << "New transport, " << transport_path.value() | |
| 158 << " is created for endpoint " << endpoint_path.value(); | |
| 159 | |
| 160 // Sets the fake property set with default values. | |
| 161 scoped_ptr<Properties> properties(new Properties( | |
| 162 base::Bind(&FakeBluetoothMediaTransportClient::OnPropertyChanged, | |
| 163 base::Unretained(this)))); | |
| 164 properties->device.ReplaceValue(ObjectPath(kTransportDevicePath)); | |
| 165 properties->uuid.ReplaceValue( | |
| 166 BluetoothMediaClient::kBluetoothAudioSinkUUID); | |
| 167 properties->codec.ReplaceValue(kTransportCodec); | |
| 168 properties->configuration.ReplaceValue(kTransportConfiguration); | |
| 169 properties->state.ReplaceValue(BluetoothMediaTransportClient::kStateIdle); | |
| 170 properties->delay.ReplaceValue(kTransportDelay); | |
| 171 properties->volume.ReplaceValue(kTransportVolume); | |
| 172 | |
| 173 endpoint_to_transport_map_[endpoint_path] = | |
| 174 new Transport(transport_path, properties.release()); | |
| 175 transport_to_endpoint_map_[transport_path] = endpoint_path; | |
| 137 return; | 176 return; |
| 138 } | 177 } |
| 139 endpoints_.erase(endpoint_path); | |
| 140 | 178 |
| 141 // TODO(mcchou): Since there is only one transport path, all observers will | 179 if (!ContainsKey(endpoint_to_transport_map_, endpoint_path)) |
| 142 // be notified. Shades irrelevant observers. | 180 return; |
| 143 | 181 |
| 144 // Notifies observers about the state change of the transport. | 182 // Notifies observers about the state change of the transport. |
| 145 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_, | 183 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_, |
| 146 MediaTransportRemoved(object_path_)); | 184 MediaTransportRemoved(GetTransportPath(endpoint_path))); |
| 185 | |
| 186 endpoint->ClearConfiguration(GetTransportPath(endpoint_path)); | |
| 187 transport_to_endpoint_map_.erase(GetTransportPath(endpoint_path)); | |
| 188 delete endpoint_to_transport_map_[endpoint_path]; | |
| 189 endpoint_to_transport_map_.erase(endpoint_path); | |
| 190 } | |
| 191 | |
| 192 void FakeBluetoothMediaTransportClient::SetState( | |
| 193 const dbus::ObjectPath& endpoint_path, | |
| 194 const std::string& state) { | |
| 195 if (!ContainsKey(endpoint_to_transport_map_, endpoint_path)) | |
| 196 return; | |
| 197 | |
| 198 endpoint_to_transport_map_[endpoint_path] | |
| 199 ->properties->state.ReplaceValue(state); | |
| 200 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_, | |
| 201 MediaTransportPropertyChanged( | |
| 202 GetTransportPath(endpoint_path), | |
| 203 BluetoothMediaTransportClient::kStateProperty)); | |
| 204 } | |
| 205 | |
| 206 void FakeBluetoothMediaTransportClient::SetVolume( | |
| 207 const dbus::ObjectPath& endpoint_path, | |
| 208 const uint16_t& volume) { | |
| 209 if (!ContainsKey(endpoint_to_transport_map_, endpoint_path)) | |
| 210 return; | |
| 211 | |
| 212 endpoint_to_transport_map_[endpoint_path]->properties->volume.ReplaceValue( | |
| 213 volume); | |
| 214 FOR_EACH_OBSERVER(BluetoothMediaTransportClient::Observer, observers_, | |
| 215 MediaTransportPropertyChanged( | |
| 216 GetTransportPath(endpoint_path), | |
| 217 BluetoothMediaTransportClient::kVolumeProperty)); | |
| 218 } | |
| 219 | |
| 220 ObjectPath FakeBluetoothMediaTransportClient::GetTransportPath( | |
| 221 const ObjectPath& endpoint_path) { | |
| 222 if (ContainsKey(endpoint_to_transport_map_, endpoint_path)) | |
| 223 return endpoint_to_transport_map_[endpoint_path]->path; | |
| 224 return ObjectPath(""); | |
| 225 } | |
| 226 | |
| 227 ObjectPath FakeBluetoothMediaTransportClient::GetEndpointPath( | |
| 228 const ObjectPath& transport_path) { | |
| 229 if (ContainsKey(transport_to_endpoint_map_, transport_path)) | |
| 230 return transport_to_endpoint_map_[transport_path]; | |
| 231 return ObjectPath(""); | |
| 147 } | 232 } |
| 148 | 233 |
| 149 void FakeBluetoothMediaTransportClient::OnPropertyChanged( | 234 void FakeBluetoothMediaTransportClient::OnPropertyChanged( |
| 150 const std::string& property_name) { | 235 const std::string& property_name) { |
| 151 VLOG(1) << "Property " << property_name << " changed"; | 236 VLOG(1) << "Property " << property_name << " changed"; |
| 152 } | 237 } |
| 153 | 238 |
| 154 } // namespace chromeos | 239 } // namespace chromeos |
| OLD | NEW |