Changed ConnectToService to accept error callback Method is async and can return error with delay. BUG: 24267885 Change-Id: I5a8d15d2cc7872bee4e54033bac36f1b839c5559 Reviewed-on: https://weave-review.googlesource.com/1114 Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave/examples/ubuntu/network_manager.cc b/libweave/examples/ubuntu/network_manager.cc index 2f96c09..6217f25 100644 --- a/libweave/examples/ubuntu/network_manager.cc +++ b/libweave/examples/ubuntu/network_manager.cc
@@ -202,11 +202,13 @@ callbacks_.push_back(listener); } -void NetworkImpl::TryToConnect(const std::string& ssid, - const std::string& passphrase, - int pid, - base::Time until, - const base::Closure& on_success) { +void NetworkImpl::TryToConnect( + const std::string& ssid, + const std::string& passphrase, + int pid, + base::Time until, + const base::Closure& success_callback, + const base::Callback<void(const Error*)>& error_callback) { if (pid) { int status = 0; if (pid == waitpid(pid, &status, WNOWAIT)) { @@ -223,7 +225,7 @@ close(sockf_d); if (ssid == essid) - return task_runner_->PostDelayedTask(FROM_HERE, on_success, {}); + return task_runner_->PostDelayedTask(FROM_HERE, success_callback, {}); pid = 0; // Try again. } } @@ -233,29 +235,42 @@ {"dev", "wifi", "connect", ssid, "password", passphrase}); } - if (base::Time::Now() >= until) + if (base::Time::Now() >= until) { + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "wifi", "timeout", + "Timeout connecting to WiFI network."); + task_runner_->PostDelayedTask( + FROM_HERE, base::Bind(error_callback, base::Owned(error.release())), + {}); return; + } task_runner_->PostDelayedTask( - FROM_HERE, - base::Bind(&NetworkImpl::TryToConnect, weak_ptr_factory_.GetWeakPtr(), - ssid, passphrase, pid, until, on_success), + FROM_HERE, base::Bind(&NetworkImpl::TryToConnect, + weak_ptr_factory_.GetWeakPtr(), ssid, passphrase, + pid, until, success_callback, error_callback), base::TimeDelta::FromSeconds(1)); } -bool NetworkImpl::ConnectToService(const std::string& ssid, - const std::string& passphrase, - const base::Closure& on_success, - ErrorPtr* error) { +void NetworkImpl::ConnectToService( + const std::string& ssid, + const std::string& passphrase, + const base::Closure& success_callback, + const base::Callback<void(const Error*)>& error_callback) { force_bootstrapping_ = false; CHECK(!hostapd_started_); if (hostapd_started_) { - Error::AddTo(error, FROM_HERE, "wifi", "busy", "Running Access Point."); - return false; + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "wifi", "busy", "Running Access Point."); + task_runner_->PostDelayedTask( + FROM_HERE, base::Bind(error_callback, base::Owned(error.release())), + {}); + return; } TryToConnect(ssid, passphrase, 0, - base::Time::Now() + base::TimeDelta::FromMinutes(1), on_success); + base::Time::Now() + base::TimeDelta::FromMinutes(1), + success_callback, error_callback); } void NetworkImpl::UpdateNetworkState() {
diff --git a/libweave/examples/ubuntu/network_manager.h b/libweave/examples/ubuntu/network_manager.h index 4855cfa..c7f2480 100644 --- a/libweave/examples/ubuntu/network_manager.h +++ b/libweave/examples/ubuntu/network_manager.h
@@ -26,27 +26,32 @@ explicit NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping); ~NetworkImpl(); + // Network implementation void AddOnConnectionChangedCallback( const OnConnectionChangedCallback& listener) override; - bool ConnectToService(const std::string& ssid, - const std::string& passphrase, - const base::Closure& on_success, - ErrorPtr* error) override; NetworkState GetConnectionState() const override; - void EnableAccessPoint(const std::string& ssid) override; - void DisableAccessPoint() override; void OpenSslSocket( const std::string& host, uint16_t port, const base::Callback<void(std::unique_ptr<Stream>)>& success_callback, const base::Callback<void(const Error*)>& error_callback) override; + // Wifi implementation + void ConnectToService( + const std::string& ssid, + const std::string& passphrase, + const base::Closure& success_callback, + const base::Callback<void(const Error*)>& error_callback) override; + void EnableAccessPoint(const std::string& ssid) override; + void DisableAccessPoint() override; + private: void TryToConnect(const std::string& ssid, const std::string& passphrase, int pid, base::Time until, - const base::Closure& on_success); + const base::Closure& success_callback, + const base::Callback<void(const Error*)>& error_callback); void UpdateNetworkState(); bool force_bootstrapping_{false};
diff --git a/libweave/include/weave/test/mock_wifi.h b/libweave/include/weave/test/mock_wifi.h index b32d1f2..20223ed 100644 --- a/libweave/include/weave/test/mock_wifi.h +++ b/libweave/include/weave/test/mock_wifi.h
@@ -20,10 +20,10 @@ ~MockWifi() override = default; MOCK_METHOD4(ConnectToService, - bool(const std::string&, + void(const std::string&, const std::string&, const base::Closure&, - ErrorPtr*)); + const base::Callback<void(const Error*)>&)); MOCK_METHOD1(EnableAccessPoint, void(const std::string&)); MOCK_METHOD0(DisableAccessPoint, void()); };
diff --git a/libweave/include/weave/wifi.h b/libweave/include/weave/wifi.h index 95edbeb..e763afa 100644 --- a/libweave/include/weave/wifi.h +++ b/libweave/include/weave/wifi.h
@@ -17,10 +17,11 @@ // Implementation should attempt to connect to the given network with the // given passphrase. Implementation should run either of callback. // Callback should be posted. - virtual bool ConnectToService(const std::string& ssid, - const std::string& passphrase, - const base::Closure& success_callback, - ErrorPtr* error) = 0; + virtual void ConnectToService( + const std::string& ssid, + const std::string& passphrase, + const base::Closure& success_callback, + const base::Callback<void(const Error*)>& error_callback) = 0; // Starts WiFi access point for wifi setup. virtual void EnableAccessPoint(const std::string& ssid) = 0;
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc index b9766d9..dc076b5 100644 --- a/libweave/src/privet/wifi_bootstrap_manager.cc +++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -96,13 +96,22 @@ << ", pass=" << passphrase << ")."; UpdateState(State::kConnecting); task_runner_->PostDelayedTask( - FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout, - tasks_weak_factory_.GetWeakPtr()), + FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectError, + tasks_weak_factory_.GetWeakPtr(), nullptr), base::TimeDelta::FromMinutes(3)); wifi_->ConnectToService(ssid, passphrase, base::Bind(&WifiBootstrapManager::OnConnectSuccess, tasks_weak_factory_.GetWeakPtr(), ssid), - nullptr); + base::Bind(&WifiBootstrapManager::OnConnectError, + tasks_weak_factory_.GetWeakPtr())); +} + +void WifiBootstrapManager::OnConnectError(const Error* error) { + ErrorPtr new_error = error ? error->Clone() : nullptr; + Error::AddTo(&new_error, FROM_HERE, errors::kDomain, errors::kInvalidState, + "Failed to connect to provided network"); + setup_state_ = SetupState{std::move(new_error)}; + StartBootstrapping(); } void WifiBootstrapManager::EndConnecting() { @@ -224,15 +233,6 @@ StartMonitoring(); } -void WifiBootstrapManager::OnConnectTimeout() { - VLOG(1) << "Wifi timed out while connecting"; - ErrorPtr error; - Error::AddTo(&error, FROM_HERE, errors::kDomain, errors::kInvalidState, - "Failed to connect to provided network"); - setup_state_ = SetupState{std::move(error)}; - StartBootstrapping(); -} - void WifiBootstrapManager::OnConnectivityChange() { VLOG(3) << "ConnectivityChanged: " << EnumToString(network_->GetConnectionState());
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h index 340296c..6c091cd 100644 --- a/libweave/src/privet/wifi_bootstrap_manager.h +++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -85,8 +85,8 @@ // to return to monitoring mode periodically in case our connectivity issues // were temporary. void OnBootstrapTimeout(); - void OnConnectTimeout(); void OnConnectSuccess(const std::string& ssid); + void OnConnectError(const Error* error); void OnConnectivityChange(); void OnMonitorTimeout(); void UpdateConnectionState();