rlz_value_store_chromeos.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/chromeos/lib/rlz_value_store_chromeos.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/json_pref_store.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_number_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/lib_values.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/recursive_lock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/rlz_lib.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace rlz_lib {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Product names.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductChrome[] = "chrome";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductOther[] = "other";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key names.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPingTimeKey[] = "ping_time";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAccessPointKey[] = "access_points";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductEventKey[] = "product_events";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStatefulEventKey[] = "stateful_events";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brand name used when there is no supplementary brand name.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNoSupplementaryBrand[] = "_";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RLZ store filename.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FilePath::CharType kRLZDataFileName[] = FILE_PATH_LITERAL("RLZ Data");
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RLZ store path for testing.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilePath g_testing_rlz_store_path_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns file path of the RLZ storage.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilePath GetRlzStorePath() {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_testing_rlz_store_path_.empty() ?
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_util::GetHomeDir().Append(kRLZDataFileName) :
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_testing_rlz_store_path_.Append(kRLZDataFileName);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the dictionary key for storing access point-related prefs.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetKeyName(std::string key, AccessPoint access_point) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string brand = SupplementaryBranding::GetBrand();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (brand.empty())
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    brand = kNoSupplementaryBrand;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return key + "." + GetAccessPointName(access_point) + "." + brand;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the dictionary key for storing product-related prefs.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetKeyName(std::string key, Product product) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string brand = SupplementaryBranding::GetBrand();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (brand.empty())
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    brand = kNoSupplementaryBrand;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return key + "." + GetProductName(product) + "." + brand;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::SequencedTaskRunner* RlzValueStoreChromeOS::io_task_runner_ = NULL;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::created_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RlzValueStoreChromeOS* RlzValueStoreChromeOS::GetInstance() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<RlzValueStoreChromeOS>::get();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzValueStoreChromeOS::SetIOTaskRunner(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SequencedTaskRunner* io_task_runner) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_task_runner_ = io_task_runner;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure |io_task_runner_| lives until constructor is called.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_task_runner_->AddRef();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzValueStoreChromeOS::ResetForTesting() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we don't create an instance if it didn't exist.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (created_)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetInstance()->ReadPrefs();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RlzValueStoreChromeOS::RlzValueStoreChromeOS() {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadPrefs();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created_ = true;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RlzValueStoreChromeOS::~RlzValueStoreChromeOS() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::HasAccess(AccessType type) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type == kReadAccess || !rlz_store_->ReadOnly();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::WritePingTime(Product product, int64 time) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value = base::Int64ToString(time);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->SetValue(GetKeyName(kPingTimeKey, product),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Value::CreateStringValue(value));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ReadPingTime(Product product, int64* time) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Value* value = NULL;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->GetValue(GetKeyName(kPingTimeKey, product), &value);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string s_value;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value && value->GetAsString(&s_value) &&
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringToInt64(s_value, time);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ClearPingTime(Product product) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->RemoveValue(GetKeyName(kPingTimeKey, product));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::WriteAccessPointRlz(AccessPoint access_point,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const char* new_rlz) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->SetValue(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetKeyName(kAccessPointKey, access_point),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Value::CreateStringValue(new_rlz));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ReadAccessPointRlz(AccessPoint access_point,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               char* rlz,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               size_t rlz_size) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Value* value = NULL;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->GetValue(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetKeyName(kAccessPointKey, access_point), &value);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string s_value;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->GetAsString(&s_value);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (s_value.size() < rlz_size) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strncpy(rlz, s_value.c_str(), rlz_size);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rlz_size > 0)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *rlz = '\0';
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ClearAccessPointRlz(AccessPoint access_point) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->RemoveValue(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetKeyName(kAccessPointKey, access_point));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::AddProductEvent(Product product,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const char* event_rlz) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddValueToList(GetKeyName(kProductEventKey, product),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::Value::CreateStringValue(event_rlz));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ReadProductEvents(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Product product,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string>* events) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* events_list = GetList(GetKeyName(kProductEventKey, product));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!events_list)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events->clear();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < events_list->GetSize(); ++i) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string event;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (events_list->GetString(i, &event))
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      events->push_back(event);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ClearProductEvent(Product product,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const char* event_rlz) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue event_value(event_rlz);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RemoveValueFromList(GetKeyName(kProductEventKey, product),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             event_value);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ClearAllProductEvents(Product product) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->RemoveValue(GetKeyName(kProductEventKey, product));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::AddStatefulEvent(Product product,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const char* event_rlz) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddValueToList(GetKeyName(kStatefulEventKey, product),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::Value::CreateStringValue(event_rlz));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::IsStatefulEvent(Product product,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const char* event_rlz) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* events_list =
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetList(GetKeyName(kStatefulEventKey, product));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue event_value(event_rlz);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return events_list && events_list->Find(event_value) != events_list->end();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::ClearAllStatefulEvents(Product product) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->RemoveValue(GetKeyName(kStatefulEventKey, product));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzValueStoreChromeOS::CollectGarbage() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RlzValueStoreChromeOS::ReadPrefs() {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(io_task_runner_)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Calling GetInstance or ResetForTesting before SetIOTaskRunner?";
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_ = new JsonPrefStore(GetRlzStorePath(), io_task_runner_);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->ReadPrefs();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (rlz_store_->GetReadError()) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PersistentPrefStore::PREF_READ_ERROR_NONE:
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PersistentPrefStore::PREF_READ_ERROR_NO_FILE:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Error read RLZ store: " << rlz_store_->GetReadError();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore refcount modified by SetIOTaskRunner().
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_task_runner_->Release();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_task_runner_ = NULL;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ListValue* RlzValueStoreChromeOS::GetList(std::string list_name) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* list_value = NULL;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->GetMutableValue(list_name, &list_value);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = NULL;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list_value || !list_value->GetAsList(&list))
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::AddValueToList(std::string list_name,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           base::Value* value) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = GetList(list_name);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list = new base::ListValue;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_store_->SetValue(list_name, list);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list->AppendIfNotPresent(value))
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_store_->ReportValueChanged(list_name);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RlzValueStoreChromeOS::RemoveValueFromList(std::string list_name,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const base::Value& value) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = GetList(list_name);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_store_->MarkNeedsEmptyValue(list_name);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t index;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list->Remove(value, &index))
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rlz_store_->ReportValueChanged(list_name);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedRlzValueStoreLock::ScopedRlzValueStoreLock()
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : store_(RlzValueStoreChromeOS::GetInstance()) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(store_->CalledOnValidThread());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedRlzValueStoreLock::~ScopedRlzValueStoreLock() {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RlzValueStore* ScopedRlzValueStoreLock::GetStore() {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return store_;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace testing {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetRlzStoreDirectory(const FilePath& directory) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_testing_rlz_store_path_ = directory;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace testing
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace rlz_lib
285