Home | History | Annotate | Download | only in drive
      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 CHROME_BROWSER_CHROMEOS_DRIVE_RESOURCE_METADATA_H_
      6 #define CHROME_BROWSER_CHROMEOS_DRIVE_RESOURCE_METADATA_H_
      7 
      8 #include <set>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/files/file_path.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "chrome/browser/chromeos/drive/file_errors.h"
     15 #include "chrome/browser/chromeos/drive/resource_metadata_storage.h"
     16 
     17 namespace base {
     18 class SequencedTaskRunner;
     19 }
     20 
     21 namespace drive {
     22 
     23 typedef std::vector<ResourceEntry> ResourceEntryVector;
     24 
     25 namespace internal {
     26 
     27 class FileCache;
     28 
     29 // Storage for Drive Metadata.
     30 // All methods except the constructor and Destroy() function must be run with
     31 // |blocking_task_runner| unless otherwise noted.
     32 class ResourceMetadata {
     33  public:
     34   typedef ResourceMetadataStorage::Iterator Iterator;
     35 
     36   ResourceMetadata(
     37       ResourceMetadataStorage* storage,
     38       FileCache* cache,
     39       scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
     40 
     41   // Initializes this object.
     42   // This method should be called before any other methods.
     43   FileError Initialize() WARN_UNUSED_RESULT;
     44 
     45   // Destroys this object.  This method posts a task to |blocking_task_runner_|
     46   // to safely delete this object.
     47   // Must be called on the UI thread.
     48   void Destroy();
     49 
     50   // Resets this object.
     51   FileError Reset();
     52 
     53   // Returns the largest changestamp.
     54   FileError GetLargestChangestamp(int64* out_value);
     55 
     56   // Sets the largest changestamp.
     57   FileError SetLargestChangestamp(int64 value);
     58 
     59   // Adds |entry| to the metadata tree based on its parent_local_id.
     60   FileError AddEntry(const ResourceEntry& entry, std::string* out_id);
     61 
     62   // Removes entry with |id| from its parent.
     63   FileError RemoveEntry(const std::string& id);
     64 
     65   // Finds an entry (a file or a directory) by |id|.
     66   FileError GetResourceEntryById(const std::string& id,
     67                                  ResourceEntry* out_entry);
     68 
     69   // Synchronous version of GetResourceEntryByPathOnUIThread().
     70   FileError GetResourceEntryByPath(const base::FilePath& file_path,
     71                                    ResourceEntry* out_entry);
     72 
     73   // Finds and reads a directory by |file_path|.
     74   FileError ReadDirectoryByPath(const base::FilePath& file_path,
     75                                 ResourceEntryVector* out_entries);
     76 
     77   // Finds and reads a directory by |id|.
     78   FileError ReadDirectoryById(const std::string& id,
     79                               ResourceEntryVector* out_entries);
     80 
     81   // Replaces an existing entry with the same local ID as |entry|.
     82   FileError RefreshEntry(const ResourceEntry& entry);
     83 
     84   // Recursively gets directories under the entry pointed to by |id|.
     85   FileError GetSubDirectoriesRecursively(
     86       const std::string& id,
     87       std::set<base::FilePath>* sub_directories);
     88 
     89   // Returns the id of the resource named |base_name| directly under
     90   // the directory with |parent_local_id|.
     91   // If not found, empty string will be returned.
     92   FileError GetChildId(const std::string& parent_local_id,
     93                        const std::string& base_name,
     94                        std::string* out_child_id);
     95 
     96   // Returns an object to iterate over entries.
     97   scoped_ptr<Iterator> GetIterator();
     98 
     99   // Returns virtual file path of the entry.
    100   FileError GetFilePath(const std::string& id, base::FilePath* out_file_path);
    101 
    102   // Returns ID of the entry at the given path.
    103   FileError GetIdByPath(const base::FilePath& file_path, std::string* out_id);
    104 
    105   // Returns the local ID associated with the given resource ID.
    106   FileError GetIdByResourceId(const std::string& resource_id,
    107                               std::string* out_local_id);
    108 
    109  private:
    110   // Note: Use Destroy() to delete this object.
    111   ~ResourceMetadata();
    112 
    113   // Sets up entries which should be present by default.
    114   FileError SetUpDefaultEntries();
    115 
    116   // Used to implement Destroy().
    117   void DestroyOnBlockingPool();
    118 
    119   // Puts an entry under its parent directory. Removes the child from the old
    120   // parent if there is. This method will also do name de-duplication to ensure
    121   // that the exposed presentation path does not have naming conflicts. Two
    122   // files with the same name "Foo" will be renamed to "Foo (1)" and "Foo (2)".
    123   FileError PutEntryUnderDirectory(const ResourceEntry& entry);
    124 
    125   // Returns an unused base name for |entry|.
    126   FileError GetDeduplicatedBaseName(const ResourceEntry& entry,
    127                                     std::string* base_name);
    128 
    129   // Removes the entry and its descendants.
    130   FileError RemoveEntryRecursively(const std::string& id);
    131 
    132   scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
    133 
    134   ResourceMetadataStorage* storage_;
    135   FileCache* cache_;
    136 
    137   DISALLOW_COPY_AND_ASSIGN(ResourceMetadata);
    138 };
    139 
    140 }  // namespace internal
    141 }  // namespace drive
    142 
    143 #endif  // CHROME_BROWSER_CHROMEOS_DRIVE_RESOURCE_METADATA_H_
    144