1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <map> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <set> 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_vector.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/observer_list.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/drive/drive_common_callbacks.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SequencedTaskRunner; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace base 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace google_apis { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AboutResource; 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace google_apis 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace drive { 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class EventLogger; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class JobScheduler; 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ResourceEntry; 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace internal { 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AboutResourceLoader; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ChangeList; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ChangeListLoaderObserver; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DirectoryFetchInfo; 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LoaderController; 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ResourceMetadata; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DirectoryLoader is used to load directory contents. 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DirectoryLoader { 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DirectoryLoader(EventLogger* logger, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::SequencedTaskRunner* blocking_task_runner, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceMetadata* resource_metadata, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) JobScheduler* scheduler, 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AboutResourceLoader* about_resource_loader, 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoaderController* apply_task_controller); 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~DirectoryLoader(); 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Adds and removes the observer. 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void AddObserver(ChangeListLoaderObserver* observer); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void RemoveObserver(ChangeListLoaderObserver* observer); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Reads the directory contents. 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // |entries_callback| can be null. 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // |completion_callback| must not be null. 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ReadDirectory(const base::FilePath& directory_path, 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const ReadDirectoryEntriesCallback& entries_callback, 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const FileOperationCallback& completion_callback); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class FeedFetcher; 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch struct ReadDirectoryCallbackState; 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Part of ReadDirectory(). 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ReadDirectoryAfterGetEntry( 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::FilePath& directory_path, 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const ReadDirectoryEntriesCallback& entries_callback, 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const FileOperationCallback& completion_callback, 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool should_try_loading_parent, 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const ResourceEntry* entry, 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FileError error); 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ReadDirectoryAfterLoadParent( 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::FilePath& directory_path, 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const ReadDirectoryEntriesCallback& entries_callback, 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const FileOperationCallback& completion_callback, 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FileError error); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ReadDirectoryAfterGetAboutResource( 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& local_id, 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::GDataErrorCode status, 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<google_apis::AboutResource> about_resource); 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void ReadDirectoryAfterCheckLocalState( 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<google_apis::AboutResource> about_resource, 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& local_id, 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ResourceEntry* entry, 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const int64* local_changestamp, 9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FileError error); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Part of ReadDirectory(). 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This function should be called when the directory load is complete. 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Flushes the callbacks waiting for the directory to be loaded. 9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void OnDirectoryLoadComplete(const std::string& local_id, FileError error); 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OnDirectoryLoadCompleteAfterRead(const std::string& local_id, 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const ResourceEntryVector* entries, 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FileError error); 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Sends |entries| to the callbacks. 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SendEntries(const std::string& local_id, 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const ResourceEntryVector& entries); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // ================= Implementation for directory loading ================= 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Loads the directory contents from server, and updates the local metadata. 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Runs |callback| when it is finished. 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void LoadDirectoryFromServer(const DirectoryFetchInfo& directory_fetch_info); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Part of LoadDirectoryFromServer() for a normal directory. 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void LoadDirectoryFromServerAfterLoad( 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const DirectoryFetchInfo& directory_fetch_info, 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FeedFetcher* fetcher, 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FileError error); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Part of LoadDirectoryFromServer(). 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void LoadDirectoryFromServerAfterUpdateChangestamp( 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const DirectoryFetchInfo& directory_fetch_info, 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath* directory_path, 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EventLogger* logger_; // Not owned. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceMetadata* resource_metadata_; // Not owned. 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) JobScheduler* scheduler_; // Not owned. 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AboutResourceLoader* about_resource_loader_; // Not owned. 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoaderController* loader_controller_; // Not owned. 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObserverList<ChangeListLoaderObserver> observers_; 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch typedef std::map<std::string, std::vector<ReadDirectoryCallbackState> > 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoadCallbackMap; 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoadCallbackMap pending_load_callback_; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Set of the running feed fetcher for the fast fetch. 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::set<FeedFetcher*> fast_fetch_feed_fetcher_set_; 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WeakPtrFactory<DirectoryLoader> weak_ptr_factory_; 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DirectoryLoader); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace internal 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace drive 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_ 149