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 |