touch_operation.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1// Copyright 2013 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#include "chrome/browser/chromeos/drive/file_system/touch_operation.h" 6 7#include "base/bind.h" 8#include "base/files/file_path.h" 9#include "base/sequenced_task_runner.h" 10#include "base/time.h" 11#include "chrome/browser/chromeos/drive/file_errors.h" 12#include "chrome/browser/chromeos/drive/file_system/operation_observer.h" 13#include "chrome/browser/chromeos/drive/file_system_util.h" 14#include "chrome/browser/chromeos/drive/job_scheduler.h" 15#include "chrome/browser/chromeos/drive/resource_entry_conversion.h" 16#include "chrome/browser/chromeos/drive/resource_metadata.h" 17#include "content/public/browser/browser_thread.h" 18 19using content::BrowserThread; 20 21namespace drive { 22namespace file_system { 23 24TouchOperation::TouchOperation(base::SequencedTaskRunner* blocking_task_runner, 25 OperationObserver* observer, 26 JobScheduler* scheduler, 27 internal::ResourceMetadata* metadata) 28 : blocking_task_runner_(blocking_task_runner), 29 observer_(observer), 30 scheduler_(scheduler), 31 metadata_(metadata), 32 weak_ptr_factory_(this) { 33} 34 35TouchOperation::~TouchOperation() { 36} 37 38void TouchOperation::TouchFile(const base::FilePath& file_path, 39 const base::Time& last_access_time, 40 const base::Time& last_modified_time, 41 const FileOperationCallback& callback) { 42 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 43 DCHECK(!callback.is_null()); 44 45 ResourceEntry* entry = new ResourceEntry; 46 base::PostTaskAndReplyWithResult( 47 blocking_task_runner_, 48 FROM_HERE, 49 base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath, 50 base::Unretained(metadata_), file_path, entry), 51 base::Bind(&TouchOperation::TouchFileAfterGetResourceEntry, 52 weak_ptr_factory_.GetWeakPtr(), 53 file_path, last_access_time, last_modified_time, callback, 54 base::Owned(entry))); 55} 56 57void TouchOperation::TouchFileAfterGetResourceEntry( 58 const base::FilePath& file_path, 59 const base::Time& last_access_time, 60 const base::Time& last_modified_time, 61 const FileOperationCallback& callback, 62 ResourceEntry* entry, 63 FileError error) { 64 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 65 DCHECK(!callback.is_null()); 66 DCHECK(entry); 67 68 if (error != FILE_ERROR_OK) { 69 callback.Run(error); 70 return; 71 } 72 73 // Note: |last_modified_time| is mapped to modifiedDate, |last_access_time| 74 // is mapped to lastViewedByMeDate. See also ConvertToResourceEntry(). 75 scheduler_->TouchResource( 76 entry->resource_id(), last_modified_time, last_access_time, 77 base::Bind(&TouchOperation::TouchFileAfterServerTimeStampUpdated, 78 weak_ptr_factory_.GetWeakPtr(), 79 file_path, callback)); 80} 81 82void TouchOperation::TouchFileAfterServerTimeStampUpdated( 83 const base::FilePath& file_path, 84 const FileOperationCallback& callback, 85 google_apis::GDataErrorCode gdata_error, 86 scoped_ptr<google_apis::ResourceEntry> resource_entry) { 87 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 88 DCHECK(!callback.is_null()); 89 90 FileError error = util::GDataToFileError(gdata_error); 91 if (error != FILE_ERROR_OK) { 92 callback.Run(error); 93 return; 94 } 95 96 base::PostTaskAndReplyWithResult( 97 blocking_task_runner_, 98 FROM_HERE, 99 base::Bind(&internal::ResourceMetadata::RefreshEntry, 100 base::Unretained(metadata_), 101 ConvertToResourceEntry(*resource_entry)), 102 base::Bind(&TouchOperation::TouchFileAfterRefreshMetadata, 103 weak_ptr_factory_.GetWeakPtr(), file_path, callback)); 104} 105 106void TouchOperation::TouchFileAfterRefreshMetadata( 107 const base::FilePath& file_path, 108 const FileOperationCallback& callback, 109 FileError error) { 110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 111 DCHECK(!callback.is_null()); 112 113 if (error == FILE_ERROR_OK) 114 observer_->OnDirectoryChangedByOperation(file_path.DirName()); 115 116 callback.Run(error); 117} 118 119} // namespace file_system 120} // namespace drive 121