Home | History | Annotate | Download | only in screens
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/login/screens/screen_context.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/memory/scoped_ptr.h"
      9 
     10 namespace chromeos {
     11 
     12 namespace {
     13 
     14 template <typename StringListType>
     15 base::ListValue* StringListToListValue(const StringListType& list) {
     16   base::ListValue* result = new base::ListValue();
     17   for (typename StringListType::const_iterator it = list.begin();
     18        it != list.end();
     19        ++it) {
     20     result->AppendString(*it);
     21   }
     22   return result;
     23 }
     24 
     25 }  // namespace
     26 
     27 ScreenContext::ScreenContext() {
     28 }
     29 
     30 ScreenContext::~ScreenContext() {
     31 }
     32 
     33 bool ScreenContext::SetBoolean(const KeyType& key, bool value) {
     34   return Set(key, new base::FundamentalValue(value));
     35 }
     36 
     37 bool ScreenContext::SetInteger(const KeyType& key, int value) {
     38   return Set(key, new base::FundamentalValue(value));
     39 }
     40 
     41 bool ScreenContext::SetDouble(const KeyType& key, double value) {
     42   return Set(key, new base::FundamentalValue(value));
     43 }
     44 
     45 bool ScreenContext::SetString(const KeyType& key, const std::string& value) {
     46   return Set(key, new base::StringValue(value));
     47 }
     48 
     49 bool ScreenContext::SetString(const KeyType& key, const base::string16& value) {
     50   return Set(key, new base::StringValue(value));
     51 }
     52 
     53 bool ScreenContext::SetStringList(const KeyType& key, const StringList& value) {
     54   return Set(key, StringListToListValue(value));
     55 }
     56 
     57 bool ScreenContext::SetString16List(const KeyType& key,
     58                                     const String16List& value) {
     59   return Set(key, StringListToListValue(value));
     60 }
     61 
     62 bool ScreenContext::GetBoolean(const KeyType& key) const {
     63   return Get<bool>(key);
     64 }
     65 
     66 bool ScreenContext::GetBoolean(const KeyType& key, bool default_value) const {
     67   return Get(key, default_value);
     68 }
     69 
     70 int ScreenContext::GetInteger(const KeyType& key) const {
     71   return Get<int>(key);
     72 }
     73 
     74 int ScreenContext::GetInteger(const KeyType& key, int default_value) const {
     75   return Get(key, default_value);
     76 }
     77 
     78 double ScreenContext::GetDouble(const KeyType& key) const {
     79   return Get<double>(key);
     80 }
     81 
     82 double ScreenContext::GetDouble(const KeyType& key,
     83                                 double default_value) const {
     84   return Get(key, default_value);
     85 }
     86 
     87 std::string ScreenContext::GetString(const KeyType& key) const {
     88   return Get<std::string>(key);
     89 }
     90 
     91 std::string ScreenContext::GetString(const KeyType& key,
     92                                      const std::string& default_value) const {
     93   return Get(key, default_value);
     94 }
     95 
     96 base::string16 ScreenContext::GetString16(const KeyType& key) const {
     97   return Get<base::string16>(key);
     98 }
     99 
    100 base::string16 ScreenContext::GetString16(
    101     const KeyType& key,
    102     const base::string16& default_value) const {
    103   return Get(key, default_value);
    104 }
    105 
    106 StringList ScreenContext::GetStringList(const KeyType& key) const {
    107   return Get<StringList>(key);
    108 }
    109 
    110 StringList ScreenContext::GetStringList(const KeyType& key,
    111                                         const StringList& default_value) const {
    112   return Get(key, default_value);
    113 }
    114 
    115 String16List ScreenContext::GetString16List(const KeyType& key) const {
    116   return Get<String16List>(key);
    117 }
    118 
    119 String16List ScreenContext::GetString16List(
    120     const KeyType& key,
    121     const String16List& default_value) const {
    122   return Get(key, default_value);
    123 }
    124 
    125 bool ScreenContext::HasKey(const KeyType& key) const {
    126   DCHECK(CalledOnValidThread());
    127   return storage_.HasKey(key);
    128 }
    129 
    130 bool ScreenContext::HasChanges() const {
    131   DCHECK(CalledOnValidThread());
    132   return !changes_.empty();
    133 }
    134 
    135 void ScreenContext::GetChangesAndReset(base::DictionaryValue* diff) {
    136   DCHECK(CalledOnValidThread());
    137   DCHECK(diff);
    138   changes_.Swap(diff);
    139   changes_.Clear();
    140 }
    141 
    142 void ScreenContext::ApplyChanges(const base::DictionaryValue& diff,
    143                                  std::vector<std::string>* keys) {
    144   DCHECK(CalledOnValidThread());
    145   DCHECK(!HasChanges());
    146   if (keys) {
    147     keys->clear();
    148     keys->reserve(diff.size());
    149   }
    150   base::DictionaryValue::Iterator it(diff);
    151   while (!it.IsAtEnd()) {
    152     Set(it.key(), it.value().DeepCopy());
    153     if (keys)
    154       keys->push_back(it.key());
    155     it.Advance();
    156   }
    157   changes_.Clear();
    158 }
    159 
    160 bool ScreenContext::Set(const KeyType& key, base::Value* value) {
    161   DCHECK(CalledOnValidThread());
    162   DCHECK(value);
    163   scoped_ptr<base::Value> new_value(value);
    164 
    165   base::Value* current_value;
    166   bool in_storage = storage_.Get(key, &current_value);
    167 
    168   // Don't do anything if |storage_| already contains <|key|, |new_value|> pair.
    169   if (in_storage && new_value->Equals(current_value))
    170     return false;
    171 
    172   changes_.Set(key, new_value->DeepCopy());
    173   storage_.Set(key, new_value.release());
    174   return true;
    175 }
    176 
    177 }  // namespace chromeos
    178