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
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/login/startup_utils.h"
8 #include "base/file_util.h"
9 #include "base/path_service.h"
10 #include "base/prefs/pref_registry_simple.h"
11 #include "base/prefs/pref_service.h"
12 #include "base/sys_info.h"
13 #include "base/threading/thread_restrictions.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/common/chrome_paths.h"
16 #include "chrome/common/pref_names.h"
17 #include "content/public/browser/browser_thread.h"
18 #include "ui/base/l10n/l10n_util.h"
20 using content::BrowserThread;
24 // Saves boolean "Local State" preference and forces its persistence to disk.
25 void SaveBoolPreferenceForced(const char* pref_name, bool value) {
26 PrefService* prefs = g_browser_process->local_state();
27 prefs->SetBoolean(pref_name, value);
28 prefs->CommitPendingWrite();
31 // Saves integer "Local State" preference and forces its persistence to disk.
32 void SaveIntegerPreferenceForced(const char* pref_name, int value) {
33 PrefService* prefs = g_browser_process->local_state();
34 prefs->SetInteger(pref_name, value);
35 prefs->CommitPendingWrite();
38 // Saves string "Local State" preference and forces its persistence to disk.
39 void SaveStringPreferenceForced(const char* pref_name,
40 const std::string& value) {
41 PrefService* prefs = g_browser_process->local_state();
42 prefs->SetString(pref_name, value);
43 prefs->CommitPendingWrite();
51 void StartupUtils::RegisterPrefs(PrefRegistrySimple* registry) {
52 registry->RegisterBooleanPref(prefs::kOobeComplete, false);
53 registry->RegisterStringPref(prefs::kOobeScreenPending, "");
54 registry->RegisterIntegerPref(prefs::kDeviceRegistered, -1);
55 registry->RegisterBooleanPref(prefs::kEnrollmentRecoveryRequired, false);
56 registry->RegisterStringPref(prefs::kInitialLocale, "en-US");
60 bool StartupUtils::IsEulaAccepted() {
61 return g_browser_process->local_state()->GetBoolean(prefs::kEulaAccepted);
65 bool StartupUtils::IsOobeCompleted() {
66 return g_browser_process->local_state()->GetBoolean(prefs::kOobeComplete);
70 void StartupUtils::MarkEulaAccepted() {
71 SaveBoolPreferenceForced(prefs::kEulaAccepted, true);
75 void StartupUtils::MarkOobeCompleted() {
76 // Forcing the second pref will force this one as well. Even if this one
77 // doesn't end up synced it is only going to eat up a couple of bytes with no
79 g_browser_process->local_state()->ClearPref(prefs::kOobeScreenPending);
80 SaveBoolPreferenceForced(prefs::kOobeComplete, true);
82 // Successful enrollment implies that recovery is not required.
83 SaveBoolPreferenceForced(prefs::kEnrollmentRecoveryRequired, false);
86 void StartupUtils::SaveOobePendingScreen(const std::string& screen) {
87 SaveStringPreferenceForced(prefs::kOobeScreenPending, screen);
90 // Returns the path to flag file indicating that both parts of OOBE were
92 // On chrome device, returns /home/chronos/.oobe_completed.
93 // On Linux desktop, returns {DIR_USER_DATA}/.oobe_completed.
94 static base::FilePath GetOobeCompleteFlagPath() {
95 // The constant is defined here so it won't be referenced directly.
96 const char kOobeCompleteFlagFilePath[] = "/home/chronos/.oobe_completed";
98 if (base::SysInfo::IsRunningOnChromeOS()) {
99 return base::FilePath(kOobeCompleteFlagFilePath);
101 base::FilePath user_data_dir;
102 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
103 return user_data_dir.AppendASCII(".oobe_completed");
107 static void CreateOobeCompleteFlagFile() {
108 // Create flag file for boot-time init scripts.
109 base::FilePath oobe_complete_path = GetOobeCompleteFlagPath();
110 if (!base::PathExists(oobe_complete_path)) {
111 FILE* oobe_flag_file = base::OpenFile(oobe_complete_path, "w+b");
112 if (oobe_flag_file == NULL)
113 DLOG(WARNING) << oobe_complete_path.value() << " doesn't exist.";
115 base::CloseFile(oobe_flag_file);
120 bool StartupUtils::IsDeviceRegistered() {
122 g_browser_process->local_state()->GetInteger(prefs::kDeviceRegistered);
124 // Recreate flag file in case it was lost.
125 BrowserThread::PostTask(
128 base::Bind(&CreateOobeCompleteFlagFile));
130 } else if (value == 0) {
133 // Pref is not set. For compatibility check flag file. It causes blocking
134 // IO on UI thread. But it's required for update from old versions.
135 base::ThreadRestrictions::ScopedAllowIO allow_io;
136 base::FilePath oobe_complete_flag_file_path = GetOobeCompleteFlagPath();
137 bool file_exists = base::PathExists(oobe_complete_flag_file_path);
138 SaveIntegerPreferenceForced(prefs::kDeviceRegistered, file_exists ? 1 : 0);
144 void StartupUtils::MarkDeviceRegistered(const base::Closure& done_callback) {
145 SaveIntegerPreferenceForced(prefs::kDeviceRegistered, 1);
146 if (done_callback.is_null()) {
147 BrowserThread::PostTask(
150 base::Bind(&CreateOobeCompleteFlagFile));
152 BrowserThread::PostTaskAndReply(
155 base::Bind(&CreateOobeCompleteFlagFile),
161 bool StartupUtils::IsEnrollmentRecoveryRequired() {
162 return g_browser_process->local_state()
163 ->GetBoolean(prefs::kEnrollmentRecoveryRequired);
167 void StartupUtils::MarkEnrollmentRecoveryRequired() {
168 SaveBoolPreferenceForced(prefs::kEnrollmentRecoveryRequired, true);
172 std::string StartupUtils::GetInitialLocale() {
174 g_browser_process->local_state()->GetString(prefs::kInitialLocale);
175 if (!l10n_util::IsValidLocaleSyntax(locale))
181 void StartupUtils::SetInitialLocale(const std::string& locale) {
182 if (l10n_util::IsValidLocaleSyntax(locale))
183 SaveStringPreferenceForced(prefs::kInitialLocale, locale);
188 } // namespace chromeos