Index: chrome/browser/chromeos/cros/network_library.cc |
=================================================================== |
--- chrome/browser/chromeos/cros/network_library.cc (revision 64886) |
+++ chrome/browser/chromeos/cros/network_library.cc (working copy) |
@@ -12,12 +12,130 @@ |
#include "base/string_number_conversions.h" |
#include "base/string_util.h" |
#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
#include "chrome/browser/browser_thread.h" |
#include "chrome/browser/chromeos/cros/cros_library.h" |
#include "grit/generated_resources.h" |
namespace chromeos { |
+namespace { |
+// TODO(ers) These string constants and Parse functions are copied |
+// straight out of libcros:chromeos_network.cc. Fix this by moving |
+// all handling of properties into libcros. |
+// Network service properties we are interested in monitoring |
+static const char* kIsActiveProperty = "IsActive"; |
+static const char* kStateProperty = "State"; |
+static const char* kSignalStrengthProperty = "Strength"; |
+static const char* kActivationStateProperty = "Cellular.ActivationState"; |
+static const char* kNetworkTechnologyProperty = "Cellular.NetworkTechnology"; |
+static const char* kPaymentURLProperty = "Cellular.OlpUrl"; |
+static const char* kRestrictedPoolProperty = "Cellular.RestrictedPool"; |
+static const char* kRoamingStateProperty = "Cellular.RoamingState"; |
+ |
+// Connman state options. |
+static const char* kStateIdle = "idle"; |
+static const char* kStateCarrier = "carrier"; |
+static const char* kStateAssociation = "association"; |
+static const char* kStateConfiguration = "configuration"; |
+static const char* kStateReady = "ready"; |
+static const char* kStateDisconnect = "disconnect"; |
+static const char* kStateFailure = "failure"; |
+static const char* kStateActivationFailure = "activation-failure"; |
+ |
+// Connman activation state options |
+static const char* kActivationStateActivated = "activated"; |
+static const char* kActivationStateActivating = "activating"; |
+static const char* kActivationStateNotActivated = "not-activated"; |
+static const char* kActivationStatePartiallyActivated = "partially-activated"; |
+static const char* kActivationStateUnknown = "unknown"; |
+ |
+// Connman network technology options. |
+static const char* kNetworkTechnology1Xrtt = "1xRTT"; |
+static const char* kNetworkTechnologyEvdo = "EVDO"; |
+static const char* kNetworkTechnologyGprs = "GPRS"; |
+static const char* kNetworkTechnologyEdge = "EDGE"; |
+static const char* kNetworkTechnologyUmts = "UMTS"; |
+static const char* kNetworkTechnologyHspa = "HSPA"; |
+static const char* kNetworkTechnologyHspaPlus = "HSPA+"; |
+static const char* kNetworkTechnologyLte = "LTE"; |
+static const char* kNetworkTechnologyLteAdvanced = "LTE Advanced"; |
+ |
+// Connman roaming state options |
+static const char* kRoamingStateHome = "home"; |
+static const char* kRoamingStateRoaming = "roaming"; |
+static const char* kRoamingStateUnknown = "unknown"; |
+ |
+static ConnectionState ParseState(const std::string& state) { |
+ if (state == kStateIdle) |
+ return STATE_IDLE; |
+ if (state == kStateCarrier) |
+ return STATE_CARRIER; |
+ if (state == kStateAssociation) |
+ return STATE_ASSOCIATION; |
+ if (state == kStateConfiguration) |
+ return STATE_CONFIGURATION; |
+ if (state == kStateReady) |
+ return STATE_READY; |
+ if (state == kStateDisconnect) |
+ return STATE_DISCONNECT; |
+ if (state == kStateFailure) |
+ return STATE_FAILURE; |
+ if (state == kStateActivationFailure) |
+ return STATE_ACTIVATION_FAILURE; |
+ return STATE_UNKNOWN; |
+} |
+ |
+static ActivationState ParseActivationState( |
+ const std::string& activation_state) { |
+ if (activation_state == kActivationStateActivated) |
+ return ACTIVATION_STATE_ACTIVATED; |
+ if (activation_state == kActivationStateActivating) |
+ return ACTIVATION_STATE_ACTIVATING; |
+ if (activation_state == kActivationStateNotActivated) |
+ return ACTIVATION_STATE_NOT_ACTIVATED; |
+ if (activation_state == kActivationStateUnknown) |
+ return ACTIVATION_STATE_UNKNOWN; |
+ if (activation_state == kActivationStatePartiallyActivated) |
+ return ACTIVATION_STATE_PARTIALLY_ACTIVATED; |
+ return ACTIVATION_STATE_UNKNOWN; |
+} |
+ |
+static NetworkTechnology ParseNetworkTechnology( |
+ const std::string& technology) { |
+ if (technology == kNetworkTechnology1Xrtt) |
+ return NETWORK_TECHNOLOGY_1XRTT; |
+ if (technology == kNetworkTechnologyEvdo) |
+ return NETWORK_TECHNOLOGY_EVDO; |
+ if (technology == kNetworkTechnologyGprs) |
+ return NETWORK_TECHNOLOGY_GPRS; |
+ if (technology == kNetworkTechnologyEdge) |
+ return NETWORK_TECHNOLOGY_EDGE; |
+ if (technology == kNetworkTechnologyUmts) |
+ return NETWORK_TECHNOLOGY_UMTS; |
+ if (technology == kNetworkTechnologyHspa) |
+ return NETWORK_TECHNOLOGY_HSPA; |
+ if (technology == kNetworkTechnologyHspaPlus) |
+ return NETWORK_TECHNOLOGY_HSPA_PLUS; |
+ if (technology == kNetworkTechnologyLte) |
+ return NETWORK_TECHNOLOGY_LTE; |
+ if (technology == kNetworkTechnologyLteAdvanced) |
+ return NETWORK_TECHNOLOGY_LTE_ADVANCED; |
+ return NETWORK_TECHNOLOGY_UNKNOWN; |
+} |
+static NetworkRoamingState ParseRoamingState( |
+ const std::string& roaming_state) { |
+ if (roaming_state == kRoamingStateHome) |
+ return ROAMING_STATE_HOME; |
+ if (roaming_state == kRoamingStateRoaming) |
+ return ROAMING_STATE_ROAMING; |
+ if (roaming_state == kRoamingStateUnknown) |
+ return ROAMING_STATE_UNKNOWN; |
+ return ROAMING_STATE_UNKNOWN; |
+} |
+ |
+} |
+ |
// Helper function to wrap Html with <th> tag. |
static std::string WrapWithTH(std::string text) { |
return "<th>" + text + "</th>"; |
@@ -99,6 +217,7 @@ |
service_path_.clear(); |
device_path_.clear(); |
ip_address_.clear(); |
+ is_active_ = false; |
} |
Network::Network(const ServiceInfo* service) { |
@@ -107,6 +226,7 @@ |
error_ = service->error; |
service_path_ = SafeString(service->service_path); |
device_path_ = SafeString(service->device_path); |
+ is_active_ = service->is_active; |
ip_address_.clear(); |
// If connected, get ip config. |
if (EnsureCrosLoaded() && connected() && service->device_path) { |
@@ -510,7 +630,7 @@ |
class NetworkLibraryImpl : public NetworkLibrary { |
public: |
NetworkLibraryImpl() |
- : network_status_connection_(NULL), |
+ : network_manager_monitor_(NULL), |
data_plan_monitor_(NULL), |
ethernet_(NULL), |
wifi_(NULL), |
@@ -521,68 +641,98 @@ |
offline_mode_(false) { |
if (EnsureCrosLoaded()) { |
Init(); |
+ network_manager_monitor_ = |
+ MonitorNetworkManager(&NetworkManagerStatusChangedHandler, |
+ this); |
+ data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, |
+ this); |
} else { |
InitTestData(); |
} |
} |
~NetworkLibraryImpl() { |
- if (network_status_connection_) { |
- DisconnectMonitorNetwork(network_status_connection_); |
- } |
- if (data_plan_monitor_) { |
- DisconnectDataPlanUpdateMonitor(data_plan_monitor_); |
- } |
- // DCHECK(!observers_.size()); |
- DCHECK(!property_observers_.size()); |
- STLDeleteValues(&property_observers_); |
+ DCHECK(!network_manager_observers_.size()); |
+ DCHECK(network_manager_monitor_); |
+ DisconnectPropertyChangeMonitor(network_manager_monitor_); |
+ DCHECK(!data_plan_observers_.size()); |
+ DCHECK(data_plan_monitor_); |
+ DisconnectDataPlanUpdateMonitor(data_plan_monitor_); |
+ DCHECK(!network_observers_.size()); |
+ STLDeleteValues(&network_observers_); |
ClearNetworks(); |
} |
- void AddObserver(Observer* observer) { |
- observers_.AddObserver(observer); |
+ virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) { |
+ network_manager_observers_.AddObserver(observer); |
} |
- void RemoveObserver(Observer* observer) { |
- observers_.RemoveObserver(observer); |
+ virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) { |
+ if (!network_manager_observers_.HasObserver(observer)) |
+ network_manager_observers_.RemoveObserver(observer); |
} |
- virtual void AddProperyObserver(const char* service_path, |
- PropertyObserver* observer) { |
- DCHECK(service_path); |
+ virtual void AddNetworkObserver(const std::string& service_path, |
+ NetworkObserver* observer) { |
DCHECK(observer); |
if (!EnsureCrosLoaded()) |
return; |
// First, add the observer to the callback map. |
- PropertyChangeObserverMap::iterator iter = property_observers_.find( |
- std::string(service_path)); |
- if (iter != property_observers_.end()) { |
- iter->second->AddObserver(observer); |
+ NetworkObserverMap::iterator iter = network_observers_.find(service_path); |
+ NetworkObserverList* oblist; |
+ if (iter != network_observers_.end()) { |
+ oblist = iter->second; |
} else { |
- std::pair<PropertyChangeObserverMap::iterator, bool> inserted = |
- property_observers_.insert( |
- std::pair<std::string, PropertyObserverList*>( |
- std::string(service_path), |
- new PropertyObserverList(this, service_path))); |
- inserted.first->second->AddObserver(observer); |
+ std::pair<NetworkObserverMap::iterator, bool> inserted = |
+ network_observers_.insert( |
+ std::make_pair<std::string, NetworkObserverList*>( |
+ service_path, |
+ new NetworkObserverList(this, service_path))); |
+ oblist = inserted.first->second; |
} |
+ if (!oblist->HasObserver(observer)) |
+ oblist->AddObserver(observer); |
} |
- virtual void RemoveProperyObserver(PropertyObserver* observer) { |
+ virtual void RemoveNetworkObserver(const std::string& service_path, |
+ NetworkObserver* observer) { |
DCHECK(observer); |
- PropertyChangeObserverMap::iterator map_iter = |
- property_observers_.begin(); |
- while (map_iter != property_observers_.end()) { |
+ DCHECK(service_path.size()); |
+ NetworkObserverMap::iterator map_iter = network_observers_.find( |
+ service_path); |
+ if (map_iter != network_observers_.end()) { |
map_iter->second->RemoveObserver(observer); |
if (!map_iter->second->size()) { |
delete map_iter->second; |
- property_observers_.erase(map_iter++); |
+ network_observers_.erase(map_iter++); |
+ } |
+ } |
+ } |
+ |
+ virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) { |
+ DCHECK(observer); |
+ NetworkObserverMap::iterator map_iter = network_observers_.begin(); |
+ while (map_iter != network_observers_.end()) { |
+ map_iter->second->RemoveObserver(observer); |
+ if (!map_iter->second->size()) { |
+ delete map_iter->second; |
+ network_observers_.erase(map_iter++); |
} else { |
++map_iter; |
} |
} |
} |
+ virtual void AddCellularDataPlanObserver(CellularDataPlanObserver* observer) { |
+ if (!data_plan_observers_.HasObserver(observer)) |
+ data_plan_observers_.AddObserver(observer); |
+ } |
+ |
+ virtual void RemoveCellularDataPlanObserver( |
+ CellularDataPlanObserver* observer) { |
+ data_plan_observers_.RemoveObserver(observer); |
+ } |
+ |
virtual EthernetNetwork* ethernet_network() { return ethernet_; } |
virtual bool ethernet_connecting() const { |
return ethernet_ ? ethernet_->connecting() : false; |
@@ -616,14 +766,14 @@ |
} |
const std::string& IPAddress() const { |
- // Returns highest priority IP address. |
- if (ethernet_connected()) |
+ // Returns IP address for the active network. |
+ const Network* active = active_network(); |
+ if (active != NULL) |
+ return active->ip_address(); |
+ if (ethernet_) |
return ethernet_->ip_address(); |
- if (wifi_connected()) |
- return wifi_->ip_address(); |
- if (cellular_connected()) |
- return cellular_->ip_address(); |
- return ethernet_->ip_address(); |
+ static std::string null_address("0.0.0.0"); |
+ return null_address; |
} |
virtual const WifiNetworkVector& wifi_networks() const { |
@@ -688,6 +838,7 @@ |
DCHECK(network); |
if (!EnsureCrosLoaded()) |
return; |
+ // TODO(ers) make wifi the highest priority service type |
if (ConnectToNetworkWithCertInfo(network->service_path().c_str(), |
password.empty() ? NULL : password.c_str(), |
identity.empty() ? NULL : identity.c_str(), |
@@ -702,7 +853,7 @@ |
wifi->set_connecting(true); |
wifi_ = wifi; |
} |
- NotifyNetworkChanged(); |
+ NotifyNetworkManagerChanged(); |
} |
} |
@@ -721,6 +872,7 @@ |
// Set auto-connect. |
SetAutoConnect(service->service_path, auto_connect); |
// Now connect to that service. |
+ // TODO(ers) make wifi the highest priority service type |
ConnectToNetworkWithCertInfo(service->service_path, |
password.empty() ? NULL : password.c_str(), |
identity.empty() ? NULL : identity.c_str(), |
@@ -738,6 +890,7 @@ |
DCHECK(network); |
if (!EnsureCrosLoaded()) |
return; |
+ // TODO(ers) make cellular the highest priority service type |
if (network && ConnectToNetwork(network->service_path().c_str(), NULL)) { |
// Update local cache and notify listeners. |
CellularNetwork* cellular = GetWirelessNetworkByPath( |
@@ -746,7 +899,7 @@ |
cellular->set_connecting(true); |
cellular_ = cellular; |
} |
- NotifyNetworkChanged(); |
+ NotifyNetworkManagerChanged(); |
} |
} |
@@ -761,6 +914,7 @@ |
DCHECK(network); |
if (!EnsureCrosLoaded() || !network) |
return; |
+ // TODO(ers) restore default service type priority ordering? |
if (DisconnectFromNetwork(network->service_path().c_str())) { |
// Update local cache and notify listeners. |
if (network->type() == TYPE_WIFI) { |
@@ -778,7 +932,7 @@ |
cellular_ = NULL; |
} |
} |
- NotifyNetworkChanged(); |
+ NotifyNetworkManagerChanged(); |
} |
} |
@@ -820,7 +974,7 @@ |
break; |
} |
} |
- NotifyNetworkChanged(); |
+ NotifyNetworkManagerChanged(); |
} |
} |
@@ -846,6 +1000,16 @@ |
virtual bool offline_mode() const { return offline_mode_; } |
+ virtual const Network* active_network() const { |
+ if (ethernet_ && ethernet_->is_active()) |
+ return ethernet_; |
+ if (wifi_ && wifi_->is_active()) |
+ return wifi_; |
+ if (cellular_ && cellular_->is_active()) |
+ return cellular_; |
+ return NULL; |
+ } |
+ |
virtual void EnableEthernetNetworkDevice(bool enable) { |
EnableNetworkDeviceType(TYPE_ETHERNET, enable); |
} |
@@ -951,52 +1115,53 @@ |
private: |
- class PropertyObserverList : public ObserverList<PropertyObserver> { |
+ class NetworkObserverList : public ObserverList<NetworkObserver> { |
public: |
- PropertyObserverList(NetworkLibraryImpl* library, |
- const char* service_path) { |
- DCHECK(service_path); |
- property_change_monitor_ = MonitorNetworkService(&PropertyChangeHandler, |
- service_path, |
- library); |
+ NetworkObserverList(NetworkLibraryImpl* library, |
+ const std::string& service_path) { |
+ network_monitor_ = MonitorNetworkService(&NetworkStatusChangedHandler, |
+ service_path.c_str(), |
+ library); |
} |
- virtual ~PropertyObserverList() { |
- if (property_change_monitor_) |
- DisconnectPropertyChangeMonitor(property_change_monitor_); |
+ virtual ~NetworkObserverList() { |
+ if (network_monitor_) |
+ DisconnectPropertyChangeMonitor(network_monitor_); |
} |
private: |
- static void PropertyChangeHandler(void* object, |
- const char* path, |
- const char* key, |
- const Value* value) { |
- NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); |
- DCHECK(network); |
- network->NotifyPropertyChange(path, key, value); |
+ static void NetworkStatusChangedHandler(void* object, |
+ const char* path, |
+ const char* key, |
+ const Value* value) { |
+ NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
+ DCHECK(networklib); |
+ networklib->UpdateNetworkStatus(path, key, value); |
} |
- PropertyChangeMonitor property_change_monitor_; |
+ PropertyChangeMonitor network_monitor_; |
}; |
- typedef std::map<std::string, PropertyObserverList*> |
- PropertyChangeObserverMap; |
+ typedef std::map<std::string, NetworkObserverList*> NetworkObserverMap; |
- static void NetworkStatusChangedHandler(void* object) { |
- NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); |
- DCHECK(network); |
- network->UpdateNetworkStatus(); |
+ static void NetworkManagerStatusChangedHandler(void* object, |
+ const char* path, |
+ const char* key, |
+ const Value* value) { |
+ NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
+ DCHECK(networklib); |
+ networklib->UpdateNetworkManagerStatus(); |
} |
static void DataPlanUpdateHandler(void* object, |
const char* modem_service_path, |
const CellularDataPlanList* dataplan) { |
- NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); |
- DCHECK(network && network->cellular_network()); |
+ NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
+ DCHECK(networklib && networklib->cellular_network()); |
// Store data plan for currently connected cellular network. |
- if (network->cellular_network()->service_path() |
+ if (networklib->cellular_network()->service_path() |
.compare(modem_service_path) == 0) { |
if (dataplan != NULL) { |
- network->UpdateCellularDataPlan(*dataplan); |
+ networklib->UpdateCellularDataPlan(*dataplan); |
} |
} |
} |
@@ -1021,6 +1186,7 @@ |
<< " str=" << service->strength |
<< " fav=" << service->favorite |
<< " auto=" << service->auto_connect |
+ << " is_active=" << service->is_active |
<< " error=" << service->error; |
// Once a connected ethernet service is found, disregard other ethernet |
// services that are also found |
@@ -1060,17 +1226,10 @@ |
} |
void Init() { |
- // First, get the currently available networks. This data is cached |
+ // First, get the currently available networks. This data is cached |
// on the connman side, so the call should be quick. |
VLOG(1) << "Getting initial CrOS network info."; |
UpdateSystemInfo(); |
- |
- VLOG(1) << "Registering for network status updates."; |
- // Now, register to receive updates on network status. |
- network_status_connection_ = MonitorNetwork(&NetworkStatusChangedHandler, |
- this); |
- VLOG(1) << "Registering for cellular data plan updates."; |
- data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, this); |
} |
void InitTestData() { |
@@ -1149,7 +1308,7 @@ |
void UpdateSystemInfo() { |
if (EnsureCrosLoaded()) { |
- UpdateNetworkStatus(); |
+ UpdateNetworkManagerStatus(); |
} |
} |
@@ -1198,53 +1357,40 @@ |
EnableNetworkDevice(device, enable); |
} |
- void NotifyNetworkChanged() { |
- FOR_EACH_OBSERVER(Observer, observers_, NetworkChanged(this)); |
+ void NotifyNetworkManagerChanged() { |
+ FOR_EACH_OBSERVER(NetworkManagerObserver, |
+ network_manager_observers_, |
+ OnNetworkManagerChanged(this)); |
} |
- void NotifyCellularDataPlanChanged() { |
- FOR_EACH_OBSERVER(Observer, observers_, CellularDataPlanChanged(this)); |
- } |
- |
- void NotifyPropertyChange(const char* service_path, |
- const char* key, |
- const Value* value) { |
- DCHECK(service_path); |
- DCHECK(key); |
- DCHECK(value); |
- PropertyChangeObserverMap::const_iterator iter = property_observers_.find( |
- std::string(service_path)); |
- if (iter != property_observers_.end()) { |
- FOR_EACH_OBSERVER(PropertyObserver, *(iter->second), |
- PropertyChanged(service_path, key, value)); |
+ void NotifyNetworkChanged(Network* network) { |
+ DCHECK(network); |
+ NetworkObserverMap::const_iterator iter = network_observers_.find( |
+ network->service_path()); |
+ if (iter != network_observers_.end()) { |
+ FOR_EACH_OBSERVER(NetworkObserver, |
+ *(iter->second), |
+ OnNetworkChanged(this, network)); |
} else { |
NOTREACHED() << |
"There weren't supposed to be any property change observers of " << |
- service_path; |
+ network->service_path(); |
} |
} |
- void ClearNetworks() { |
- if (ethernet_) |
- delete ethernet_; |
- ethernet_ = NULL; |
- wifi_ = NULL; |
- cellular_ = NULL; |
- STLDeleteElements(&wifi_networks_); |
- wifi_networks_.clear(); |
- STLDeleteElements(&cellular_networks_); |
- cellular_networks_.clear(); |
- STLDeleteElements(&remembered_wifi_networks_); |
- remembered_wifi_networks_.clear(); |
+ void NotifyCellularDataPlanChanged() { |
+ FOR_EACH_OBSERVER(CellularDataPlanObserver, |
+ data_plan_observers_, |
+ OnCellularDataPlanChanged(this)); |
} |
- void UpdateNetworkStatus() { |
+ void UpdateNetworkManagerStatus() { |
// Make sure we run on UI thread. |
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
NewRunnableMethod(this, |
- &NetworkLibraryImpl::UpdateNetworkStatus)); |
+ &NetworkLibraryImpl::UpdateNetworkManagerStatus)); |
return; |
} |
@@ -1288,30 +1434,114 @@ |
connected_devices_ = system->connected_technologies; |
offline_mode_ = system->offline_mode; |
- NotifyNetworkChanged(); |
+ NotifyNetworkManagerChanged(); |
FreeSystemInfo(system); |
} |
+ void UpdateNetworkStatus(const char* path, |
+ const char* key, |
+ const Value* value) { |
+ if (key == NULL || value == NULL) |
+ return; |
+ // Make sure we run on UI thread. |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ NewRunnableMethod(this, |
+ &NetworkLibraryImpl::UpdateNetworkStatus, |
+ path, key, value)); |
+ return; |
+ } |
+ |
+ bool boolval = false; |
+ int intval = 0; |
+ std::string stringval; |
+ Network* network; |
+ if (ethernet_->service_path() == path) { |
+ network = ethernet_; |
+ } else { |
+ CellularNetwork* cellular = |
+ GetWirelessNetworkByPath(cellular_networks_, path); |
+ WifiNetwork* wifi = |
+ GetWirelessNetworkByPath(wifi_networks_, path); |
+ if (cellular == NULL && wifi == NULL) |
+ return; |
+ |
+ WirelessNetwork* wireless; |
+ if (wifi != NULL) |
+ wireless = static_cast<WirelessNetwork*>(wifi); |
+ else |
+ wireless = static_cast<WirelessNetwork*>(cellular); |
+ |
+ if (strcmp(key, kSignalStrengthProperty) == 0) { |
+ if (value->GetAsInteger(&intval)) |
+ wireless->set_strength(intval); |
+ } else if (cellular != NULL) { |
+ if (strcmp(key, kRestrictedPoolProperty) == 0) { |
+ if (value->GetAsBoolean(&boolval)) |
+ cellular->set_restricted_pool(boolval); |
+ } else if (strcmp(key, kActivationStateProperty) == 0) { |
+ if (value->GetAsString(&stringval)) |
+ cellular->set_activation_state(ParseActivationState(stringval)); |
+ } else if (strcmp(key, kPaymentURLProperty) == 0) { |
+ if (value->GetAsString(&stringval)) |
+ cellular->set_payment_url(stringval); |
+ } else if (strcmp(key, kNetworkTechnologyProperty) == 0) { |
+ if (value->GetAsString(&stringval)) |
+ cellular->set_network_technology( |
+ ParseNetworkTechnology(stringval)); |
+ } else if (strcmp(key, kRoamingStateProperty) == 0) { |
+ if (value->GetAsString(&stringval)) |
+ cellular->set_roaming_state(ParseRoamingState(stringval)); |
+ } |
+ } |
+ network = wireless; |
+ } |
+ if (strcmp(key, kIsActiveProperty) == 0) { |
+ if (value->GetAsBoolean(&boolval)) |
+ network->set_active(boolval); |
+ } else if (strcmp(key, kStateProperty) == 0) { |
+ if (value->GetAsString(&stringval)) |
+ network->set_state(ParseState(stringval)); |
+ } |
+ NotifyNetworkChanged(network); |
+ } |
+ |
void UpdateCellularDataPlan(const CellularDataPlanList& data_plans) { |
DCHECK(cellular_); |
cellular_->SetDataPlans(data_plans); |
NotifyCellularDataPlanChanged(); |
} |
- ObserverList<Observer> observers_; |
+ void ClearNetworks() { |
+ if (ethernet_) |
+ delete ethernet_; |
+ ethernet_ = NULL; |
+ wifi_ = NULL; |
+ cellular_ = NULL; |
+ STLDeleteElements(&wifi_networks_); |
+ wifi_networks_.clear(); |
+ STLDeleteElements(&cellular_networks_); |
+ cellular_networks_.clear(); |
+ STLDeleteElements(&remembered_wifi_networks_); |
+ remembered_wifi_networks_.clear(); |
+ } |
- // Property change observer map |
- PropertyChangeObserverMap property_observers_; |
+ // Network manager observer list |
+ ObserverList<NetworkManagerObserver> network_manager_observers_; |
- // The network status connection for monitoring network status changes. |
- MonitorNetworkConnection network_status_connection_; |
+ // Cellular data plan observer list |
+ ObserverList<CellularDataPlanObserver> data_plan_observers_; |
+ // Network observer map |
+ NetworkObserverMap network_observers_; |
+ |
+ // For monitoring network manager status changes. |
+ PropertyChangeMonitor network_manager_monitor_; |
+ |
// For monitoring data plan changes to the connected cellular network. |
DataPlanUpdateMonitor data_plan_monitor_; |
- // The property change connection for monitoring service property changes. |
- std::map<std::string, PropertyChangeMonitor> property_change_monitors_; |
- |
// The ethernet network. |
EthernetNetwork* ethernet_; |
@@ -1353,11 +1583,17 @@ |
cellular_(NULL) { |
} |
~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; } |
- virtual void AddObserver(Observer* observer) {} |
- virtual void RemoveObserver(Observer* observer) {} |
- virtual void AddProperyObserver(const char* service_path, |
- PropertyObserver* observer) {} |
- virtual void RemoveProperyObserver(PropertyObserver* observer) {} |
+ virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {} |
+ virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {} |
+ virtual void AddNetworkObserver(const std::string& service_path, |
+ NetworkObserver* observer) {} |
+ virtual void RemoveNetworkObserver(const std::string& service_path, |
+ NetworkObserver* observer) {} |
+ virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {} |
+ virtual void AddCellularDataPlanObserver( |
+ CellularDataPlanObserver* observer) {} |
+ virtual void RemoveCellularDataPlanObserver( |
+ CellularDataPlanObserver* observer) {} |
virtual EthernetNetwork* ethernet_network() { |
return ethernet_; |
} |
@@ -1422,6 +1658,7 @@ |
virtual bool ethernet_enabled() const { return true; } |
virtual bool wifi_enabled() const { return false; } |
virtual bool cellular_enabled() const { return false; } |
+ virtual const Network* active_network() const { return NULL; } |
virtual bool offline_mode() const { return false; } |
virtual void EnableEthernetNetworkDevice(bool enable) {} |
virtual void EnableWifiNetworkDevice(bool enable) {} |