| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/network/network_state_handler.h" | 5 #include "chromeos/network/network_state_handler.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
| 9 #include "base/guid.h" |
| 9 #include "base/location.h" | 10 #include "base/location.h" |
| 10 #include "base/logging.h" | 11 #include "base/logging.h" |
| 11 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 12 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 13 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 14 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 15 #include "base/values.h" | 16 #include "base/values.h" |
| 16 #include "chromeos/network/device_state.h" | 17 #include "chromeos/network/device_state.h" |
| 17 #include "chromeos/network/favorite_state.h" | 18 #include "chromeos/network/favorite_state.h" |
| 18 #include "chromeos/network/managed_state.h" | 19 #include "chromeos/network/managed_state.h" |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 303 |
| 303 void NetworkStateHandler::GetFavoriteListByType(const NetworkTypePattern& type, | 304 void NetworkStateHandler::GetFavoriteListByType(const NetworkTypePattern& type, |
| 304 FavoriteStateList* list) const { | 305 FavoriteStateList* list) const { |
| 305 DCHECK(list); | 306 DCHECK(list); |
| 306 FavoriteStateList result; | 307 FavoriteStateList result; |
| 307 list->clear(); | 308 list->clear(); |
| 308 for (ManagedStateList::const_iterator iter = favorite_list_.begin(); | 309 for (ManagedStateList::const_iterator iter = favorite_list_.begin(); |
| 309 iter != favorite_list_.end(); ++iter) { | 310 iter != favorite_list_.end(); ++iter) { |
| 310 const FavoriteState* favorite = (*iter)->AsFavoriteState(); | 311 const FavoriteState* favorite = (*iter)->AsFavoriteState(); |
| 311 DCHECK(favorite); | 312 DCHECK(favorite); |
| 312 if (favorite->update_received() && favorite->IsFavorite() && | 313 if (favorite->update_received() && favorite->IsInProfile() && |
| 313 favorite->Matches(type)) { | 314 favorite->Matches(type)) { |
| 314 list->push_back(favorite); | 315 list->push_back(favorite); |
| 315 } | 316 } |
| 316 } | 317 } |
| 317 } | 318 } |
| 318 | 319 |
| 319 const FavoriteState* NetworkStateHandler::GetFavoriteState( | 320 const FavoriteState* NetworkStateHandler::GetFavoriteState( |
| 320 const std::string& service_path) const { | 321 const std::string& service_path) const { |
| 321 ManagedState* managed = | 322 ManagedState* managed = |
| 322 GetModifiableManagedState(&favorite_list_, service_path); | 323 GetModifiableManagedState(&favorite_list_, service_path); |
| 323 if (!managed) | 324 if (!managed) |
| 324 return NULL; | 325 return NULL; |
| 325 const FavoriteState* favorite = managed->AsFavoriteState(); | 326 const FavoriteState* favorite = managed->AsFavoriteState(); |
| 326 DCHECK(favorite); | 327 DCHECK(favorite); |
| 327 if (!favorite->update_received() || !favorite->IsFavorite()) | 328 if (!favorite->update_received() || !favorite->IsInProfile()) |
| 328 return NULL; | 329 return NULL; |
| 329 return favorite; | 330 return favorite; |
| 330 } | 331 } |
| 331 | 332 |
| 333 const FavoriteState* NetworkStateHandler::GetFavoriteStateFromGuid( |
| 334 const std::string& guid) const { |
| 335 for (ManagedStateList::const_iterator iter = favorite_list_.begin(); |
| 336 iter != favorite_list_.end(); ++iter) { |
| 337 const FavoriteState* favorite = (*iter)->AsFavoriteState(); |
| 338 if (favorite->guid() == guid) |
| 339 return favorite; |
| 340 } |
| 341 return NULL; |
| 342 } |
| 343 |
| 332 void NetworkStateHandler::RequestScan() const { | 344 void NetworkStateHandler::RequestScan() const { |
| 333 NET_LOG_USER("RequestScan", ""); | 345 NET_LOG_USER("RequestScan", ""); |
| 334 shill_property_handler_->RequestScan(); | 346 shill_property_handler_->RequestScan(); |
| 335 } | 347 } |
| 336 | 348 |
| 337 void NetworkStateHandler::WaitForScan(const std::string& type, | 349 void NetworkStateHandler::WaitForScan(const std::string& type, |
| 338 const base::Closure& callback) { | 350 const base::Closure& callback) { |
| 339 scan_complete_callbacks_[type].push_back(callback); | 351 scan_complete_callbacks_[type].push_back(callback); |
| 340 if (!GetScanningByType(NetworkTypePattern::Primitive(type))) | 352 if (!GetScanningByType(NetworkTypePattern::Primitive(type))) |
| 341 RequestScan(); | 353 RequestScan(); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 ManagedState* managed = GetModifiableManagedState(managed_list, path); | 494 ManagedState* managed = GetModifiableManagedState(managed_list, path); |
| 483 if (!managed) { | 495 if (!managed) { |
| 484 if (type != ManagedState::MANAGED_TYPE_FAVORITE) { | 496 if (type != ManagedState::MANAGED_TYPE_FAVORITE) { |
| 485 // The network has been removed from the list of visible networks. | 497 // The network has been removed from the list of visible networks. |
| 486 NET_LOG_DEBUG("UpdateManagedStateProperties: Not found", path); | 498 NET_LOG_DEBUG("UpdateManagedStateProperties: Not found", path); |
| 487 return; | 499 return; |
| 488 } | 500 } |
| 489 // A Favorite may not have been created yet if it was added later (e.g. | 501 // A Favorite may not have been created yet if it was added later (e.g. |
| 490 // through ConfigureService) since ServiceCompleteList updates are not | 502 // through ConfigureService) since ServiceCompleteList updates are not |
| 491 // emitted. Add and update the state here. | 503 // emitted. Add and update the state here. |
| 492 managed = new FavoriteState(path); | 504 managed = ManagedState::Create(type, path); |
| 493 managed_list->push_back(managed); | 505 managed_list->push_back(managed); |
| 494 } | 506 } |
| 495 managed->set_update_received(); | 507 managed->set_update_received(); |
| 496 | 508 |
| 497 std::string desc = GetManagedStateLogType(managed) + " Properties Received"; | 509 std::string desc = GetManagedStateLogType(managed) + " Properties Received"; |
| 498 NET_LOG_DEBUG(desc, GetManagedStateLogName(managed)); | 510 NET_LOG_DEBUG(desc, GetManagedStateLogName(managed)); |
| 499 | 511 |
| 500 if (type == ManagedState::MANAGED_TYPE_NETWORK) { | 512 if (type == ManagedState::MANAGED_TYPE_NETWORK) { |
| 501 UpdateNetworkStateProperties(managed->AsNetworkState(), properties); | 513 UpdateNetworkStateProperties(managed->AsNetworkState(), properties); |
| 502 } else { | 514 } else { |
| 503 // Device, Favorite | 515 // Device, Favorite |
| 504 for (base::DictionaryValue::Iterator iter(properties); | 516 for (base::DictionaryValue::Iterator iter(properties); |
| 505 !iter.IsAtEnd(); iter.Advance()) { | 517 !iter.IsAtEnd(); iter.Advance()) { |
| 506 managed->PropertyChanged(iter.key(), iter.value()); | 518 managed->PropertyChanged(iter.key(), iter.value()); |
| 507 } | 519 } |
| 508 managed->InitialPropertiesReceived(properties); | 520 managed->InitialPropertiesReceived(properties); |
| 509 } | 521 } |
| 522 UpdateGuid(managed); |
| 510 managed->set_update_requested(false); | 523 managed->set_update_requested(false); |
| 511 } | 524 } |
| 512 | 525 |
| 513 void NetworkStateHandler::UpdateNetworkStateProperties( | 526 void NetworkStateHandler::UpdateNetworkStateProperties( |
| 514 NetworkState* network, | 527 NetworkState* network, |
| 515 const base::DictionaryValue& properties) { | 528 const base::DictionaryValue& properties) { |
| 516 DCHECK(network); | 529 DCHECK(network); |
| 517 bool network_property_updated = false; | 530 bool network_property_updated = false; |
| 518 std::string prev_connection_state = network->connection_state(); | 531 std::string prev_connection_state = network->connection_state(); |
| 519 for (base::DictionaryValue::Iterator iter(properties); | 532 for (base::DictionaryValue::Iterator iter(properties); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 NET_LOG_DEBUG("FavoriteListChanged", | 687 NET_LOG_DEBUG("FavoriteListChanged", |
| 675 base::StringPrintf("Size:%" PRIuS, favorite_list_.size())); | 688 base::StringPrintf("Size:%" PRIuS, favorite_list_.size())); |
| 676 // The FavoriteState list only changes when the NetworkState list changes, | 689 // The FavoriteState list only changes when the NetworkState list changes, |
| 677 // so no need to signal observers here again. | 690 // so no need to signal observers here again. |
| 678 | 691 |
| 679 // Update UMA stats. | 692 // Update UMA stats. |
| 680 size_t shared = 0, unshared = 0; | 693 size_t shared = 0, unshared = 0; |
| 681 for (ManagedStateList::iterator iter = favorite_list_.begin(); | 694 for (ManagedStateList::iterator iter = favorite_list_.begin(); |
| 682 iter != favorite_list_.end(); ++iter) { | 695 iter != favorite_list_.end(); ++iter) { |
| 683 FavoriteState* favorite = (*iter)->AsFavoriteState(); | 696 FavoriteState* favorite = (*iter)->AsFavoriteState(); |
| 684 if (!favorite->IsFavorite()) | 697 if (!favorite->IsInProfile()) |
| 685 continue; | 698 continue; |
| 686 if (favorite->IsPrivate()) | 699 if (favorite->IsPrivate()) |
| 687 ++unshared; | 700 ++unshared; |
| 688 else | 701 else |
| 689 ++shared; | 702 ++shared; |
| 690 } | 703 } |
| 691 UMA_HISTOGRAM_COUNTS_100("Networks.RememberedShared", shared); | 704 UMA_HISTOGRAM_COUNTS_100("Networks.RememberedShared", shared); |
| 692 UMA_HISTOGRAM_COUNTS_100("Networks.RememberedUnshared", unshared); | 705 UMA_HISTOGRAM_COUNTS_100("Networks.RememberedUnshared", unshared); |
| 693 } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { | 706 } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { |
| 694 NotifyDeviceListChanged(); | 707 NotifyDeviceListChanged(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 721 NET_LOG_ERROR( | 734 NET_LOG_ERROR( |
| 722 "DefaultNetwork is not connected: " + network->connection_state(), | 735 "DefaultNetwork is not connected: " + network->connection_state(), |
| 723 network->path()); | 736 network->path()); |
| 724 } | 737 } |
| 725 NotifyDefaultNetworkChanged(network); | 738 NotifyDefaultNetworkChanged(network); |
| 726 } | 739 } |
| 727 | 740 |
| 728 //------------------------------------------------------------------------------ | 741 //------------------------------------------------------------------------------ |
| 729 // Private methods | 742 // Private methods |
| 730 | 743 |
| 744 void NetworkStateHandler::UpdateGuid(ManagedState* managed) { |
| 745 if (managed->managed_type() == ManagedState::MANAGED_TYPE_FAVORITE) { |
| 746 // Ensure that a FavoriteState has a valid GUID. |
| 747 FavoriteState* favorite = managed->AsFavoriteState(); |
| 748 if (!favorite->guid().empty()) |
| 749 return; |
| 750 std::string specifier = favorite->GetSpecifier(); |
| 751 std::string guid; |
| 752 SpecifierGuidMap::iterator iter = specifier_guid_map_.find(specifier); |
| 753 if (iter != specifier_guid_map_.end()) { |
| 754 guid = iter->second; |
| 755 } else { |
| 756 guid = base::GenerateGUID(); |
| 757 specifier_guid_map_[specifier] = guid; |
| 758 } |
| 759 favorite->SetGuid(guid); |
| 760 NetworkState* network = GetModifiableNetworkState(favorite->path()); |
| 761 if (network) |
| 762 network->SetGuid(guid); |
| 763 } else if (managed->managed_type() == ManagedState::MANAGED_TYPE_NETWORK) { |
| 764 // If the GUID is not set and a corresponding FavoriteState exists, get the |
| 765 // GUID from the FavoriteState. Otherwise it will get set when the Favorite |
| 766 // is created. |
| 767 NetworkState* network = managed->AsNetworkState(); |
| 768 if (!network->guid().empty()) |
| 769 return; |
| 770 FavoriteState* favorite = GetModifiableFavoriteState(network->path()); |
| 771 if (favorite && !favorite->guid().empty()) |
| 772 network->SetGuid(favorite->guid()); |
| 773 } |
| 774 } |
| 775 |
| 731 void NetworkStateHandler::NotifyDeviceListChanged() { | 776 void NetworkStateHandler::NotifyDeviceListChanged() { |
| 732 NET_LOG_DEBUG("NotifyDeviceListChanged", | 777 NET_LOG_DEBUG("NotifyDeviceListChanged", |
| 733 base::StringPrintf("Size:%" PRIuS, device_list_.size())); | 778 base::StringPrintf("Size:%" PRIuS, device_list_.size())); |
| 734 FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, | 779 FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
| 735 DeviceListChanged()); | 780 DeviceListChanged()); |
| 736 } | 781 } |
| 737 | 782 |
| 738 DeviceState* NetworkStateHandler::GetModifiableDeviceState( | 783 DeviceState* NetworkStateHandler::GetModifiableDeviceState( |
| 739 const std::string& device_path) const { | 784 const std::string& device_path) const { |
| 740 ManagedState* managed = GetModifiableManagedState(&device_list_, device_path); | 785 ManagedState* managed = GetModifiableManagedState(&device_list_, device_path); |
| 741 if (!managed) | 786 if (!managed) |
| 742 return NULL; | 787 return NULL; |
| 743 return managed->AsDeviceState(); | 788 return managed->AsDeviceState(); |
| 744 } | 789 } |
| 745 | 790 |
| 746 NetworkState* NetworkStateHandler::GetModifiableNetworkState( | 791 NetworkState* NetworkStateHandler::GetModifiableNetworkState( |
| 747 const std::string& service_path) const { | 792 const std::string& service_path) const { |
| 748 ManagedState* managed = | 793 ManagedState* managed = |
| 749 GetModifiableManagedState(&network_list_, service_path); | 794 GetModifiableManagedState(&network_list_, service_path); |
| 750 if (!managed) | 795 if (!managed) |
| 751 return NULL; | 796 return NULL; |
| 752 return managed->AsNetworkState(); | 797 return managed->AsNetworkState(); |
| 753 } | 798 } |
| 754 | 799 |
| 800 FavoriteState* NetworkStateHandler::GetModifiableFavoriteState( |
| 801 const std::string& service_path) const { |
| 802 ManagedState* managed = |
| 803 GetModifiableManagedState(&favorite_list_, service_path); |
| 804 if (!managed) |
| 805 return NULL; |
| 806 return managed->AsFavoriteState(); |
| 807 } |
| 808 |
| 755 ManagedState* NetworkStateHandler::GetModifiableManagedState( | 809 ManagedState* NetworkStateHandler::GetModifiableManagedState( |
| 756 const ManagedStateList* managed_list, | 810 const ManagedStateList* managed_list, |
| 757 const std::string& path) const { | 811 const std::string& path) const { |
| 758 for (ManagedStateList::const_iterator iter = managed_list->begin(); | 812 for (ManagedStateList::const_iterator iter = managed_list->begin(); |
| 759 iter != managed_list->end(); ++iter) { | 813 iter != managed_list->end(); ++iter) { |
| 760 ManagedState* managed = *iter; | 814 ManagedState* managed = *iter; |
| 761 if (managed->path() == path) | 815 if (managed->path() == path) |
| 762 return managed; | 816 return managed; |
| 763 } | 817 } |
| 764 return NULL; | 818 return NULL; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 if (type.MatchesType(shill::kTypeBluetooth)) | 916 if (type.MatchesType(shill::kTypeBluetooth)) |
| 863 technologies.push_back(new std::string(shill::kTypeBluetooth)); | 917 technologies.push_back(new std::string(shill::kTypeBluetooth)); |
| 864 if (type.MatchesType(shill::kTypeVPN)) | 918 if (type.MatchesType(shill::kTypeVPN)) |
| 865 technologies.push_back(new std::string(shill::kTypeVPN)); | 919 technologies.push_back(new std::string(shill::kTypeVPN)); |
| 866 | 920 |
| 867 CHECK_GT(technologies.size(), 0ul); | 921 CHECK_GT(technologies.size(), 0ul); |
| 868 return technologies.Pass(); | 922 return technologies.Pass(); |
| 869 } | 923 } |
| 870 | 924 |
| 871 } // namespace chromeos | 925 } // namespace chromeos |
| OLD | NEW |