1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file.
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/get_file_for_saving_operation.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/bind_helpers.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback_helpers.h"
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/create_file_operation.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/download_operation.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_delegate.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_write_watcher.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/job_scheduler.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/browser_thread.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing content::BrowserThread;
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace drive {
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace file_system {
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FileError OpenCacheFileForWrite(
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    internal::ResourceMetadata* metadata,
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    internal::FileCache* cache,
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& local_id,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<base::ScopedClosureRunner>* file_closer,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ResourceEntry* entry) {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FileError error = cache->OpenForWrite(local_id, file_closer);
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (error != FILE_ERROR_OK)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error;
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return metadata->GetResourceEntryById(local_id, entry);
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGetFileForSavingOperation::GetFileForSavingOperation(
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EventLogger* logger,
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::SequencedTaskRunner* blocking_task_runner,
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    OperationDelegate* delegate,
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    JobScheduler* scheduler,
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    internal::ResourceMetadata* metadata,
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    internal::FileCache* cache,
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& temporary_file_directory)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : logger_(logger),
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      create_file_operation_(new CreateFileOperation(blocking_task_runner,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                     delegate,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                     metadata)),
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      download_operation_(new DownloadOperation(blocking_task_runner,
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                delegate,
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                scheduler,
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                metadata,
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                cache,
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                temporary_file_directory)),
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_write_watcher_(new internal::FileWriteWatcher),
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      blocking_task_runner_(blocking_task_runner),
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      delegate_(delegate),
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      metadata_(metadata),
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cache_(cache),
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_ptr_factory_(this) {
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochGetFileForSavingOperation::~GetFileForSavingOperation() {
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GetFileForSavingOperation::GetFileForSaving(
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& file_path,
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GetFileCallback& callback) {
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback.is_null());
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  create_file_operation_->CreateFile(
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      file_path,
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      false,  // error_if_already_exists
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // no specific mime type
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterCreate,
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 weak_ptr_factory_.GetWeakPtr(),
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 file_path,
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 callback));
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GetFileForSavingOperation::GetFileForSavingAfterCreate(
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& file_path,
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GetFileCallback& callback,
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FileError error) {
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback.is_null());
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (error != FILE_ERROR_OK) {
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    callback.Run(error, base::FilePath(), scoped_ptr<ResourceEntry>());
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  download_operation_->EnsureFileDownloadedByPath(
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      file_path,
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ClientContext(USER_INITIATED),
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetFileContentInitializedCallback(),
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      google_apis::GetContentCallback(),
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterDownload,
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 weak_ptr_factory_.GetWeakPtr(),
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 callback));
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GetFileForSavingOperation::GetFileForSavingAfterDownload(
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GetFileCallback& callback,
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FileError error,
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& cache_path,
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<ResourceEntry> entry) {
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback.is_null());
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (error != FILE_ERROR_OK) {
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    callback.Run(error, base::FilePath(), scoped_ptr<ResourceEntry>());
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string& local_id = entry->local_id();
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResourceEntry* entry_ptr = entry.get();
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::ScopedClosureRunner>* file_closer =
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new scoped_ptr<base::ScopedClosureRunner>;
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::PostTaskAndReplyWithResult(
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      blocking_task_runner_.get(),
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FROM_HERE,
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&OpenCacheFileForWrite,
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 metadata_,
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 cache_,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 local_id,
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 file_closer,
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 entry_ptr),
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterOpenForWrite,
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 weak_ptr_factory_.GetWeakPtr(),
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 callback,
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 cache_path,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Passed(&entry),
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Owned(file_closer)));
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GetFileForSavingOperation::GetFileForSavingAfterOpenForWrite(
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GetFileCallback& callback,
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& cache_path,
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<ResourceEntry> entry,
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<base::ScopedClosureRunner>* file_closer,
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FileError error) {
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback.is_null());
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (error != FILE_ERROR_OK) {
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    callback.Run(error, base::FilePath(), scoped_ptr<ResourceEntry>());
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string& local_id = entry->local_id();
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  file_write_watcher_->StartWatch(
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cache_path,
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&GetFileForSavingOperation::GetFileForSavingAfterWatch,
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 weak_ptr_factory_.GetWeakPtr(),
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 callback,
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 cache_path,
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 base::Passed(&entry)),
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(&GetFileForSavingOperation::OnWriteEvent,
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 local_id,
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Passed(file_closer)));
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid GetFileForSavingOperation::GetFileForSavingAfterWatch(
170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GetFileCallback& callback,
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& cache_path,
172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<ResourceEntry> entry,
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool success) {
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback.is_null());
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  logger_->Log(logging::LOG_INFO, "Started watching modification to %s [%s].",
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               entry->local_id().c_str(),
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               success ? "ok" : "fail");
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!success) {
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    callback.Run(FILE_ERROR_FAILED,
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 base::FilePath(), scoped_ptr<ResourceEntry>());
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  callback.Run(FILE_ERROR_OK, cache_path, entry.Pass());
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GetFileForSavingOperation::OnWriteEvent(
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& local_id,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<base::ScopedClosureRunner> file_closer) {
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  logger_->Log(logging::LOG_INFO, "Detected modification to %s.",
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               local_id.c_str());
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  delegate_->OnEntryUpdatedByOperation(local_id);
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Clients may have enlarged the file. By FreeDiskpSpaceIfNeededFor(0),
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // we try to ensure (0 + the-minimum-safe-margin = 512MB as of now) space.
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  blocking_task_runner_->PostTask(
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      FROM_HERE,
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(base::IgnoreResult(
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          base::Bind(&internal::FileCache::FreeDiskSpaceIfNeededFor,
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                     base::Unretained(cache_),
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                     0))));
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace file_system
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace drive
210