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

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_file_system.cc

Issue 10830298: GDataFileSystem::CloseFile needs not modify GDataEntry. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 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 | « chrome/browser/chromeos/gdata/gdata_file_system.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) 2012 The Chromium Authors. All rights reserved. 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 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 "chrome/browser/chromeos/gdata/gdata_file_system.h" 5 #include "chrome/browser/chromeos/gdata/gdata_file_system.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 3211 matching lines...) Expand 10 before | Expand all | Expand 10 after
3222 // The file is not being opened. 3222 // The file is not being opened.
3223 MessageLoop::current()->PostTask( 3223 MessageLoop::current()->PostTask(
3224 FROM_HERE, 3224 FROM_HERE,
3225 base::Bind(callback, GDATA_FILE_ERROR_NOT_FOUND)); 3225 base::Bind(callback, GDATA_FILE_ERROR_NOT_FOUND));
3226 return; 3226 return;
3227 } 3227 }
3228 3228
3229 // Step 1 of CloseFile: Get resource_id and md5 for |file_path|. 3229 // Step 1 of CloseFile: Get resource_id and md5 for |file_path|.
3230 directory_service_->GetEntryInfoByPath( 3230 directory_service_->GetEntryInfoByPath(
3231 file_path, 3231 file_path,
3232 base::Bind(&GDataFileSystem::OnGetEntryInfoCompleteForCloseFile, 3232 base::Bind(&GDataFileSystem::CloseFileOnUIThreadAfterGetEntryInfo,
3233 ui_weak_ptr_, 3233 ui_weak_ptr_,
3234 file_path, 3234 file_path,
3235 base::Bind(&GDataFileSystem::OnCloseFileFinished, 3235 base::Bind(&GDataFileSystem::CloseFileOnUIThreadFinalize,
3236 ui_weak_ptr_, 3236 ui_weak_ptr_,
3237 file_path, 3237 file_path,
3238 callback))); 3238 callback)));
3239 } 3239 }
3240 3240
3241 void GDataFileSystem::OnGetEntryInfoCompleteForCloseFile( 3241 void GDataFileSystem::CloseFileOnUIThreadAfterGetEntryInfo(
3242 const FilePath& file_path, 3242 const FilePath& file_path,
3243 const FileOperationCallback& callback, 3243 const FileOperationCallback& callback,
3244 GDataFileError error, 3244 GDataFileError error,
3245 scoped_ptr<GDataEntryProto> entry_proto) { 3245 scoped_ptr<GDataEntryProto> entry_proto) {
3246 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3246 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3247 DCHECK(!callback.is_null()); 3247 DCHECK(!callback.is_null());
3248 3248
3249 if (entry_proto.get() && !entry_proto->has_file_specific_info()) 3249 if (entry_proto.get() && !entry_proto->has_file_specific_info())
3250 error = GDATA_FILE_ERROR_NOT_FOUND; 3250 error = GDATA_FILE_ERROR_NOT_FOUND;
3251 3251
3252 if (error != GDATA_FILE_OK) { 3252 if (error != GDATA_FILE_OK) {
3253 callback.Run(error); 3253 callback.Run(error);
3254 return; 3254 return;
3255 } 3255 }
3256 3256
3257 // Step 2 of CloseFile: Get the local path of the cache. Since CloseFile must 3257 // Step 2 of CloseFile: Commit the modification in cache. This will trigger
3258 // always be called on paths opened by OpenFile, the file must be cached,
3259 cache_->GetFileOnUIThread(
3260 entry_proto->resource_id(),
3261 entry_proto->file_specific_info().file_md5(),
3262 base::Bind(&GDataFileSystem::OnGetCacheFilePathCompleteForCloseFile,
3263 ui_weak_ptr_,
3264 file_path,
3265 callback));
3266 }
3267
3268 void GDataFileSystem::OnGetCacheFilePathCompleteForCloseFile(
3269 const FilePath& file_path,
3270 const FileOperationCallback& callback,
3271 GDataFileError error,
3272 const std::string& resource_id,
3273 const std::string& md5,
3274 const FilePath& local_cache_path) {
3275 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3276 DCHECK(!callback.is_null());
3277
3278 if (error != GDATA_FILE_OK) {
3279 callback.Run(error);
3280 return;
3281 }
3282
3283 // Step 3 of CloseFile: Retrieves the (possibly modified) PlatformFileInfo of
3284 // the cache file.
3285 base::PlatformFileInfo* file_info = new base::PlatformFileInfo;
3286 bool* get_file_info_result = new bool(false);
3287 util::PostBlockingPoolSequencedTaskAndReply(
3288 FROM_HERE,
3289 blocking_task_runner_,
3290 base::Bind(&GetFileInfoOnBlockingPool,
3291 local_cache_path,
3292 base::Unretained(file_info),
3293 base::Unretained(get_file_info_result)),
3294 base::Bind(&GDataFileSystem::OnGetModifiedFileInfoCompleteForCloseFile,
3295 ui_weak_ptr_,
3296 file_path,
3297 base::Owned(file_info),
3298 base::Owned(get_file_info_result),
3299 callback));
3300 }
3301
3302 void GDataFileSystem::OnGetModifiedFileInfoCompleteForCloseFile(
3303 const FilePath& file_path,
3304 base::PlatformFileInfo* file_info,
3305 bool* get_file_info_result,
3306 const FileOperationCallback& callback) {
3307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3308 DCHECK(!callback.is_null());
3309
3310 if (!*get_file_info_result) {
3311 callback.Run(GDATA_FILE_ERROR_NOT_FOUND);
3312 return;
3313 }
3314
3315 // Step 4 of CloseFile: Find GDataEntry corresponding to |file_path|, for
3316 // modifying the entry's metadata.
3317 FindEntryByPathAsyncOnUIThread(
3318 file_path,
3319 base::Bind(&GDataFileSystem::OnGetEntryCompleteForCloseFile,
3320 ui_weak_ptr_,
3321 *file_info,
3322 callback));
3323 }
3324
3325 void GDataFileSystem::OnGetEntryCompleteForCloseFile(
3326 const base::PlatformFileInfo& file_info,
3327 const FileOperationCallback& callback,
3328 GDataFileError error,
3329 GDataEntry* entry) {
3330 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3331 DCHECK(!callback.is_null());
3332
3333 if (error != GDATA_FILE_OK) {
3334 callback.Run(error);
3335 return;
3336 }
3337
3338 DCHECK(entry);
3339 GDataFile* file = entry->AsGDataFile();
3340 if (!file || file->file_md5().empty() || file->is_hosted_document()) {
3341 // No support for opening a directory or hosted document.
3342 callback.Run(GDATA_FILE_ERROR_INVALID_OPERATION);
3343 return;
3344 }
3345 DCHECK(!file->resource_id().empty());
3346
3347 // Step 5 of CloseFile:
3348 // Update the in-memory meta data. Until the committed cache is uploaded in
3349 // background to the server and the change is propagated back, this in-memory
3350 // meta data is referred by subsequent file operations. So it needs to reflect
3351 // the modification made before committing.
3352 file->set_file_info(file_info);
3353
3354 // Step 6 of CloseFile: Commit the modification in cache. This will trigger
3355 // background upload. 3258 // background upload.
3356 // TODO(benchan,kinaba): Call ClearDirtyInCache instead of CommitDirtyInCache 3259 // TODO(benchan,kinaba): Call ClearDirtyInCache instead of CommitDirtyInCache
3357 // if the file has not been modified. Come up with a way to detect the 3260 // if the file has not been modified. Come up with a way to detect the
3358 // intactness effectively, or provide a method for user to declare it when 3261 // intactness effectively, or provide a method for user to declare it when
3359 // calling CloseFile(). 3262 // calling CloseFile().
3360 cache_->CommitDirtyOnUIThread( 3263 cache_->CommitDirtyOnUIThread(
3361 file->resource_id(), 3264 entry_proto->resource_id(),
3362 file->file_md5(), 3265 entry_proto->file_specific_info().file_md5(),
3363 base::Bind(&GDataFileSystem::OnCommitDirtyInCacheCompleteForCloseFile, 3266 base::Bind(&GDataFileSystem::CloseFileOnUIThreadAfterCommitDirtyInCache,
3364 ui_weak_ptr_, 3267 ui_weak_ptr_,
3365 callback)); 3268 callback));
3366 } 3269 }
3367 3270
3368 void GDataFileSystem::OnCommitDirtyInCacheCompleteForCloseFile( 3271 void GDataFileSystem::CloseFileOnUIThreadAfterCommitDirtyInCache(
3369 const FileOperationCallback& callback, 3272 const FileOperationCallback& callback,
3370 GDataFileError error, 3273 GDataFileError error,
3371 const std::string& /* resource_id */, 3274 const std::string& /* resource_id */,
3372 const std::string& /* md5 */) { 3275 const std::string& /* md5 */) {
3373 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3276 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3374 DCHECK(!callback.is_null()); 3277 DCHECK(!callback.is_null());
3375 3278
3376 callback.Run(error); 3279 callback.Run(error);
3377 } 3280 }
3378 3281
3379 void GDataFileSystem::OnCloseFileFinished( 3282 void GDataFileSystem::CloseFileOnUIThreadFinalize(
3380 const FilePath& file_path, 3283 const FilePath& file_path,
3381 const FileOperationCallback& callback, 3284 const FileOperationCallback& callback,
3382 GDataFileError result) { 3285 GDataFileError result) {
3383 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3286 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3384 DCHECK(!callback.is_null()); 3287 DCHECK(!callback.is_null());
3385 3288
3386 // Step 7 of CloseFile. 3289 // Step 3 of CloseFile.
3387 // All the invocation of |callback| from operations initiated from CloseFile 3290 // All the invocation of |callback| from operations initiated from CloseFile
3388 // must go through here. Removes the |file_path| from the remembered set so 3291 // must go through here. Removes the |file_path| from the remembered set so
3389 // that subsequent operations can open the file again. 3292 // that subsequent operations can open the file again.
3390 open_files_.erase(file_path); 3293 open_files_.erase(file_path);
3391 3294
3392 // Then invokes the user-supplied callback function. 3295 // Then invokes the user-supplied callback function.
3393 callback.Run(result); 3296 callback.Run(result);
3394 } 3297 }
3395 3298
3396 void GDataFileSystem::CheckLocalModificationAndRun( 3299 void GDataFileSystem::CheckLocalModificationAndRun(
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
3490 return; 3393 return;
3491 } 3394 }
3492 3395
3493 PlatformFileInfoProto entry_file_info; 3396 PlatformFileInfoProto entry_file_info;
3494 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); 3397 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info);
3495 *entry_proto->mutable_file_info() = entry_file_info; 3398 *entry_proto->mutable_file_info() = entry_file_info;
3496 if (!callback.is_null()) 3399 if (!callback.is_null())
3497 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); 3400 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
3498 } 3401 }
3499 3402
3500 } // namespace gdata 3403 } // namespace gdata
satorux1 2012/08/14 05:19:56 97 lines are gone!!
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_file_system.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698