1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// The methods in this file belong conceptually to rlz_lib.cc. However, some 6// programs depend on rlz only to call ClearAllProductEvents(), so this file 7// contains this in fairly self-contained form to make it easier for linkers 8// to strip away most of rlz. In particular, this file should not reference any 9// symbols defined in financial_ping.cc. 10 11#include "rlz/lib/rlz_lib.h" 12 13#include "base/lazy_instance.h" 14#include "rlz/lib/assert.h" 15#include "rlz/lib/rlz_value_store.h" 16 17namespace rlz_lib { 18 19bool ClearAllProductEvents(Product product) { 20 rlz_lib::ScopedRlzValueStoreLock lock; 21 rlz_lib::RlzValueStore* store = lock.GetStore(); 22 if (!store || !store->HasAccess(rlz_lib::RlzValueStore::kWriteAccess)) 23 return false; 24 25 bool result; 26 result = store->ClearAllProductEvents(product); 27 result &= store->ClearAllStatefulEvents(product); 28 return result; 29} 30 31void ClearProductState(Product product, const AccessPoint* access_points) { 32 rlz_lib::ScopedRlzValueStoreLock lock; 33 rlz_lib::RlzValueStore* store = lock.GetStore(); 34 if (!store || !store->HasAccess(rlz_lib::RlzValueStore::kWriteAccess)) 35 return; 36 37 // Delete all product specific state. 38 VERIFY(ClearAllProductEvents(product)); 39 VERIFY(store->ClearPingTime(product)); 40 41 // Delete all RLZ's for access points being uninstalled. 42 if (access_points) { 43 for (int i = 0; access_points[i] != NO_ACCESS_POINT; i++) { 44 VERIFY(store->ClearAccessPointRlz(access_points[i])); 45 } 46 } 47 48 store->CollectGarbage(); 49} 50 51static base::LazyInstance<std::string>::Leaky g_supplemental_branding; 52 53SupplementaryBranding::SupplementaryBranding(const char* brand) 54 : lock_(new ScopedRlzValueStoreLock) { 55 if (!lock_->GetStore()) 56 return; 57 58 if (!g_supplemental_branding.Get().empty()) { 59 ASSERT_STRING("ProductBranding: existing brand is not empty"); 60 return; 61 } 62 63 if (brand == NULL || brand[0] == 0) { 64 ASSERT_STRING("ProductBranding: new brand is empty"); 65 return; 66 } 67 68 g_supplemental_branding.Get() = brand; 69} 70 71SupplementaryBranding::~SupplementaryBranding() { 72 if (lock_->GetStore()) 73 g_supplemental_branding.Get().clear(); 74 delete lock_; 75} 76 77// static 78const std::string& SupplementaryBranding::GetBrand() { 79 return g_supplemental_branding.Get(); 80} 81 82} // namespace rlz_lib 83