Chromium Code Reviews| 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" |
| 11 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
| 12 #include "chromeos/chromeos_switches.h" | 12 #include "chromeos/chromeos_switches.h" |
| 13 #include "components/arc/arc_bridge_service_impl.h" | 13 #include "components/arc/arc_bridge_service_impl.h" |
| 14 | 14 |
| 15 namespace arc { | 15 namespace arc { |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 // Weak pointer. This class is owned by ArcServiceManager. | 19 // Weak pointer. This class is owned by ArcServiceManager. |
| 20 ArcBridgeService* g_arc_bridge_service = nullptr; | 20 ArcBridgeService* g_arc_bridge_service = nullptr; |
| 21 | 21 |
| 22 } // namespace | 22 } // namespace |
| 23 | 23 |
| 24 ArcBridgeService::ArcBridgeService() | 24 ArcBridgeService::ArcBridgeService() |
| 25 : available_(false), state_(State::STOPPED) { | 25 : available_(false), state_(State::STOPPED), weak_factory_(this) { |
| 26 DCHECK(!g_arc_bridge_service); | 26 DCHECK(!g_arc_bridge_service); |
| 27 g_arc_bridge_service = this; | 27 g_arc_bridge_service = this; |
| 28 } | 28 } |
| 29 | 29 |
| 30 ArcBridgeService::~ArcBridgeService() { | 30 ArcBridgeService::~ArcBridgeService() { |
| 31 DCHECK(CalledOnValidThread()); | 31 DCHECK(CalledOnValidThread()); |
| 32 DCHECK(state() == State::STOPPING || state() == State::STOPPED); | 32 DCHECK(state() == State::STOPPING || state() == State::STOPPED); |
| 33 DCHECK(g_arc_bridge_service == this); | 33 DCHECK(g_arc_bridge_service == this); |
| 34 g_arc_bridge_service = nullptr; | 34 g_arc_bridge_service = nullptr; |
| 35 } | 35 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 53 | 53 |
| 54 void ArcBridgeService::RemoveObserver(Observer* observer) { | 54 void ArcBridgeService::RemoveObserver(Observer* observer) { |
| 55 DCHECK(CalledOnValidThread()); | 55 DCHECK(CalledOnValidThread()); |
| 56 observer_list_.RemoveObserver(observer); | 56 observer_list_.RemoveObserver(observer); |
| 57 } | 57 } |
| 58 | 58 |
| 59 void ArcBridgeService::OnAppInstanceReady(AppInstancePtr app_ptr) { | 59 void ArcBridgeService::OnAppInstanceReady(AppInstancePtr app_ptr) { |
| 60 DCHECK(CalledOnValidThread()); | 60 DCHECK(CalledOnValidThread()); |
| 61 app_ptr_ = std::move(app_ptr); | 61 app_ptr_ = std::move(app_ptr); |
| 62 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceReady()); | 62 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceReady()); |
| 63 app_ptr_.set_connection_error_handler(base::Bind( | |
| 64 &ArcBridgeService::OnAppChannelClosed, weak_factory_.GetWeakPtr())); | |
| 65 } | |
| 66 | |
| 67 void ArcBridgeService::OnAppChannelClosed() { | |
| 68 DCHECK(CalledOnValidThread()); | |
| 69 if (!app_ptr_) | |
| 70 return; | |
| 71 | |
| 72 app_ptr_.reset(); | |
| 73 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceClosed()); | |
| 63 } | 74 } |
| 64 | 75 |
| 65 void ArcBridgeService::OnInputInstanceReady(InputInstancePtr input_ptr) { | 76 void ArcBridgeService::OnInputInstanceReady(InputInstancePtr input_ptr) { |
| 66 DCHECK(CalledOnValidThread()); | 77 DCHECK(CalledOnValidThread()); |
| 67 input_ptr_ = std::move(input_ptr); | 78 input_ptr_ = std::move(input_ptr); |
| 68 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceReady()); | 79 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceReady()); |
| 80 input_ptr_.set_connection_error_handler(base::Bind( | |
| 81 &ArcBridgeService::OnInputChannelClosed, weak_factory_.GetWeakPtr())); | |
| 82 } | |
| 83 | |
| 84 void ArcBridgeService::OnInputChannelClosed() { | |
| 85 DCHECK(CalledOnValidThread()); | |
| 86 if (!input_ptr_) | |
| 87 return; | |
| 88 | |
| 89 input_ptr_.reset(); | |
| 90 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceClosed()); | |
| 69 } | 91 } |
| 70 | 92 |
| 71 void ArcBridgeService::OnNotificationsInstanceReady( | 93 void ArcBridgeService::OnNotificationsInstanceReady( |
| 72 NotificationsInstancePtr notifications_ptr) { | 94 NotificationsInstancePtr notifications_ptr) { |
| 73 DCHECK(CalledOnValidThread()); | 95 DCHECK(CalledOnValidThread()); |
| 74 notifications_ptr_ = std::move(notifications_ptr); | 96 notifications_ptr_ = std::move(notifications_ptr); |
| 75 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceReady()); | 97 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceReady()); |
| 98 notifications_ptr_.set_connection_error_handler( | |
| 99 base::Bind(&ArcBridgeService::OnNotificationsChannelClosed, | |
| 100 weak_factory_.GetWeakPtr())); | |
| 101 } | |
| 102 | |
| 103 void ArcBridgeService::OnNotificationsChannelClosed() { | |
| 104 DCHECK(CalledOnValidThread()); | |
| 105 if (!notifications_ptr_) | |
| 106 return; | |
| 107 | |
| 108 notifications_ptr_.reset(); | |
| 109 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceClosed()); | |
| 76 } | 110 } |
| 77 | 111 |
| 78 void ArcBridgeService::OnPowerInstanceReady(PowerInstancePtr power_ptr) { | 112 void ArcBridgeService::OnPowerInstanceReady(PowerInstancePtr power_ptr) { |
| 79 DCHECK(CalledOnValidThread()); | 113 DCHECK(CalledOnValidThread()); |
| 80 power_ptr_ = std::move(power_ptr); | 114 power_ptr_ = std::move(power_ptr); |
| 81 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceReady()); | 115 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceReady()); |
| 116 power_ptr_.set_connection_error_handler(base::Bind( | |
| 117 &ArcBridgeService::OnPowerChannelClosed, weak_factory_.GetWeakPtr())); | |
| 118 } | |
| 119 | |
| 120 void ArcBridgeService::OnPowerChannelClosed() { | |
| 121 DCHECK(CalledOnValidThread()); | |
| 122 if (!power_ptr_) | |
| 123 return; | |
| 124 | |
| 125 power_ptr_.reset(); | |
| 126 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceClosed()); | |
| 82 } | 127 } |
| 83 | 128 |
| 84 void ArcBridgeService::OnProcessInstanceReady(ProcessInstancePtr process_ptr) { | 129 void ArcBridgeService::OnProcessInstanceReady(ProcessInstancePtr process_ptr) { |
| 85 DCHECK(CalledOnValidThread()); | 130 DCHECK(CalledOnValidThread()); |
| 86 process_ptr_ = std::move(process_ptr); | 131 process_ptr_ = std::move(process_ptr); |
| 87 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceReady()); | 132 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceReady()); |
| 133 process_ptr_.set_connection_error_handler(base::Bind( | |
| 134 &ArcBridgeService::OnProcessChannelClosed, weak_factory_.GetWeakPtr())); | |
| 135 } | |
| 136 | |
| 137 void ArcBridgeService::OnProcessChannelClosed() { | |
| 138 DCHECK(CalledOnValidThread()); | |
| 139 if (!process_ptr_) | |
| 140 return; | |
| 141 | |
| 142 process_ptr_.reset(); | |
| 143 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceClosed()); | |
| 88 } | 144 } |
| 89 | 145 |
| 90 void ArcBridgeService::OnSettingsInstanceReady( | 146 void ArcBridgeService::OnSettingsInstanceReady( |
| 91 SettingsInstancePtr settings_ptr) { | 147 SettingsInstancePtr settings_ptr) { |
| 92 DCHECK(CalledOnValidThread()); | 148 DCHECK(CalledOnValidThread()); |
| 93 settings_ptr_ = std::move(settings_ptr); | 149 settings_ptr_ = std::move(settings_ptr); |
| 94 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceReady()); | 150 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceReady()); |
| 151 settings_ptr_.set_connection_error_handler(base::Bind( | |
| 152 &ArcBridgeService::OnSettingsChannelClosed, weak_factory_.GetWeakPtr())); | |
| 153 } | |
| 154 | |
| 155 void ArcBridgeService::OnSettingsChannelClosed() { | |
| 156 DCHECK(CalledOnValidThread()); | |
| 157 if (!settings_ptr_) | |
| 158 return; | |
| 159 | |
| 160 settings_ptr_.reset(); | |
| 161 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceClosed()); | |
| 95 } | 162 } |
| 96 | 163 |
| 97 void ArcBridgeService::SetState(State state) { | 164 void ArcBridgeService::SetState(State state) { |
| 98 DCHECK(CalledOnValidThread()); | 165 DCHECK(CalledOnValidThread()); |
| 99 // DCHECK on enum classes not supported. | 166 // DCHECK on enum classes not supported. |
| 100 DCHECK(state_ != state); | 167 DCHECK(state_ != state); |
| 101 state_ = state; | 168 state_ = state; |
| 102 FOR_EACH_OBSERVER(Observer, observer_list(), OnStateChanged(state_)); | 169 FOR_EACH_OBSERVER(Observer, observer_list(), OnStateChanged(state_)); |
| 103 } | 170 } |
| 104 | 171 |
| 105 void ArcBridgeService::SetAvailable(bool available) { | 172 void ArcBridgeService::SetAvailable(bool available) { |
| 106 DCHECK(CalledOnValidThread()); | 173 DCHECK(CalledOnValidThread()); |
| 107 DCHECK(available_ != available); | 174 DCHECK(available_ != available); |
| 108 available_ = available; | 175 available_ = available; |
| 109 FOR_EACH_OBSERVER(Observer, observer_list(), OnAvailableChanged(available_)); | 176 FOR_EACH_OBSERVER(Observer, observer_list(), OnAvailableChanged(available_)); |
| 110 } | 177 } |
| 111 | 178 |
| 112 bool ArcBridgeService::CalledOnValidThread() { | 179 bool ArcBridgeService::CalledOnValidThread() { |
| 113 return thread_checker_.CalledOnValidThread(); | 180 return thread_checker_.CalledOnValidThread(); |
| 114 } | 181 } |
| 115 | 182 |
| 183 void ArcBridgeService::CloseAllChannels() { | |
|
hidehiko
2015/12/29 13:27:12
This method looks not actually close the channels?
Luis Héctor Chávez
2015/12/29 17:17:36
It does, but let me add a comment to make it more
hidehiko
2016/01/05 08:17:13
Oh, I was confused by the name.
So, let's rename t
Luis Héctor Chávez
2016/01/05 18:59:21
When there is an error, Mojo closes the channel fi
| |
| 184 OnAppChannelClosed(); | |
| 185 OnInputChannelClosed(); | |
| 186 OnNotificationsChannelClosed(); | |
| 187 OnPowerChannelClosed(); | |
| 188 OnProcessChannelClosed(); | |
| 189 OnSettingsChannelClosed(); | |
| 190 } | |
| 191 | |
| 116 } // namespace arc | 192 } // namespace arc |
| OLD | NEW |