blob: e25e572fb44161a3d3d44580ae548f69fcb30d35 [file] [log] [blame]
// Copyright (c) 2012 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 COMPONENTS_DRIVE_CHROMEOS_RESOURCE_METADATA_H_
#define COMPONENTS_DRIVE_CHROMEOS_RESOURCE_METADATA_H_
#include <stdint.h>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
#include "base/threading/thread_checker.h"
#include "components/drive/file_errors.h"
#include "components/drive/resource_metadata_storage.h"
namespace base {
class SequencedTaskRunner;
}
namespace drive {
typedef std::vector<ResourceEntry> ResourceEntryVector;
namespace internal {
class FileCache;
// Storage for Drive Metadata.
// All methods except the constructor and Destroy() function must be run with
// |blocking_task_runner| unless otherwise noted.
class ResourceMetadata {
public:
typedef ResourceMetadataStorage::Iterator Iterator;
ResourceMetadata(
ResourceMetadataStorage* storage,
FileCache* cache,
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
// Initializes this object.
// This method should be called before any other methods.
FileError Initialize() WARN_UNUSED_RESULT;
// Destroys this object. This method posts a task to |blocking_task_runner_|
// to safely delete this object.
// Must be called on the UI thread.
void Destroy();
// Resets this object.
FileError Reset();
// Returns the largest changestamp.
FileError GetLargestChangestamp(int64_t* out_value);
// Sets the largest changestamp.
FileError SetLargestChangestamp(int64_t value);
// Adds |entry| to the metadata tree based on its parent_local_id.
FileError AddEntry(const ResourceEntry& entry, std::string* out_id);
// Removes entry with |id| from its parent.
FileError RemoveEntry(const std::string& id);
// Finds an entry (a file or a directory) by |id|.
FileError GetResourceEntryById(const std::string& id,
ResourceEntry* out_entry);
// Synchronous version of GetResourceEntryByPathOnUIThread().
FileError GetResourceEntryByPath(const base::FilePath& file_path,
ResourceEntry* out_entry);
// Finds and reads a directory by |file_path|.
FileError ReadDirectoryByPath(const base::FilePath& file_path,
ResourceEntryVector* out_entries);
// Finds and reads a directory by |id|.
FileError ReadDirectoryById(const std::string& id,
ResourceEntryVector* out_entries);
// Replaces an existing entry with the same local ID as |entry|.
FileError RefreshEntry(const ResourceEntry& entry);
// Recursively gets directories under the entry pointed to by |id|.
FileError GetSubDirectoriesRecursively(
const std::string& id,
std::set<base::FilePath>* sub_directories);
// Returns the id of the resource named |base_name| directly under
// the directory with |parent_local_id|.
// If not found, empty string will be returned.
FileError GetChildId(const std::string& parent_local_id,
const std::string& base_name,
std::string* out_child_id);
// Returns an object to iterate over entries.
std::unique_ptr<Iterator> GetIterator();
// Returns virtual file path of the entry.
FileError GetFilePath(const std::string& id, base::FilePath* out_file_path);
// Returns ID of the entry at the given path.
FileError GetIdByPath(const base::FilePath& file_path, std::string* out_id);
// Returns the local ID associated with the given resource ID.
FileError GetIdByResourceId(const std::string& resource_id,
std::string* out_local_id);
private:
// Note: Use Destroy() to delete this object.
~ResourceMetadata();
// Sets up entries which should be present by default.
FileError SetUpDefaultEntries();
// Used to implement Destroy().
void DestroyOnBlockingPool();
// Puts an entry under its parent directory. Removes the child from the old
// parent if there is. This method will also do name de-duplication to ensure
// that the exposed presentation path does not have naming conflicts. Two
// files with the same name "Foo" will be renamed to "Foo (1)" and "Foo (2)".
FileError PutEntryUnderDirectory(const ResourceEntry& entry);
// Returns an unused base name for |entry|.
FileError GetDeduplicatedBaseName(const ResourceEntry& entry,
std::string* base_name);
// Removes the entry and its descendants.
FileError RemoveEntryRecursively(const std::string& id);
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
ResourceMetadataStorage* storage_;
FileCache* cache_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(ResourceMetadata);
};
} // namespace internal
} // namespace drive
#endif // COMPONENTS_DRIVE_CHROMEOS_RESOURCE_METADATA_H_