blob: 1f56837ece762cd86892283f819607abc5b501bc [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_POLICY_CLOUD_RESOURCE_CACHE_H_
#define CHROME_BROWSER_POLICY_CLOUD_RESOURCE_CACHE_H_
#include <map>
#include <set>
#include <string>
#include "base/basictypes.h"
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
namespace base {
class SequencedTaskRunner;
}
namespace policy {
// Manages storage of data at a given path. The data is keyed by a key and
// a subkey, and can be queried by (key, subkey) or (key) lookups.
// The contents of the cache have to be manually cleared using Delete() or
// PurgeOtherSubkeys().
// The class can be instantiated on any thread but from then on, it must be
// accessed via the |task_runner| only. The |task_runner| must support file I/O.
class ResourceCache {
public:
explicit ResourceCache(const base::FilePath& cache_path,
scoped_refptr<base::SequencedTaskRunner> task_runner);
virtual ~ResourceCache();
// Stores |data| under (key, subkey). Returns true if the store suceeded, and
// false otherwise.
bool Store(const std::string& key,
const std::string& subkey,
const std::string& data);
// Loads the contents of (key, subkey) into |data| and returns true. Returns
// false if (key, subkey) isn't found or if there is a problem reading the
// data.
bool Load(const std::string& key,
const std::string& subkey,
std::string* data);
// Loads all the subkeys of |key| into |contents|.
void LoadAllSubkeys(const std::string& key,
std::map<std::string, std::string>* contents);
// Deletes (key, subkey).
void Delete(const std::string& key, const std::string& subkey);
// Deletes all keys not in |keys_to_keep|, along with their subkeys.
void PurgeOtherKeys(const std::set<std::string>& keys_to_keep);
// Deletes all the subkeys of |key| not in |subkeys_to_keep|.
void PurgeOtherSubkeys(const std::string& key,
const std::set<std::string>& subkeys_to_keep);
private:
// Points |path| at the cache directory for |key| and returns whether the
// directory exists. If |allow_create| is |true|, the directory is created if
// it did not exist yet.
bool VerifyKeyPath(const std::string& key,
bool allow_create,
base::FilePath* path);
// Points |path| at the file in which data for (key, subkey) should be stored
// and returns whether the parent directory of this file exists. If
// |allow_create_key| is |true|, the directory is created if it did not exist
// yet. This method does not check whether the file at |path| exists or not.
bool VerifyKeyPathAndGetSubkeyPath(const std::string& key,
bool allow_create_key,
const std::string& subkey,
base::FilePath* subkey_path);
base::FilePath cache_dir_;
// Task runner that |this| runs on.
scoped_refptr<base::SequencedTaskRunner> task_runner_;
DISALLOW_COPY_AND_ASSIGN(ResourceCache);
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_CLOUD_RESOURCE_CACHE_H_