Home | History | Annotate | Download | only in cloud
      1 // Copyright (c) 2013 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 COMPONENTS_POLICY_CORE_COMMON_CLOUD_RESOURCE_CACHE_H_
      6 #define COMPONENTS_POLICY_CORE_COMMON_CLOUD_RESOURCE_CACHE_H_
      7 
      8 #include <map>
      9 #include <set>
     10 #include <string>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/callback_forward.h"
     14 #include "base/files/file_path.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "components/policy/policy_export.h"
     17 
     18 namespace base {
     19 class SequencedTaskRunner;
     20 }
     21 
     22 namespace policy {
     23 
     24 // Manages storage of data at a given path. The data is keyed by a key and
     25 // a subkey, and can be queried by (key, subkey) or (key) lookups.
     26 // The contents of the cache have to be manually cleared using Delete() or
     27 // Purge*().
     28 // The class can be instantiated on any thread but from then on, it must be
     29 // accessed via the |task_runner| only. The |task_runner| must support file I/O.
     30 class POLICY_EXPORT ResourceCache {
     31  public:
     32   explicit ResourceCache(const base::FilePath& cache_path,
     33                          scoped_refptr<base::SequencedTaskRunner> task_runner);
     34   virtual ~ResourceCache();
     35 
     36   // Stores |data| under (key, subkey). Returns true if the store suceeded, and
     37   // false otherwise.
     38   bool Store(const std::string& key,
     39              const std::string& subkey,
     40              const std::string& data);
     41 
     42   // Loads the contents of (key, subkey) into |data| and returns true. Returns
     43   // false if (key, subkey) isn't found or if there is a problem reading the
     44   // data.
     45   bool Load(const std::string& key,
     46             const std::string& subkey,
     47             std::string* data);
     48 
     49   // Loads all the subkeys of |key| into |contents|.
     50   void LoadAllSubkeys(const std::string& key,
     51                       std::map<std::string, std::string>* contents);
     52 
     53   // Deletes (key, subkey).
     54   void Delete(const std::string& key, const std::string& subkey);
     55 
     56   // Deletes all the subkeys of |key|.
     57   void Clear(const std::string& key);
     58 
     59   // Deletes the subkeys of |key| for which the |filter| returns true.
     60   typedef base::Callback<bool(const std::string&)> SubkeyFilter;
     61   void FilterSubkeys(const std::string& key, const SubkeyFilter& filter);
     62 
     63   // Deletes all keys not in |keys_to_keep|, along with their subkeys.
     64   void PurgeOtherKeys(const std::set<std::string>& keys_to_keep);
     65 
     66   // Deletes all the subkeys of |key| not in |subkeys_to_keep|.
     67   void PurgeOtherSubkeys(const std::string& key,
     68                          const std::set<std::string>& subkeys_to_keep);
     69 
     70  private:
     71   // Points |path| at the cache directory for |key| and returns whether the
     72   // directory exists. If |allow_create| is |true|, the directory is created if
     73   // it did not exist yet.
     74   bool VerifyKeyPath(const std::string& key,
     75                      bool allow_create,
     76                      base::FilePath* path);
     77 
     78   // Points |path| at the file in which data for (key, subkey) should be stored
     79   // and returns whether the parent directory of this file exists. If
     80   // |allow_create_key| is |true|, the directory is created if it did not exist
     81   // yet. This method does not check whether the file at |path| exists or not.
     82   bool VerifyKeyPathAndGetSubkeyPath(const std::string& key,
     83                                      bool allow_create_key,
     84                                      const std::string& subkey,
     85                                      base::FilePath* subkey_path);
     86 
     87   base::FilePath cache_dir_;
     88 
     89   // Task runner that |this| runs on.
     90   scoped_refptr<base::SequencedTaskRunner> task_runner_;
     91 
     92   DISALLOW_COPY_AND_ASSIGN(ResourceCache);
     93 };
     94 
     95 }  // namespace policy
     96 
     97 #endif  // COMPONENTS_POLICY_CORE_COMMON_CLOUD_RESOURCE_CACHE_H_
     98