Chromium Code Reviews| 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..b1873a15eb2e44a19d27b9397beffe25e1a43e75 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; |
| } |
| @@ -285,24 +283,24 @@ void NetworkStateHandler::UpdateManagedStateProperties( |
| LOG(ERROR) << "GetPropertiesCallback: " << path << " Not found!"; |
| return; |
| } |
| - bool network_property_changed = false; |
| + bool network_property_updated = false; |
| for (base::DictionaryValue::Iterator iter(properties); |
| iter.HasNext(); iter.Advance()) { |
| if (type == ManagedState::MANAGED_TYPE_NETWORK) { |
| if (ParseNetworkServiceProperty( |
| managed->AsNetworkState(), iter.key(), iter.value())) { |
| - network_property_changed = true; |
| + network_property_updated = true; |
| } |
| } else { |
| managed->PropertyChanged(iter.key(), iter.value()); |
| } |
| } |
| // Notify observers. |
| - if (network_property_changed) { |
| + if (network_property_updated) { |
| NetworkState* network = managed->AsNetworkState(); |
| DCHECK(network); |
| FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
| - NetworkServiceChanged(network)); |
| + NetworkPropertiesUpdated(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, "NetworkPropertiesUpdated", detail); |
| + FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
| + NetworkPropertiesUpdated(network)); |
| } |
| void NetworkStateHandler::UpdateNetworkServiceIPAddress( |
| @@ -338,7 +336,7 @@ void NetworkStateHandler::UpdateNetworkServiceIPAddress( |
| network->set_ip_address(ip_address); |
| FOR_EACH_OBSERVER( |
| NetworkStateHandlerObserver, observers_, |
| - NetworkServiceChanged(network)); |
| + NetworkPropertiesUpdated(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); |
| + 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, "NetworkConnectionStateChanged", desc); |
| + FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
| + NetworkConnectionStateChanged(network)); |
| + bool signaled_observers = CheckDefaultNetworkChanged(); |
| + if (!signaled_observers && network->path() == default_network_path_) { |
|
gauravsh
2012/12/19 23:48:00
CheckDefaultNetworkChanged() could perhaps use a b
stevenjb
2012/12/20 02:17:50
Split out logging and notification from CheckDefau
|
| + // This was already the default network; signal observers. |
| FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
|
gauravsh
2012/12/19 23:48:00
You don't log DefaultNetworkChanged to the event l
stevenjb
2012/12/20 02:17:50
Yes, thanks. Fixed with splitting CheckDefaultNetw
|
| - 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 |