Index: chromeos/network/network_state_handler.cc |
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc |
index 7b0e0d9e0e084163753335c92e0a0d68995cf95d..590d763c41bc477457651cb12b498f1edbbcfdbe 100644 |
--- a/chromeos/network/network_state_handler.cc |
+++ b/chromeos/network/network_state_handler.cc |
@@ -108,7 +108,7 @@ const NetworkState* NetworkStateHandler::GetNetworkState( |
return GetModifiableNetworkState(service_path); |
} |
-const NetworkState* NetworkStateHandler::ActiveNetwork() const { |
+const NetworkState* NetworkStateHandler::DefaultNetwork() const { |
if (network_list_.empty()) |
return NULL; |
const NetworkState* network = network_list_.front()->AsNetworkState(); |
@@ -126,7 +126,7 @@ const NetworkState* NetworkStateHandler::ConnectedNetworkByType( |
DCHECK(network); |
if (!network->IsConnectedState()) |
break; // Connected networks are listed first. |
- if (network->type() == type) |
+ if (network->MatchesType(type)) |
return network; |
} |
return NULL; |
@@ -142,10 +142,8 @@ const NetworkState* NetworkStateHandler::ConnectingNetworkByType( |
continue; |
if (!network->IsConnectingState()) |
break; // Connected and connecting networks are listed first. |
- if (network->type() == type || |
- (type.empty() && type != flimflam::kTypeEthernet)) { |
+ if (network->MatchesType(type)) |
return network; |
- } |
} |
return NULL; |
} |
@@ -302,7 +300,7 @@ void NetworkStateHandler::UpdateManagedStateProperties( |
NetworkState* network = managed->AsNetworkState(); |
DCHECK(network); |
FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
- NetworkServiceChanged(network)); |
+ NetworkPropertyChanged(network)); |
} |
network_event_log::AddEntry( |
kLogModule, "PropertiesReceived", |
@@ -316,15 +314,15 @@ void NetworkStateHandler::UpdateNetworkServiceProperty( |
NetworkState* network = GetModifiableNetworkState(service_path); |
if (!network) |
return; |
- if (ParseNetworkServiceProperty(network, key, value)) { |
- std::string detail = network->name() + "." + key; |
- std::string vstr; |
- if (value.GetAsString(&vstr)) |
- detail += " = " + vstr; |
- network_event_log::AddEntry(kLogModule, "NetworkPropertyChanged", detail); |
- FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
- NetworkServiceChanged(network)); |
- } |
+ if (!ParseNetworkServiceProperty(network, key, value)) |
+ return; |
+ std::string detail = network->name() + "." + key; |
+ std::string vstr; |
+ if (value.GetAsString(&vstr)) |
+ detail += " = " + vstr; |
+ network_event_log::AddEntry(kLogModule, "NetworkPropertyChanged", detail); |
+ FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
+ NetworkPropertyChanged(network)); |
} |
void NetworkStateHandler::UpdateNetworkServiceIPAddress( |
@@ -338,7 +336,7 @@ void NetworkStateHandler::UpdateNetworkServiceIPAddress( |
network->set_ip_address(ip_address); |
FOR_EACH_OBSERVER( |
NetworkStateHandlerObserver, observers_, |
- NetworkServiceChanged(network)); |
+ NetworkPropertyChanged(network)); |
} |
void NetworkStateHandler::ManagerPropertyChanged() { |
@@ -357,19 +355,8 @@ void NetworkStateHandler::ManagedStateListChanged( |
StringPrintf("Size: %"PRIuS, network_list_.size())); |
FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
NetworkListChanged(network_list)); |
- // Update the active network and notify observers if it has changed. |
- NetworkState* new_active_network = |
- network_list_.empty() ? NULL : network_list_.front()->AsNetworkState(); |
- std::string new_active_network_path; |
- if (new_active_network) |
- new_active_network_path = new_active_network->path(); |
- if (new_active_network_path != active_network_path_) { |
- network_event_log::AddEntry( |
- kLogModule, "ActiveNetworkChanged", new_active_network_path); |
- active_network_path_ = new_active_network_path; |
- FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
- ActiveNetworkChanged(new_active_network)); |
- } |
+ // The list order may have changed, so check if the default network changed. |
+ CheckDefaultNetworkChanged(); |
} else if (type == ManagedState::MANAGED_TYPE_DEVICE) { |
network_event_log::AddEntry( |
kLogModule, "DeviceListChanged", |
@@ -430,14 +417,45 @@ bool NetworkStateHandler::ParseNetworkServiceProperty( |
const std::string& key, |
const base::Value& value) { |
DCHECK(network); |
+ std::string prev_connection_state = network->connection_state(); |
if (!network->PropertyChanged(key, value)) |
return false; |
- if (network->path() == active_network_path_ && |
- key == flimflam::kStateProperty) { |
+ if (key == flimflam::kStateProperty && |
+ network->connection_state() != prev_connection_state) |
+ OnNetworkConnectionStateChanged(network); |
pneubeck (no reviews)
2012/12/19 19:40:06
looks better. Now it's clearer which conditions ar
|
+ return true; |
+} |
+ |
+bool NetworkStateHandler::OnNetworkConnectionStateChanged( |
+ NetworkState* network) { |
+ std::string desc = StringPrintf( |
+ "%s: %s", network->path().c_str(), network->connection_state().c_str()); |
+ network_event_log::AddEntry( |
+ kLogModule, "NetworkStateChanged", desc); |
+ FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
+ NetworkStateChanged(network)); |
+ bool signaled_observers = CheckDefaultNetworkChanged(); |
+ if (!signaled_observers && network->path() == default_network_path_) { |
+ // This was already the default network; signal observers. |
FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
- ActiveNetworkStateChanged(network)); |
+ DefaultNetworkChanged(network)); |
} |
return true; |
} |
+bool NetworkStateHandler::CheckDefaultNetworkChanged() { |
+ std::string new_default_network_path; |
+ const NetworkState* new_default_network = DefaultNetwork(); |
+ if (new_default_network) |
+ new_default_network_path = new_default_network->path(); |
+ if (new_default_network_path == default_network_path_) |
+ return false; |
+ default_network_path_ = new_default_network_path; |
+ network_event_log::AddEntry( |
+ kLogModule, "DefaultNetworkChanged", new_default_network_path); |
+ FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
+ DefaultNetworkChanged(new_default_network)); |
+ return true; |
+} |
+ |
} // namespace chromeos |