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
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/drive/file_write_helper.h"
6
7#include "base/bind.h"
8#include "base/callback.h"
9#include "base/threading/sequenced_worker_pool.h"
10#include "chrome/browser/chromeos/drive/file_system_interface.h"
11#include "content/public/browser/browser_thread.h"
12
13using content::BrowserThread;
14
15namespace drive {
16
17FileWriteHelper::FileWriteHelper(FileSystemInterface* file_system)
18    : file_system_(file_system),
19      weak_ptr_factory_(this) {
20  // Must be created in DriveIntegrationService.
21  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
22}
23
24FileWriteHelper::~FileWriteHelper() {
25  // Must be destroyed in DriveIntegrationService.
26  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
27}
28
29void FileWriteHelper::PrepareWritableFileAndRun(
30    const base::FilePath& file_path,
31    const OpenFileCallback& callback) {
32  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
33  DCHECK(!callback.is_null());
34
35  file_system_->OpenFile(
36      file_path, OPEN_OR_CREATE_FILE,
37      base::Bind(&FileWriteHelper::PrepareWritableFileAndRunAfterOpenFile,
38                 weak_ptr_factory_.GetWeakPtr(), file_path, callback));
39}
40
41void FileWriteHelper::PrepareWritableFileAndRunAfterOpenFile(
42    const base::FilePath& file_path,
43    const OpenFileCallback& callback,
44    FileError error,
45    const base::FilePath& local_cache_path,
46    const base::Closure& close_callback) {
47  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
48  DCHECK(!callback.is_null());
49
50  if (error != FILE_ERROR_OK) {
51    content::BrowserThread::GetBlockingPool()->PostTask(
52        FROM_HERE,
53        base::Bind(callback, error, base::FilePath()));
54    return;
55  }
56
57  content::BrowserThread::GetBlockingPool()->PostTaskAndReply(
58      FROM_HERE,
59      base::Bind(callback, FILE_ERROR_OK, local_cache_path),
60      close_callback);
61}
62
63}  // namespace drive
64