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