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

Unified Diff: chromeos/components/tether/connect_tethering_operation.cc

Issue 2792483002: [CrOS Tether] Create TetherConnector, which attempts to connect to a nearby tether host. (Closed)
Patch Set: hansberry@ comment. Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chromeos/components/tether/connect_tethering_operation.cc
diff --git a/chromeos/components/tether/connect_tethering_operation.cc b/chromeos/components/tether/connect_tethering_operation.cc
index b7723b7130872c4aaf97c130e509f9f26371fe6c..f63f105bce9c7b7b327e67ed388d3019bd61bec3 100644
--- a/chromeos/components/tether/connect_tethering_operation.cc
+++ b/chromeos/components/tether/connect_tethering_operation.cc
@@ -52,8 +52,11 @@ ConnectTetheringOperation::ConnectTetheringOperation(
: MessageTransferOperation(
std::vector<cryptauth::RemoteDevice>{device_to_connect},
connection_manager),
+ remote_device_(device_to_connect),
host_scan_device_prioritizer_(host_scan_device_prioritizer),
- has_authenticated_(false) {}
+ error_code_to_return_(
+ ConnectTetheringResponse_ResponseCode::
+ ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR) {}
ConnectTetheringOperation::~ConnectTetheringOperation() {}
@@ -68,8 +71,6 @@ void ConnectTetheringOperation::RemoveObserver(Observer* observer) {
void ConnectTetheringOperation::OnDeviceAuthenticated(
const cryptauth::RemoteDevice& remote_device) {
DCHECK(remote_devices().size() == 1u && remote_devices()[0] == remote_device);
- has_authenticated_ = true;
-
SendMessageToDevice(remote_device, base::MakeUnique<MessageWrapper>(
ConnectTetheringRequest()));
}
@@ -83,6 +84,11 @@ void ConnectTetheringOperation::OnMessageReceived(
return;
}
+ if (!(remote_device == remote_device_)) {
+ // If the message came from another device, ignore it.
+ return;
+ }
+
ConnectTetheringResponse* response =
static_cast<ConnectTetheringResponse*>(message_wrapper->GetProto().get());
if (response->response_code() ==
@@ -98,22 +104,19 @@ void ConnectTetheringOperation::OnMessageReceived(
host_scan_device_prioritizer_->RecordSuccessfulConnectTetheringResponse(
remote_device);
- NotifyObserversOfSuccessfulResponse(response->ssid(),
- response->password());
+ ssid_to_return_ = response->ssid();
+ password_to_return_ = response->password();
} else {
PA_LOG(ERROR) << "Received ConnectTetheringResponse from device with ID "
<< remote_device.GetTruncatedDeviceIdForLogs() << " and "
<< "response_code == SUCCESS, but the response did not "
<< "contain a Wi-Fi SSID and/or password.";
- NotifyObserversOfConnectionFailure(
- ConnectTetheringResponse_ResponseCode::
- ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR);
}
} else {
PA_LOG(INFO) << "Received ConnectTetheringResponse from device with ID "
<< remote_device.GetTruncatedDeviceIdForLogs() << " and "
<< "response_code == " << response->response_code() << ".";
- NotifyObserversOfConnectionFailure(response->response_code());
+ error_code_to_return_ = response->response_code();
}
// Now that a response has been received, the device can be unregistered.
@@ -121,13 +124,18 @@ void ConnectTetheringOperation::OnMessageReceived(
}
void ConnectTetheringOperation::OnOperationFinished() {
- if (!has_authenticated_) {
- // If the operation finished but the device never authenticated, there was
- // some sort of problem connecting to the device. In this case, notify
- // observers of a failure.
- NotifyObserversOfConnectionFailure(
- ConnectTetheringResponse_ResponseCode::
- ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR);
+ // Notify observers of the results of this operation in OnOperationFinished()
+ // instead of in OnMessageReceived() because observers may delete this
+ // ConnectTetheringOperation instance. If this happens, the UnregisterDevice()
+ // call in OnMessageReceived() will cause a crash.
+
+ if (!ssid_to_return_.empty()) {
+ NotifyObserversOfSuccessfulResponse(ssid_to_return_, password_to_return_);
+ } else {
+ // At this point, either the operation finished with a failed response or
+ // no connection succeeded at all. In these cases, notify observers of a
+ // failure.
+ NotifyObserversOfConnectionFailure(error_code_to_return_);
}
}
@@ -139,14 +147,15 @@ void ConnectTetheringOperation::NotifyObserversOfSuccessfulResponse(
const std::string& ssid,
const std::string& password) {
for (auto& observer : observer_list_) {
- observer.OnSuccessfulConnectTetheringResponse(ssid, password);
+ observer.OnSuccessfulConnectTetheringResponse(remote_device_, ssid,
+ password);
}
}
void ConnectTetheringOperation::NotifyObserversOfConnectionFailure(
ConnectTetheringResponse_ResponseCode error_code) {
for (auto& observer : observer_list_) {
- observer.OnConnectTetheringFailure(error_code);
+ observer.OnConnectTetheringFailure(remote_device_, error_code);
}
}

Powered by Google App Engine
This is Rietveld 408576698