diff options
Diffstat (limited to 'chromeos/network/network_state_handler.cc')
-rw-r--r-- | chromeos/network/network_state_handler.cc | 115 |
1 files changed, 79 insertions, 36 deletions
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc index 7b0e0d9..0fc7ec1 100644 --- a/chromeos/network/network_state_handler.cc +++ b/chromeos/network/network_state_handler.cc @@ -18,11 +18,33 @@ #include "third_party/cros_system_api/dbus/service_constants.h" namespace { + const char kLogModule[] = "NetworkPropertyHandler"; + +// Returns true if |network->type()| == |match_type|, or it matches one of the +// following special match types: +// * kMatchTypeDefault matches any network (i.e. the first instance) +// * kMatchTypeNonVirtual matches non virtual networks +// * kMatchTypeWireless matches wireless networks +bool NetworkStateMatchesType(const chromeos::NetworkState* network, + const std::string& match_type) { + const std::string& type = network->type(); + return ((match_type == chromeos::NetworkStateHandler::kMatchTypeDefault) || + (match_type == type) || + (match_type == chromeos::NetworkStateHandler::kMatchTypeNonVirtual && + type != flimflam::kTypeVPN) || + (match_type == chromeos::NetworkStateHandler::kMatchTypeWireless && + type != flimflam::kTypeEthernet && type != flimflam::kTypeVPN)); } +} // namespace + namespace chromeos { +const char NetworkStateHandler::kMatchTypeDefault[] = "default"; +const char NetworkStateHandler::kMatchTypeWireless[] = "wireless"; +const char NetworkStateHandler::kMatchTypeNonVirtual[] = "non-virtual"; + static NetworkStateHandler* g_network_state_handler = NULL; NetworkStateHandler::NetworkStateHandler() { @@ -108,7 +130,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 +148,7 @@ const NetworkState* NetworkStateHandler::ConnectedNetworkByType( DCHECK(network); if (!network->IsConnectedState()) break; // Connected networks are listed first. - if (network->type() == type) + if (NetworkStateMatchesType(network, type)) return network; } return NULL; @@ -142,10 +164,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 (NetworkStateMatchesType(network, type)) return network; - } } return NULL; } @@ -285,24 +305,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 +336,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 +358,7 @@ void NetworkStateHandler::UpdateNetworkServiceIPAddress( network->set_ip_address(ip_address); FOR_EACH_OBSERVER( NetworkStateHandlerObserver, observers_, - NetworkServiceChanged(network)); + NetworkPropertiesUpdated(network)); } void NetworkStateHandler::ManagerPropertyChanged() { @@ -357,19 +377,9 @@ 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. + if (CheckDefaultNetworkChanged()) + OnDefaultNetworkChanged(); } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { network_event_log::AddEntry( kLogModule, "DeviceListChanged", @@ -430,14 +440,47 @@ 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) { - FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, - ActiveNetworkStateChanged(network)); + if (key == flimflam::kStateProperty && + network->connection_state() != prev_connection_state) { + OnNetworkConnectionStateChanged(network); + } + return true; +} + +void 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)); + if (CheckDefaultNetworkChanged() || + network->path() == default_network_path_) { + OnDefaultNetworkChanged(); } +} + +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; return true; } +void NetworkStateHandler::OnDefaultNetworkChanged() { + const NetworkState* default_network = DefaultNetwork(); + network_event_log::AddEntry( + kLogModule, "DefaultNetworkChanged", default_network->path()); + FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, + DefaultNetworkChanged(default_network)); +} + } // namespace chromeos |