chromecast_config.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1// Copyright 2014 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 "chromecast/common/chromecast_config.h"
6
7#include <string>
8
9#include "base/command_line.h"
10#include "base/file_util.h"
11#include "base/logging.h"
12#include "base/path_service.h"
13#include "base/prefs/json_pref_store.h"
14#include "base/prefs/pref_registry_simple.h"
15#include "base/prefs/pref_service_factory.h"
16#include "base/prefs/pref_store.h"
17#include "base/strings/string_number_conversions.h"
18#include "chromecast/common/cast_paths.h"
19#include "chromecast/common/pref_names.h"
20
21namespace chromecast {
22
23namespace {
24
25// Config file IO worker constants.
26const int kNumOfConfigFileIOWorkers = 1;
27const char kNameOfConfigFileIOWorkers[] = "ConfigFileIO";
28
29void UserPrefsLoadError(
30    PersistentPrefStore::PrefReadError* error_val,
31    PersistentPrefStore::PrefReadError error) {
32  DCHECK(error_val);
33  *error_val = error;
34}
35
36base::FilePath GetConfigPath() {
37  base::FilePath config_path;
38  CHECK(PathService::Get(FILE_CAST_CONFIG, &config_path));
39  return config_path;
40}
41
42}  // namespace
43
44// static
45ChromecastConfig* ChromecastConfig::g_instance_ = NULL;
46
47// static
48void ChromecastConfig::Create(PrefRegistrySimple* registry) {
49  DCHECK(g_instance_ == NULL);
50  g_instance_ = new ChromecastConfig();
51  g_instance_->Load(registry);
52}
53
54// static
55ChromecastConfig* ChromecastConfig::GetInstance() {
56  DCHECK(g_instance_ != NULL);
57  return g_instance_;
58}
59
60ChromecastConfig::ChromecastConfig()
61    : config_path_(GetConfigPath()),
62      worker_pool_(new base::SequencedWorkerPool(kNumOfConfigFileIOWorkers,
63                                                 kNameOfConfigFileIOWorkers)) {
64}
65
66ChromecastConfig::~ChromecastConfig() {
67  // Explict writing before worker_pool shutdown.
68  pref_service_->CommitPendingWrite();
69  worker_pool_->Shutdown();
70}
71
72bool ChromecastConfig::Load(PrefRegistrySimple* registry) {
73  DCHECK(thread_checker_.CalledOnValidThread());
74  VLOG(1) << "Loading config from " << config_path_.value();
75  registry->RegisterIntegerPref(prefs::kRemoteDebuggingPort, 0);
76
77  RegisterPlatformPrefs(registry);
78
79  PersistentPrefStore::PrefReadError prefs_read_error =
80      PersistentPrefStore::PREF_READ_ERROR_NONE;
81  base::PrefServiceFactory prefServiceFactory;
82  prefServiceFactory.SetUserPrefsFile(config_path_,
83      JsonPrefStore::GetTaskRunnerForFile(config_path_, worker_pool_));
84  prefServiceFactory.set_async(false);
85  prefServiceFactory.set_read_error_callback(
86      base::Bind(&UserPrefsLoadError, &prefs_read_error));
87  pref_service_ = prefServiceFactory.Create(registry);
88
89  if (prefs_read_error == PersistentPrefStore::PREF_READ_ERROR_NONE) {
90    return true;
91  } else {
92    LOG(ERROR) << "Cannot initialize chromecast config: "
93               << config_path_.value()
94               << ", pref_error=" << prefs_read_error;
95    return false;
96  }
97}
98
99void ChromecastConfig::Save() const {
100  DCHECK(thread_checker_.CalledOnValidThread());
101  VLOG(1) << "Saving config to: " << config_path_.value();
102  pref_service_->CommitPendingWrite();
103}
104
105const std::string ChromecastConfig::GetValue(const std::string& key) const {
106  DCHECK(thread_checker_.CalledOnValidThread());
107  return pref_service_->GetString(key.c_str());
108}
109
110const int ChromecastConfig::GetIntValue(const std::string& key) const {
111  return pref_service_->GetInteger(key.c_str());
112}
113
114void ChromecastConfig::SetValue(
115    const std::string& key,
116    const std::string& value) const {
117  DCHECK(thread_checker_.CalledOnValidThread());
118  if (pref_service_->IsUserModifiablePreference(key.c_str())) {
119    VLOG(1) << "Set config: key=" << key << ", value=" << value;
120    pref_service_->SetString(key.c_str(), value);
121  } else {
122    LOG(ERROR) << "Cannot set read-only config: key=" << key
123               << ", value=" << value;
124  }
125}
126
127void ChromecastConfig::SetIntValue(const std::string& key, int value) const {
128  DCHECK(thread_checker_.CalledOnValidThread());
129  if (pref_service_->IsUserModifiablePreference(key.c_str())) {
130    VLOG(1) << "Set config: key=" << key << ", value=" << value;
131    pref_service_->SetInteger(key.c_str(), value);
132  } else {
133    LOG(ERROR) << "Cannot set read-only config: key=" << key
134               << ", value=" << value;
135  }
136}
137
138}  // namespace chromecast
139