OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/arc/arc_bridge_service.h" | 5 #include "components/arc/arc_bridge_service.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/sequenced_task_runner.h" | 10 #include "base/sequenced_task_runner.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 DCHECK(CalledOnValidThread()); | 60 DCHECK(CalledOnValidThread()); |
61 temporary_app_ptr_ = std::move(app_ptr); | 61 temporary_app_ptr_ = std::move(app_ptr); |
62 temporary_app_ptr_.QueryVersion(base::Bind( | 62 temporary_app_ptr_.QueryVersion(base::Bind( |
63 &ArcBridgeService::OnAppVersionReady, weak_factory_.GetWeakPtr())); | 63 &ArcBridgeService::OnAppVersionReady, weak_factory_.GetWeakPtr())); |
64 } | 64 } |
65 | 65 |
66 void ArcBridgeService::OnAppVersionReady(int32_t version) { | 66 void ArcBridgeService::OnAppVersionReady(int32_t version) { |
67 DCHECK(CalledOnValidThread()); | 67 DCHECK(CalledOnValidThread()); |
68 app_ptr_ = std::move(temporary_app_ptr_); | 68 app_ptr_ = std::move(temporary_app_ptr_); |
69 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceReady()); | 69 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceReady()); |
| 70 app_ptr_.set_connection_error_handler(base::Bind( |
| 71 &ArcBridgeService::CloseAppChannel, weak_factory_.GetWeakPtr())); |
| 72 } |
| 73 |
| 74 void ArcBridgeService::CloseAppChannel() { |
| 75 DCHECK(CalledOnValidThread()); |
| 76 if (!app_ptr_) |
| 77 return; |
| 78 |
| 79 app_ptr_.reset(); |
| 80 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceClosed()); |
70 } | 81 } |
71 | 82 |
72 void ArcBridgeService::OnInputInstanceReady(InputInstancePtr input_ptr) { | 83 void ArcBridgeService::OnInputInstanceReady(InputInstancePtr input_ptr) { |
73 DCHECK(CalledOnValidThread()); | 84 DCHECK(CalledOnValidThread()); |
74 temporary_input_ptr_ = std::move(input_ptr); | 85 temporary_input_ptr_ = std::move(input_ptr); |
75 temporary_input_ptr_.QueryVersion(base::Bind( | 86 temporary_input_ptr_.QueryVersion(base::Bind( |
76 &ArcBridgeService::OnInputVersionReady, weak_factory_.GetWeakPtr())); | 87 &ArcBridgeService::OnInputVersionReady, weak_factory_.GetWeakPtr())); |
77 } | 88 } |
78 | 89 |
79 void ArcBridgeService::OnInputVersionReady(int32_t version) { | 90 void ArcBridgeService::OnInputVersionReady(int32_t version) { |
80 DCHECK(CalledOnValidThread()); | 91 DCHECK(CalledOnValidThread()); |
81 input_ptr_ = std::move(temporary_input_ptr_); | 92 input_ptr_ = std::move(temporary_input_ptr_); |
82 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceReady()); | 93 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceReady()); |
| 94 input_ptr_.set_connection_error_handler(base::Bind( |
| 95 &ArcBridgeService::CloseInputChannel, weak_factory_.GetWeakPtr())); |
| 96 } |
| 97 |
| 98 void ArcBridgeService::CloseInputChannel() { |
| 99 DCHECK(CalledOnValidThread()); |
| 100 if (!input_ptr_) |
| 101 return; |
| 102 |
| 103 input_ptr_.reset(); |
| 104 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceClosed()); |
83 } | 105 } |
84 | 106 |
85 void ArcBridgeService::OnNotificationsInstanceReady( | 107 void ArcBridgeService::OnNotificationsInstanceReady( |
86 NotificationsInstancePtr notifications_ptr) { | 108 NotificationsInstancePtr notifications_ptr) { |
87 DCHECK(CalledOnValidThread()); | 109 DCHECK(CalledOnValidThread()); |
88 temporary_notifications_ptr_ = std::move(notifications_ptr); | 110 temporary_notifications_ptr_ = std::move(notifications_ptr); |
89 temporary_notifications_ptr_.QueryVersion( | 111 temporary_notifications_ptr_.QueryVersion( |
90 base::Bind(&ArcBridgeService::OnNotificationsVersionReady, | 112 base::Bind(&ArcBridgeService::OnNotificationsVersionReady, |
91 weak_factory_.GetWeakPtr())); | 113 weak_factory_.GetWeakPtr())); |
92 } | 114 } |
93 | 115 |
94 void ArcBridgeService::OnNotificationsVersionReady(int32_t version) { | 116 void ArcBridgeService::OnNotificationsVersionReady(int32_t version) { |
95 DCHECK(CalledOnValidThread()); | 117 DCHECK(CalledOnValidThread()); |
96 notifications_ptr_ = std::move(temporary_notifications_ptr_); | 118 notifications_ptr_ = std::move(temporary_notifications_ptr_); |
97 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceReady()); | 119 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceReady()); |
| 120 notifications_ptr_.set_connection_error_handler( |
| 121 base::Bind(&ArcBridgeService::CloseNotificationsChannel, |
| 122 weak_factory_.GetWeakPtr())); |
| 123 } |
| 124 |
| 125 void ArcBridgeService::CloseNotificationsChannel() { |
| 126 DCHECK(CalledOnValidThread()); |
| 127 if (!notifications_ptr_) |
| 128 return; |
| 129 |
| 130 notifications_ptr_.reset(); |
| 131 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceClosed()); |
98 } | 132 } |
99 | 133 |
100 void ArcBridgeService::OnPowerInstanceReady(PowerInstancePtr power_ptr) { | 134 void ArcBridgeService::OnPowerInstanceReady(PowerInstancePtr power_ptr) { |
101 DCHECK(CalledOnValidThread()); | 135 DCHECK(CalledOnValidThread()); |
102 temporary_power_ptr_ = std::move(power_ptr); | 136 temporary_power_ptr_ = std::move(power_ptr); |
103 temporary_power_ptr_.QueryVersion(base::Bind( | 137 temporary_power_ptr_.QueryVersion(base::Bind( |
104 &ArcBridgeService::OnPowerVersionReady, weak_factory_.GetWeakPtr())); | 138 &ArcBridgeService::OnPowerVersionReady, weak_factory_.GetWeakPtr())); |
105 } | 139 } |
106 | 140 |
107 void ArcBridgeService::OnPowerVersionReady(int32_t version) { | 141 void ArcBridgeService::OnPowerVersionReady(int32_t version) { |
108 DCHECK(CalledOnValidThread()); | 142 DCHECK(CalledOnValidThread()); |
109 power_ptr_ = std::move(temporary_power_ptr_); | 143 power_ptr_ = std::move(temporary_power_ptr_); |
110 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceReady()); | 144 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceReady()); |
| 145 power_ptr_.set_connection_error_handler(base::Bind( |
| 146 &ArcBridgeService::ClosePowerChannel, weak_factory_.GetWeakPtr())); |
| 147 } |
| 148 |
| 149 void ArcBridgeService::ClosePowerChannel() { |
| 150 DCHECK(CalledOnValidThread()); |
| 151 if (!power_ptr_) |
| 152 return; |
| 153 |
| 154 power_ptr_.reset(); |
| 155 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceClosed()); |
111 } | 156 } |
112 | 157 |
113 void ArcBridgeService::OnProcessInstanceReady(ProcessInstancePtr process_ptr) { | 158 void ArcBridgeService::OnProcessInstanceReady(ProcessInstancePtr process_ptr) { |
114 DCHECK(CalledOnValidThread()); | 159 DCHECK(CalledOnValidThread()); |
115 temporary_process_ptr_ = std::move(process_ptr); | 160 temporary_process_ptr_ = std::move(process_ptr); |
116 temporary_process_ptr_.QueryVersion(base::Bind( | 161 temporary_process_ptr_.QueryVersion(base::Bind( |
117 &ArcBridgeService::OnProcessVersionReady, weak_factory_.GetWeakPtr())); | 162 &ArcBridgeService::OnProcessVersionReady, weak_factory_.GetWeakPtr())); |
118 } | 163 } |
119 | 164 |
120 void ArcBridgeService::OnProcessVersionReady(int32_t version) { | 165 void ArcBridgeService::OnProcessVersionReady(int32_t version) { |
121 DCHECK(CalledOnValidThread()); | 166 DCHECK(CalledOnValidThread()); |
122 process_ptr_ = std::move(temporary_process_ptr_); | 167 process_ptr_ = std::move(temporary_process_ptr_); |
123 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceReady()); | 168 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceReady()); |
| 169 process_ptr_.set_connection_error_handler(base::Bind( |
| 170 &ArcBridgeService::CloseProcessChannel, weak_factory_.GetWeakPtr())); |
| 171 } |
| 172 |
| 173 void ArcBridgeService::CloseProcessChannel() { |
| 174 DCHECK(CalledOnValidThread()); |
| 175 if (!process_ptr_) |
| 176 return; |
| 177 |
| 178 process_ptr_.reset(); |
| 179 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceClosed()); |
124 } | 180 } |
125 | 181 |
126 void ArcBridgeService::OnSettingsInstanceReady( | 182 void ArcBridgeService::OnSettingsInstanceReady( |
127 SettingsInstancePtr settings_ptr) { | 183 SettingsInstancePtr settings_ptr) { |
128 DCHECK(CalledOnValidThread()); | 184 DCHECK(CalledOnValidThread()); |
129 temporary_settings_ptr_ = std::move(settings_ptr); | 185 temporary_settings_ptr_ = std::move(settings_ptr); |
130 temporary_settings_ptr_.QueryVersion(base::Bind( | 186 temporary_settings_ptr_.QueryVersion(base::Bind( |
131 &ArcBridgeService::OnSettingsVersionReady, weak_factory_.GetWeakPtr())); | 187 &ArcBridgeService::OnSettingsVersionReady, weak_factory_.GetWeakPtr())); |
132 } | 188 } |
133 | 189 |
134 void ArcBridgeService::OnSettingsVersionReady(int32_t version) { | 190 void ArcBridgeService::OnSettingsVersionReady(int32_t version) { |
135 settings_ptr_ = std::move(temporary_settings_ptr_); | 191 settings_ptr_ = std::move(temporary_settings_ptr_); |
136 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceReady()); | 192 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceReady()); |
| 193 settings_ptr_.set_connection_error_handler(base::Bind( |
| 194 &ArcBridgeService::CloseSettingsChannel, weak_factory_.GetWeakPtr())); |
| 195 } |
| 196 |
| 197 void ArcBridgeService::CloseSettingsChannel() { |
| 198 DCHECK(CalledOnValidThread()); |
| 199 if (!settings_ptr_) |
| 200 return; |
| 201 |
| 202 settings_ptr_.reset(); |
| 203 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceClosed()); |
137 } | 204 } |
138 | 205 |
139 void ArcBridgeService::SetState(State state) { | 206 void ArcBridgeService::SetState(State state) { |
140 DCHECK(CalledOnValidThread()); | 207 DCHECK(CalledOnValidThread()); |
141 // DCHECK on enum classes not supported. | 208 // DCHECK on enum classes not supported. |
142 DCHECK(state_ != state); | 209 DCHECK(state_ != state); |
143 state_ = state; | 210 state_ = state; |
144 FOR_EACH_OBSERVER(Observer, observer_list(), OnStateChanged(state_)); | 211 FOR_EACH_OBSERVER(Observer, observer_list(), OnStateChanged(state_)); |
145 } | 212 } |
146 | 213 |
147 void ArcBridgeService::SetAvailable(bool available) { | 214 void ArcBridgeService::SetAvailable(bool available) { |
148 DCHECK(CalledOnValidThread()); | 215 DCHECK(CalledOnValidThread()); |
149 DCHECK(available_ != available); | 216 DCHECK(available_ != available); |
150 available_ = available; | 217 available_ = available; |
151 FOR_EACH_OBSERVER(Observer, observer_list(), OnAvailableChanged(available_)); | 218 FOR_EACH_OBSERVER(Observer, observer_list(), OnAvailableChanged(available_)); |
152 } | 219 } |
153 | 220 |
154 bool ArcBridgeService::CalledOnValidThread() { | 221 bool ArcBridgeService::CalledOnValidThread() { |
155 return thread_checker_.CalledOnValidThread(); | 222 return thread_checker_.CalledOnValidThread(); |
156 } | 223 } |
157 | 224 |
| 225 void ArcBridgeService::CloseAllChannels() { |
| 226 // Call all the error handlers of all the channels to both close the channel |
| 227 // and notify any observers that the channel is closed. |
| 228 CloseAppChannel(); |
| 229 CloseInputChannel(); |
| 230 CloseNotificationsChannel(); |
| 231 ClosePowerChannel(); |
| 232 CloseProcessChannel(); |
| 233 CloseSettingsChannel(); |
| 234 } |
| 235 |
158 } // namespace arc | 236 } // namespace arc |
OLD | NEW |