Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: chromeos/components/tether/tether_connector.cc

Issue 2857853005: [CrOS Tether] Create TetherDisconnector, which disconnects from active tethering sessions. (Closed)
Patch Set: hansberry@ comments. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/components/tether/tether_connector.h" 5 #include "chromeos/components/tether/tether_connector.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "chromeos/components/tether/active_host.h" 8 #include "chromeos/components/tether/active_host.h"
9 #include "chromeos/components/tether/device_id_tether_network_guid_map.h" 9 #include "chromeos/components/tether/device_id_tether_network_guid_map.h"
10 #include "chromeos/components/tether/tether_host_fetcher.h" 10 #include "chromeos/components/tether/tether_host_fetcher.h"
11 #include "chromeos/components/tether/wifi_hotspot_connector.h" 11 #include "chromeos/components/tether/wifi_hotspot_connector.h"
12 #include "chromeos/network/network_handler.h" 12 #include "chromeos/network/network_handler.h"
13 #include "chromeos/network/network_state_handler.h" 13 #include "chromeos/network/network_state_handler.h"
14 #include "components/proximity_auth/logging/logging.h" 14 #include "components/proximity_auth/logging/logging.h"
15 15
16 namespace chromeos { 16 namespace chromeos {
17 17
18 namespace tether { 18 namespace tether {
19 19
20 TetherConnector::TetherConnector( 20 TetherConnector::TetherConnector(
21 NetworkConnectionHandler* network_connection_handler,
22 NetworkStateHandler* network_state_handler, 21 NetworkStateHandler* network_state_handler,
23 WifiHotspotConnector* wifi_hotspot_connector, 22 WifiHotspotConnector* wifi_hotspot_connector,
24 ActiveHost* active_host, 23 ActiveHost* active_host,
25 TetherHostFetcher* tether_host_fetcher, 24 TetherHostFetcher* tether_host_fetcher,
26 BleConnectionManager* connection_manager, 25 BleConnectionManager* connection_manager,
27 TetherHostResponseRecorder* tether_host_response_recorder, 26 TetherHostResponseRecorder* tether_host_response_recorder,
28 DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map) 27 DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map)
29 : network_connection_handler_(network_connection_handler), 28 : network_state_handler_(network_state_handler),
30 network_state_handler_(network_state_handler),
31 wifi_hotspot_connector_(wifi_hotspot_connector), 29 wifi_hotspot_connector_(wifi_hotspot_connector),
32 active_host_(active_host), 30 active_host_(active_host),
33 tether_host_fetcher_(tether_host_fetcher), 31 tether_host_fetcher_(tether_host_fetcher),
34 connection_manager_(connection_manager), 32 connection_manager_(connection_manager),
35 tether_host_response_recorder_(tether_host_response_recorder), 33 tether_host_response_recorder_(tether_host_response_recorder),
36 device_id_tether_network_guid_map_(device_id_tether_network_guid_map), 34 device_id_tether_network_guid_map_(device_id_tether_network_guid_map),
37 weak_ptr_factory_(this) { 35 weak_ptr_factory_(this) {}
38 network_connection_handler_->SetTetherDelegate(this);
39 }
40 36
41 TetherConnector::~TetherConnector() { 37 TetherConnector::~TetherConnector() {
42 network_connection_handler_->SetTetherDelegate(nullptr);
43 if (connect_tethering_operation_) { 38 if (connect_tethering_operation_) {
44 connect_tethering_operation_->RemoveObserver(this); 39 connect_tethering_operation_->RemoveObserver(this);
45 } 40 }
46 } 41 }
47 42
48 void TetherConnector::ConnectToNetwork( 43 void TetherConnector::ConnectToNetwork(
49 const std::string& tether_network_guid, 44 const std::string& tether_network_guid,
50 const base::Closure& success_callback, 45 const base::Closure& success_callback,
51 const network_handler::StringResultCallback& error_callback) { 46 const network_handler::StringResultCallback& error_callback) {
52 DCHECK(!tether_network_guid.empty()); 47 DCHECK(!tether_network_guid.empty());
53 DCHECK(!success_callback.is_null()); 48 DCHECK(!success_callback.is_null());
54 DCHECK(!error_callback.is_null()); 49 DCHECK(!error_callback.is_null());
55 50
56 PA_LOG(INFO) << "Attempting to connect to network with GUID " 51 PA_LOG(INFO) << "Attempting to connect to network with GUID "
57 << tether_network_guid << "."; 52 << tether_network_guid << ".";
58 53
59 std::string device_id = 54 const std::string device_id =
60 device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid( 55 device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid(
61 tether_network_guid); 56 tether_network_guid);
62 57
63 // If NetworkConnectionHandler receives a connection request for a network 58 // If NetworkConnectionHandler receives a connection request for a network
64 // to which it is already attempting a connection, it should stop the 59 // to which it is already attempting a connection, it should stop the
65 // duplicate connection request itself before invoking its TetherDelegate. 60 // duplicate connection request itself before invoking its TetherDelegate.
66 // Thus, ConnectToNetwork() should never be called for a device which is 61 // Thus, ConnectToNetwork() should never be called for a device which is
67 // already pending connection. 62 // already pending connection.
68 DCHECK(device_id_pending_connection_ != device_id); 63 DCHECK(device_id_pending_connection_ != device_id);
69 64
70 if (!device_id_pending_connection_.empty()) { 65 if (!device_id_pending_connection_.empty()) {
71 PA_LOG(INFO) << "A connection attempt was already in progress to device " 66 PA_LOG(INFO) << "A connection attempt was already in progress to device "
72 << "with ID " << device_id_pending_connection_ << ". " 67 << "with ID " << device_id_pending_connection_ << ". "
73 << "Canceling that connection attempt before continuing."; 68 << "Canceling that connection attempt before continuing.";
74 69 CancelConnectionAttempt(
75 if (connect_tethering_operation_) { 70 device_id_tether_network_guid_map_->GetTetherNetworkGuidForDeviceId(
76 // If a ConnectTetheringOperation is in progress, stop it. 71 device_id_pending_connection_));
77 connect_tethering_operation_->RemoveObserver(this);
78 connect_tethering_operation_.reset();
79 }
80
81 // Since the previous connection attempt did not complete before the new
82 // attempt began, call the error callback.
83 DCHECK(!error_callback_.is_null());
84 error_callback_.Run(NetworkConnectionHandler::kErrorConnectCanceled);
85 } 72 }
86 73
87 device_id_pending_connection_ = device_id; 74 device_id_pending_connection_ = device_id;
88 success_callback_ = success_callback; 75 success_callback_ = success_callback;
89 error_callback_ = error_callback; 76 error_callback_ = error_callback;
90 active_host_->SetActiveHostConnecting(device_id, tether_network_guid); 77 active_host_->SetActiveHostConnecting(device_id, tether_network_guid);
91 78
92 tether_host_fetcher_->FetchTetherHost( 79 tether_host_fetcher_->FetchTetherHost(
93 device_id_pending_connection_, 80 device_id_pending_connection_,
94 base::Bind(&TetherConnector::OnTetherHostToConnectFetched, 81 base::Bind(&TetherConnector::OnTetherHostToConnectFetched,
95 weak_ptr_factory_.GetWeakPtr(), 82 weak_ptr_factory_.GetWeakPtr(),
96 device_id_pending_connection_)); 83 device_id_pending_connection_));
97 } 84 }
98 85
86 bool TetherConnector::CancelConnectionAttempt(
87 const std::string& tether_network_guid) {
88 const std::string device_id =
89 device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid(
90 tether_network_guid);
91
92 if (device_id != device_id_pending_connection_) {
93 PA_LOG(ERROR) << "CancelConnectionAttempt(): Cancel requested for Tether "
94 << "network with GUID " << tether_network_guid << ", but "
95 << "there was no active connection to that network.";
96 return false;
97 }
98
99 PA_LOG(INFO) << "Canceling connection attempt to Tether network with GUID "
100 << tether_network_guid;
101
102 if (connect_tethering_operation_) {
103 // If a ConnectTetheringOperation is in progress, stop it.
104 connect_tethering_operation_->RemoveObserver(this);
105 connect_tethering_operation_.reset();
106 }
107
108 SetConnectionFailed(NetworkConnectionHandler::kErrorConnectCanceled);
109 return true;
110 }
111
99 void TetherConnector::OnSuccessfulConnectTetheringResponse( 112 void TetherConnector::OnSuccessfulConnectTetheringResponse(
100 const cryptauth::RemoteDevice& remote_device, 113 const cryptauth::RemoteDevice& remote_device,
101 const std::string& ssid, 114 const std::string& ssid,
102 const std::string& password) { 115 const std::string& password) {
103 if (device_id_pending_connection_ != remote_device.GetDeviceId()) { 116 if (device_id_pending_connection_ != remote_device.GetDeviceId()) {
104 // If the success was part of a previous attempt for a different device, 117 // If the success was part of a previous attempt for a different device,
105 // ignore it. 118 // ignore it.
106 PA_LOG(INFO) << "Received successful ConnectTetheringResponse from " 119 PA_LOG(INFO) << "Received successful ConnectTetheringResponse from "
107 << "device with ID " 120 << "device with ID "
108 << remote_device.GetTruncatedDeviceIdForLogs() 121 << remote_device.GetTruncatedDeviceIdForLogs()
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 << ", but a connection to another device has already started."; 155 << ", but a connection to another device has already started.";
143 return; 156 return;
144 } 157 }
145 158
146 PA_LOG(WARNING) << "Connection to device with ID " 159 PA_LOG(WARNING) << "Connection to device with ID "
147 << remote_device.GetTruncatedDeviceIdForLogs() 160 << remote_device.GetTruncatedDeviceIdForLogs()
148 << " could not complete. Error code: " << error_code; 161 << " could not complete. Error code: " << error_code;
149 162
150 connect_tethering_operation_->RemoveObserver(this); 163 connect_tethering_operation_->RemoveObserver(this);
151 connect_tethering_operation_.reset(); 164 connect_tethering_operation_.reset();
152 SetConnectionFailed(); 165 SetConnectionFailed(NetworkConnectionHandler::kErrorConnectFailed);
153 } 166 }
154 167
155 void TetherConnector::OnTetherHostToConnectFetched( 168 void TetherConnector::OnTetherHostToConnectFetched(
156 const std::string& device_id, 169 const std::string& device_id,
157 std::unique_ptr<cryptauth::RemoteDevice> tether_host_to_connect) { 170 std::unique_ptr<cryptauth::RemoteDevice> tether_host_to_connect) {
158 if (device_id_pending_connection_ != device_id) { 171 if (device_id_pending_connection_ != device_id) {
159 PA_LOG(INFO) << "Device to connect to has changed while device with ID " 172 PA_LOG(INFO) << "Device to connect to has changed while device with ID "
160 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id) 173 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
161 << " was being fetched."; 174 << " was being fetched.";
162 return; 175 return;
163 } 176 }
164 177
165 if (!tether_host_to_connect) { 178 if (!tether_host_to_connect) {
166 PA_LOG(ERROR) << "Could not fetch tether host with device ID " 179 PA_LOG(ERROR) << "Could not fetch tether host with device ID "
167 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id) 180 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
168 << ". Cannot connect."; 181 << ". Cannot connect.";
169 SetConnectionFailed(); 182 SetConnectionFailed(NetworkConnectionHandler::kErrorConnectFailed);
170 return; 183 return;
171 } 184 }
172 185
173 DCHECK(device_id == tether_host_to_connect->GetDeviceId()); 186 DCHECK(device_id == tether_host_to_connect->GetDeviceId());
174 187
175 connect_tethering_operation_ = 188 connect_tethering_operation_ =
176 ConnectTetheringOperation::Factory::NewInstance( 189 ConnectTetheringOperation::Factory::NewInstance(
177 *tether_host_to_connect, connection_manager_, 190 *tether_host_to_connect, connection_manager_,
178 tether_host_response_recorder_); 191 tether_host_response_recorder_);
179 connect_tethering_operation_->AddObserver(this); 192 connect_tethering_operation_->AddObserver(this);
180 connect_tethering_operation_->Initialize(); 193 connect_tethering_operation_->Initialize();
181 } 194 }
182 195
183 void TetherConnector::SetConnectionFailed() { 196 void TetherConnector::SetConnectionFailed(const std::string& error_name) {
184 DCHECK(!device_id_pending_connection_.empty()); 197 DCHECK(!device_id_pending_connection_.empty());
185 DCHECK(!error_callback_.is_null()); 198 DCHECK(!error_callback_.is_null());
186 199
187 // Save a copy of the callback before resetting it below. 200 // Save a copy of the callback before resetting it below.
188 network_handler::StringResultCallback error_callback = error_callback_; 201 network_handler::StringResultCallback error_callback = error_callback_;
189 202
190 device_id_pending_connection_.clear(); 203 device_id_pending_connection_.clear();
191 success_callback_.Reset(); 204 success_callback_.Reset();
192 error_callback_.Reset(); 205 error_callback_.Reset();
193 206
194 error_callback.Run(NetworkConnectionHandler::kErrorConnectFailed); 207 error_callback.Run(error_name);
195 active_host_->SetActiveHostDisconnected(); 208 active_host_->SetActiveHostDisconnected();
196 } 209 }
197 210
198 void TetherConnector::SetConnectionSucceeded( 211 void TetherConnector::SetConnectionSucceeded(
199 const std::string& device_id, 212 const std::string& device_id,
200 const std::string& wifi_network_guid) { 213 const std::string& wifi_network_guid) {
201 DCHECK(!device_id_pending_connection_.empty()); 214 DCHECK(!device_id_pending_connection_.empty());
202 DCHECK(device_id_pending_connection_ == device_id); 215 DCHECK(device_id_pending_connection_ == device_id);
203 DCHECK(!success_callback_.is_null()); 216 DCHECK(!success_callback_.is_null());
204 217
(...skipping 26 matching lines...) Expand all
231 return; 244 return;
232 } 245 }
233 246
234 if (wifi_network_guid.empty()) { 247 if (wifi_network_guid.empty()) {
235 // If the Wi-Fi network ID is empty, then the connection did not succeed. 248 // If the Wi-Fi network ID is empty, then the connection did not succeed.
236 PA_LOG(ERROR) << "Failed to connect to the hotspot belonging to the device " 249 PA_LOG(ERROR) << "Failed to connect to the hotspot belonging to the device "
237 << "with ID " 250 << "with ID "
238 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id) 251 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
239 << "."; 252 << ".";
240 253
241 SetConnectionFailed(); 254 SetConnectionFailed(NetworkConnectionHandler::kErrorConnectFailed);
242 return; 255 return;
243 } 256 }
244 257
245 bool successful_association = 258 bool successful_association =
246 network_state_handler_->AssociateTetherNetworkStateWithWifiNetwork( 259 network_state_handler_->AssociateTetherNetworkStateWithWifiNetwork(
247 device_id, wifi_network_guid); 260 device_id, wifi_network_guid);
248 if (successful_association) { 261 if (successful_association) {
249 PA_LOG(INFO) << "Successfully connected to host device with ID " 262 PA_LOG(INFO) << "Successfully connected to host device with ID "
250 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id) 263 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
251 << ". Tether network ID: \"" << device_id 264 << ". Tether network ID: \"" << device_id
252 << "\", Wi-Fi network ID: \"" << wifi_network_guid << "\""; 265 << "\", Wi-Fi network ID: \"" << wifi_network_guid << "\"";
253 } else { 266 } else {
254 PA_LOG(WARNING) << "Successfully connected to host device with ID " 267 PA_LOG(WARNING) << "Successfully connected to host device with ID "
255 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs( 268 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(
256 device_id) 269 device_id)
257 << ", but failed to associate tether network with ID \"" 270 << ", but failed to associate tether network with ID \""
258 << device_id << "\" to Wi-Fi network with ID \"" 271 << device_id << "\" to Wi-Fi network with ID \""
259 << wifi_network_guid << "\"."; 272 << wifi_network_guid << "\".";
260 } 273 }
261 274
262 SetConnectionSucceeded(device_id, wifi_network_guid); 275 SetConnectionSucceeded(device_id, wifi_network_guid);
263 } 276 }
264 277
265 } // namespace tether 278 } // namespace tether
266 279
267 } // namespace chromeos 280 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/components/tether/tether_connector.h ('k') | chromeos/components/tether/tether_connector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698