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