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