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/write_on_cache_file.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 "chrome/browser/chromeos/drive/file_system_util.h"
12 #include "content/public/browser/browser_thread.h"
13
14 using content::BrowserThread;
15
16 namespace drive {
17
18 namespace {
19
20 // Runs |close_callback| and |reply|.
RunCloseCallbackAndReplyTask(const base::Closure & close_callback,const FileOperationCallback & reply,FileError error)21 void RunCloseCallbackAndReplyTask(const base::Closure& close_callback,
22 const FileOperationCallback& reply,
23 FileError error) {
24 if (!close_callback.is_null())
25 close_callback.Run();
26 DCHECK(!reply.is_null());
27 reply.Run(error);
28 }
29
30 // Runs |file_io_task_callback| in blocking pool and runs |close_callback|
31 // in the UI thread after that.
WriteOnCacheFileAfterOpenFile(const base::FilePath & drive_path,const WriteOnCacheFileCallback & file_io_task_callback,const FileOperationCallback & reply,FileError error,const base::FilePath & local_cache_path,const base::Closure & close_callback)32 void WriteOnCacheFileAfterOpenFile(
33 const base::FilePath& drive_path,
34 const WriteOnCacheFileCallback& file_io_task_callback,
35 const FileOperationCallback& reply,
36 FileError error,
37 const base::FilePath& local_cache_path,
38 const base::Closure& close_callback) {
39 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
40
41 BrowserThread::GetBlockingPool()->PostTaskAndReply(
42 FROM_HERE,
43 base::Bind(file_io_task_callback, error, local_cache_path),
44 base::Bind(&RunCloseCallbackAndReplyTask, close_callback, reply, error));
45 }
46
47 } // namespace
48
WriteOnCacheFile(FileSystemInterface * file_system,const base::FilePath & path,const std::string & mime_type,const WriteOnCacheFileCallback & callback)49 void WriteOnCacheFile(FileSystemInterface* file_system,
50 const base::FilePath& path,
51 const std::string& mime_type,
52 const WriteOnCacheFileCallback& callback) {
53 WriteOnCacheFileAndReply(file_system, path, mime_type, callback,
54 base::Bind(&util::EmptyFileOperationCallback));
55 }
56
WriteOnCacheFileAndReply(FileSystemInterface * file_system,const base::FilePath & path,const std::string & mime_type,const WriteOnCacheFileCallback & callback,const FileOperationCallback & reply)57 void WriteOnCacheFileAndReply(FileSystemInterface* file_system,
58 const base::FilePath& path,
59 const std::string& mime_type,
60 const WriteOnCacheFileCallback& callback,
61 const FileOperationCallback& reply) {
62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
63 DCHECK(file_system);
64 DCHECK(!callback.is_null());
65 DCHECK(!reply.is_null());
66
67 file_system->OpenFile(
68 path,
69 OPEN_OR_CREATE_FILE,
70 mime_type,
71 base::Bind(&WriteOnCacheFileAfterOpenFile, path, callback, reply));
72 }
73
74 } // namespace drive
75