Home | History | Annotate | Download | only in lib
      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