copy_operation.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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_FILE_SYSTEM_COPY_OPERATION_H_
6#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_COPY_OPERATION_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/memory/ref_counted.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/memory/weak_ptr.h"
15#include "chrome/browser/chromeos/drive/file_errors.h"
16#include "google_apis/drive/gdata_errorcode.h"
17
18namespace base {
19class FilePath;
20class SequencedTaskRunner;
21class Time;
22}  // namespace base
23
24namespace google_apis {
25class FileResource;
26}  // namespace google_apis
27
28namespace drive {
29
30class JobScheduler;
31class ResourceEntry;
32
33namespace internal {
34class FileCache;
35class ResourceMetadata;
36}  // namespace internal
37
38namespace file_system {
39
40class CreateFileOperation;
41class OperationDelegate;
42
43// This class encapsulates the drive Copy function.  It is responsible for
44// sending the request to the drive API, then updating the local state and
45// metadata to reflect the new state.
46class CopyOperation {
47 public:
48  CopyOperation(base::SequencedTaskRunner* blocking_task_runner,
49                OperationDelegate* delegate,
50                JobScheduler* scheduler,
51                internal::ResourceMetadata* metadata,
52                internal::FileCache* cache);
53  ~CopyOperation();
54
55  // Performs the copy operation on the file at drive path |src_file_path|
56  // with a target of |dest_file_path|.
57  // If |preserve_last_modified| is set to true, this tries to preserve
58  // last modified time stamp. This is supported only on Drive API v2.
59  // Invokes |callback| when finished with the result of the operation.
60  // |callback| must not be null.
61  void Copy(const base::FilePath& src_file_path,
62            const base::FilePath& dest_file_path,
63            bool preserve_last_modified,
64            const FileOperationCallback& callback);
65
66  // Initiates transfer of |local_src_file_path| to |remote_dest_file_path|.
67  // |local_src_file_path| must be a file from the local file system.
68  // |remote_dest_file_path| is the virtual destination path within Drive file
69  // system.
70  //
71  // |callback| must not be null.
72  void TransferFileFromLocalToRemote(
73      const base::FilePath& local_src_file_path,
74      const base::FilePath& remote_dest_file_path,
75      const FileOperationCallback& callback);
76
77  // Params for Copy().
78  struct CopyParams;
79
80  // Params for TransferJsonGdocFileAfterLocalWork.
81  struct TransferJsonGdocParams;
82
83 private:
84  // Part of Copy(). Called after trying to copy locally.
85  void CopyAfterTryToCopyLocally(
86      const CopyParams* params,
87      const std::vector<std::string>* updated_local_ids,
88      const bool* directory_changed,
89      const bool* should_copy_on_server,
90      FileError error);
91
92  // Part of Copy(). Called after the parent entry gets synced.
93  void CopyAfterParentSync(const CopyParams& params, FileError error);
94
95  // Part of Copy(). Called after the parent resource ID is resolved.
96  void CopyAfterGetParentResourceId(const CopyParams& params,
97                                    const ResourceEntry* parent,
98                                    FileError error);
99
100  // Part of TransferFileFromLocalToRemote(). Called after preparation is done.
101  // |gdoc_resource_id| and |parent_resource_id| is available only if the file
102  // is JSON GDoc file.
103  void TransferFileFromLocalToRemoteAfterPrepare(
104      const base::FilePath& local_src_path,
105      const base::FilePath& remote_dest_path,
106      const FileOperationCallback& callback,
107      std::string* gdoc_resource_id,
108      ResourceEntry* parent_entry,
109      FileError error);
110
111  // Part of TransferFileFromLocalToRemote().
112  void TransferJsonGdocFileAfterLocalWork(TransferJsonGdocParams* params,
113                                          FileError error);
114
115  // Copies resource with |resource_id| into the directory |parent_resource_id|
116  // with renaming it to |new_title|.
117  void CopyResourceOnServer(const std::string& resource_id,
118                            const std::string& parent_resource_id,
119                            const std::string& new_title,
120                            const base::Time& last_modified,
121                            const FileOperationCallback& callback);
122
123  // Part of CopyResourceOnServer and TransferFileFromLocalToRemote.
124  // Called after server side operation is done.
125  void UpdateAfterServerSideOperation(
126      const FileOperationCallback& callback,
127      google_apis::GDataErrorCode status,
128      scoped_ptr<google_apis::FileResource> entry);
129
130  // Part of CopyResourceOnServer and TransferFileFromLocalToRemote.
131  // Called after local state update is done.
132  void UpdateAfterLocalStateUpdate(const FileOperationCallback& callback,
133                                   base::FilePath* file_path,
134                                   const ResourceEntry* entry,
135                                   FileError error);
136
137  // Creates an empty file on the server at |remote_dest_path| to ensure
138  // the location, stores a file at |local_file_path| in cache and marks it
139  // dirty, so that SyncClient will upload the data later.
140  void ScheduleTransferRegularFile(const base::FilePath& local_src_path,
141                                   const base::FilePath& remote_dest_path,
142                                   const FileOperationCallback& callback);
143
144  // Part of ScheduleTransferRegularFile(). Called after file creation.
145  void ScheduleTransferRegularFileAfterCreate(
146      const base::FilePath& local_src_path,
147      const base::FilePath& remote_dest_path,
148      const FileOperationCallback& callback,
149      FileError error);
150
151  // Part of ScheduleTransferRegularFile(). Called after updating local state
152  // is completed.
153  void ScheduleTransferRegularFileAfterUpdateLocalState(
154      const FileOperationCallback& callback,
155      const base::FilePath& remote_dest_path,
156      const ResourceEntry* entry,
157      std::string* local_id,
158      FileError error);
159
160  scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
161  OperationDelegate* delegate_;
162  JobScheduler* scheduler_;
163  internal::ResourceMetadata* metadata_;
164  internal::FileCache* cache_;
165
166  // Uploading a new file is internally implemented by creating a dirty file.
167  scoped_ptr<CreateFileOperation> create_file_operation_;
168
169  // Note: This should remain the last member so it'll be destroyed and
170  // invalidate the weak pointers before any other members are destroyed.
171  base::WeakPtrFactory<CopyOperation> weak_ptr_factory_;
172  DISALLOW_COPY_AND_ASSIGN(CopyOperation);
173};
174
175}  // namespace file_system
176}  // namespace drive
177
178#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_COPY_OPERATION_H_
179