touch_operation.cc revision 3551c9c881056c480085172ff9840cab31610854
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/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_.get(), 48 FROM_HERE, 49 base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath, 50 base::Unretained(metadata_), 51 file_path, 52 entry), 53 base::Bind(&TouchOperation::TouchFileAfterGetResourceEntry, 54 weak_ptr_factory_.GetWeakPtr(), 55 file_path, 56 last_access_time, 57 last_modified_time, 58 callback, 59 base::Owned(entry))); 60} 61 62void TouchOperation::TouchFileAfterGetResourceEntry( 63 const base::FilePath& file_path, 64 const base::Time& last_access_time, 65 const base::Time& last_modified_time, 66 const FileOperationCallback& callback, 67 ResourceEntry* entry, 68 FileError error) { 69 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 70 DCHECK(!callback.is_null()); 71 DCHECK(entry); 72 73 if (error != FILE_ERROR_OK) { 74 callback.Run(error); 75 return; 76 } 77 78 // Note: |last_modified_time| is mapped to modifiedDate, |last_access_time| 79 // is mapped to lastViewedByMeDate. See also ConvertToResourceEntry(). 80 scheduler_->TouchResource( 81 entry->resource_id(), last_modified_time, last_access_time, 82 base::Bind(&TouchOperation::TouchFileAfterServerTimeStampUpdated, 83 weak_ptr_factory_.GetWeakPtr(), 84 file_path, callback)); 85} 86 87void TouchOperation::TouchFileAfterServerTimeStampUpdated( 88 const base::FilePath& file_path, 89 const FileOperationCallback& callback, 90 google_apis::GDataErrorCode gdata_error, 91 scoped_ptr<google_apis::ResourceEntry> resource_entry) { 92 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 93 DCHECK(!callback.is_null()); 94 95 FileError error = GDataToFileError(gdata_error); 96 if (error != FILE_ERROR_OK) { 97 callback.Run(error); 98 return; 99 } 100 101 DCHECK(resource_entry); 102 ResourceEntry entry; 103 if (!ConvertToResourceEntry(*resource_entry, &entry)) { 104 callback.Run(FILE_ERROR_NOT_A_FILE); 105 return; 106 } 107 108 base::PostTaskAndReplyWithResult( 109 blocking_task_runner_.get(), 110 FROM_HERE, 111 base::Bind(&internal::ResourceMetadata::RefreshEntry, 112 base::Unretained(metadata_), 113 entry.resource_id(), 114 entry), 115 base::Bind(&TouchOperation::TouchFileAfterRefreshMetadata, 116 weak_ptr_factory_.GetWeakPtr(), 117 file_path, 118 callback)); 119} 120 121void TouchOperation::TouchFileAfterRefreshMetadata( 122 const base::FilePath& file_path, 123 const FileOperationCallback& callback, 124 FileError error) { 125 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 126 DCHECK(!callback.is_null()); 127 128 if (error == FILE_ERROR_OK) 129 observer_->OnDirectoryChangedByOperation(file_path.DirName()); 130 131 callback.Run(error); 132} 133 134} // namespace file_system 135} // namespace drive 136