| OLD | NEW |
| (Empty) |
| 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 #ifndef RLZ_VALUE_STORE_H_ | |
| 6 #define RLZ_VALUE_STORE_H_ | |
| 7 | |
| 8 #include "base/basictypes.h" | |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "rlz/lib/rlz_enums.h" | |
| 11 | |
| 12 #if defined(OS_WIN) | |
| 13 #include "rlz/win/lib/lib_mutex.h" | |
| 14 #endif | |
| 15 | |
| 16 #if defined(OS_MACOSX) | |
| 17 #include "base/mac/scoped_nsautorelease_pool.h" | |
| 18 #endif | |
| 19 | |
| 20 | |
| 21 #include <string> | |
| 22 #include <vector> | |
| 23 | |
| 24 class FilePath; | |
| 25 | |
| 26 namespace rlz_lib { | |
| 27 | |
| 28 // Abstracts away rlz's key value store. On windows, this usually writes to | |
| 29 // the registry. On mac, it writes to an NSDefaults object. | |
| 30 class RlzValueStore { | |
| 31 public: | |
| 32 virtual ~RlzValueStore() {} | |
| 33 | |
| 34 enum AccessType { kReadAccess, kWriteAccess }; | |
| 35 virtual bool HasAccess(AccessType type) = 0; | |
| 36 | |
| 37 // Ping times. | |
| 38 virtual bool WritePingTime(Product product, int64 time) = 0; | |
| 39 virtual bool ReadPingTime(Product product, int64* time) = 0; | |
| 40 virtual bool ClearPingTime(Product product) = 0; | |
| 41 | |
| 42 // Access point RLZs. | |
| 43 virtual bool WriteAccessPointRlz(AccessPoint access_point, | |
| 44 const char* new_rlz) = 0; | |
| 45 virtual bool ReadAccessPointRlz(AccessPoint access_point, | |
| 46 char* rlz, // At most kMaxRlzLength + 1 bytes | |
| 47 size_t rlz_size) = 0; | |
| 48 virtual bool ClearAccessPointRlz(AccessPoint access_point) = 0; | |
| 49 | |
| 50 // Product events. | |
| 51 // Stores |event_rlz| for product |product| as product event. | |
| 52 virtual bool AddProductEvent(Product product, const char* event_rlz) = 0; | |
| 53 // Appends all events for |product| to |events|, in arbirtrary order. | |
| 54 virtual bool ReadProductEvents(Product product, | |
| 55 std::vector<std::string>* events) = 0; | |
| 56 // Removes the stored event |event_rlz| for |product| if it exists. | |
| 57 virtual bool ClearProductEvent(Product product, const char* event_rlz) = 0; | |
| 58 // Removes all stored product events for |product|. | |
| 59 virtual bool ClearAllProductEvents(Product product) = 0; | |
| 60 | |
| 61 // Stateful events. | |
| 62 // Stores |event_rlz| for product |product| as stateful event. | |
| 63 virtual bool AddStatefulEvent(Product product, const char* event_rlz) = 0; | |
| 64 // Checks if |event_rlz| has been stored as stateful event for |product|. | |
| 65 virtual bool IsStatefulEvent(Product product, const char* event_rlz) = 0; | |
| 66 // Removes all stored stateful events for |product|. | |
| 67 virtual bool ClearAllStatefulEvents(Product product) = 0; | |
| 68 | |
| 69 // Tells the value store to clean up unimportant internal data structures, for | |
| 70 // example empty registry folders, that might remain after clearing other | |
| 71 // data. Best-effort. | |
| 72 virtual void CollectGarbage() = 0; | |
| 73 }; | |
| 74 | |
| 75 // All methods of RlzValueStore must stays consistent even when accessed from | |
| 76 // multiple threads in multiple processes. To enforce this through the type | |
| 77 // system, the only way to access the RlzValueStore is through a | |
| 78 // ScopedRlzValueStoreLock, which is a cross-process lock. It is active while | |
| 79 // it is in scope. If the class fails to acquire a lock, its GetStore() method | |
| 80 // returns NULL. If the lock fails to be acquired, it must not be taken | |
| 81 // recursively. That is, all user code should look like this: | |
| 82 // ScopedRlzValueStoreLock lock; | |
| 83 // RlzValueStore* store = lock.GetStore(); | |
| 84 // if (!store) | |
| 85 // return some_error_code; | |
| 86 // ... | |
| 87 class ScopedRlzValueStoreLock { | |
| 88 public: | |
| 89 ScopedRlzValueStoreLock(); | |
| 90 ~ScopedRlzValueStoreLock(); | |
| 91 | |
| 92 // Returns a RlzValueStore protected by a cross-process lock, or NULL if the | |
| 93 // lock can't be obtained. The lifetime of the returned object is limited to | |
| 94 // the lifetime of this ScopedRlzValueStoreLock object. | |
| 95 RlzValueStore* GetStore(); | |
| 96 | |
| 97 private: | |
| 98 scoped_ptr<RlzValueStore> store_; | |
| 99 #if defined(OS_WIN) | |
| 100 LibMutex lock_; | |
| 101 #else | |
| 102 base::mac::ScopedNSAutoreleasePool autorelease_pool_; | |
| 103 #endif | |
| 104 }; | |
| 105 | |
| 106 #if defined(OS_MACOSX) | |
| 107 namespace testing { | |
| 108 // Prefix |directory| to the path where the RLZ data file lives, for tests. | |
| 109 void SetRlzStoreDirectory(const FilePath& directory); | |
| 110 } // namespace testing | |
| 111 #endif // defined(OS_MACOSX) | |
| 112 | |
| 113 | |
| 114 } // namespace rlz_lib | |
| 115 | |
| 116 #endif // RLZ_VALUE_STORE_H_ | |
| OLD | NEW |