diff options
Diffstat (limited to 'chrome/browser/chromeos/drive/file_system/touch_operation.cc')
-rw-r--r-- | chrome/browser/chromeos/drive/file_system/touch_operation.cc | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/drive/file_system/touch_operation.cc b/chrome/browser/chromeos/drive/file_system/touch_operation.cc new file mode 100644 index 0000000..3bda5ff --- /dev/null +++ b/chrome/browser/chromeos/drive/file_system/touch_operation.cc @@ -0,0 +1,122 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/drive/file_system/touch_operation.h" + +#include "base/bind.h" +#include "base/files/file_path.h" +#include "base/sequenced_task_runner.h" +#include "base/time.h" +#include "chrome/browser/chromeos/drive/file_errors.h" +#include "chrome/browser/chromeos/drive/file_system/operation_observer.h" +#include "chrome/browser/chromeos/drive/file_system_util.h" +#include "chrome/browser/chromeos/drive/job_scheduler.h" +#include "chrome/browser/chromeos/drive/resource_entry_conversion.h" +#include "chrome/browser/chromeos/drive/resource_metadata.h" +#include "content/public/browser/browser_thread.h" + +using content::BrowserThread; + +namespace drive { +namespace file_system { + +TouchOperation::TouchOperation(base::SequencedTaskRunner* blocking_task_runner, + OperationObserver* observer, + JobScheduler* scheduler, + internal::ResourceMetadata* metadata) + : blocking_task_runner_(blocking_task_runner), + observer_(observer), + scheduler_(scheduler), + metadata_(metadata), + weak_ptr_factory_(this) { +} + +TouchOperation::~TouchOperation() { +} + +void TouchOperation::TouchFile(const base::FilePath& file_path, + const base::Time& last_access_time, + const base::Time& last_modified_time, + const FileOperationCallback& callback) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + + ResourceEntry* entry = new ResourceEntry; + base::PostTaskAndReplyWithResult( + blocking_task_runner_, + FROM_HERE, + base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath, + base::Unretained(metadata_), file_path, entry), + base::Bind(&TouchOperation::TouchFileAfterGetResourceEntry, + weak_ptr_factory_.GetWeakPtr(), + file_path, last_access_time, last_modified_time, callback, + base::Owned(entry))); +} + +void TouchOperation::TouchFileAfterGetResourceEntry( + const base::FilePath& file_path, + const base::Time& last_access_time, + const base::Time& last_modified_time, + const FileOperationCallback& callback, + ResourceEntry* entry, + FileError error) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + DCHECK(entry); + + if (error != FILE_ERROR_OK) { + callback.Run(error); + return; + } + + // Note: |last_modified_time| is mapped to modifiedDate, |last_access_time| + // is mapped to lastViewedByMeDate. See also ConvertToResourceEntry(). + scheduler_->TouchResource( + entry->resource_id(), last_modified_time, last_access_time, + base::Bind(&TouchOperation::TouchFileAfterServerTimeStampUpdated, + weak_ptr_factory_.GetWeakPtr(), + file_path, callback)); +} + +void TouchOperation::TouchFileAfterServerTimeStampUpdated( + const base::FilePath& file_path, + const FileOperationCallback& callback, + google_apis::GDataErrorCode gdata_error, + scoped_ptr<google_apis::ResourceEntry> resource_entry) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + + FileError error = util::GDataToFileError(gdata_error); + if (error != FILE_ERROR_OK) { + callback.Run(error); + return; + } + + base::PostTaskAndReplyWithResult( + blocking_task_runner_, + FROM_HERE, + base::Bind(&internal::ResourceMetadata::RefreshEntry, + base::Unretained(metadata_), + ConvertToResourceEntry(*resource_entry), + static_cast<base::FilePath*>(NULL), + static_cast<ResourceEntry*>(NULL)), + base::Bind(&TouchOperation::TouchFileAfterRefreshMetadata, + weak_ptr_factory_.GetWeakPtr(), file_path, callback)); +} + +void TouchOperation::TouchFileAfterRefreshMetadata( + const base::FilePath& file_path, + const FileOperationCallback& callback, + FileError error) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + + if (error == FILE_ERROR_OK) + observer_->OnDirectoryChangedByOperation(file_path.DirName()); + + callback.Run(error); +} + +} // namespace file_system +} // namespace drive |