Chromium Code Reviews| Index: chromeos/dbus/fake_shill_profile_client.cc |
| diff --git a/chromeos/dbus/fake_shill_profile_client.cc b/chromeos/dbus/fake_shill_profile_client.cc |
| index 9a5fe1a3c0522195735e597ff2458e1fabf3e7de..3a9d955276a5776cc1419e9865fde1aa5ff69655 100644 |
| --- a/chromeos/dbus/fake_shill_profile_client.cc |
| +++ b/chromeos/dbus/fake_shill_profile_client.cc |
| @@ -23,6 +23,7 @@ |
| namespace chromeos { |
| struct FakeShillProfileClient::ProfileProperties { |
| + std::string path; // Profile path |
| base::DictionaryValue entries; // Dictionary of Service Dictionaries |
| base::DictionaryValue properties; // Dictionary of Profile properties |
| }; |
| @@ -127,11 +128,22 @@ void FakeShillProfileClient::AddProfile(const std::string& profile_path, |
| if (GetProfile(dbus::ObjectPath(profile_path), ErrorCallback())) |
| return; |
| - std::unique_ptr<ProfileProperties> profile = |
| - base::MakeUnique<ProfileProperties>(); |
| + // If adding a shared profile, make sure there are no user profiles currently |
| + // on the stack - note that it's enough to check the top of the stack only. |
| + if (profile_path == GetSharedProfilePath()) { |
| + if (!(profiles_.empty() || |
| + profiles_.back()->path == GetSharedProfilePath())) { |
| + NOTREACHED() << "Adding shared profile when a user profile exists."; |
| + return; |
| + } |
| + } |
|
stevenjb
2017/03/30 17:33:13
nit: We shouldn't need to support multiple shared
tbarzic
2017/03/30 18:00:05
Done.
|
| + |
| + auto profile = base::MakeUnique<ProfileProperties>(); |
| profile->properties.SetStringWithoutPathExpansion(shill::kUserHashProperty, |
| userhash); |
| - profiles_[profile_path] = std::move(profile); |
| + profile->path = profile_path; |
| + profiles_.emplace_back(std::move(profile)); |
| + |
| DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
| AddProfile(profile_path); |
| } |
| @@ -211,26 +223,32 @@ bool FakeShillProfileClient::AddOrUpdateServiceImpl( |
| void FakeShillProfileClient::GetProfilePaths( |
| std::vector<std::string>* profiles) { |
| - for (auto iter = profiles_.begin(); iter != profiles_.end(); ++iter) |
| - profiles->push_back(iter->first); |
| + for (const auto& profile : profiles_) |
| + profiles->push_back(profile->path); |
| +} |
| + |
| +void FakeShillProfileClient::GetProfilePathsContainingService( |
| + const std::string& service_path, |
| + std::vector<std::string>* profiles) { |
| + for (const auto& profile : profiles_) { |
| + if (GetServiceDataFromProfile(profile.get(), service_path, nullptr)) |
| + profiles->push_back(profile->path); |
| + } |
| } |
| bool FakeShillProfileClient::GetService(const std::string& service_path, |
| std::string* profile_path, |
| base::DictionaryValue* properties) { |
| properties->Clear(); |
| - for (auto iter = profiles_.begin(); iter != profiles_.end(); ++iter) { |
| - const ProfileProperties* profile = iter->second.get(); |
| - const base::DictionaryValue* entry; |
| - if (!profile->entries.GetDictionaryWithoutPathExpansion( |
| - service_path, &entry)) { |
| - continue; |
| + |
| + bool found_profile = false; |
| + for (const auto& profile : profiles_) { |
| + if (GetServiceDataFromProfile(profile.get(), service_path, properties)) { |
| + found_profile = true; |
| + *profile_path = profile->path; |
| } |
| - *profile_path = iter->first; |
| - properties->MergeDictionary(entry); |
| - return true; |
| } |
| - return false; |
| + return found_profile; |
| } |
| void FakeShillProfileClient::ClearProfiles() { |
| @@ -240,14 +258,29 @@ void FakeShillProfileClient::ClearProfiles() { |
| FakeShillProfileClient::ProfileProperties* FakeShillProfileClient::GetProfile( |
| const dbus::ObjectPath& profile_path, |
| const ErrorCallback& error_callback) { |
| - auto found = profiles_.find(profile_path.value()); |
| - if (found == profiles_.end()) { |
| - if (!error_callback.is_null()) |
| - error_callback.Run("Error.InvalidProfile", "Invalid profile"); |
| - return nullptr; |
| + for (auto& profile : profiles_) { |
| + if (profile->path == profile_path.value()) |
| + return profile.get(); |
| } |
| + if (!error_callback.is_null()) |
| + error_callback.Run("Error.InvalidProfile", "Invalid profile"); |
| + return nullptr; |
| +} |
| - return found->second.get(); |
| +bool FakeShillProfileClient::GetServiceDataFromProfile( |
| + const FakeShillProfileClient::ProfileProperties* profile, |
| + const std::string& service_path, |
| + base::DictionaryValue* properties) { |
| + const base::DictionaryValue* entry; |
| + if (!profile->entries.GetDictionaryWithoutPathExpansion(service_path, |
| + &entry)) { |
| + return false; |
| + } |
| + |
| + if (properties) |
| + properties->MergeDictionary(entry); |
| + |
| + return true; |
| } |
| } // namespace chromeos |