| Index: chrome/browser/chromeos/drive/file_system/get_file_for_saving_operation.cc
|
| diff --git a/chrome/browser/chromeos/drive/file_system/get_file_for_saving_operation.cc b/chrome/browser/chromeos/drive/file_system/get_file_for_saving_operation.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..79648764d98c93dc08f83e8d70256e9c319bd959
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/drive/file_system/get_file_for_saving_operation.cc
|
| @@ -0,0 +1,146 @@
|
| +// 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/get_file_for_saving_operation.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "chrome/browser/chromeos/drive/file_system/create_file_operation.h"
|
| +#include "chrome/browser/chromeos/drive/file_system/download_operation.h"
|
| +#include "chrome/browser/chromeos/drive/file_write_watcher.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +
|
| +using content::BrowserThread;
|
| +
|
| +namespace drive {
|
| +namespace file_system {
|
| +
|
| +GetFileForSavingOperation::GetFileForSavingOperation(
|
| + base::SequencedTaskRunner* blocking_task_runner,
|
| + OperationObserver* observer,
|
| + JobScheduler* scheduler,
|
| + internal::ResourceMetadata* metadata,
|
| + internal::FileCache* cache,
|
| + const base::FilePath& temporary_file_directory)
|
| + : create_file_operation_(new CreateFileOperation(blocking_task_runner,
|
| + observer,
|
| + scheduler,
|
| + metadata,
|
| + cache)),
|
| + download_operation_(new DownloadOperation(blocking_task_runner,
|
| + observer,
|
| + scheduler,
|
| + metadata,
|
| + cache,
|
| + temporary_file_directory)),
|
| + file_write_watcher_(new internal::FileWriteWatcher(observer)),
|
| + cache_(cache),
|
| + weak_ptr_factory_(this) {
|
| +}
|
| +
|
| +GetFileForSavingOperation::~GetFileForSavingOperation() {
|
| +}
|
| +
|
| +void GetFileForSavingOperation::GetFileForSaving(
|
| + const base::FilePath& file_path,
|
| + const GetFileCallback& callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!callback.is_null());
|
| +
|
| + create_file_operation_->CreateFile(
|
| + file_path,
|
| + false, // error_if_already_exists
|
| + base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterCreate,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + file_path,
|
| + callback));
|
| +}
|
| +
|
| +void GetFileForSavingOperation::GetFileForSavingAfterCreate(
|
| + const base::FilePath& file_path,
|
| + const GetFileCallback& callback,
|
| + FileError error) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!callback.is_null());
|
| +
|
| + if (error != FILE_ERROR_OK) {
|
| + callback.Run(error, base::FilePath(), scoped_ptr<ResourceEntry>());
|
| + return;
|
| + }
|
| +
|
| + download_operation_->EnsureFileDownloadedByPath(
|
| + file_path,
|
| + ClientContext(USER_INITIATED),
|
| + GetFileContentInitializedCallback(),
|
| + google_apis::GetContentCallback(),
|
| + base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterDownload,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + callback));
|
| +}
|
| +
|
| +void GetFileForSavingOperation::GetFileForSavingAfterDownload(
|
| + const GetFileCallback& callback,
|
| + FileError error,
|
| + const base::FilePath& cache_path,
|
| + scoped_ptr<ResourceEntry> entry) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!callback.is_null());
|
| +
|
| + if (error != FILE_ERROR_OK) {
|
| + callback.Run(error, base::FilePath(), scoped_ptr<ResourceEntry>());
|
| + return;
|
| + }
|
| +
|
| + const std::string& resource_id = entry->resource_id();
|
| + cache_->MarkDirtyOnUIThread(
|
| + resource_id,
|
| + base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterMarkDirty,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + callback,
|
| + cache_path,
|
| + base::Passed(&entry)));
|
| +}
|
| +
|
| +void GetFileForSavingOperation::GetFileForSavingAfterMarkDirty(
|
| + const GetFileCallback& callback,
|
| + const base::FilePath& cache_path,
|
| + scoped_ptr<ResourceEntry> entry,
|
| + FileError error) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!callback.is_null());
|
| +
|
| + if (error != FILE_ERROR_OK) {
|
| + callback.Run(error, base::FilePath(), scoped_ptr<ResourceEntry>());
|
| + return;
|
| + }
|
| +
|
| + const std::string& resource_id = entry->resource_id();
|
| + file_write_watcher_->StartWatch(
|
| + cache_path,
|
| + resource_id,
|
| + base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterWatch,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + callback,
|
| + cache_path,
|
| + base::Passed(&entry)));
|
| +}
|
| +
|
| +void GetFileForSavingOperation::GetFileForSavingAfterWatch(
|
| + const GetFileCallback& callback,
|
| + const base::FilePath& cache_path,
|
| + scoped_ptr<ResourceEntry> entry,
|
| + bool success) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!callback.is_null());
|
| +
|
| + if (!success) {
|
| + callback.Run(FILE_ERROR_FAILED,
|
| + base::FilePath(), scoped_ptr<ResourceEntry>());
|
| + return;
|
| + }
|
| +
|
| + callback.Run(FILE_ERROR_OK, cache_path, entry.Pass());
|
| +}
|
| +
|
| +} // namespace file_system
|
| +} // namespace drive
|
|
|