prefs.cc revision 06c76a49bfd29c8abdb8abd5b646a6583783191a
1480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
23003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov// Use of this source code is governed by a BSD-style license that can be
33003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov// found in the LICENSE file.
43003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
53003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov#include "update_engine/prefs.h"
63003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
706c76a49bfd29c8abdb8abd5b646a6583783191aBen Chan#include <base/files/file_util.h>
8362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov#include <base/logging.h>
975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/string_number_conversions.h>
1075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/string_util.h>
11362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov
123003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov#include "update_engine/utils.h"
133003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
143003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovusing std::string;
153003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
163003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovnamespace chromeos_update_engine {
173003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
1875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenkobool Prefs::Init(const base::FilePath& prefs_dir) {
193003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  prefs_dir_ = prefs_dir;
203003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
213003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
223003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
233003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::GetString(const string& key, string* value) {
2475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  base::FilePath filename;
253003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
2675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  if (!base::ReadFileToString(filename, value)) {
2708fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan    LOG(INFO) << key << " not present in " << prefs_dir_.value();
2834e41a1b50ccd06f5b3dad7a1ab1d467c7e8e00eAndrew de los Reyes    return false;
2934e41a1b50ccd06f5b3dad7a1ab1d467c7e8e00eAndrew de los Reyes  }
303003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
313003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
323003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
333003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::SetString(const std::string& key, const std::string& value) {
3475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  base::FilePath filename;
353003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
3675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  TEST_AND_RETURN_FALSE(base::CreateDirectory(filename.DirName()));
37736fcb57ca2dcf09710a797e4c23a64f6cd64e16Ben Chan  TEST_AND_RETURN_FALSE(base::WriteFile(filename, value.data(), value.size()) ==
38736fcb57ca2dcf09710a797e4c23a64f6cd64e16Ben Chan                        static_cast<int>(value.size()));
393003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
403003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
413003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
423003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::GetInt64(const string& key, int64_t* value) {
433003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  string str_value;
4408fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  if (!GetString(key, &str_value))
4508fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan    return false;
46736fcb57ca2dcf09710a797e4c23a64f6cd64e16Ben Chan  base::TrimWhitespaceASCII(str_value, base::TRIM_ALL, &str_value);
47790e62e2d8114647b0785574bea361cf931c482bChris Masone  TEST_AND_RETURN_FALSE(base::StringToInt64(str_value, value));
483003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
493003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
503003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
513003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkovbool Prefs::SetInt64(const string& key, const int64_t value) {
52790e62e2d8114647b0785574bea361cf931c482bChris Masone  return SetString(key, base::Int64ToString(value));
533003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
543003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
55efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymobool Prefs::GetBoolean(const std::string& key, bool* value) {
56efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  string str_value;
57efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  if (!GetString(key, &str_value))
58efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo    return false;
59736fcb57ca2dcf09710a797e4c23a64f6cd64e16Ben Chan  base::TrimWhitespaceASCII(str_value, base::TRIM_ALL, &str_value);
60efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  if (str_value == "false") {
61efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo    *value = false;
62efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo    return true;
63efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  }
64efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  if (str_value == "true") {
65efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo    *value = true;
66efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo    return true;
67efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  }
68efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  return false;
69efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo}
70efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo
71efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymobool Prefs::SetBoolean(const std::string& key, const bool value) {
72efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo  return SetString(key, value ? "true" : "false");
73efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo}
74efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo
75480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanbool Prefs::Exists(const string& key) {
7675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  base::FilePath filename;
77480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
7875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  return base::PathExists(filename);
79480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
80480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
81480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanbool Prefs::Delete(const string& key) {
8275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  base::FilePath filename;
83480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename));
8475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  return base::DeleteFile(filename, false);
85480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
86480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenkobool Prefs::GetFileNameForKey(const std::string& key,
8875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                              base::FilePath* filename) {
893003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  // Allows only non-empty keys containing [A-Za-z0-9_-].
903003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  TEST_AND_RETURN_FALSE(!key.empty());
913003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  for (size_t i = 0; i < key.size(); ++i) {
923003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov    char c = key.at(i);
933003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov    TEST_AND_RETURN_FALSE(IsAsciiAlpha(c) || IsAsciiDigit(c) ||
943003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov                          c == '_' || c == '-');
953003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  }
963003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  *filename = prefs_dir_.Append(key);
973003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov  return true;
983003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}
993003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov
1003003059032a7ac8a49f1bdd9fda2d58becec8374Darin Petkov}  // namespace chromeos_update_engine
101