blob: ee172389314b680adc31251fa9941dd36bedf309 [file] [log] [blame]
// Copyright (c) 2011 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.
#ifndef CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
#define CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
#pragma once
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_vector.h"
#include "base/memory/singleton.h"
#include "base/observer_list.h"
#include "base/string16.h"
#include "base/timer.h"
#include "third_party/cros/chromeos_network.h"
class DictionaryValue;
class Value;
namespace chromeos {
// Connection enums (see flimflam/include/service.h)
enum ConnectionType {
TYPE_UNKNOWN = 0,
TYPE_ETHERNET = 1,
TYPE_WIFI = 2,
TYPE_WIMAX = 3,
TYPE_BLUETOOTH = 4,
TYPE_CELLULAR = 5,
TYPE_VPN = 6,
};
enum ConnectionMode {
MODE_UNKNOWN = 0,
MODE_MANAGED = 1,
MODE_ADHOC = 2,
};
enum ConnectionSecurity {
SECURITY_UNKNOWN = 0,
SECURITY_NONE = 1,
SECURITY_WEP = 2,
SECURITY_WPA = 3,
SECURITY_RSN = 4,
SECURITY_8021X = 5,
};
enum ConnectionState {
STATE_UNKNOWN = 0,
STATE_IDLE = 1,
STATE_CARRIER = 2,
STATE_ASSOCIATION = 3,
STATE_CONFIGURATION = 4,
STATE_READY = 5,
STATE_DISCONNECT = 6,
STATE_FAILURE = 7,
STATE_ACTIVATION_FAILURE = 8
};
enum ConnectivityState {
CONN_STATE_UNKNOWN = 0,
CONN_STATE_UNRESTRICTED = 1,
CONN_STATE_RESTRICTED = 2,
CONN_STATE_NONE = 3
};
// Network enums (see flimflam/include/network.h)
enum NetworkTechnology {
NETWORK_TECHNOLOGY_UNKNOWN = 0,
NETWORK_TECHNOLOGY_1XRTT = 1,
NETWORK_TECHNOLOGY_EVDO = 2,
NETWORK_TECHNOLOGY_GPRS = 3,
NETWORK_TECHNOLOGY_EDGE = 4,
NETWORK_TECHNOLOGY_UMTS = 5,
NETWORK_TECHNOLOGY_HSPA = 6,
NETWORK_TECHNOLOGY_HSPA_PLUS = 7,
NETWORK_TECHNOLOGY_LTE = 8,
NETWORK_TECHNOLOGY_LTE_ADVANCED = 9,
};
enum ActivationState {
ACTIVATION_STATE_UNKNOWN = 0,
ACTIVATION_STATE_ACTIVATED = 1,
ACTIVATION_STATE_ACTIVATING = 2,
ACTIVATION_STATE_NOT_ACTIVATED = 3,
ACTIVATION_STATE_PARTIALLY_ACTIVATED = 4,
};
enum NetworkRoamingState {
ROAMING_STATE_UNKNOWN = 0,
ROAMING_STATE_HOME = 1,
ROAMING_STATE_ROAMING = 2,
};
// connection errors (see flimflam/include/service.h)
enum ConnectionError {
ERROR_UNKNOWN = 0,
ERROR_OUT_OF_RANGE = 1,
ERROR_PIN_MISSING = 2,
ERROR_DHCP_FAILED = 3,
ERROR_CONNECT_FAILED = 4,
ERROR_BAD_PASSPHRASE = 5,
ERROR_BAD_WEPKEY = 6,
ERROR_ACTIVATION_FAILED = 7,
ERROR_NEED_EVDO = 8,
ERROR_NEED_HOME_NETWORK = 9,
ERROR_OTASP_FAILED = 10,
ERROR_AAA_FAILED = 11,
};
// We are currently only supporting setting a single EAP Method.
enum EAPMethod {
EAP_METHOD_UNKNOWN = 0,
EAP_METHOD_PEAP = 1,
EAP_METHOD_TLS = 2,
EAP_METHOD_TTLS = 3,
EAP_METHOD_LEAP = 4
};
// We are currently only supporting setting a single EAP phase 2 authentication.
enum EAPPhase2Auth {
EAP_PHASE_2_AUTH_AUTO = 0,
EAP_PHASE_2_AUTH_MD5 = 1,
EAP_PHASE_2_AUTH_MSCHAPV2 = 2,
EAP_PHASE_2_AUTH_MSCHAP = 3,
EAP_PHASE_2_AUTH_PAP = 4,
EAP_PHASE_2_AUTH_CHAP = 5
};
// Cellular network is considered low data when less than 60 minues.
static const int kCellularDataLowSecs = 60 * 60;
// Cellular network is considered low data when less than 30 minues.
static const int kCellularDataVeryLowSecs = 30 * 60;
// Cellular network is considered low data when less than 100MB.
static const int kCellularDataLowBytes = 100 * 1024 * 1024;
// Cellular network is considered very low data when less than 50MB.
static const int kCellularDataVeryLowBytes = 50 * 1024 * 1024;
// Contains data related to the flimflam.Device interface,
// e.g. ethernet, wifi, cellular.
class NetworkDevice {
public:
explicit NetworkDevice(const std::string& device_path);
// Device info.
const std::string& device_path() const { return device_path_; }
const std::string& name() const { return name_; }
ConnectionType type() const { return type_; }
bool scanning() const { return scanning_; }
const std::string& meid() const { return MEID_; }
const std::string& imei() const { return IMEI_; }
const std::string& imsi() const { return IMSI_; }
const std::string& esn() const { return ESN_; }
const std::string& mdn() const { return MDN_; }
const std::string& min() const { return MIN_; }
const std::string& model_id() const { return model_id_; }
const std::string& manufacturer() const { return manufacturer_; }
const std::string& firmware_revision() const { return firmware_revision_; }
const std::string& hardware_revision() const { return hardware_revision_; }
const std::string& last_update() const { return last_update_; }
const unsigned int prl_version() const { return PRL_version_; }
private:
bool ParseValue(int index, const Value* value);
void ParseInfo(const DictionaryValue* info);
// General device info.
std::string device_path_;
std::string name_;
ConnectionType type_;
bool scanning_;
// Cellular specific device info.
std::string carrier_;
std::string MEID_;
std::string IMEI_;
std::string IMSI_;
std::string ESN_;
std::string MDN_;
std::string MIN_;
std::string model_id_;
std::string manufacturer_;
std::string firmware_revision_;
std::string hardware_revision_;
std::string last_update_;
int PRL_version_;
friend class NetworkLibraryImpl;
DISALLOW_COPY_AND_ASSIGN(NetworkDevice);
};
// Contains data common to all network service types.
class Network {
public:
virtual ~Network() {}
const std::string& service_path() const { return service_path_; }
const std::string& name() const { return name_; }
const std::string& device_path() const { return device_path_; }
const std::string& ip_address() const { return ip_address_; }
ConnectionType type() const { return type_; }
ConnectionMode mode() const { return mode_; }
ConnectionState connection_state() const { return state_; }
bool connecting() const { return state_ == STATE_ASSOCIATION ||
state_ == STATE_CONFIGURATION ||
state_ == STATE_CARRIER; }
bool configuring() const { return state_ == STATE_CONFIGURATION; }
bool connected() const { return state_ == STATE_READY; }
bool connecting_or_connected() const { return connecting() || connected(); }
bool failed() const { return state_ == STATE_FAILURE; }
bool failed_or_disconnected() const {
return failed() || state_ == STATE_IDLE;
}
ConnectionError error() const { return error_; }
ConnectionState state() const { return state_; }
// Is this network connectable. Currently, this is mainly used by 802.1x
// networks to specify that the network is not configured yet.
bool connectable() const { return connectable_; }
// Is this the active network, i.e, the one through which
// network traffic is being routed? A network can be connected,
// but not be carrying traffic.
bool is_active() const { return is_active_; }
bool favorite() const { return favorite_; }
bool auto_connect() const { return auto_connect_; }
ConnectivityState connectivity_state() const { return connectivity_state_; }
// We don't have a setter for |favorite_| because to unfavorite a network is
// equivalent to forget a network, so we call forget network on cros for
// that. See ForgetWifiNetwork().
void SetAutoConnect(bool auto_connect);
// Return a string representation of the state code.
std::string GetStateString() const;
// Return a string representation of the error code.
std::string GetErrorString() const;
protected:
Network(const std::string& service_path, ConnectionType type)
: state_(STATE_UNKNOWN),
error_(ERROR_UNKNOWN),
connectable_(true),
is_active_(false),
favorite_(false),
auto_connect_(false),
connectivity_state_(CONN_STATE_UNKNOWN),
priority_(0),
service_path_(service_path),
type_(type) {}
// Parse name/value pairs from libcros.
virtual bool ParseValue(int index, const Value* value);
void ParseInfo(const DictionaryValue* info);
// Methods to asynchronously set network service properties
virtual void SetStringProperty(const char* prop, const std::string& str);
virtual void SetBooleanProperty(const char* prop, bool b);
virtual void SetIntegerProperty(const char* prop, int i);
virtual void ClearProperty(const char* prop);
// This will clear the property if string is empty. Otherwise, it will set it.
virtual void SetOrClearStringProperty(const char* prop,
const std::string& str);
std::string device_path_;
std::string name_;
std::string ip_address_;
ConnectionMode mode_;
ConnectionState state_;
ConnectionError error_;
bool connectable_;
bool is_active_;
bool favorite_;
bool auto_connect_;
ConnectivityState connectivity_state_;
private:
void set_name(const std::string& name) { name_ = name; }
void set_connecting(bool connecting) {
state_ = (connecting ? STATE_ASSOCIATION : STATE_IDLE);
}
void set_connected(bool connected) {
state_ = (connected ? STATE_READY : STATE_IDLE);
}
void set_state(ConnectionState state) { state_ = state; }
void set_connectable(bool connectable) { connectable_ = connectable; }
void set_active(bool is_active) { is_active_ = is_active; }
void set_error(ConnectionError error) { error_ = error; }
void set_connectivity_state(ConnectivityState connectivity_state) {
connectivity_state_ = connectivity_state;
}
virtual void SetValueProperty(const char* prop, Value* val);
// Initialize the IP address field
void InitIPAddress();
// Priority value, corresponds to index in list from flimflam (0 = highest)
int priority_;
// These must not be modified after construction.
std::string service_path_;
ConnectionType type_;
friend class NetworkLibraryImpl;
// ChangeAutoConnectSaveTest accesses |favorite_|.
FRIEND_TEST_ALL_PREFIXES(WifiConfigViewTest, ChangeAutoConnectSaveTest);
};
// Class for networks of TYPE_ETHERNET.
class EthernetNetwork : public Network {
public:
explicit EthernetNetwork(const std::string& service_path) :
Network(service_path, TYPE_ETHERNET) {
}
};
// Class for networks of TYPE_VPN.
class VirtualNetwork : public Network {
public:
explicit VirtualNetwork(const std::string& service_path) :
Network(service_path, TYPE_VPN) {
}
};
typedef std::vector<VirtualNetwork*> VirtualNetworkVector;
// Base class for networks of TYPE_WIFI or TYPE_CELLULAR.
class WirelessNetwork : public Network {
public:
int strength() const { return strength_; }
protected:
WirelessNetwork(const std::string& service_path, ConnectionType type)
: Network(service_path, type),
strength_(0) {}
int strength_;
// Network overrides.
virtual bool ParseValue(int index, const Value* value);
private:
void set_strength(int strength) { strength_ = strength; }
friend class NetworkLibraryImpl;
};
// Class for networks of TYPE_CELLULAR.
class CellularDataPlan;
class CellularNetwork : public WirelessNetwork {
public:
enum DataLeft {
DATA_UNKNOWN,
DATA_NORMAL,
DATA_LOW,
DATA_VERY_LOW,
DATA_NONE
};
virtual ~CellularNetwork();
explicit CellularNetwork(const std::string& service_path)
: WirelessNetwork(service_path, TYPE_CELLULAR),
activation_state_(ACTIVATION_STATE_UNKNOWN),
network_technology_(NETWORK_TECHNOLOGY_UNKNOWN),
roaming_state_(ROAMING_STATE_UNKNOWN),
data_left_(DATA_UNKNOWN) {
}
// Starts device activation process. Returns false if the device state does
// not permit activation.
bool StartActivation() const;
// Requests data plans if the network is conencted and activated.
// Plan data will be passed through Network::Observer::CellularDataPlanChanged
// callback.
void RefreshDataPlansIfNeeded() const;
const ActivationState activation_state() const { return activation_state_; }
bool activated() const {
return activation_state() == ACTIVATION_STATE_ACTIVATED;
}
const NetworkTechnology network_technology() const {
return network_technology_;
}
const NetworkRoamingState roaming_state() const { return roaming_state_; }
bool restricted_pool() const {
return connectivity_state() == CONN_STATE_RESTRICTED;
}
bool needs_new_plan() const {
return restricted_pool() && connected() && activated();
}
const std::string& operator_name() const { return operator_name_; }
const std::string& operator_code() const { return operator_code_; }
const std::string& payment_url() const { return payment_url_; }
const std::string& usage_url() const { return usage_url_; }
DataLeft data_left() const { return data_left_; }
// Misc.
bool is_gsm() const {
return network_technology_ != NETWORK_TECHNOLOGY_EVDO &&
network_technology_ != NETWORK_TECHNOLOGY_1XRTT &&
network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN;
}
// Return a string representation of network technology.
std::string GetNetworkTechnologyString() const;
// Return a string representation of connectivity state.
std::string GetConnectivityStateString() const;
// Return a string representation of activation state.
std::string GetActivationStateString() const;
// Return a string representation of roaming state.
std::string GetRoamingStateString() const;
// Return a string representation of |activation_state|.
static std::string ActivationStateToString(ActivationState activation_state);
protected:
// WirelessNetwork overrides.
virtual bool ParseValue(int index, const Value* value);
ActivationState activation_state_;
NetworkTechnology network_technology_;
NetworkRoamingState roaming_state_;
// Carrier Info
std::string operator_name_;
std::string operator_code_;
std::string payment_url_;
std::string usage_url_;
// Cached values
DataLeft data_left_; // Updated when data plans are updated.
private:
void set_activation_state(ActivationState state) {
activation_state_ = state;
}
void set_payment_url(const std::string& url) { payment_url_ = url; }
void set_usage_url(const std::string& url) { usage_url_ = url; }
void set_network_technology(NetworkTechnology technology) {
network_technology_ = technology;
}
void set_roaming_state(NetworkRoamingState state) { roaming_state_ = state; }
void set_data_left(DataLeft data_left) { data_left_ = data_left; }
friend class NetworkLibraryImpl;
};
typedef std::vector<CellularNetwork*> CellularNetworkVector;
// Class for networks of TYPE_WIFI.
class WifiNetwork : public WirelessNetwork {
public:
explicit WifiNetwork(const std::string& service_path)
: WirelessNetwork(service_path, TYPE_WIFI),
encryption_(SECURITY_NONE),
passphrase_required_(false),
eap_method_(EAP_METHOD_UNKNOWN),
eap_phase_2_auth_(EAP_PHASE_2_AUTH_AUTO),
eap_use_system_cas_(true) {
}
bool encrypted() const { return encryption_ != SECURITY_NONE; }
ConnectionSecurity encryption() const { return encryption_; }
const std::string& passphrase() const { return passphrase_; }
const std::string& identity() const { return identity_; }
const std::string& cert_path() const { return cert_path_; }
EAPMethod eap_method() const { return eap_method_; }
EAPPhase2Auth eap_phase_2_auth() const { return eap_phase_2_auth_; }
const std::string& eap_server_ca_cert() const {
return eap_server_ca_cert_path_; }
const std::string& eap_client_cert() const { return eap_client_cert_path_; }
const bool eap_use_system_cas() const { return eap_use_system_cas_; }
const std::string& eap_identity() const { return eap_identity_; }
const std::string& eap_anonymous_identity() const {
return eap_anonymous_identity_; }
const std::string& eap_passphrase() const { return eap_passphrase_; }
const std::string& GetPassphrase() const;
void SetPassphrase(const std::string& passphrase);
void SetIdentity(const std::string& identity);
void SetCertPath(const std::string& cert_path);
// 802.1x properties
void SetEAPMethod(EAPMethod method);
void SetEAPPhase2Auth(EAPPhase2Auth auth);
void SetEAPServerCACert(const std::string& cert_path);
void SetEAPClientCert(const std::string& cert_path);
void SetEAPUseSystemCAs(bool use_system_cas);
void SetEAPIdentity(const std::string& identity);
void SetEAPAnonymousIdentity(const std::string& identity);
void SetEAPPassphrase(const std::string& passphrase);
// Return a string representation of the encryption code.
// This not translated and should be only used for debugging purposes.
std::string GetEncryptionString();
// Return true if a passphrase or other input is required to connect.
bool IsPassphraseRequired() const;
// Return true if cert_path_ indicates that we have loaded the certificate.
bool IsCertificateLoaded() const;
protected:
// WirelessNetwork overrides.
virtual bool ParseValue(int index, const Value* value);
private:
void set_encryption(ConnectionSecurity encryption) {
encryption_ = encryption;
}
void set_passphrase(const std::string& passphrase) {
passphrase_ = passphrase;
}
void set_passphrase_required(bool passphrase_required) {
passphrase_required_ = passphrase_required;
}
void set_identity(const std::string& identity) {
identity_ = identity;
}
void set_cert_path(const std::string& cert_path) {
cert_path_ = cert_path;
}
ConnectionSecurity encryption_;
std::string passphrase_;
bool passphrase_required_;
std::string identity_;
std::string cert_path_;
EAPMethod eap_method_;
EAPPhase2Auth eap_phase_2_auth_;
std::string eap_server_ca_cert_path_;
std::string eap_client_cert_path_;
bool eap_use_system_cas_;
std::string eap_identity_;
std::string eap_anonymous_identity_;
std::string eap_passphrase_;
// Internal state (not stored in flimflam).
// Passphrase set by user (stored for UI).
std::string user_passphrase_;
friend class NetworkLibraryImpl;
};
typedef std::vector<WifiNetwork*> WifiNetworkVector;
// Cellular Data Plan management.
class CellularDataPlan {
public:
CellularDataPlan()
: plan_name("Unknown"),
plan_type(CELLULAR_DATA_PLAN_UNLIMITED),
plan_data_bytes(0),
data_bytes_used(0) { }
explicit CellularDataPlan(const CellularDataPlanInfo &plan)
: plan_name(plan.plan_name ? plan.plan_name : ""),
plan_type(plan.plan_type),
update_time(base::Time::FromInternalValue(plan.update_time)),
plan_start_time(base::Time::FromInternalValue(plan.plan_start_time)),
plan_end_time(base::Time::FromInternalValue(plan.plan_end_time)),
plan_data_bytes(plan.plan_data_bytes),
data_bytes_used(plan.data_bytes_used) { }
// Formats cellular plan description.
string16 GetPlanDesciption() const;
// Evaluates cellular plans status and returns warning string if it is near
// expiration.
string16 GetRemainingWarning() const;
// Formats remaining plan data description.
string16 GetDataRemainingDesciption() const;
// Formats plan expiration description.
string16 GetPlanExpiration() const;
// Formats plan usage info.
string16 GetUsageInfo() const;
// Returns a unique string for this plan that can be used for comparisons.
std::string GetUniqueIdentifier() const;
base::TimeDelta remaining_time() const;
int64 remaining_minutes() const;
// Returns plan data remaining in bytes.
int64 remaining_data() const;
// TODO(stevenjb): Make these private with accessors and properly named.
std::string plan_name;
CellularDataPlanType plan_type;
base::Time update_time;
base::Time plan_start_time;
base::Time plan_end_time;
int64 plan_data_bytes;
int64 data_bytes_used;
};
typedef ScopedVector<CellularDataPlan> CellularDataPlanVector;
// Geolocation data.
struct CellTower {
enum RadioType {
RADIOTYPE_GSM,
RADIOTYPE_CDMA,
RADIOTYPE_WCDMA,
} radio_type; // GSM/WCDMA CDMA
int mobile_country_code; // MCC MCC
int mobile_network_code; // MNC SID
int location_area_code; // LAC NID
int cell_id; // CID BID
base::Time timestamp; // Timestamp when this cell was primary
int signal_strength; // Radio signal strength measured in dBm.
int timing_advance; // Represents the distance from the cell tower.
// Each unit is roughly 550 meters.
};
struct WifiAccessPoint {
std::string mac_address; // The mac address of the WiFi node.
std::string name; // The SSID of the WiFi node.
base::Time timestamp; // Timestamp when this AP was detected.
int signal_strength; // Radio signal strength measured in dBm.
int signal_to_noise; // Current signal to noise ratio measured in dB.
int channel; // Wifi channel number.
};
typedef std::vector<CellTower> CellTowerVector;
typedef std::vector<WifiAccessPoint> WifiAccessPointVector;
// IP Configuration.
struct NetworkIPConfig {
NetworkIPConfig(const std::string& device_path, IPConfigType type,
const std::string& address, const std::string& netmask,
const std::string& gateway, const std::string& name_servers)
: device_path(device_path),
type(type),
address(address),
netmask(netmask),
gateway(gateway),
name_servers(name_servers) {}
// NetworkIPConfigs are sorted by tyoe.
bool operator< (const NetworkIPConfig& other) const {
return type < other.type;
}
std::string device_path;
IPConfigType type;
std::string address; // This looks like "/device/0011aa22bb33"
std::string netmask;
std::string gateway;
std::string name_servers;
};
typedef std::vector<NetworkIPConfig> NetworkIPConfigVector;
// This class handles the interaction with the ChromeOS network library APIs.
// Classes can add themselves as observers. Users can get an instance of the
// library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary()
class NetworkLibrary {
public:
class NetworkManagerObserver {
public:
// Called when the state of the network manager has changed,
// for example, networks have appeared or disappeared.
virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0;
};
class NetworkObserver {
public:
// Called when the state of a single network has changed,
// for example signal strength or connection state.
virtual void OnNetworkChanged(NetworkLibrary* cros,
const Network* network) = 0;
};
class CellularDataPlanObserver {
public:
// Called when the cellular data plan has changed.
virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0;
};
class UserActionObserver {
public:
// Called when user initiates a new connection.
// Network is NULL when we don't have an associated Network object.
virtual void OnConnectionInitiated(NetworkLibrary* cros,
const Network* network) = 0;
};
virtual ~NetworkLibrary() {}
virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0;
virtual void RemoveNetworkManagerObserver(
NetworkManagerObserver* observer) = 0;
// An attempt to add an observer that has already been added for a
// give service path will be ignored.
virtual void AddNetworkObserver(const std::string& service_path,
NetworkObserver* observer) = 0;
// Remove an observer of a single network
virtual void RemoveNetworkObserver(const std::string& service_path,
NetworkObserver* observer) = 0;
// Stop |observer| from observing any networks
virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0;
// Temporarily locks down certain functionality in network library to prevent
// unplanned side effects. During the lock down, Enable*Device() calls cannot
// be made.
virtual void Lock() = 0;
// Removes temporarily lock of network library.
virtual void Unlock() = 0;
// Checks if access to network library is locked.
virtual bool IsLocked() = 0;
virtual void AddCellularDataPlanObserver(
CellularDataPlanObserver* observer) = 0;
virtual void RemoveCellularDataPlanObserver(
CellularDataPlanObserver* observer) = 0;
virtual void AddUserActionObserver(UserActionObserver* observer) = 0;
virtual void RemoveUserActionObserver(UserActionObserver* observer) = 0;
// Return the active or default Ethernet network (or NULL if none).
virtual const EthernetNetwork* ethernet_network() const = 0;
virtual bool ethernet_connecting() const = 0;
virtual bool ethernet_connected() const = 0;
// Return the active Wifi network (or NULL if none active).
virtual const WifiNetwork* wifi_network() const = 0;
virtual bool wifi_connecting() const = 0;
virtual bool wifi_connected() const = 0;
// Return the active Cellular network (or NULL if none active).
virtual const CellularNetwork* cellular_network() const = 0;
virtual bool cellular_connecting() const = 0;
virtual bool cellular_connected() const = 0;
// Return the active virtual network (or NULL if none active).
virtual const VirtualNetwork* virtual_network() const = 0;
virtual bool virtual_network_connecting() const = 0;
virtual bool virtual_network_connected() const = 0;
// Return true if any network is currently connected.
virtual bool Connected() const = 0;
// Return true if any network is currently connecting.
virtual bool Connecting() const = 0;
// Returns the current IP address if connected. If not, returns empty string.
virtual const std::string& IPAddress() const = 0;
// Returns the current list of wifi networks.
virtual const WifiNetworkVector& wifi_networks() const = 0;
// Returns the list of remembered wifi networks.
virtual const WifiNetworkVector& remembered_wifi_networks() const = 0;
// Returns the current list of cellular networks.
virtual const CellularNetworkVector& cellular_networks() const = 0;
// Returns the current list of virtual networks.
virtual const VirtualNetworkVector& virtual_networks() const = 0;
// Return a pointer to the device, if it exists, or NULL.
virtual const NetworkDevice* FindNetworkDeviceByPath(
const std::string& path) const = 0;
// Return a pointer to the network, if it exists, or NULL.
// NOTE: Never store these results, store service paths instead.
// The pattern for doing an operation on a Network is:
// Network* network = cros->FindNetworkByPath(service_path);
// network->SetFoo();
// network->Connect();
// As long as this is done in sequence on the UI thread it will be safe;
// the network list only gets updated on the UI thread.
virtual Network* FindNetworkByPath(const std::string& path) const = 0;
virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const = 0;
virtual CellularNetwork* FindCellularNetworkByPath(
const std::string& path) const = 0;
// Retrieves the data plans associated with |path|, NULL if there are no
// associated plans.
virtual const CellularDataPlanVector* GetDataPlans(
const std::string& path) const = 0;
// This returns the significant data plan. If the user only has the
// base data plan, then return that. If there is a base and a paid data plan,
// then the significant one is the paid one. So return the paid plan.
// If there are no data plans, then this method returns NULL.
// This returns a pointer to a member of data_plans_, so if SetDataPlans()
// gets called, the result becomes invalid.
virtual const CellularDataPlan* GetSignificantDataPlan(
const std::string& path) const = 0;
// Request a scan for new wifi networks.
virtual void RequestNetworkScan() = 0;
// Reads out the results of the last wifi scan. These results are not
// pre-cached in the library, so the call may block whilst the results are
// read over IPC.
// Returns false if an error occurred in reading the results. Note that
// a true return code only indicates the result set was successfully read,
// it does not imply a scan has successfully completed yet.
virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) = 0;
// TODO(joth): Add GetCellTowers to retrieve a CellTowerVector.
// Connect to the specified wireless network.
virtual void ConnectToWifiNetwork(WifiNetwork* network) = 0;
// Same as above but searches for an existing network by name.
virtual void ConnectToWifiNetwork(const std::string& service_path) = 0;
// Connect to the specified network with security, ssid, and passphrase.
virtual void ConnectToWifiNetwork(ConnectionSecurity security,
const std::string& ssid,
const std::string& passphrase,
const std::string& identity,
const std::string& certpath,
bool auto_connect) = 0;
// Connect to the specified cellular network.
virtual void ConnectToCellularNetwork(CellularNetwork* network) = 0;
// Records information that cellular play payment had happened.
virtual void SignalCellularPlanPayment() = 0;
// Returns true if cellular plan payment had been recorded recently.
virtual bool HasRecentCellularPlanPayment() = 0;
// Disconnect from the specified wireless (either cellular or wifi) network.
virtual void DisconnectFromWirelessNetwork(
const WirelessNetwork* network) = 0;
// Forget the wifi network corresponding to service_path.
virtual void ForgetWifiNetwork(const std::string& service_path) = 0;
virtual bool ethernet_available() const = 0;
virtual bool wifi_available() const = 0;
virtual bool cellular_available() const = 0;
virtual bool ethernet_enabled() const = 0;
virtual bool wifi_enabled() const = 0;
virtual bool cellular_enabled() const = 0;
virtual bool wifi_scanning() const = 0;
virtual const Network* active_network() const = 0;
virtual bool offline_mode() const = 0;
// Enables/disables the ethernet network device.
virtual void EnableEthernetNetworkDevice(bool enable) = 0;
// Enables/disables the wifi network device.
virtual void EnableWifiNetworkDevice(bool enable) = 0;
// Enables/disables the cellular network device.
virtual void EnableCellularNetworkDevice(bool enable) = 0;
// Enables/disables offline mode.
virtual void EnableOfflineMode(bool enable) = 0;
// Fetches IP configs and hardware address for a given device_path.
// The hardware address is usually a MAC address like "0011AA22BB33".
// |hardware_address| will be an empty string, if no hardware address is
// found.
virtual NetworkIPConfigVector GetIPConfigs(
const std::string& device_path,
std::string* hardware_address) = 0;
// Fetches debug network info for display in about:network.
// The page will have a meta refresh of |refresh| seconds if |refresh| > 0.
virtual std::string GetHtmlInfo(int refresh) = 0;
// Factory function, creates a new instance and returns ownership.
// For normal usage, access the singleton via CrosLibrary::Get().
static NetworkLibrary* GetImpl(bool stub);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_