examples/ubuntu: switch to libevent network provider - remove network provider impl from network_manager - rename network_manager to wifi_manager Bug: 24466635 Change-Id: I23845a59f0602c3995f5ece07a31d4a81f23b224 Reviewed-on: https://weave-review.googlesource.com/1331 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/examples/ubuntu/main.cc b/libweave/examples/ubuntu/main.cc index cd6dc06..fa1901e 100644 --- a/libweave/examples/ubuntu/main.cc +++ b/libweave/examples/ubuntu/main.cc
@@ -13,9 +13,10 @@ #include "examples/ubuntu/bluez_client.h" #include "examples/ubuntu/curl_http_client.h" #include "examples/ubuntu/event_http_server.h" +#include "examples/ubuntu/event_network.h" #include "examples/ubuntu/event_task_runner.h" #include "examples/ubuntu/file_config_store.h" -#include "examples/ubuntu/network_manager.h" +#include "examples/ubuntu/wifi_manager.h" namespace { @@ -266,7 +267,8 @@ weave::examples::FileConfigStore config_store{disable_security}; weave::examples::EventTaskRunner task_runner; weave::examples::CurlHttpClient http_client{&task_runner}; - weave::examples::NetworkImpl network{&task_runner, force_bootstrapping}; + weave::examples::EventNetworkImpl network{&task_runner}; + weave::examples::WifiImpl wifi{&task_runner, force_bootstrapping}; weave::examples::AvahiClient dns_sd; weave::examples::HttpServerImpl http_server{&task_runner}; weave::examples::BluetoothImpl bluetooth; @@ -274,7 +276,7 @@ auto device = weave::Device::Create( &config_store, &task_runner, &http_client, &network, &dns_sd, &http_server, - weave::examples::NetworkImpl::HasWifiCapability() ? &network : nullptr, + weave::examples::WifiImpl::HasWifiCapability() ? &wifi : nullptr, &bluetooth); if (!registration_ticket.empty()) {
diff --git a/libweave/examples/ubuntu/network_manager.h b/libweave/examples/ubuntu/network_manager.h deleted file mode 100644 index 3769ab1..0000000 --- a/libweave/examples/ubuntu/network_manager.h +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2015 The Weave Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef LIBWEAVE_EXAMPLES_UBUNTU_NETWORK_MANAGER_H_ -#define LIBWEAVE_EXAMPLES_UBUNTU_NETWORK_MANAGER_H_ - -#include <string> -#include <vector> - -#include <base/memory/weak_ptr.h> -#include <base/time/time.h> -#include <weave/provider/network.h> -#include <weave/provider/wifi.h> - -namespace weave { - -namespace provider { -class TaskRunner; -} - -namespace examples { - -// Basic weave::Network implementation. -// Production version of SSL socket needs secure server certificate check. -class NetworkImpl : public provider::Network, public provider::Wifi { - public: - explicit NetworkImpl(provider::TaskRunner* task_runner, - bool force_bootstrapping); - ~NetworkImpl(); - - // Network implementation. - void AddConnectionChangedCallback( - const ConnectionChangedCallback& callback) override; - State GetConnectionState() const override; - void OpenSslSocket(const std::string& host, - uint16_t port, - const OpenSslSocketCallback& callback) override; - - // Wifi implementation. - void Connect(const std::string& ssid, - const std::string& passphrase, - const DoneCallback& callback) override; - void StartAccessPoint(const std::string& ssid) override; - void StopAccessPoint() override; - - static bool HasWifiCapability(); - - private: - void TryToConnect(const std::string& ssid, - const std::string& passphrase, - int pid, - base::Time until, - const DoneCallback& callback); - void UpdateNetworkState(); - - bool force_bootstrapping_{false}; - bool hostapd_started_{false}; - provider::TaskRunner* task_runner_{nullptr}; - std::vector<ConnectionChangedCallback> callbacks_; - provider::Network::State network_state_{provider::Network::State::kOffline}; - - base::WeakPtrFactory<NetworkImpl> weak_ptr_factory_{this}; -}; - -} // namespace examples -} // namespace weave - -#endif // LIBWEAVE_EXAMPLES_UBUNTU_NETWORK_MANAGER_H_
diff --git a/libweave/examples/ubuntu/weave.gyp b/libweave/examples/ubuntu/weave.gyp index a561c9d..24e8f15 100644 --- a/libweave/examples/ubuntu/weave.gyp +++ b/libweave/examples/ubuntu/weave.gyp
@@ -37,7 +37,7 @@ 'file_config_store.cc', 'main.cc', 'event_network.cc', - 'network_manager.cc', + 'wifi_manager.cc', 'ssl_stream.cc', ], 'dependencies': [
diff --git a/libweave/examples/ubuntu/network_manager.cc b/libweave/examples/ubuntu/wifi_manager.cc similarity index 67% rename from libweave/examples/ubuntu/network_manager.cc rename to libweave/examples/ubuntu/wifi_manager.cc index efc2d5c..be2953e 100644 --- a/libweave/examples/ubuntu/network_manager.cc +++ b/libweave/examples/ubuntu/wifi_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "examples/ubuntu/network_manager.h" +#include "examples/ubuntu/wifi_manager.h" #include <arpa/inet.h> #include <linux/wireless.h> @@ -39,25 +39,19 @@ } // namespace -NetworkImpl::NetworkImpl(provider::TaskRunner* task_runner, +WifiImpl::WifiImpl(provider::TaskRunner* task_runner, bool force_bootstrapping) : force_bootstrapping_{force_bootstrapping}, task_runner_{task_runner} { SSL_load_error_strings(); SSL_library_init(); StopAccessPoint(); - UpdateNetworkState(); } -NetworkImpl::~NetworkImpl() { +WifiImpl::~WifiImpl() { StopAccessPoint(); } -void NetworkImpl::AddConnectionChangedCallback( - const ConnectionChangedCallback& callback) { - callbacks_.push_back(callback); -} - -void NetworkImpl::TryToConnect(const std::string& ssid, +void WifiImpl::TryToConnect(const std::string& ssid, const std::string& passphrase, int pid, base::Time until, @@ -100,12 +94,12 @@ task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&NetworkImpl::TryToConnect, weak_ptr_factory_.GetWeakPtr(), + base::Bind(&WifiImpl::TryToConnect, weak_ptr_factory_.GetWeakPtr(), ssid, passphrase, pid, until, callback), base::TimeDelta::FromSeconds(1)); } -void NetworkImpl::Connect(const std::string& ssid, +void WifiImpl::Connect(const std::string& ssid, const std::string& passphrase, const DoneCallback& callback) { force_bootstrapping_ = false; @@ -122,35 +116,10 @@ base::Time::Now() + base::TimeDelta::FromMinutes(1), callback); } -void NetworkImpl::UpdateNetworkState() { - network_state_ = Network::State::kOffline; - if (force_bootstrapping_) - return; - if (std::system("ping talk.google.com -c 1") == 0) - network_state_ = State::kOnline; - else if (std::system("nmcli dev")) - network_state_ = State::kError; - else if (std::system("nmcli dev | grep connecting") == 0) - network_state_ = State::kConnecting; - - task_runner_->PostDelayedTask(FROM_HERE, - base::Bind(&NetworkImpl::UpdateNetworkState, - weak_ptr_factory_.GetWeakPtr()), - base::TimeDelta::FromSeconds(10)); - for (const auto& cb : callbacks_) - cb.Run(); -} - -provider::Network::State NetworkImpl::GetConnectionState() const { - return network_state_; -} - -void NetworkImpl::StartAccessPoint(const std::string& ssid) { +void WifiImpl::StartAccessPoint(const std::string& ssid) { if (hostapd_started_) return; - network_state_ = State::kOffline; - // Release wlan0 interface. CHECK_EQ(0, std::system("nmcli nm wifi off")); CHECK_EQ(0, std::system("rfkill unblock wlan")); @@ -187,35 +156,16 @@ CHECK_EQ(0, std::system(("dnsmasq --conf-file=" + dnsmasq_conf).c_str())); } -void NetworkImpl::StopAccessPoint() { +void WifiImpl::StopAccessPoint() { base::IgnoreResult(std::system("pkill -f dnsmasq.*/tmp/weave")); base::IgnoreResult(std::system("pkill -f hostapd.*/tmp/weave")); CHECK_EQ(0, std::system("nmcli nm wifi on")); hostapd_started_ = false; } -bool NetworkImpl::HasWifiCapability() { +bool WifiImpl::HasWifiCapability() { return std::system("nmcli dev | grep ^wlan0") == 0; } -void NetworkImpl::OpenSslSocket(const std::string& host, - uint16_t port, - const OpenSslSocketCallback& callback) { - // Connect to SSL port instead of upgrading to TLS. - std::unique_ptr<SSLStream> tls_stream{new SSLStream{task_runner_}}; - - if (tls_stream->Init(host, port)) { - task_runner_->PostDelayedTask( - FROM_HERE, base::Bind(callback, base::Passed(&tls_stream), nullptr), - {}); - } else { - ErrorPtr error; - Error::AddTo(&error, FROM_HERE, "tls", "tls_init_failed", - "Failed to initialize TLS stream."); - task_runner_->PostDelayedTask( - FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error)), {}); - } -} - } // namespace examples } // namespace weave
diff --git a/libweave/examples/ubuntu/wifi_manager.h b/libweave/examples/ubuntu/wifi_manager.h new file mode 100644 index 0000000..3258374 --- /dev/null +++ b/libweave/examples/ubuntu/wifi_manager.h
@@ -0,0 +1,55 @@ +// Copyright 2015 The Weave Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef LIBWEAVE_EXAMPLES_UBUNTU_WIFI_MANAGER_H_ +#define LIBWEAVE_EXAMPLES_UBUNTU_WIFI_MANAGER_H_ + +#include <string> +#include <vector> + +#include <base/memory/weak_ptr.h> +#include <base/time/time.h> +#include <weave/provider/wifi.h> + +namespace weave { + +namespace provider { +class TaskRunner; +} + +namespace examples { + +// Basic weave::Wifi implementation. +// Production version of SSL socket needs secure server certificate check. +class WifiImpl : public provider::Wifi { + public: + explicit WifiImpl(provider::TaskRunner* task_runner, + bool force_bootstrapping); + ~WifiImpl(); + + // Wifi implementation. + void Connect(const std::string& ssid, + const std::string& passphrase, + const DoneCallback& callback) override; + void StartAccessPoint(const std::string& ssid) override; + void StopAccessPoint() override; + + static bool HasWifiCapability(); + + private: + void TryToConnect(const std::string& ssid, + const std::string& passphrase, + int pid, + base::Time until, + const DoneCallback& callback); + bool force_bootstrapping_{false}; + bool hostapd_started_{false}; + provider::TaskRunner* task_runner_{nullptr}; + base::WeakPtrFactory<WifiImpl> weak_ptr_factory_{this}; +}; + +} // namespace examples +} // namespace weave + +#endif // LIBWEAVE_EXAMPLES_UBUNTU_WIFI_MANAGER_H_