Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: webkit/fileapi/cross_operation_delegate.cc

Issue 14225022: fileapi: Pass virtual path to copy validator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/fileapi/cross_operation_delegate.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/fileapi/cross_operation_delegate.h" 5 #include "webkit/fileapi/cross_operation_delegate.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "webkit/blob/shareable_file_reference.h" 8 #include "webkit/blob/shareable_file_reference.h"
9 #include "webkit/fileapi/copy_or_move_file_validator.h" 9 #include "webkit/fileapi/copy_or_move_file_validator.h"
10 #include "webkit/fileapi/file_system_context.h" 10 #include "webkit/fileapi/file_system_context.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 return; 48 return;
49 } 49 }
50 50
51 // It is an error to copy/move an entry into the same path. 51 // It is an error to copy/move an entry into the same path.
52 if (same_file_system_ && src_root_.path() == dest_root_.path()) { 52 if (same_file_system_ && src_root_.path() == dest_root_.path()) {
53 callback_.Run(base::PLATFORM_FILE_ERROR_EXISTS); 53 callback_.Run(base::PLATFORM_FILE_ERROR_EXISTS);
54 return; 54 return;
55 } 55 }
56 56
57 // First try to copy/move it as a file. 57 // First try to copy/move it as a file.
58 CopyOrMoveFile(src_root_, dest_root_, 58 CopyOrMoveFile(URLPair(src_root_, dest_root_),
59 base::Bind(&CrossOperationDelegate::DidTryCopyOrMoveFile, 59 base::Bind(&CrossOperationDelegate::DidTryCopyOrMoveFile,
60 AsWeakPtr())); 60 AsWeakPtr()));
61 } 61 }
62 62
63 void CrossOperationDelegate::ProcessFile(const FileSystemURL& src_url, 63 void CrossOperationDelegate::ProcessFile(const FileSystemURL& src_url,
64 const StatusCallback& callback) { 64 const StatusCallback& callback) {
65 CopyOrMoveFile(src_url, CreateDestURL(src_url), callback); 65 CopyOrMoveFile(URLPair(src_url, CreateDestURL(src_url)), callback);
66 } 66 }
67 67
68 void CrossOperationDelegate::ProcessDirectory(const FileSystemURL& src_url, 68 void CrossOperationDelegate::ProcessDirectory(const FileSystemURL& src_url,
69 const StatusCallback& callback) { 69 const StatusCallback& callback) {
70 FileSystemURL dest_url = CreateDestURL(src_url); 70 FileSystemURL dest_url = CreateDestURL(src_url);
71 71
72 // If operation_type == Move we may need to record directories and 72 // If operation_type == Move we may need to record directories and
73 // restore directory timestamps in the end, though it may have 73 // restore directory timestamps in the end, though it may have
74 // negative performance impact. 74 // negative performance impact.
75 // See http://crbug.com/171284 for more details. 75 // See http://crbug.com/171284 for more details.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 107
108 // Start to process the source directory recursively. 108 // Start to process the source directory recursively.
109 // TODO(kinuko): This could be too expensive for same_file_system_==true 109 // TODO(kinuko): This could be too expensive for same_file_system_==true
110 // and operation==MOVE case, probably we can just rename the root directory. 110 // and operation==MOVE case, probably we can just rename the root directory.
111 // http://crbug.com/172187 111 // http://crbug.com/172187
112 StartRecursiveOperation( 112 StartRecursiveOperation(
113 src_root_, base::Bind(&CrossOperationDelegate::DidFinishCopy, 113 src_root_, base::Bind(&CrossOperationDelegate::DidFinishCopy,
114 AsWeakPtr(), src_root_, callback_)); 114 AsWeakPtr(), src_root_, callback_));
115 } 115 }
116 116
117 void CrossOperationDelegate::CopyOrMoveFile( 117 void CrossOperationDelegate::CopyOrMoveFile(const URLPair& url_pair,
118 const FileSystemURL& src, 118 const StatusCallback& callback) {
119 const FileSystemURL& dest,
120 const StatusCallback& callback) {
121 // Same filesystem case. 119 // Same filesystem case.
122 if (same_file_system_) { 120 if (same_file_system_) {
123 if (operation_type_ == OPERATION_MOVE) 121 if (operation_type_ == OPERATION_MOVE) {
124 NewSourceOperation()->MoveFileLocal(src, dest, callback); 122 NewSourceOperation()->MoveFileLocal(url_pair.src, url_pair.dest,
125 else 123 callback);
126 NewSourceOperation()->CopyFileLocal(src, dest, callback); 124 } else {
125 NewSourceOperation()->CopyFileLocal(url_pair.src, url_pair.dest,
126 callback);
127 }
127 return; 128 return;
128 } 129 }
129 130
130 // Cross filesystem case. 131 // Cross filesystem case.
131 // Perform CreateSnapshotFile, CopyInForeignFile and then calls 132 // Perform CreateSnapshotFile, CopyInForeignFile and then calls
132 // copy_callback which removes the source file if operation_type == MOVE. 133 // copy_callback which removes the source file if operation_type == MOVE.
133 StatusCallback copy_callback = 134 StatusCallback copy_callback =
134 base::Bind(&CrossOperationDelegate::DidFinishCopy, AsWeakPtr(), 135 base::Bind(&CrossOperationDelegate::DidFinishCopy, AsWeakPtr(),
135 src, callback); 136 url_pair.src, callback);
136 NewSourceOperation()->CreateSnapshotFile( 137 NewSourceOperation()->CreateSnapshotFile(
137 src, base::Bind(&CrossOperationDelegate::DidCreateSnapshot, AsWeakPtr(), 138 url_pair.src,
138 dest, copy_callback)); 139 base::Bind(&CrossOperationDelegate::DidCreateSnapshot, AsWeakPtr(),
140 url_pair, copy_callback));
139 } 141 }
140 142
141 void CrossOperationDelegate::DidCreateSnapshot( 143 void CrossOperationDelegate::DidCreateSnapshot(
142 const FileSystemURL& dest, 144 const URLPair& url_pair,
143 const StatusCallback& callback, 145 const StatusCallback& callback,
144 base::PlatformFileError error, 146 base::PlatformFileError error,
145 const base::PlatformFileInfo& file_info, 147 const base::PlatformFileInfo& file_info,
146 const base::FilePath& platform_path, 148 const base::FilePath& platform_path,
147 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) { 149 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) {
148 if (error != base::PLATFORM_FILE_OK) { 150 if (error != base::PLATFORM_FILE_OK) {
149 callback.Run(error); 151 callback.Run(error);
150 return; 152 return;
151 } 153 }
152 current_file_ref_ = file_ref; 154 current_file_ref_ = file_ref;
153 155
154 // For now we assume CreateSnapshotFile always return a valid local file path. 156 // For now we assume CreateSnapshotFile always return a valid local file path.
155 // TODO(kinuko): Otherwise create a FileStreamReader to perform a copy/move. 157 // TODO(kinuko): Otherwise create a FileStreamReader to perform a copy/move.
156 DCHECK(!platform_path.empty()); 158 DCHECK(!platform_path.empty());
157 159
158 CopyOrMoveFileValidatorFactory* factory = 160 CopyOrMoveFileValidatorFactory* factory =
159 file_system_context()->GetCopyOrMoveFileValidatorFactory( 161 file_system_context()->GetCopyOrMoveFileValidatorFactory(
160 dest_root_.type(), &error); 162 dest_root_.type(), &error);
161 if (error != base::PLATFORM_FILE_OK) { 163 if (error != base::PLATFORM_FILE_OK) {
162 callback.Run(error); 164 callback.Run(error);
163 return; 165 return;
164 } 166 }
165 if (!factory) { 167 if (!factory) {
166 DidValidateFile(dest, callback, file_info, platform_path, error); 168 DidValidateFile(url_pair.dest, callback, file_info, platform_path, error);
167 return; 169 return;
168 } 170 }
169 171
170 validator_.reset(factory->CreateCopyOrMoveFileValidator(platform_path)); 172 validator_.reset(
173 factory->CreateCopyOrMoveFileValidator(url_pair.src, platform_path));
171 validator_->StartValidation( 174 validator_->StartValidation(
172 base::Bind(&CrossOperationDelegate::DidValidateFile, AsWeakPtr(), 175 base::Bind(&CrossOperationDelegate::DidValidateFile, AsWeakPtr(),
173 dest, callback, file_info, platform_path)); 176 url_pair.dest, callback, file_info, platform_path));
174 } 177 }
175 178
176 void CrossOperationDelegate::DidValidateFile( 179 void CrossOperationDelegate::DidValidateFile(
177 const FileSystemURL& dest, 180 const FileSystemURL& dest,
178 const StatusCallback& callback, 181 const StatusCallback& callback,
179 const base::PlatformFileInfo& file_info, 182 const base::PlatformFileInfo& file_info,
180 const base::FilePath& platform_path, 183 const base::FilePath& platform_path,
181 base::PlatformFileError error) { 184 base::PlatformFileError error) {
182 if (error != base::PLATFORM_FILE_OK) { 185 if (error != base::PLATFORM_FILE_OK) {
183 callback.Run(error); 186 callback.Run(error);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 return NewNestedOperation(); 235 return NewNestedOperation();
233 } 236 }
234 237
235 LocalFileSystemOperation* CrossOperationDelegate::NewSourceOperation() { 238 LocalFileSystemOperation* CrossOperationDelegate::NewSourceOperation() {
236 if (same_file_system_) 239 if (same_file_system_)
237 return NewDestOperation(); 240 return NewDestOperation();
238 return src_root_operation_->CreateNestedOperation(); 241 return src_root_operation_->CreateNestedOperation();
239 } 242 }
240 243
241 } // namespace fileapi 244 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/cross_operation_delegate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698