// 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 #include #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, SECURITY_PSK = 6, }; 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, }; // SIMLock states (see gobi-cromo-plugin/gobi_gsm_modem.cc) enum SIMLockState { SIM_UNKNOWN = 0, SIM_UNLOCKED = 1, SIM_LOCKED_PIN = 2, SIM_LOCKED_PUK = 3, // also when SIM is blocked, then retries = 0. }; // SIM PinRequire states. Since PinRequire current state is not exposed as a // cellular property, we initialize it's value based on the SIMLockState // initial value. // SIM_PIN_REQUIRE_UNKNOWN - SIM card is absent or SIMLockState initial value // hasn't been received yet. // SIM_PIN_REQUIRED - SIM card is locked when booted/wake from sleep and // requires user to enter PIN. // SIM_PIN_NOT_REQUIRED - SIM card is unlocked all the time and requires PIN // only on certain operations, such as ChangeRequirePin, ChangePin, EnterPin. enum SIMPinRequire { SIM_PIN_REQUIRE_UNKNOWN = 0, SIM_PIN_NOT_REQUIRED = 1, SIM_PIN_REQUIRED = 2, }; // Any PIN operation result (EnterPin, UnblockPin etc.). enum PinOperationError { PIN_ERROR_NONE = 0, PIN_ERROR_UNKNOWN = 1, PIN_ERROR_INCORRECT_CODE = 2, // Either PIN/PUK specified is incorrect. PIN_ERROR_BLOCKED = 3, // No more PIN retries left, SIM is blocked. }; // connection errors (see flimflam/include/service.h) enum ConnectionError { ERROR_NO_ERROR = 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 }; // Simple wrapper for property Cellular.FoundNetworks. struct FoundCellularNetwork { std::string status; std::string network_id; std::string short_name; std::string long_name; std::string technology; }; typedef std::vector CellularNetworkList; // 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. // TODO(dpolukhin): refactor to make base class and device specific derivatives. 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_; } SIMLockState sim_lock_state() const { return sim_lock_state_; } bool is_sim_locked() const { return sim_lock_state_ == SIM_LOCKED_PIN || sim_lock_state_ == SIM_LOCKED_PUK; } const int sim_retries_left() const { return sim_retries_left_; } SIMPinRequire sim_pin_required() const { return sim_pin_required_; } const std::string& firmware_revision() const { return firmware_revision_; } const std::string& hardware_revision() const { return hardware_revision_; } const unsigned int prl_version() const { return PRL_version_; } const std::string& home_provider() const { return home_provider_; } const std::string& home_provider_code() const { return home_provider_code_; } const std::string& home_provider_country() const { return home_provider_country_; } const std::string& home_provider_id() const { return home_provider_id_; } const std::string& home_provider_name() const { return home_provider_name_; } const std::string& selected_cellular_network() const { return selected_cellular_network_; } const CellularNetworkList& found_cellular_networks() const { return found_cellular_networks_; } bool data_roaming_allowed() const { return data_roaming_allowed_; } bool support_network_scan() const { return support_network_scan_; } 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 home_provider_; std::string home_provider_code_; std::string home_provider_country_; std::string home_provider_id_; std::string home_provider_name_; 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_; SIMLockState sim_lock_state_; int sim_retries_left_; SIMPinRequire sim_pin_required_; std::string firmware_revision_; std::string hardware_revision_; int PRL_version_; std::string selected_cellular_network_; CellularNetworkList found_cellular_networks_; bool data_roaming_allowed_; bool support_network_scan_; 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 IsConnectingState(state_); } 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_; } bool added() const { return added_; } const std::string& unique_id() const { return unique_id_; } // 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); // Sets network name. void SetName(const std::string& name); // Return a string representation of the state code. std::string GetStateString() const; // Return a string representation of the error code. std::string GetErrorString() const; static bool IsConnectingState(ConnectionState state) { return (state == STATE_ASSOCIATION || state == STATE_CONFIGURATION || state == STATE_CARRIER); } protected: Network(const std::string& service_path, ConnectionType type) : state_(STATE_UNKNOWN), error_(ERROR_NO_ERROR), connectable_(true), is_active_(false), favorite_(false), auto_connect_(false), connectivity_state_(CONN_STATE_UNKNOWN), priority_order_(0), added_(false), service_path_(service_path), type_(type) {} // Parse name/value pairs from libcros. virtual bool ParseValue(int index, const Value* value); virtual void ParseInfo(const DictionaryValue* info); // Methods to asynchronously set network service properties virtual void SetStringProperty(const char* prop, const std::string& str, std::string* dest); virtual void SetBooleanProperty(const char* prop, bool b, bool* dest); virtual void SetIntegerProperty(const char* prop, int i, int* dest); virtual void SetValueProperty(const char* prop, Value* val); 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* dest); 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_; // Unique identifier, set the first time the network is parsed. std::string unique_id_; 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; } void set_added(bool added) { added_ = added; } // Initialize the IP address field void InitIPAddress(); // Priority value, corresponds to index in list from flimflam (0 = first) int priority_order_; // Set to true if the UI requested this as a new network. bool added_; // These must not be modified after construction. std::string service_path_; ConnectionType type_; friend class NetworkLibraryImpl; friend class NetworkLibraryStubImpl; DISALLOW_COPY_AND_ASSIGN(Network); // 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) { } private: friend class NetworkLibraryImpl; DISALLOW_COPY_AND_ASSIGN(EthernetNetwork); }; // Class for networks of TYPE_VPN. class VirtualNetwork : public Network { public: enum ProviderType { PROVIDER_TYPE_L2TP_IPSEC_PSK, PROVIDER_TYPE_L2TP_IPSEC_USER_CERT, PROVIDER_TYPE_OPEN_VPN, // Add new provider types before PROVIDER_TYPE_MAX. PROVIDER_TYPE_MAX, }; explicit VirtualNetwork(const std::string& service_path) : Network(service_path, TYPE_VPN), provider_type_(PROVIDER_TYPE_L2TP_IPSEC_PSK) { } const std::string& server_hostname() const { return server_hostname_; } ProviderType provider_type() const { return provider_type_; } const std::string& ca_cert() const { return ca_cert_; } const std::string& psk_passphrase() const { return psk_passphrase_; } const std::string& user_cert() const { return user_cert_; } const std::string& user_cert_key() const { return user_cert_key_; } const std::string& username() const { return username_; } const std::string& user_passphrase() const { return user_passphrase_; } bool NeedMoreInfoToConnect() const; // Public setters. void SetCACert(const std::string& ca_cert); void SetPSKPassphrase(const std::string& psk_passphrase); void SetUserCert(const std::string& user_cert); void SetUserCertKey(const std::string& key); void SetUsername(const std::string& username); void SetUserPassphrase(const std::string& user_passphrase); std::string GetProviderTypeString() const; private: // Network overrides. virtual bool ParseValue(int index, const Value* value); virtual void ParseInfo(const DictionaryValue* info); // VirtualNetwork private methods. bool ParseProviderValue(int index, const Value* value); void set_server_hostname(const std::string& server_hostname) { server_hostname_ = server_hostname; } void set_provider_type(ProviderType provider_type) { provider_type_ = provider_type; } void set_ca_cert(const std::string& ca_cert) { ca_cert_ = ca_cert; } void set_psk_passphrase(const std::string& psk_passphrase) { psk_passphrase_ = psk_passphrase; } void set_user_cert(const std::string& user_cert) { user_cert_ = user_cert; } void set_user_cert_key(const std::string& key) { user_cert_key_ = key; } void set_username(const std::string& username) { username_ = username; } void set_user_passphrase(const std::string& user_passphrase) { user_passphrase_ = user_passphrase; } std::string server_hostname_; ProviderType provider_type_; std::string ca_cert_; std::string psk_passphrase_; std::string user_cert_; std::string user_cert_key_; std::string username_; std::string user_passphrase_; friend class NetworkLibraryImpl; DISALLOW_COPY_AND_ASSIGN(VirtualNetwork); }; typedef std::vector 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; friend class NetworkLibraryStubImpl; DISALLOW_COPY_AND_ASSIGN(WirelessNetwork); }; // 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 }; struct Apn { std::string apn; std::string network_id; std::string username; std::string password; Apn() {} Apn(const std::string& apn, const std::string& network_id, const std::string& username, const std::string& password) : apn(apn), network_id(network_id), username(username), password(password) { } void Set(const DictionaryValue& dict); }; 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& operator_country() const { return operator_country_; } 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_; } const Apn& apn() const { return apn_; } const Apn& last_good_apn() const { return last_good_apn_; } void SetApn(const Apn& apn); bool SupportsDataPlan() const; // 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 operator_country_; std::string payment_url_; std::string usage_url_; // Cached values DataLeft data_left_; // Updated when data plans are updated. Apn apn_; Apn last_good_apn_; 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; } void set_apn(const Apn& apn) { apn_ = apn; } void set_last_good_apn(const Apn& apn) { last_good_apn_ = apn; } friend class NetworkLibraryImpl; friend class NetworkLibraryStubImpl; DISALLOW_COPY_AND_ASSIGN(CellularNetwork); }; typedef std::vector 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), save_credentials_(false) { } 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_; } bool passphrase_required() const { return passphrase_required_; } 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_nss_nickname() const { return eap_server_ca_cert_nss_nickname_; } const std::string& eap_client_cert_pkcs11_id() const { return eap_client_cert_pkcs11_id_; } 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_; } bool save_credentials() const { return save_credentials_; } const std::string& GetPassphrase() const; bool SetSsid(const std::string& ssid); bool SetHexSsid(const std::string& ssid_hex); 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 SetEAPServerCaCertNssNickname(const std::string& nss_nickname); void SetEAPClientCertPkcs11Id(const std::string& pkcs11_id); void SetEAPUseSystemCAs(bool use_system_cas); void SetEAPIdentity(const std::string& identity); void SetEAPAnonymousIdentity(const std::string& identity); void SetEAPPassphrase(const std::string& passphrase); void SetSaveCredentials(bool save_credentials); // Erase cached credentials, used when "Save password" is unchecked. void EraseCredentials(); // Return a string representation of the encryption code. // This not translated and should be only used for debugging purposes. std::string GetEncryptionString() const; // 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; private: // WirelessNetwork overrides. virtual bool ParseValue(int index, const Value* value); virtual void ParseInfo(const DictionaryValue* info); void CalculateUniqueId(); 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_nss_nickname_; std::string eap_client_cert_pkcs11_id_; bool eap_use_system_cas_; std::string eap_identity_; std::string eap_anonymous_identity_; std::string eap_passphrase_; // Tells flimflam to save passphrase and EAP credentials to disk. bool save_credentials_; // Internal state (not stored in flimflam). // Passphrase set by user (stored for UI). std::string user_passphrase_; friend class NetworkLibraryImpl; DISALLOW_COPY_AND_ASSIGN(WifiNetwork); }; typedef std::vector 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 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 CellTowerVector; typedef std::vector 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 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: enum HardwareAddressFormat { FORMAT_RAW_HEX, FORMAT_COLON_SEPARATED_HEX }; 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 NetworkDeviceObserver { public: // Called when the state of a single device has changed, // for example SIMLock state for cellular. virtual void OnNetworkDeviceChanged(NetworkLibrary* cros, const NetworkDevice* device) = 0; }; class CellularDataPlanObserver { public: // Called when the cellular data plan has changed. virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0; }; class PinOperationObserver { public: // Called when pin async operation has completed. // Network is NULL when we don't have an associated Network object. virtual void OnPinOperationCompleted(NetworkLibrary* cros, PinOperationError error) = 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; // Add an observer for a single network device. virtual void AddNetworkDeviceObserver(const std::string& device_path, NetworkDeviceObserver* observer) = 0; // Remove an observer for a single network device. virtual void RemoveNetworkDeviceObserver(const std::string& device_path, NetworkDeviceObserver* 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 AddPinOperationObserver(PinOperationObserver* observer) = 0; virtual void RemovePinOperationObserver(PinOperationObserver* 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; // Returns device with TYPE_CELLULAR. Returns NULL if none exists. virtual const NetworkDevice* FindCellularDevice() const = 0; // Returns device with TYPE_ETHERNET. Returns NULL if none exists. virtual const NetworkDevice* FindEthernetDevice() const = 0; // Returns device with TYPE_WIFI. Returns NULL if none exists. virtual const NetworkDevice* FindWifiDevice() 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; virtual VirtualNetwork* FindVirtualNetworkByPath( const std::string& path) const = 0; // Returns the visible wifi network corresponding to the remembered // wifi network, or NULL if the remembered network is not visible. virtual Network* FindNetworkFromRemembered( const Network* remembered) 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; // Passes |old_pin|, |new_pin| to change SIM card PIM. virtual void ChangePin(const std::string& old_pin, const std::string& new_pin) = 0; // Passes |pin|, |require_pin| value to change SIM card RequirePin setting. virtual void ChangeRequirePin(bool require_pin, const std::string& pin) = 0; // Passes |pin| to unlock SIM card. virtual void EnterPin(const std::string& pin) = 0; // Passes |puk|, |new_pin| to unblock SIM card. virtual void UnblockPin(const std::string& puk, const std::string& new_pin) = 0; // Request a scan for available cellular networks. virtual void RequestCellularScan() = 0; // Request a register in cellular network with |network_id|. virtual void RequestCellularRegister(const std::string& network_id) = 0; // Change data roaming restriction for current cellular device. virtual void SetCellularDataRoamingAllowed(bool new_value) = 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, passphrase, identity, // and (optionally) certpath. virtual void ConnectToWifiNetwork(ConnectionSecurity security, const std::string& ssid, const std::string& passphrase, const std::string& identity, const std::string& certpath) = 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; // Connect to the specified virtual network. virtual void ConnectToVirtualNetwork(VirtualNetwork* network) = 0; // Connect to the specified virtual network with service name, // server hostname, provider_type, PSK passphrase, username and passphrase. virtual void ConnectToVirtualNetworkPSK( const std::string& service_name, const std::string& server_hostname, const std::string& psk, const std::string& username, const std::string& user_passphrase) = 0; // Disconnect from the specified network. virtual void DisconnectFromNetwork(const Network* network) = 0; // Forget the wifi network corresponding to service_path. virtual void ForgetWifiNetwork(const std::string& service_path) = 0; // Returns home carrier ID if available, otherwise empty string is returned. // Carrier ID format: (country). Ex.: "Verizon (us)". virtual std::string GetCellularHomeCarrierId() const = 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 const Network* connected_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, HardwareAddressFormat) = 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_