screen_context.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/screen_context.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ScreenContext::ScreenContext() { 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ScreenContext::~ScreenContext() { 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::SetBoolean(const KeyType& key, bool value) { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Set(key, new base::FundamentalValue(value)); 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::SetInteger(const KeyType& key, int value) { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Set(key, new base::FundamentalValue(value)); 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::SetDouble(const KeyType& key, double value) { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Set(key, new base::FundamentalValue(value)); 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::SetString(const KeyType& key, const std::string& value) { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Set(key, new base::StringValue(value)); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::SetString(const KeyType& key, const base::string16& value) { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Set(key, new base::StringValue(value)); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::GetBoolean(const KeyType& key) { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get<bool>(key); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::GetBoolean(const KeyType& key, bool default_value) { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get(key, default_value); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ScreenContext::GetInteger(const KeyType& key) { 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get<int>(key); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ScreenContext::GetInteger(const KeyType& key, int default_value) { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get(key, default_value); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double ScreenContext::GetDouble(const KeyType& key) { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get<double>(key); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double ScreenContext::GetDouble(const KeyType& key, double default_value) { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get(key, default_value); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string ScreenContext::GetString(const KeyType& key) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get<std::string>(key); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string ScreenContext::GetString(const KeyType& key, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& default_value) { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get(key, default_value); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 ScreenContext::GetString16(const KeyType& key) { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get<base::string16>(key); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 ScreenContext::GetString16(const KeyType& key, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& default_value) { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get(key, default_value); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::HasKey(const KeyType& key) const { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return storage_.HasKey(key); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ScreenContext::HasChanges() const { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !changes_.empty(); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ScreenContext::GetChangesAndReset(base::DictionaryValue* diff) { 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(diff); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) changes_.Swap(diff); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) changes_.Clear(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ScreenContext::ApplyChanges(const base::DictionaryValue& diff, 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>* keys) { 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!HasChanges()); 1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (keys) { 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) keys->clear(); 1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) keys->reserve(diff.size()); 1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::DictionaryValue::Iterator it(diff); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) while (!it.IsAtEnd()) { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Set(it.key(), it.value().DeepCopy()); 1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (keys) 1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) keys->push_back(it.key()); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it.Advance(); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) changes_.Clear(); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ScreenContext::Set(const KeyType& key, base::Value* value) { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(value); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::Value> new_value(value); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* current_value; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool in_storage = storage_.Get(key, ¤t_value); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't do anything if |storage_| already contains <|key|, |new_value|> pair. 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (in_storage && new_value->Equals(current_value)) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) changes_.Set(key, new_value->DeepCopy()); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) storage_.Set(key, new_value.release()); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 133