1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_ 6 #define CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_ 7 #pragma once 8 9 #include <string> 10 #include <vector> 11 12 #include "base/gtest_prod_util.h" 13 #include "base/memory/scoped_vector.h" 14 #include "base/memory/singleton.h" 15 #include "base/observer_list.h" 16 #include "base/string16.h" 17 #include "base/timer.h" 18 #include "third_party/cros/chromeos_network.h" 19 20 class DictionaryValue; 21 class Value; 22 23 namespace chromeos { 24 25 // Connection enums (see flimflam/include/service.h) 26 enum ConnectionType { 27 TYPE_UNKNOWN = 0, 28 TYPE_ETHERNET = 1, 29 TYPE_WIFI = 2, 30 TYPE_WIMAX = 3, 31 TYPE_BLUETOOTH = 4, 32 TYPE_CELLULAR = 5, 33 TYPE_VPN = 6, 34 }; 35 36 enum ConnectionMode { 37 MODE_UNKNOWN = 0, 38 MODE_MANAGED = 1, 39 MODE_ADHOC = 2, 40 }; 41 42 enum ConnectionSecurity { 43 SECURITY_UNKNOWN = 0, 44 SECURITY_NONE = 1, 45 SECURITY_WEP = 2, 46 SECURITY_WPA = 3, 47 SECURITY_RSN = 4, 48 SECURITY_8021X = 5, 49 SECURITY_PSK = 6, 50 }; 51 52 enum ConnectionState { 53 STATE_UNKNOWN = 0, 54 STATE_IDLE = 1, 55 STATE_CARRIER = 2, 56 STATE_ASSOCIATION = 3, 57 STATE_CONFIGURATION = 4, 58 STATE_READY = 5, 59 STATE_DISCONNECT = 6, 60 STATE_FAILURE = 7, 61 STATE_ACTIVATION_FAILURE = 8 62 }; 63 64 enum ConnectivityState { 65 CONN_STATE_UNKNOWN = 0, 66 CONN_STATE_UNRESTRICTED = 1, 67 CONN_STATE_RESTRICTED = 2, 68 CONN_STATE_NONE = 3 69 }; 70 71 // Network enums (see flimflam/include/network.h) 72 enum NetworkTechnology { 73 NETWORK_TECHNOLOGY_UNKNOWN = 0, 74 NETWORK_TECHNOLOGY_1XRTT = 1, 75 NETWORK_TECHNOLOGY_EVDO = 2, 76 NETWORK_TECHNOLOGY_GPRS = 3, 77 NETWORK_TECHNOLOGY_EDGE = 4, 78 NETWORK_TECHNOLOGY_UMTS = 5, 79 NETWORK_TECHNOLOGY_HSPA = 6, 80 NETWORK_TECHNOLOGY_HSPA_PLUS = 7, 81 NETWORK_TECHNOLOGY_LTE = 8, 82 NETWORK_TECHNOLOGY_LTE_ADVANCED = 9, 83 }; 84 85 enum ActivationState { 86 ACTIVATION_STATE_UNKNOWN = 0, 87 ACTIVATION_STATE_ACTIVATED = 1, 88 ACTIVATION_STATE_ACTIVATING = 2, 89 ACTIVATION_STATE_NOT_ACTIVATED = 3, 90 ACTIVATION_STATE_PARTIALLY_ACTIVATED = 4, 91 }; 92 93 enum NetworkRoamingState { 94 ROAMING_STATE_UNKNOWN = 0, 95 ROAMING_STATE_HOME = 1, 96 ROAMING_STATE_ROAMING = 2, 97 }; 98 99 // SIMLock states (see gobi-cromo-plugin/gobi_gsm_modem.cc) 100 enum SIMLockState { 101 SIM_UNKNOWN = 0, 102 SIM_UNLOCKED = 1, 103 SIM_LOCKED_PIN = 2, 104 SIM_LOCKED_PUK = 3, // also when SIM is blocked, then retries = 0. 105 }; 106 107 // SIM PinRequire states. Since PinRequire current state is not exposed as a 108 // cellular property, we initialize it's value based on the SIMLockState 109 // initial value. 110 // SIM_PIN_REQUIRE_UNKNOWN - SIM card is absent or SIMLockState initial value 111 // hasn't been received yet. 112 // SIM_PIN_REQUIRED - SIM card is locked when booted/wake from sleep and 113 // requires user to enter PIN. 114 // SIM_PIN_NOT_REQUIRED - SIM card is unlocked all the time and requires PIN 115 // only on certain operations, such as ChangeRequirePin, ChangePin, EnterPin. 116 enum SIMPinRequire { 117 SIM_PIN_REQUIRE_UNKNOWN = 0, 118 SIM_PIN_NOT_REQUIRED = 1, 119 SIM_PIN_REQUIRED = 2, 120 }; 121 122 // Any PIN operation result (EnterPin, UnblockPin etc.). 123 enum PinOperationError { 124 PIN_ERROR_NONE = 0, 125 PIN_ERROR_UNKNOWN = 1, 126 PIN_ERROR_INCORRECT_CODE = 2, // Either PIN/PUK specified is incorrect. 127 PIN_ERROR_BLOCKED = 3, // No more PIN retries left, SIM is blocked. 128 }; 129 130 // connection errors (see flimflam/include/service.h) 131 enum ConnectionError { 132 ERROR_NO_ERROR = 0, 133 ERROR_OUT_OF_RANGE = 1, 134 ERROR_PIN_MISSING = 2, 135 ERROR_DHCP_FAILED = 3, 136 ERROR_CONNECT_FAILED = 4, 137 ERROR_BAD_PASSPHRASE = 5, 138 ERROR_BAD_WEPKEY = 6, 139 ERROR_ACTIVATION_FAILED = 7, 140 ERROR_NEED_EVDO = 8, 141 ERROR_NEED_HOME_NETWORK = 9, 142 ERROR_OTASP_FAILED = 10, 143 ERROR_AAA_FAILED = 11, 144 }; 145 146 // We are currently only supporting setting a single EAP Method. 147 enum EAPMethod { 148 EAP_METHOD_UNKNOWN = 0, 149 EAP_METHOD_PEAP = 1, 150 EAP_METHOD_TLS = 2, 151 EAP_METHOD_TTLS = 3, 152 EAP_METHOD_LEAP = 4 153 }; 154 155 // We are currently only supporting setting a single EAP phase 2 authentication. 156 enum EAPPhase2Auth { 157 EAP_PHASE_2_AUTH_AUTO = 0, 158 EAP_PHASE_2_AUTH_MD5 = 1, 159 EAP_PHASE_2_AUTH_MSCHAPV2 = 2, 160 EAP_PHASE_2_AUTH_MSCHAP = 3, 161 EAP_PHASE_2_AUTH_PAP = 4, 162 EAP_PHASE_2_AUTH_CHAP = 5 163 }; 164 165 // Simple wrapper for property Cellular.FoundNetworks. 166 struct FoundCellularNetwork { 167 std::string status; 168 std::string network_id; 169 std::string short_name; 170 std::string long_name; 171 std::string technology; 172 }; 173 174 typedef std::vector<FoundCellularNetwork> CellularNetworkList; 175 176 // Cellular network is considered low data when less than 60 minues. 177 static const int kCellularDataLowSecs = 60 * 60; 178 179 // Cellular network is considered low data when less than 30 minues. 180 static const int kCellularDataVeryLowSecs = 30 * 60; 181 182 // Cellular network is considered low data when less than 100MB. 183 static const int kCellularDataLowBytes = 100 * 1024 * 1024; 184 185 // Cellular network is considered very low data when less than 50MB. 186 static const int kCellularDataVeryLowBytes = 50 * 1024 * 1024; 187 188 // Contains data related to the flimflam.Device interface, 189 // e.g. ethernet, wifi, cellular. 190 // TODO(dpolukhin): refactor to make base class and device specific derivatives. 191 class NetworkDevice { 192 public: 193 explicit NetworkDevice(const std::string& device_path); 194 195 // Device info. device_path()196 const std::string& device_path() const { return device_path_; } name()197 const std::string& name() const { return name_; } type()198 ConnectionType type() const { return type_; } scanning()199 bool scanning() const { return scanning_; } meid()200 const std::string& meid() const { return MEID_; } imei()201 const std::string& imei() const { return IMEI_; } imsi()202 const std::string& imsi() const { return IMSI_; } esn()203 const std::string& esn() const { return ESN_; } mdn()204 const std::string& mdn() const { return MDN_; } min()205 const std::string& min() const { return MIN_; } model_id()206 const std::string& model_id() const { return model_id_; } manufacturer()207 const std::string& manufacturer() const { return manufacturer_; } sim_lock_state()208 SIMLockState sim_lock_state() const { return sim_lock_state_; } is_sim_locked()209 bool is_sim_locked() const { 210 return sim_lock_state_ == SIM_LOCKED_PIN || 211 sim_lock_state_ == SIM_LOCKED_PUK; 212 } sim_retries_left()213 const int sim_retries_left() const { return sim_retries_left_; } sim_pin_required()214 SIMPinRequire sim_pin_required() const { return sim_pin_required_; } firmware_revision()215 const std::string& firmware_revision() const { return firmware_revision_; } hardware_revision()216 const std::string& hardware_revision() const { return hardware_revision_; } prl_version()217 const unsigned int prl_version() const { return PRL_version_; } home_provider()218 const std::string& home_provider() const { return home_provider_; } home_provider_code()219 const std::string& home_provider_code() const { return home_provider_code_; } home_provider_country()220 const std::string& home_provider_country() const { 221 return home_provider_country_; 222 } home_provider_id()223 const std::string& home_provider_id() const { return home_provider_id_; } home_provider_name()224 const std::string& home_provider_name() const { return home_provider_name_; } selected_cellular_network()225 const std::string& selected_cellular_network() const { 226 return selected_cellular_network_; 227 } found_cellular_networks()228 const CellularNetworkList& found_cellular_networks() const { 229 return found_cellular_networks_; 230 } data_roaming_allowed()231 bool data_roaming_allowed() const { return data_roaming_allowed_; } support_network_scan()232 bool support_network_scan() const { return support_network_scan_; } 233 234 private: 235 bool ParseValue(int index, const Value* value); 236 void ParseInfo(const DictionaryValue* info); 237 238 // General device info. 239 std::string device_path_; 240 std::string name_; 241 ConnectionType type_; 242 bool scanning_; 243 // Cellular specific device info. 244 std::string carrier_; 245 std::string home_provider_; 246 std::string home_provider_code_; 247 std::string home_provider_country_; 248 std::string home_provider_id_; 249 std::string home_provider_name_; 250 std::string MEID_; 251 std::string IMEI_; 252 std::string IMSI_; 253 std::string ESN_; 254 std::string MDN_; 255 std::string MIN_; 256 std::string model_id_; 257 std::string manufacturer_; 258 SIMLockState sim_lock_state_; 259 int sim_retries_left_; 260 SIMPinRequire sim_pin_required_; 261 std::string firmware_revision_; 262 std::string hardware_revision_; 263 int PRL_version_; 264 std::string selected_cellular_network_; 265 CellularNetworkList found_cellular_networks_; 266 bool data_roaming_allowed_; 267 bool support_network_scan_; 268 269 friend class NetworkLibraryImpl; 270 DISALLOW_COPY_AND_ASSIGN(NetworkDevice); 271 }; 272 273 // Contains data common to all network service types. 274 class Network { 275 public: ~Network()276 virtual ~Network() {} 277 service_path()278 const std::string& service_path() const { return service_path_; } name()279 const std::string& name() const { return name_; } device_path()280 const std::string& device_path() const { return device_path_; } ip_address()281 const std::string& ip_address() const { return ip_address_; } type()282 ConnectionType type() const { return type_; } mode()283 ConnectionMode mode() const { return mode_; } connection_state()284 ConnectionState connection_state() const { return state_; } connecting()285 bool connecting() const { return IsConnectingState(state_); } configuring()286 bool configuring() const { return state_ == STATE_CONFIGURATION; } connected()287 bool connected() const { return state_ == STATE_READY; } connecting_or_connected()288 bool connecting_or_connected() const { return connecting() || connected(); } failed()289 bool failed() const { return state_ == STATE_FAILURE; } failed_or_disconnected()290 bool failed_or_disconnected() const { 291 return failed() || state_ == STATE_IDLE; 292 } error()293 ConnectionError error() const { return error_; } state()294 ConnectionState state() const { return state_; } 295 // Is this network connectable. Currently, this is mainly used by 802.1x 296 // networks to specify that the network is not configured yet. connectable()297 bool connectable() const { return connectable_; } 298 // Is this the active network, i.e, the one through which 299 // network traffic is being routed? A network can be connected, 300 // but not be carrying traffic. is_active()301 bool is_active() const { return is_active_; } favorite()302 bool favorite() const { return favorite_; } auto_connect()303 bool auto_connect() const { return auto_connect_; } connectivity_state()304 ConnectivityState connectivity_state() const { return connectivity_state_; } added()305 bool added() const { return added_; } 306 unique_id()307 const std::string& unique_id() const { return unique_id_; } 308 309 // We don't have a setter for |favorite_| because to unfavorite a network is 310 // equivalent to forget a network, so we call forget network on cros for 311 // that. See ForgetWifiNetwork(). 312 void SetAutoConnect(bool auto_connect); 313 314 // Sets network name. 315 void SetName(const std::string& name); 316 317 // Return a string representation of the state code. 318 std::string GetStateString() const; 319 320 // Return a string representation of the error code. 321 std::string GetErrorString() const; 322 IsConnectingState(ConnectionState state)323 static bool IsConnectingState(ConnectionState state) { 324 return (state == STATE_ASSOCIATION || 325 state == STATE_CONFIGURATION || 326 state == STATE_CARRIER); 327 } 328 329 protected: Network(const std::string & service_path,ConnectionType type)330 Network(const std::string& service_path, ConnectionType type) 331 : state_(STATE_UNKNOWN), 332 error_(ERROR_NO_ERROR), 333 connectable_(true), 334 is_active_(false), 335 favorite_(false), 336 auto_connect_(false), 337 connectivity_state_(CONN_STATE_UNKNOWN), 338 priority_order_(0), 339 added_(false), 340 service_path_(service_path), 341 type_(type) {} 342 343 // Parse name/value pairs from libcros. 344 virtual bool ParseValue(int index, const Value* value); 345 virtual void ParseInfo(const DictionaryValue* info); 346 347 // Methods to asynchronously set network service properties 348 virtual void SetStringProperty(const char* prop, const std::string& str, 349 std::string* dest); 350 virtual void SetBooleanProperty(const char* prop, bool b, bool* dest); 351 virtual void SetIntegerProperty(const char* prop, int i, int* dest); 352 virtual void SetValueProperty(const char* prop, Value* val); 353 virtual void ClearProperty(const char* prop); 354 355 // This will clear the property if string is empty. Otherwise, it will set it. 356 virtual void SetOrClearStringProperty(const char* prop, 357 const std::string& str, 358 std::string* dest); 359 360 std::string device_path_; 361 std::string name_; 362 std::string ip_address_; 363 ConnectionMode mode_; 364 ConnectionState state_; 365 ConnectionError error_; 366 bool connectable_; 367 bool is_active_; 368 bool favorite_; 369 bool auto_connect_; 370 ConnectivityState connectivity_state_; 371 372 // Unique identifier, set the first time the network is parsed. 373 std::string unique_id_; 374 375 private: set_name(const std::string & name)376 void set_name(const std::string& name) { name_ = name; } set_connecting(bool connecting)377 void set_connecting(bool connecting) { 378 state_ = (connecting ? STATE_ASSOCIATION : STATE_IDLE); 379 } set_connected(bool connected)380 void set_connected(bool connected) { 381 state_ = (connected ? STATE_READY : STATE_IDLE); 382 } set_state(ConnectionState state)383 void set_state(ConnectionState state) { state_ = state; } set_connectable(bool connectable)384 void set_connectable(bool connectable) { connectable_ = connectable; } set_active(bool is_active)385 void set_active(bool is_active) { is_active_ = is_active; } set_error(ConnectionError error)386 void set_error(ConnectionError error) { error_ = error; } set_connectivity_state(ConnectivityState connectivity_state)387 void set_connectivity_state(ConnectivityState connectivity_state) { 388 connectivity_state_ = connectivity_state; 389 } set_added(bool added)390 void set_added(bool added) { added_ = added; } 391 392 // Initialize the IP address field 393 void InitIPAddress(); 394 395 // Priority value, corresponds to index in list from flimflam (0 = first) 396 int priority_order_; 397 398 // Set to true if the UI requested this as a new network. 399 bool added_; 400 401 // These must not be modified after construction. 402 std::string service_path_; 403 ConnectionType type_; 404 405 friend class NetworkLibraryImpl; 406 friend class NetworkLibraryStubImpl; 407 DISALLOW_COPY_AND_ASSIGN(Network); 408 // ChangeAutoConnectSaveTest accesses |favorite_|. 409 FRIEND_TEST_ALL_PREFIXES(WifiConfigViewTest, ChangeAutoConnectSaveTest); 410 }; 411 412 // Class for networks of TYPE_ETHERNET. 413 class EthernetNetwork : public Network { 414 public: EthernetNetwork(const std::string & service_path)415 explicit EthernetNetwork(const std::string& service_path) : 416 Network(service_path, TYPE_ETHERNET) { 417 } 418 private: 419 friend class NetworkLibraryImpl; 420 DISALLOW_COPY_AND_ASSIGN(EthernetNetwork); 421 }; 422 423 // Class for networks of TYPE_VPN. 424 class VirtualNetwork : public Network { 425 public: 426 enum ProviderType { 427 PROVIDER_TYPE_L2TP_IPSEC_PSK, 428 PROVIDER_TYPE_L2TP_IPSEC_USER_CERT, 429 PROVIDER_TYPE_OPEN_VPN, 430 // Add new provider types before PROVIDER_TYPE_MAX. 431 PROVIDER_TYPE_MAX, 432 }; 433 VirtualNetwork(const std::string & service_path)434 explicit VirtualNetwork(const std::string& service_path) : 435 Network(service_path, TYPE_VPN), 436 provider_type_(PROVIDER_TYPE_L2TP_IPSEC_PSK) { 437 } 438 server_hostname()439 const std::string& server_hostname() const { return server_hostname_; } provider_type()440 ProviderType provider_type() const { return provider_type_; } ca_cert()441 const std::string& ca_cert() const { return ca_cert_; } psk_passphrase()442 const std::string& psk_passphrase() const { return psk_passphrase_; } user_cert()443 const std::string& user_cert() const { return user_cert_; } user_cert_key()444 const std::string& user_cert_key() const { return user_cert_key_; } username()445 const std::string& username() const { return username_; } user_passphrase()446 const std::string& user_passphrase() const { return user_passphrase_; } 447 448 bool NeedMoreInfoToConnect() const; 449 450 // Public setters. 451 void SetCACert(const std::string& ca_cert); 452 void SetPSKPassphrase(const std::string& psk_passphrase); 453 void SetUserCert(const std::string& user_cert); 454 void SetUserCertKey(const std::string& key); 455 void SetUsername(const std::string& username); 456 void SetUserPassphrase(const std::string& user_passphrase); 457 458 std::string GetProviderTypeString() const; 459 460 private: 461 // Network overrides. 462 virtual bool ParseValue(int index, const Value* value); 463 virtual void ParseInfo(const DictionaryValue* info); 464 465 // VirtualNetwork private methods. 466 bool ParseProviderValue(int index, const Value* value); 467 set_server_hostname(const std::string & server_hostname)468 void set_server_hostname(const std::string& server_hostname) { 469 server_hostname_ = server_hostname; 470 } set_provider_type(ProviderType provider_type)471 void set_provider_type(ProviderType provider_type) { 472 provider_type_ = provider_type; 473 } set_ca_cert(const std::string & ca_cert)474 void set_ca_cert(const std::string& ca_cert) { 475 ca_cert_ = ca_cert; 476 } set_psk_passphrase(const std::string & psk_passphrase)477 void set_psk_passphrase(const std::string& psk_passphrase) { 478 psk_passphrase_ = psk_passphrase; 479 } set_user_cert(const std::string & user_cert)480 void set_user_cert(const std::string& user_cert) { 481 user_cert_ = user_cert; 482 } set_user_cert_key(const std::string & key)483 void set_user_cert_key(const std::string& key) { 484 user_cert_key_ = key; 485 } set_username(const std::string & username)486 void set_username(const std::string& username) { 487 username_ = username; 488 } set_user_passphrase(const std::string & user_passphrase)489 void set_user_passphrase(const std::string& user_passphrase) { 490 user_passphrase_ = user_passphrase; 491 } 492 493 std::string server_hostname_; 494 ProviderType provider_type_; 495 std::string ca_cert_; 496 std::string psk_passphrase_; 497 std::string user_cert_; 498 std::string user_cert_key_; 499 std::string username_; 500 std::string user_passphrase_; 501 502 friend class NetworkLibraryImpl; 503 DISALLOW_COPY_AND_ASSIGN(VirtualNetwork); 504 }; 505 typedef std::vector<VirtualNetwork*> VirtualNetworkVector; 506 507 // Base class for networks of TYPE_WIFI or TYPE_CELLULAR. 508 class WirelessNetwork : public Network { 509 public: strength()510 int strength() const { return strength_; } 511 512 protected: WirelessNetwork(const std::string & service_path,ConnectionType type)513 WirelessNetwork(const std::string& service_path, ConnectionType type) 514 : Network(service_path, type), 515 strength_(0) {} 516 int strength_; 517 518 // Network overrides. 519 virtual bool ParseValue(int index, const Value* value); 520 521 private: set_strength(int strength)522 void set_strength(int strength) { strength_ = strength; } 523 524 friend class NetworkLibraryImpl; 525 friend class NetworkLibraryStubImpl; 526 DISALLOW_COPY_AND_ASSIGN(WirelessNetwork); 527 }; 528 529 // Class for networks of TYPE_CELLULAR. 530 class CellularDataPlan; 531 532 class CellularNetwork : public WirelessNetwork { 533 public: 534 enum DataLeft { 535 DATA_UNKNOWN, 536 DATA_NORMAL, 537 DATA_LOW, 538 DATA_VERY_LOW, 539 DATA_NONE 540 }; 541 542 struct Apn { 543 std::string apn; 544 std::string network_id; 545 std::string username; 546 std::string password; 547 ApnApn548 Apn() {} ApnApn549 Apn(const std::string& apn, const std::string& network_id, 550 const std::string& username, const std::string& password) 551 : apn(apn), network_id(network_id), 552 username(username), password(password) { 553 } 554 void Set(const DictionaryValue& dict); 555 }; 556 557 virtual ~CellularNetwork(); 558 CellularNetwork(const std::string & service_path)559 explicit CellularNetwork(const std::string& service_path) 560 : WirelessNetwork(service_path, TYPE_CELLULAR), 561 activation_state_(ACTIVATION_STATE_UNKNOWN), 562 network_technology_(NETWORK_TECHNOLOGY_UNKNOWN), 563 roaming_state_(ROAMING_STATE_UNKNOWN), 564 data_left_(DATA_UNKNOWN) { 565 } 566 // Starts device activation process. Returns false if the device state does 567 // not permit activation. 568 bool StartActivation() const; 569 // Requests data plans if the network is conencted and activated. 570 // Plan data will be passed through Network::Observer::CellularDataPlanChanged 571 // callback. 572 void RefreshDataPlansIfNeeded() const; 573 activation_state()574 const ActivationState activation_state() const { return activation_state_; } activated()575 bool activated() const { 576 return activation_state() == ACTIVATION_STATE_ACTIVATED; 577 } network_technology()578 const NetworkTechnology network_technology() const { 579 return network_technology_; 580 } roaming_state()581 const NetworkRoamingState roaming_state() const { return roaming_state_; } restricted_pool()582 bool restricted_pool() const { 583 return connectivity_state() == CONN_STATE_RESTRICTED; 584 } needs_new_plan()585 bool needs_new_plan() const { 586 return restricted_pool() && connected() && activated(); 587 } operator_name()588 const std::string& operator_name() const { return operator_name_; } operator_code()589 const std::string& operator_code() const { return operator_code_; } operator_country()590 const std::string& operator_country() const { return operator_country_; } payment_url()591 const std::string& payment_url() const { return payment_url_; } usage_url()592 const std::string& usage_url() const { return usage_url_; } data_left()593 DataLeft data_left() const { return data_left_; } apn()594 const Apn& apn() const { return apn_; } last_good_apn()595 const Apn& last_good_apn() const { return last_good_apn_; } 596 void SetApn(const Apn& apn); 597 bool SupportsDataPlan() const; 598 599 // Misc. is_gsm()600 bool is_gsm() const { 601 return network_technology_ != NETWORK_TECHNOLOGY_EVDO && 602 network_technology_ != NETWORK_TECHNOLOGY_1XRTT && 603 network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN; 604 } 605 606 // Return a string representation of network technology. 607 std::string GetNetworkTechnologyString() const; 608 // Return a string representation of connectivity state. 609 std::string GetConnectivityStateString() const; 610 // Return a string representation of activation state. 611 std::string GetActivationStateString() const; 612 // Return a string representation of roaming state. 613 std::string GetRoamingStateString() const; 614 615 // Return a string representation of |activation_state|. 616 static std::string ActivationStateToString(ActivationState activation_state); 617 618 protected: 619 // WirelessNetwork overrides. 620 virtual bool ParseValue(int index, const Value* value); 621 622 ActivationState activation_state_; 623 NetworkTechnology network_technology_; 624 NetworkRoamingState roaming_state_; 625 // Carrier Info 626 std::string operator_name_; 627 std::string operator_code_; 628 std::string operator_country_; 629 std::string payment_url_; 630 std::string usage_url_; 631 // Cached values 632 DataLeft data_left_; // Updated when data plans are updated. 633 Apn apn_; 634 Apn last_good_apn_; 635 636 private: set_activation_state(ActivationState state)637 void set_activation_state(ActivationState state) { 638 activation_state_ = state; 639 } set_payment_url(const std::string & url)640 void set_payment_url(const std::string& url) { payment_url_ = url; } set_usage_url(const std::string & url)641 void set_usage_url(const std::string& url) { usage_url_ = url; } set_network_technology(NetworkTechnology technology)642 void set_network_technology(NetworkTechnology technology) { 643 network_technology_ = technology; 644 } set_roaming_state(NetworkRoamingState state)645 void set_roaming_state(NetworkRoamingState state) { roaming_state_ = state; } set_data_left(DataLeft data_left)646 void set_data_left(DataLeft data_left) { data_left_ = data_left; } set_apn(const Apn & apn)647 void set_apn(const Apn& apn) { apn_ = apn; } set_last_good_apn(const Apn & apn)648 void set_last_good_apn(const Apn& apn) { last_good_apn_ = apn; } 649 650 friend class NetworkLibraryImpl; 651 friend class NetworkLibraryStubImpl; 652 DISALLOW_COPY_AND_ASSIGN(CellularNetwork); 653 }; 654 typedef std::vector<CellularNetwork*> CellularNetworkVector; 655 656 // Class for networks of TYPE_WIFI. 657 class WifiNetwork : public WirelessNetwork { 658 public: WifiNetwork(const std::string & service_path)659 explicit WifiNetwork(const std::string& service_path) 660 : WirelessNetwork(service_path, TYPE_WIFI), 661 encryption_(SECURITY_NONE), 662 passphrase_required_(false), 663 eap_method_(EAP_METHOD_UNKNOWN), 664 eap_phase_2_auth_(EAP_PHASE_2_AUTH_AUTO), 665 eap_use_system_cas_(true), 666 save_credentials_(false) { 667 } 668 encrypted()669 bool encrypted() const { return encryption_ != SECURITY_NONE; } encryption()670 ConnectionSecurity encryption() const { return encryption_; } passphrase()671 const std::string& passphrase() const { return passphrase_; } identity()672 const std::string& identity() const { return identity_; } cert_path()673 const std::string& cert_path() const { return cert_path_; } passphrase_required()674 bool passphrase_required() const { return passphrase_required_; } 675 eap_method()676 EAPMethod eap_method() const { return eap_method_; } eap_phase_2_auth()677 EAPPhase2Auth eap_phase_2_auth() const { return eap_phase_2_auth_; } eap_server_ca_cert_nss_nickname()678 const std::string& eap_server_ca_cert_nss_nickname() const { 679 return eap_server_ca_cert_nss_nickname_; } eap_client_cert_pkcs11_id()680 const std::string& eap_client_cert_pkcs11_id() const { 681 return eap_client_cert_pkcs11_id_; } eap_use_system_cas()682 const bool eap_use_system_cas() const { return eap_use_system_cas_; } eap_identity()683 const std::string& eap_identity() const { return eap_identity_; } eap_anonymous_identity()684 const std::string& eap_anonymous_identity() const { 685 return eap_anonymous_identity_; } eap_passphrase()686 const std::string& eap_passphrase() const { return eap_passphrase_; } save_credentials()687 bool save_credentials() const { return save_credentials_; } 688 689 const std::string& GetPassphrase() const; 690 691 bool SetSsid(const std::string& ssid); 692 bool SetHexSsid(const std::string& ssid_hex); 693 void SetPassphrase(const std::string& passphrase); 694 void SetIdentity(const std::string& identity); 695 void SetCertPath(const std::string& cert_path); 696 697 // 802.1x properties 698 void SetEAPMethod(EAPMethod method); 699 void SetEAPPhase2Auth(EAPPhase2Auth auth); 700 void SetEAPServerCaCertNssNickname(const std::string& nss_nickname); 701 void SetEAPClientCertPkcs11Id(const std::string& pkcs11_id); 702 void SetEAPUseSystemCAs(bool use_system_cas); 703 void SetEAPIdentity(const std::string& identity); 704 void SetEAPAnonymousIdentity(const std::string& identity); 705 void SetEAPPassphrase(const std::string& passphrase); 706 void SetSaveCredentials(bool save_credentials); 707 708 // Erase cached credentials, used when "Save password" is unchecked. 709 void EraseCredentials(); 710 711 // Return a string representation of the encryption code. 712 // This not translated and should be only used for debugging purposes. 713 std::string GetEncryptionString() const; 714 715 // Return true if a passphrase or other input is required to connect. 716 bool IsPassphraseRequired() const; 717 718 // Return true if cert_path_ indicates that we have loaded the certificate. 719 bool IsCertificateLoaded() const; 720 721 private: 722 // WirelessNetwork overrides. 723 virtual bool ParseValue(int index, const Value* value); 724 virtual void ParseInfo(const DictionaryValue* info); 725 726 void CalculateUniqueId(); 727 set_encryption(ConnectionSecurity encryption)728 void set_encryption(ConnectionSecurity encryption) { 729 encryption_ = encryption; 730 } set_passphrase(const std::string & passphrase)731 void set_passphrase(const std::string& passphrase) { 732 passphrase_ = passphrase; 733 } set_passphrase_required(bool passphrase_required)734 void set_passphrase_required(bool passphrase_required) { 735 passphrase_required_ = passphrase_required; 736 } set_identity(const std::string & identity)737 void set_identity(const std::string& identity) { 738 identity_ = identity; 739 } set_cert_path(const std::string & cert_path)740 void set_cert_path(const std::string& cert_path) { 741 cert_path_ = cert_path; 742 } 743 744 ConnectionSecurity encryption_; 745 std::string passphrase_; 746 bool passphrase_required_; 747 std::string identity_; 748 std::string cert_path_; 749 750 EAPMethod eap_method_; 751 EAPPhase2Auth eap_phase_2_auth_; 752 std::string eap_server_ca_cert_nss_nickname_; 753 std::string eap_client_cert_pkcs11_id_; 754 bool eap_use_system_cas_; 755 std::string eap_identity_; 756 std::string eap_anonymous_identity_; 757 std::string eap_passphrase_; 758 // Tells flimflam to save passphrase and EAP credentials to disk. 759 bool save_credentials_; 760 761 // Internal state (not stored in flimflam). 762 // Passphrase set by user (stored for UI). 763 std::string user_passphrase_; 764 765 friend class NetworkLibraryImpl; 766 DISALLOW_COPY_AND_ASSIGN(WifiNetwork); 767 }; 768 typedef std::vector<WifiNetwork*> WifiNetworkVector; 769 770 // Cellular Data Plan management. 771 class CellularDataPlan { 772 public: CellularDataPlan()773 CellularDataPlan() 774 : plan_name("Unknown"), 775 plan_type(CELLULAR_DATA_PLAN_UNLIMITED), 776 plan_data_bytes(0), 777 data_bytes_used(0) { } CellularDataPlan(const CellularDataPlanInfo & plan)778 explicit CellularDataPlan(const CellularDataPlanInfo &plan) 779 : plan_name(plan.plan_name ? plan.plan_name : ""), 780 plan_type(plan.plan_type), 781 update_time(base::Time::FromInternalValue(plan.update_time)), 782 plan_start_time(base::Time::FromInternalValue(plan.plan_start_time)), 783 plan_end_time(base::Time::FromInternalValue(plan.plan_end_time)), 784 plan_data_bytes(plan.plan_data_bytes), 785 data_bytes_used(plan.data_bytes_used) { } 786 // Formats cellular plan description. 787 string16 GetPlanDesciption() const; 788 // Evaluates cellular plans status and returns warning string if it is near 789 // expiration. 790 string16 GetRemainingWarning() const; 791 // Formats remaining plan data description. 792 string16 GetDataRemainingDesciption() const; 793 // Formats plan expiration description. 794 string16 GetPlanExpiration() const; 795 // Formats plan usage info. 796 string16 GetUsageInfo() const; 797 // Returns a unique string for this plan that can be used for comparisons. 798 std::string GetUniqueIdentifier() const; 799 base::TimeDelta remaining_time() const; 800 int64 remaining_minutes() const; 801 // Returns plan data remaining in bytes. 802 int64 remaining_data() const; 803 // TODO(stevenjb): Make these private with accessors and properly named. 804 std::string plan_name; 805 CellularDataPlanType plan_type; 806 base::Time update_time; 807 base::Time plan_start_time; 808 base::Time plan_end_time; 809 int64 plan_data_bytes; 810 int64 data_bytes_used; 811 }; 812 typedef ScopedVector<CellularDataPlan> CellularDataPlanVector; 813 814 // Geolocation data. 815 struct CellTower { 816 enum RadioType { 817 RADIOTYPE_GSM, 818 RADIOTYPE_CDMA, 819 RADIOTYPE_WCDMA, 820 } radio_type; // GSM/WCDMA CDMA 821 int mobile_country_code; // MCC MCC 822 int mobile_network_code; // MNC SID 823 int location_area_code; // LAC NID 824 int cell_id; // CID BID 825 base::Time timestamp; // Timestamp when this cell was primary 826 int signal_strength; // Radio signal strength measured in dBm. 827 int timing_advance; // Represents the distance from the cell tower. 828 // Each unit is roughly 550 meters. 829 }; 830 831 struct WifiAccessPoint { 832 std::string mac_address; // The mac address of the WiFi node. 833 std::string name; // The SSID of the WiFi node. 834 base::Time timestamp; // Timestamp when this AP was detected. 835 int signal_strength; // Radio signal strength measured in dBm. 836 int signal_to_noise; // Current signal to noise ratio measured in dB. 837 int channel; // Wifi channel number. 838 }; 839 840 typedef std::vector<CellTower> CellTowerVector; 841 typedef std::vector<WifiAccessPoint> WifiAccessPointVector; 842 843 // IP Configuration. 844 struct NetworkIPConfig { NetworkIPConfigNetworkIPConfig845 NetworkIPConfig(const std::string& device_path, IPConfigType type, 846 const std::string& address, const std::string& netmask, 847 const std::string& gateway, const std::string& name_servers) 848 : device_path(device_path), 849 type(type), 850 address(address), 851 netmask(netmask), 852 gateway(gateway), 853 name_servers(name_servers) {} 854 855 // NetworkIPConfigs are sorted by tyoe. 856 bool operator< (const NetworkIPConfig& other) const { 857 return type < other.type; 858 } 859 860 std::string device_path; 861 IPConfigType type; 862 std::string address; // This looks like "/device/0011aa22bb33" 863 std::string netmask; 864 std::string gateway; 865 std::string name_servers; 866 }; 867 typedef std::vector<NetworkIPConfig> NetworkIPConfigVector; 868 869 // This class handles the interaction with the ChromeOS network library APIs. 870 // Classes can add themselves as observers. Users can get an instance of the 871 // library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary() 872 class NetworkLibrary { 873 public: 874 enum HardwareAddressFormat { 875 FORMAT_RAW_HEX, 876 FORMAT_COLON_SEPARATED_HEX 877 }; 878 879 class NetworkManagerObserver { 880 public: 881 // Called when the state of the network manager has changed, 882 // for example, networks have appeared or disappeared. 883 virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0; 884 }; 885 886 class NetworkObserver { 887 public: 888 // Called when the state of a single network has changed, 889 // for example signal strength or connection state. 890 virtual void OnNetworkChanged(NetworkLibrary* cros, 891 const Network* network) = 0; 892 }; 893 894 class NetworkDeviceObserver { 895 public: 896 // Called when the state of a single device has changed, 897 // for example SIMLock state for cellular. 898 virtual void OnNetworkDeviceChanged(NetworkLibrary* cros, 899 const NetworkDevice* device) = 0; 900 }; 901 902 class CellularDataPlanObserver { 903 public: 904 // Called when the cellular data plan has changed. 905 virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0; 906 }; 907 908 class PinOperationObserver { 909 public: 910 // Called when pin async operation has completed. 911 // Network is NULL when we don't have an associated Network object. 912 virtual void OnPinOperationCompleted(NetworkLibrary* cros, 913 PinOperationError error) = 0; 914 }; 915 916 class UserActionObserver { 917 public: 918 // Called when user initiates a new connection. 919 // Network is NULL when we don't have an associated Network object. 920 virtual void OnConnectionInitiated(NetworkLibrary* cros, 921 const Network* network) = 0; 922 }; 923 ~NetworkLibrary()924 virtual ~NetworkLibrary() {} 925 926 virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0; 927 virtual void RemoveNetworkManagerObserver( 928 NetworkManagerObserver* observer) = 0; 929 930 // An attempt to add an observer that has already been added for a 931 // give service path will be ignored. 932 virtual void AddNetworkObserver(const std::string& service_path, 933 NetworkObserver* observer) = 0; 934 // Remove an observer of a single network 935 virtual void RemoveNetworkObserver(const std::string& service_path, 936 NetworkObserver* observer) = 0; 937 // Stop |observer| from observing any networks 938 virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0; 939 940 // Add an observer for a single network device. 941 virtual void AddNetworkDeviceObserver(const std::string& device_path, 942 NetworkDeviceObserver* observer) = 0; 943 // Remove an observer for a single network device. 944 virtual void RemoveNetworkDeviceObserver(const std::string& device_path, 945 NetworkDeviceObserver* observer) = 0; 946 947 // Temporarily locks down certain functionality in network library to prevent 948 // unplanned side effects. During the lock down, Enable*Device() calls cannot 949 // be made. 950 virtual void Lock() = 0; 951 // Removes temporarily lock of network library. 952 virtual void Unlock() = 0; 953 // Checks if access to network library is locked. 954 virtual bool IsLocked() = 0; 955 956 virtual void AddCellularDataPlanObserver( 957 CellularDataPlanObserver* observer) = 0; 958 virtual void RemoveCellularDataPlanObserver( 959 CellularDataPlanObserver* observer) = 0; 960 961 virtual void AddPinOperationObserver(PinOperationObserver* observer) = 0; 962 virtual void RemovePinOperationObserver(PinOperationObserver* observer) = 0; 963 964 virtual void AddUserActionObserver(UserActionObserver* observer) = 0; 965 virtual void RemoveUserActionObserver(UserActionObserver* observer) = 0; 966 967 // Return the active or default Ethernet network (or NULL if none). 968 virtual const EthernetNetwork* ethernet_network() const = 0; 969 virtual bool ethernet_connecting() const = 0; 970 virtual bool ethernet_connected() const = 0; 971 972 // Return the active Wifi network (or NULL if none active). 973 virtual const WifiNetwork* wifi_network() const = 0; 974 virtual bool wifi_connecting() const = 0; 975 virtual bool wifi_connected() const = 0; 976 977 // Return the active Cellular network (or NULL if none active). 978 virtual const CellularNetwork* cellular_network() const = 0; 979 virtual bool cellular_connecting() const = 0; 980 virtual bool cellular_connected() const = 0; 981 982 // Return the active virtual network (or NULL if none active). 983 virtual const VirtualNetwork* virtual_network() const = 0; 984 virtual bool virtual_network_connecting() const = 0; 985 virtual bool virtual_network_connected() const = 0; 986 987 // Return true if any network is currently connected. 988 virtual bool Connected() const = 0; 989 990 // Return true if any network is currently connecting. 991 virtual bool Connecting() const = 0; 992 993 // Returns the current IP address if connected. If not, returns empty string. 994 virtual const std::string& IPAddress() const = 0; 995 996 // Returns the current list of wifi networks. 997 virtual const WifiNetworkVector& wifi_networks() const = 0; 998 999 // Returns the list of remembered wifi networks. 1000 virtual const WifiNetworkVector& remembered_wifi_networks() const = 0; 1001 1002 // Returns the current list of cellular networks. 1003 virtual const CellularNetworkVector& cellular_networks() const = 0; 1004 1005 // Returns the current list of virtual networks. 1006 virtual const VirtualNetworkVector& virtual_networks() const = 0; 1007 1008 // Return a pointer to the device, if it exists, or NULL. 1009 virtual const NetworkDevice* FindNetworkDeviceByPath( 1010 const std::string& path) const = 0; 1011 1012 // Returns device with TYPE_CELLULAR. Returns NULL if none exists. 1013 virtual const NetworkDevice* FindCellularDevice() const = 0; 1014 1015 // Returns device with TYPE_ETHERNET. Returns NULL if none exists. 1016 virtual const NetworkDevice* FindEthernetDevice() const = 0; 1017 1018 // Returns device with TYPE_WIFI. Returns NULL if none exists. 1019 virtual const NetworkDevice* FindWifiDevice() const = 0; 1020 1021 // Return a pointer to the network, if it exists, or NULL. 1022 // NOTE: Never store these results, store service paths instead. 1023 // The pattern for doing an operation on a Network is: 1024 // Network* network = cros->FindNetworkByPath(service_path); 1025 // network->SetFoo(); 1026 // network->Connect(); 1027 // As long as this is done in sequence on the UI thread it will be safe; 1028 // the network list only gets updated on the UI thread. 1029 virtual Network* FindNetworkByPath(const std::string& path) const = 0; 1030 virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const = 0; 1031 virtual CellularNetwork* FindCellularNetworkByPath( 1032 const std::string& path) const = 0; 1033 virtual VirtualNetwork* FindVirtualNetworkByPath( 1034 const std::string& path) const = 0; 1035 1036 // Returns the visible wifi network corresponding to the remembered 1037 // wifi network, or NULL if the remembered network is not visible. 1038 virtual Network* FindNetworkFromRemembered( 1039 const Network* remembered) const = 0; 1040 1041 // Retrieves the data plans associated with |path|, NULL if there are no 1042 // associated plans. 1043 virtual const CellularDataPlanVector* GetDataPlans( 1044 const std::string& path) const = 0; 1045 1046 // This returns the significant data plan. If the user only has the 1047 // base data plan, then return that. If there is a base and a paid data plan, 1048 // then the significant one is the paid one. So return the paid plan. 1049 // If there are no data plans, then this method returns NULL. 1050 // This returns a pointer to a member of data_plans_, so if SetDataPlans() 1051 // gets called, the result becomes invalid. 1052 virtual const CellularDataPlan* GetSignificantDataPlan( 1053 const std::string& path) const = 0; 1054 1055 // Passes |old_pin|, |new_pin| to change SIM card PIM. 1056 virtual void ChangePin(const std::string& old_pin, 1057 const std::string& new_pin) = 0; 1058 1059 // Passes |pin|, |require_pin| value to change SIM card RequirePin setting. 1060 virtual void ChangeRequirePin(bool require_pin, 1061 const std::string& pin) = 0; 1062 1063 // Passes |pin| to unlock SIM card. 1064 virtual void EnterPin(const std::string& pin) = 0; 1065 1066 // Passes |puk|, |new_pin| to unblock SIM card. 1067 virtual void UnblockPin(const std::string& puk, 1068 const std::string& new_pin) = 0; 1069 1070 // Request a scan for available cellular networks. 1071 virtual void RequestCellularScan() = 0; 1072 1073 // Request a register in cellular network with |network_id|. 1074 virtual void RequestCellularRegister(const std::string& network_id) = 0; 1075 1076 // Change data roaming restriction for current cellular device. 1077 virtual void SetCellularDataRoamingAllowed(bool new_value) = 0; 1078 1079 // Request a scan for new wifi networks. 1080 virtual void RequestNetworkScan() = 0; 1081 1082 // Reads out the results of the last wifi scan. These results are not 1083 // pre-cached in the library, so the call may block whilst the results are 1084 // read over IPC. 1085 // Returns false if an error occurred in reading the results. Note that 1086 // a true return code only indicates the result set was successfully read, 1087 // it does not imply a scan has successfully completed yet. 1088 virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) = 0; 1089 1090 // TODO(joth): Add GetCellTowers to retrieve a CellTowerVector. 1091 1092 // Connect to the specified wireless network. 1093 virtual void ConnectToWifiNetwork(WifiNetwork* network) = 0; 1094 1095 // Same as above but searches for an existing network by name. 1096 virtual void ConnectToWifiNetwork(const std::string& service_path) = 0; 1097 1098 // Connect to the specified network with security, ssid, passphrase, identity, 1099 // and (optionally) certpath. 1100 virtual void ConnectToWifiNetwork(ConnectionSecurity security, 1101 const std::string& ssid, 1102 const std::string& passphrase, 1103 const std::string& identity, 1104 const std::string& certpath) = 0; 1105 1106 // Connect to the specified cellular network. 1107 virtual void ConnectToCellularNetwork(CellularNetwork* network) = 0; 1108 1109 // Records information that cellular play payment had happened. 1110 virtual void SignalCellularPlanPayment() = 0; 1111 1112 // Returns true if cellular plan payment had been recorded recently. 1113 virtual bool HasRecentCellularPlanPayment() = 0; 1114 1115 // Connect to the specified virtual network. 1116 virtual void ConnectToVirtualNetwork(VirtualNetwork* network) = 0; 1117 1118 // Connect to the specified virtual network with service name, 1119 // server hostname, provider_type, PSK passphrase, username and passphrase. 1120 virtual void ConnectToVirtualNetworkPSK( 1121 const std::string& service_name, 1122 const std::string& server_hostname, 1123 const std::string& psk, 1124 const std::string& username, 1125 const std::string& user_passphrase) = 0; 1126 1127 // Disconnect from the specified network. 1128 virtual void DisconnectFromNetwork(const Network* network) = 0; 1129 1130 // Forget the wifi network corresponding to service_path. 1131 virtual void ForgetWifiNetwork(const std::string& service_path) = 0; 1132 1133 // Returns home carrier ID if available, otherwise empty string is returned. 1134 // Carrier ID format: <carrier name> (country). Ex.: "Verizon (us)". 1135 virtual std::string GetCellularHomeCarrierId() const = 0; 1136 1137 virtual bool ethernet_available() const = 0; 1138 virtual bool wifi_available() const = 0; 1139 virtual bool cellular_available() const = 0; 1140 1141 virtual bool ethernet_enabled() const = 0; 1142 virtual bool wifi_enabled() const = 0; 1143 virtual bool cellular_enabled() const = 0; 1144 1145 virtual bool wifi_scanning() const = 0; 1146 1147 virtual const Network* active_network() const = 0; 1148 virtual const Network* connected_network() const = 0; 1149 1150 virtual bool offline_mode() const = 0; 1151 1152 // Enables/disables the ethernet network device. 1153 virtual void EnableEthernetNetworkDevice(bool enable) = 0; 1154 1155 // Enables/disables the wifi network device. 1156 virtual void EnableWifiNetworkDevice(bool enable) = 0; 1157 1158 // Enables/disables the cellular network device. 1159 virtual void EnableCellularNetworkDevice(bool enable) = 0; 1160 1161 // Enables/disables offline mode. 1162 virtual void EnableOfflineMode(bool enable) = 0; 1163 1164 // Fetches IP configs and hardware address for a given device_path. 1165 // The hardware address is usually a MAC address like "0011AA22BB33". 1166 // |hardware_address| will be an empty string, if no hardware address is 1167 // found. 1168 virtual NetworkIPConfigVector GetIPConfigs( 1169 const std::string& device_path, 1170 std::string* hardware_address, 1171 HardwareAddressFormat) = 0; 1172 1173 // Factory function, creates a new instance and returns ownership. 1174 // For normal usage, access the singleton via CrosLibrary::Get(). 1175 static NetworkLibrary* GetImpl(bool stub); 1176 }; 1177 1178 } // namespace chromeos 1179 1180 #endif // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_ 1181