OLD | NEW |
| (Empty) |
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_media_client.h" | |
6 | |
7 #include <string> | |
8 | |
9 #include "base/stl_util.h" | |
10 #include "chromeos/dbus/dbus_thread_manager.h" | |
11 #include "chromeos/dbus/fake_bluetooth_adapter_client.h" | |
12 #include "chromeos/dbus/fake_bluetooth_media_endpoint_service_provider.h" | |
13 #include "chromeos/dbus/fake_bluetooth_media_transport_client.h" | |
14 | |
15 using dbus::ObjectPath; | |
16 | |
17 namespace { | |
18 | |
19 // Except for |kFailedError|, the other error is defined in BlueZ D-Bus Media | |
20 // API. | |
21 const char kFailedError[] = "org.chromium.Error.Failed"; | |
22 const char kInvalidArgumentsError[] = "org.chromium.Error.InvalidArguments"; | |
23 | |
24 } // namespace | |
25 | |
26 namespace chromeos { | |
27 | |
28 // static | |
29 const uint8_t FakeBluetoothMediaClient::kDefaultCodec = 0x00; | |
30 | |
31 FakeBluetoothMediaClient::FakeBluetoothMediaClient() | |
32 : visible_(true), | |
33 object_path_(ObjectPath(FakeBluetoothAdapterClient::kAdapterPath)) { | |
34 } | |
35 | |
36 FakeBluetoothMediaClient::~FakeBluetoothMediaClient() { | |
37 } | |
38 | |
39 void FakeBluetoothMediaClient::Init(dbus::Bus* bus) { | |
40 } | |
41 | |
42 void FakeBluetoothMediaClient::AddObserver( | |
43 BluetoothMediaClient::Observer* observer) { | |
44 DCHECK(observer); | |
45 observers_.AddObserver(observer); | |
46 } | |
47 | |
48 void FakeBluetoothMediaClient::RemoveObserver( | |
49 BluetoothMediaClient::Observer* observer) { | |
50 DCHECK(observer); | |
51 observers_.RemoveObserver(observer); | |
52 } | |
53 | |
54 void FakeBluetoothMediaClient::RegisterEndpoint( | |
55 const ObjectPath& object_path, | |
56 const ObjectPath& endpoint_path, | |
57 const EndpointProperties& properties, | |
58 const base::Closure& callback, | |
59 const ErrorCallback& error_callback) { | |
60 if (!visible_) | |
61 return; | |
62 | |
63 VLOG(1) << "RegisterEndpoint: " << endpoint_path.value(); | |
64 | |
65 // The media client and adapter client should have the same object path. | |
66 if (object_path != object_path_ || | |
67 properties.uuid != BluetoothMediaClient::kBluetoothAudioSinkUUID || | |
68 properties.codec != kDefaultCodec || properties.capabilities.empty()) { | |
69 error_callback.Run(kInvalidArgumentsError, ""); | |
70 return; | |
71 } | |
72 | |
73 callback.Run(); | |
74 } | |
75 | |
76 void FakeBluetoothMediaClient::UnregisterEndpoint( | |
77 const ObjectPath& object_path, | |
78 const ObjectPath& endpoint_path, | |
79 const base::Closure& callback, | |
80 const ErrorCallback& error_callback) { | |
81 // TODO(mcchou): Come up with some corresponding actions. | |
82 VLOG(1) << "UnregisterEndpoint: " << endpoint_path.value(); | |
83 | |
84 if (!ContainsKey(endpoints_, endpoint_path)) { | |
85 error_callback.Run(kFailedError, "Unknown media endpoint"); | |
86 return; | |
87 } | |
88 | |
89 SetEndpointRegistered(endpoints_[endpoint_path], false); | |
90 callback.Run(); | |
91 } | |
92 | |
93 void FakeBluetoothMediaClient::SetVisible(bool visible) { | |
94 visible_ = visible; | |
95 | |
96 if (visible_) | |
97 return; | |
98 | |
99 // If the media object becomes invisible, an update chain will unregister all | |
100 // endpoints and set the associated transport objects to be invalid. | |
101 // SetEndpointRegistered will remove the endpoint entry from |endpoints_|. | |
102 while (endpoints_.begin() != endpoints_.end()) | |
103 SetEndpointRegistered(endpoints_.begin()->second, false); | |
104 | |
105 // Notifies observers about the change on |visible_|. | |
106 FOR_EACH_OBSERVER(BluetoothMediaClient::Observer, observers_, | |
107 MediaRemoved(object_path_)); | |
108 } | |
109 | |
110 void FakeBluetoothMediaClient::SetEndpointRegistered( | |
111 FakeBluetoothMediaEndpointServiceProvider* endpoint, | |
112 bool registered) { | |
113 if (registered) { | |
114 endpoints_[endpoint->object_path()] = endpoint; | |
115 return; | |
116 } | |
117 | |
118 if (!IsRegistered(endpoint->object_path())) | |
119 return; | |
120 | |
121 // Once a media endpoint object becomes invalid, invalidate the associated | |
122 // transport. | |
123 FakeBluetoothMediaTransportClient* transport = | |
124 static_cast<FakeBluetoothMediaTransportClient*>( | |
125 DBusThreadManager::Get()->GetBluetoothMediaTransportClient()); | |
126 transport->SetValid(endpoint, false); | |
127 | |
128 endpoints_.erase(endpoint->object_path()); | |
129 endpoint->Released(); | |
130 } | |
131 | |
132 bool FakeBluetoothMediaClient::IsRegistered( | |
133 const dbus::ObjectPath& endpoint_path) { | |
134 return ContainsKey(endpoints_, endpoint_path); | |
135 } | |
136 | |
137 } // namespace chromeos | |
OLD | NEW |