blob: 59c626b61c508e2d4e47ef0cf67a4871d5f5b046 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/net/connectivity_state_helper.h"
#include "base/command_line.h"
#include "chrome/browser/chromeos/cros/network_library.h"
#include "chromeos/chromeos_switches.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
#include "chromeos/network/network_state_handler_observer.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace chromeos {
static ConnectivityStateHelper* g_connectivity_state_helper = NULL;
static ConnectivityStateHelper* g_test_connectivity_state_helper = NULL;
// Implementation of the connectivity state helper that uses the network
// state handler for fetching connectivity state.
class ConnectivityStateHelperImpl
: public ConnectivityStateHelper,
public NetworkStateHandlerObserver {
public:
ConnectivityStateHelperImpl();
virtual ~ConnectivityStateHelperImpl();
// NetworkStateHandler overrides.
virtual bool IsConnected() OVERRIDE;
virtual bool IsConnecting() OVERRIDE;
virtual bool IsConnectedType(const std::string& type) OVERRIDE;
virtual bool IsConnectingType(const std::string& type) OVERRIDE;
virtual std::string NetworkNameForType(const std::string& type) OVERRIDE;
virtual std::string DefaultNetworkName() OVERRIDE;
virtual bool DefaultNetworkOnline() OVERRIDE;
virtual void RequestScan() const OVERRIDE;
// NetworkStateHandlerObserver overrides.
virtual void NetworkManagerChanged() OVERRIDE;
virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE;
private:
NetworkStateHandler* network_state_handler_;
};
// Implementation of the connectivity state helper that uses the network
// library for fetching connectivity state.
class ConnectivityStateHelperNetworkLibrary
: public ConnectivityStateHelper,
public NetworkLibrary::NetworkManagerObserver {
public:
ConnectivityStateHelperNetworkLibrary();
virtual ~ConnectivityStateHelperNetworkLibrary();
// ConnectivityStateHelper overrides.
virtual bool IsConnected() OVERRIDE;
virtual bool IsConnecting() OVERRIDE;
virtual bool IsConnectedType(const std::string& type) OVERRIDE;
virtual bool IsConnectingType(const std::string& type) OVERRIDE;
virtual std::string NetworkNameForType(const std::string& type) OVERRIDE;
virtual std::string DefaultNetworkName() OVERRIDE;
virtual bool DefaultNetworkOnline() OVERRIDE;
virtual void RequestScan() const OVERRIDE;
// NetworkLibrary::NetworkManagerObserver overrides.
virtual void OnNetworkManagerChanged(
NetworkLibrary* network_library) OVERRIDE;
private:
NetworkLibrary* network_library_;
};
ConnectivityStateHelper::ConnectivityStateHelper() {
}
ConnectivityStateHelper::~ConnectivityStateHelper() {
}
// static
void ConnectivityStateHelper::Initialize() {
CHECK(!g_connectivity_state_helper);
if (!CommandLine::ForCurrentProcess()->HasSwitch(
chromeos::switches::kDisableNewNetworkChangeNotifier)) {
g_connectivity_state_helper = new ConnectivityStateHelperImpl();
} else {
g_connectivity_state_helper =
new ConnectivityStateHelperNetworkLibrary();
}
}
// static
bool ConnectivityStateHelper::IsInitialized() {
return g_connectivity_state_helper != NULL;
}
// static
void ConnectivityStateHelper::Shutdown() {
CHECK(g_connectivity_state_helper);
delete g_connectivity_state_helper;
g_connectivity_state_helper = NULL;
}
// static
ConnectivityStateHelper* ConnectivityStateHelper::Get() {
CHECK(g_connectivity_state_helper || g_test_connectivity_state_helper)
<< "ConnectivityStateHelper: Get() called before Initialize()";
if (g_test_connectivity_state_helper)
return g_test_connectivity_state_helper;
return g_connectivity_state_helper;
}
// static
void ConnectivityStateHelper::SetForTest(ConnectivityStateHelper* impl) {
CHECK(!g_test_connectivity_state_helper || !impl);
g_test_connectivity_state_helper = impl;
}
void ConnectivityStateHelper::AddNetworkManagerObserver(
ConnectivityStateHelperObserver* observer) {
connectivity_observers_.AddObserver(observer);
}
void ConnectivityStateHelper::RemoveNetworkManagerObserver(
ConnectivityStateHelperObserver* observer) {
connectivity_observers_.RemoveObserver(observer);
}
ConnectivityStateHelperImpl::ConnectivityStateHelperImpl() {
network_state_handler_ = NetworkHandler::Get()->network_state_handler();
network_state_handler_->AddObserver(this, FROM_HERE);
}
ConnectivityStateHelperImpl::~ConnectivityStateHelperImpl() {
network_state_handler_->RemoveObserver(this, FROM_HERE);
}
bool ConnectivityStateHelperImpl::IsConnected() {
return network_state_handler_->ConnectedNetworkByType(
NetworkStateHandler::kMatchTypeDefault) != NULL;
}
bool ConnectivityStateHelperImpl::IsConnecting() {
return network_state_handler_->ConnectingNetworkByType(
NetworkStateHandler::kMatchTypeDefault) != NULL;
}
bool ConnectivityStateHelperImpl::IsConnectedType(
const std::string& type) {
return network_state_handler_->ConnectedNetworkByType(type) != NULL;
}
bool ConnectivityStateHelperImpl::IsConnectingType(
const std::string& type) {
return network_state_handler_->ConnectingNetworkByType(type) != NULL;
}
std::string ConnectivityStateHelperImpl::NetworkNameForType(
const std::string& type) {
const NetworkState* network = network_state_handler_->
ConnectedNetworkByType(type);
if (!network)
network = network_state_handler_->ConnectingNetworkByType(type);
return network ? network->name() : std::string();
}
std::string ConnectivityStateHelperImpl::DefaultNetworkName() {
const NetworkState* default_network = network_state_handler_->
DefaultNetwork();
return default_network ? default_network->name() : std::string();
}
bool ConnectivityStateHelperImpl::DefaultNetworkOnline() {
const NetworkState* network = network_state_handler_->DefaultNetwork();
if (!network)
return false;
if (!network->IsConnectedState())
return false;
if (network->connection_state() == flimflam::kStatePortal)
return false;
return true;
}
void ConnectivityStateHelperImpl::RequestScan() const {
network_state_handler_->RequestScan();
}
void ConnectivityStateHelperImpl::NetworkManagerChanged() {
FOR_EACH_OBSERVER(ConnectivityStateHelperObserver, connectivity_observers_,
NetworkManagerChanged());
}
void ConnectivityStateHelperImpl::DefaultNetworkChanged(
const NetworkState* network) {
FOR_EACH_OBSERVER(ConnectivityStateHelperObserver, connectivity_observers_,
DefaultNetworkChanged());
}
////////////////////////////////////////////////////////////////////////////////
// NetworkLibrary implementation.
//
ConnectivityStateHelperNetworkLibrary::ConnectivityStateHelperNetworkLibrary() {
network_library_ = NetworkLibrary::Get();
network_library_->AddNetworkManagerObserver(this);
}
ConnectivityStateHelperNetworkLibrary::~ConnectivityStateHelperNetworkLibrary()
{
network_library_->RemoveNetworkManagerObserver(this);
}
bool ConnectivityStateHelperNetworkLibrary::IsConnected() {
return network_library_->Connected();
}
bool ConnectivityStateHelperNetworkLibrary::IsConnecting() {
return network_library_->Connecting();
}
bool ConnectivityStateHelperNetworkLibrary::IsConnectedType(
const std::string& type) {
if (type == flimflam::kTypeEthernet)
return network_library_->ethernet_connected();
if (type == flimflam::kTypeWifi)
return network_library_->wifi_connected();
if (type == flimflam::kTypeCellular)
return network_library_->cellular_connected();
if (type == flimflam::kTypeWimax)
return network_library_->wimax_connected();
return false;
}
bool ConnectivityStateHelperNetworkLibrary::IsConnectingType(
const std::string& type) {
if (type == flimflam::kTypeEthernet)
return network_library_->ethernet_connecting();
if (type == flimflam::kTypeWifi)
return network_library_->wifi_connecting();
if (type == flimflam::kTypeCellular)
return network_library_->cellular_connecting();
if (type == flimflam::kTypeWimax)
return network_library_->wimax_connecting();
return false;
}
std::string ConnectivityStateHelperNetworkLibrary::NetworkNameForType(
const std::string& type) {
if (type == flimflam::kTypeEthernet && network_library_->ethernet_network())
return network_library_->ethernet_network()->name();
if (type == flimflam::kTypeWifi && network_library_->wifi_network())
return network_library_->wifi_network()->name();
if (type == flimflam::kTypeCellular && network_library_->cellular_network())
return network_library_->cellular_network()->name();
if (type == flimflam::kTypeWimax && network_library_->wimax_network())
return network_library_->wimax_network()->name();
return std::string();
}
std::string ConnectivityStateHelperNetworkLibrary::DefaultNetworkName() {
if (network_library_->active_network())
return network_library_->active_network()->name();
return std::string();
}
bool ConnectivityStateHelperNetworkLibrary::DefaultNetworkOnline() {
const Network* active_network = network_library_->active_network();
if (!active_network)
return false;
if (!active_network->connected())
return false;
if (active_network->restricted_pool())
return false;
return true;
}
void ConnectivityStateHelperNetworkLibrary::RequestScan() const {
network_library_->RequestNetworkScan();
}
void ConnectivityStateHelperNetworkLibrary::OnNetworkManagerChanged(
NetworkLibrary* network_library) {
FOR_EACH_OBSERVER(ConnectivityStateHelperObserver, connectivity_observers_,
NetworkManagerChanged());
}
} // namespace chromeos