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 17 namespace rlz_lib { 18 19 bool 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 31 void 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 51 static base::LazyInstance<std::string>::Leaky g_supplemental_branding; 52 53 SupplementaryBranding::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 71 SupplementaryBranding::~SupplementaryBranding() { 72 if (lock_->GetStore()) 73 g_supplemental_branding.Get().clear(); 74 delete lock_; 75 } 76 77 // static 78 const std::string& SupplementaryBranding::GetBrand() { 79 return g_supplemental_branding.Get(); 80 } 81 82 } // namespace rlz_lib 83