1 // Copyright (c) 2011 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/signed_settings_temp_storage.h"
6
7 #include "base/lazy_instance.h"
8 #include "base/values.h"
9 #include "chrome/browser/chromeos/login/ownership_service.h"
10 #include "chrome/browser/chromeos/login/signed_settings.h"
11 #include "chrome/browser/prefs/pref_service.h"
12 #include "chrome/browser/prefs/scoped_user_pref_update.h"
13 #include "chrome/common/pref_names.h"
14
15 static base::LazyInstance<chromeos::SignedSettings::Delegate<bool> >
16 g_signed_settings_delegate(base::LINKER_INITIALIZED);
17
18 namespace chromeos {
19
20 // static
RegisterPrefs(PrefService * local_state)21 void SignedSettingsTempStorage::RegisterPrefs(PrefService* local_state) {
22 local_state->RegisterDictionaryPref(prefs::kSignedSettingsTempStorage);
23 }
24
25 // static
Store(const std::string & name,const std::string & value,PrefService * local_state)26 bool SignedSettingsTempStorage::Store(const std::string& name,
27 const std::string& value,
28 PrefService* local_state) {
29 if (local_state) {
30 DictionaryPrefUpdate temp_storage_update(
31 local_state, prefs::kSignedSettingsTempStorage);
32 temp_storage_update->SetWithoutPathExpansion(
33 name, Value::CreateStringValue(value));
34 return true;
35 }
36 return false;
37 }
38
39 // static
Retrieve(const std::string & name,std::string * value,PrefService * local_state)40 bool SignedSettingsTempStorage::Retrieve(const std::string& name,
41 std::string* value,
42 PrefService* local_state) {
43 if (local_state) {
44 const DictionaryValue* temp_storage =
45 local_state->GetDictionary(prefs::kSignedSettingsTempStorage);
46 if (temp_storage && temp_storage->HasKey(name)) {
47 temp_storage->GetStringWithoutPathExpansion(name, value);
48 return true;
49 }
50 }
51 return false;
52 }
53
54 // static
Finalize(PrefService * local_state)55 void SignedSettingsTempStorage::Finalize(PrefService* local_state) {
56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
57 if (local_state) {
58 const DictionaryValue* temp_storage =
59 local_state->GetDictionary(prefs::kSignedSettingsTempStorage);
60 if (temp_storage) {
61 // We've stored some settings in transient storage
62 // before owner has been assigned.
63 // Now owner is assigned and key is generated and we should persist
64 // those settings into signed storage.
65 for (DictionaryValue::key_iterator it = temp_storage->begin_keys();
66 it != temp_storage->end_keys();
67 ++it) {
68 std::string value;
69 temp_storage->GetStringWithoutPathExpansion(*it, &value);
70 SignedSettings::CreateStorePropertyOp(
71 *it, value,
72 g_signed_settings_delegate.Pointer())->Execute();
73 }
74 local_state->ClearPref(prefs::kSignedSettingsTempStorage);
75 }
76 }
77 }
78
79 } // namespace chromeos
80