| Jay Srinivasan | 480ddfa | 2012-06-01 19:15:26 -0700 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 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 "update_engine/prefs.h" | 
 | 6 |  | 
| Darin Petkov | 3627577 | 2010-10-01 11:40:57 -0700 | [diff] [blame] | 7 | #include <base/file_util.h> | 
 | 8 | #include <base/logging.h> | 
 | 9 | #include <base/string_number_conversions.h> | 
 | 10 | #include <base/string_util.h> | 
 | 11 |  | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 12 | #include "update_engine/utils.h" | 
 | 13 |  | 
 | 14 | using std::string; | 
 | 15 |  | 
 | 16 | namespace chromeos_update_engine { | 
 | 17 |  | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 18 | bool Prefs::Init(const FilePath& prefs_dir) { | 
 | 19 |   prefs_dir_ = prefs_dir; | 
 | 20 |   return true; | 
 | 21 | } | 
 | 22 |  | 
 | 23 | bool Prefs::GetString(const string& key, string* value) { | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 24 |   FilePath filename; | 
 | 25 |   TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename)); | 
| Andrew de los Reyes | 34e41a1 | 2010-10-26 20:07:58 -0700 | [diff] [blame] | 26 |   if (!file_util::ReadFileToString(filename, value)) { | 
| Jay Srinivasan | 08fce04 | 2012-06-07 16:31:01 -0700 | [diff] [blame] | 27 |     LOG(INFO) << key << " not present in " << prefs_dir_.value(); | 
| Andrew de los Reyes | 34e41a1 | 2010-10-26 20:07:58 -0700 | [diff] [blame] | 28 |     return false; | 
 | 29 |   } | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 30 |   return true; | 
 | 31 | } | 
 | 32 |  | 
 | 33 | bool Prefs::SetString(const std::string& key, const std::string& value) { | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 34 |   FilePath filename; | 
 | 35 |   TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename)); | 
 | 36 |   TEST_AND_RETURN_FALSE(file_util::CreateDirectory(filename.DirName())); | 
 | 37 |   TEST_AND_RETURN_FALSE( | 
 | 38 |       file_util::WriteFile(filename, value.data(), value.size()) == | 
 | 39 |       static_cast<int>(value.size())); | 
 | 40 |   return true; | 
 | 41 | } | 
 | 42 |  | 
 | 43 | bool Prefs::GetInt64(const string& key, int64_t* value) { | 
 | 44 |   string str_value; | 
| Jay Srinivasan | 08fce04 | 2012-06-07 16:31:01 -0700 | [diff] [blame] | 45 |   if (!GetString(key, &str_value)) | 
 | 46 |     return false; | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 47 |   TrimWhitespaceASCII(str_value, TRIM_ALL, &str_value); | 
| Chris Masone | 790e62e | 2010-08-12 10:41:18 -0700 | [diff] [blame] | 48 |   TEST_AND_RETURN_FALSE(base::StringToInt64(str_value, value)); | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 49 |   return true; | 
 | 50 | } | 
 | 51 |  | 
 | 52 | bool Prefs::SetInt64(const string& key, const int64_t value) { | 
| Chris Masone | 790e62e | 2010-08-12 10:41:18 -0700 | [diff] [blame] | 53 |   return SetString(key, base::Int64ToString(value)); | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 54 | } | 
 | 55 |  | 
| Alex Deymo | efb7c4c | 2013-07-09 14:34:00 -0700 | [diff] [blame] | 56 | bool Prefs::GetBoolean(const std::string& key, bool* value) { | 
 | 57 |   string str_value; | 
 | 58 |   if (!GetString(key, &str_value)) | 
 | 59 |     return false; | 
 | 60 |   TrimWhitespaceASCII(str_value, TRIM_ALL, &str_value); | 
 | 61 |   if (str_value == "false") { | 
 | 62 |     *value = false; | 
 | 63 |     return true; | 
 | 64 |   } | 
 | 65 |   if (str_value == "true") { | 
 | 66 |     *value = true; | 
 | 67 |     return true; | 
 | 68 |   } | 
 | 69 |   return false; | 
 | 70 | } | 
 | 71 |  | 
 | 72 | bool Prefs::SetBoolean(const std::string& key, const bool value) { | 
 | 73 |   return SetString(key, value ? "true" : "false"); | 
 | 74 | } | 
 | 75 |  | 
| Jay Srinivasan | 480ddfa | 2012-06-01 19:15:26 -0700 | [diff] [blame] | 76 | bool Prefs::Exists(const string& key) { | 
 | 77 |   FilePath filename; | 
 | 78 |   TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename)); | 
 | 79 |   return file_util::PathExists(filename); | 
 | 80 | } | 
 | 81 |  | 
 | 82 | bool Prefs::Delete(const string& key) { | 
 | 83 |   FilePath filename; | 
 | 84 |   TEST_AND_RETURN_FALSE(GetFileNameForKey(key, &filename)); | 
 | 85 |   return file_util::Delete(filename, false); | 
 | 86 | } | 
 | 87 |  | 
| Darin Petkov | 3003059 | 2010-07-27 13:53:20 -0700 | [diff] [blame] | 88 | bool Prefs::GetFileNameForKey(const std::string& key, FilePath* filename) { | 
 | 89 |   // Allows only non-empty keys containing [A-Za-z0-9_-]. | 
 | 90 |   TEST_AND_RETURN_FALSE(!key.empty()); | 
 | 91 |   for (size_t i = 0; i < key.size(); ++i) { | 
 | 92 |     char c = key.at(i); | 
 | 93 |     TEST_AND_RETURN_FALSE(IsAsciiAlpha(c) || IsAsciiDigit(c) || | 
 | 94 |                           c == '_' || c == '-'); | 
 | 95 |   } | 
 | 96 |   *filename = prefs_dir_.Append(key); | 
 | 97 |   return true; | 
 | 98 | } | 
 | 99 |  | 
 | 100 | }  // namespace chromeos_update_engine |