1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_UPDATE_PERFORMER_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_UPDATE_PERFORMER_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ScopedClosureRunner; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SequencedTaskRunner; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace base 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace google_apis { 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class FileResource; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace google_apis 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace drive { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class JobScheduler; 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ResourceEntry; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct ClientContext; 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace file_system { 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class OperationObserver; 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace file_system 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace internal { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class EntryRevertPerformer; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FileCache; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LoaderController; 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class RemovePerformer; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ResourceMetadata; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This class is responsible to perform server side update of an entry. 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class EntryUpdatePerformer { 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EntryUpdatePerformer(base::SequencedTaskRunner* blocking_task_runner, 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_system::OperationObserver* observer, 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) JobScheduler* scheduler, 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceMetadata* metadata, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileCache* cache, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoaderController* loader_controller); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ~EntryUpdatePerformer(); 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Requests the server to update the metadata of the entry specified by 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |local_id| with the locally stored one. 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invokes |callback| when finished with the result of the operation. 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |callback| must not be null. 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateEntry(const std::string& local_id, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ClientContext& context, 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FileOperationCallback& callback); 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct LocalState; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Part of UpdateEntry(). Called after local metadata look up. 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UpdateEntryAfterPrepare(const ClientContext& context, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FileOperationCallback& callback, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<LocalState> local_state, 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileError error); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Part of UpdateEntry(). Called after UpdateResource is completed. 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateEntryAfterUpdateResource( 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ClientContext& context, 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FileOperationCallback& callback, 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& local_id, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ScopedClosureRunner> loader_lock, 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) google_apis::GDataErrorCode status, 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<google_apis::FileResource> entry); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Part of UpdateEntry(). Called after FinishUpdate is completed. 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UpdateEntryAfterFinish(const FileOperationCallback& callback, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath* changed_directory, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_system::OperationObserver* observer_; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) JobScheduler* scheduler_; 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceMetadata* metadata_; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileCache* cache_; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoaderController* loader_controller_; 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<RemovePerformer> remove_performer_; 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<EntryRevertPerformer> entry_revert_performer_; 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // invalidate the weak pointers before any other members are destroyed. 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WeakPtrFactory<EntryUpdatePerformer> weak_ptr_factory_; 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EntryUpdatePerformer); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace internal 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace drive 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_UPDATE_PERFORMER_H_ 103