1 // Copyright 2014 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.
5 // This file provides the core implementation of fileapi methods.
6 // The functions should be called on UI thread.
7 // Note that most method invocation of fileapi is done on IO thread. The gap is
8 // filled by FileSystemProxy.
9 // Also, the order of arguments for the functions which take FileSystemInterface
10 // at the last is intentional. The instance of FileSystemInterface should be
11 // accessible only on UI thread, but arguments are passed on IO thread.
12 // So, here is an intended use case:
13 // 1) Bind arguments on IO thread. Then a callback instance whose type is
14 // Callback<void(FileSysstemInterface*)> is created.
15 // 2) Post the task to the UI thread.
16 // 3) On UI thread, check if the instance of FileSystemInterface is alive or
17 // not. If yes, Run the callback with it.
19 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILEAPI_WORKER_H_
20 #define CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILEAPI_WORKER_H_
24 #include "base/basictypes.h"
25 #include "base/callback_forward.h"
26 #include "base/memory/weak_ptr.h"
27 #include "chrome/browser/chromeos/drive/file_errors.h"
28 #include "storage/browser/blob/scoped_file.h"
35 struct DirectoryEntry
;
37 } // namespace storage
41 class FileSystemInterface
;
43 namespace fileapi_internal
{
45 typedef base::Callback
<FileSystemInterface
*()> FileSystemGetter
;
47 typedef base::Callback
<
48 void(base::File::Error result
)> StatusCallback
;
49 typedef base::Callback
<
50 void(base::File::Error result
,
51 const base::File::Info
& file_info
)> GetFileInfoCallback
;
52 typedef base::Callback
<
53 void(base::File::Error result
,
54 const std::vector
<storage::DirectoryEntry
>& file_list
,
55 bool has_more
)> ReadDirectoryCallback
;
56 typedef base::Callback
<void(base::File::Error result
,
57 const base::File::Info
& file_info
,
58 const base::FilePath
& snapshot_file_path
,
59 storage::ScopedFile::ScopeOutPolicy
60 scope_out_policy
)> CreateSnapshotFileCallback
;
61 typedef base::Callback
<
62 void(base::File::Error result
,
63 const base::FilePath
& snapshot_file_path
,
64 const base::Closure
& close_callback
)>
65 CreateWritableSnapshotFileCallback
;
66 typedef base::Callback
<
68 const base::Closure
& close_callback
)> OpenFileCallback
;
70 // Gets the profile of the Drive entry pointed by |url|. Used as
71 // FileSystemGetter callback by binding an URL on the IO thread and passing to
73 FileSystemInterface
* GetFileSystemFromUrl(const storage::FileSystemURL
& url
);
75 // Runs |file_system_getter| to obtain the instance of FileSystemInstance,
76 // and then runs |callback| with it.
77 // If |file_system_getter| returns NULL, runs |error_callback| instead.
78 // This function must be called on UI thread.
79 // |file_system_getter| and |callback| must not be null, but
80 // |error_callback| can be null (if no operation is necessary for error
82 void RunFileSystemCallback(
83 const FileSystemGetter
& file_system_getter
,
84 const base::Callback
<void(FileSystemInterface
*)>& callback
,
85 const base::Closure
& error_callback
);
87 // Returns the metadata info of the file at |file_path|.
88 // Called from FileSystemProxy::GetFileInfo().
89 void GetFileInfo(const base::FilePath
& file_path
,
90 const GetFileInfoCallback
& callback
,
91 FileSystemInterface
* file_system
);
93 // Copies a file from |src_file_path| to |dest_file_path|.
94 // Called from FileSystemProxy::Copy().
95 void Copy(const base::FilePath
& src_file_path
,
96 const base::FilePath
& dest_file_path
,
97 bool preserve_last_modified
,
98 const StatusCallback
& callback
,
99 FileSystemInterface
* file_system
);
101 // Moves a file from |src_file_path| to |dest_file_path|.
102 // Called from FileSystemProxy::Move().
103 void Move(const base::FilePath
& src_file_path
,
104 const base::FilePath
& dest_file_path
,
105 const StatusCallback
& callback
,
106 FileSystemInterface
* file_system
);
109 // Copies a file at |src_foreign_file_path|, which is not managed by Drive File
110 // System, to |dest_file_path|.
111 void CopyInForeignFile(const base::FilePath
& src_foreign_file_path
,
112 const base::FilePath
& dest_file_path
,
113 const StatusCallback
& callback
,
114 FileSystemInterface
* file_system
);
116 // Reads the contents of the directory at |file_path|.
117 // Called from FileSystemProxy::ReadDirectory().
118 void ReadDirectory(const base::FilePath
& file_path
,
119 const ReadDirectoryCallback
& callback
,
120 FileSystemInterface
* file_system
);
122 // Removes a file at |file_path|. Called from FileSystemProxy::Remove().
123 void Remove(const base::FilePath
& file_path
,
125 const StatusCallback
& callback
,
126 FileSystemInterface
* file_system
);
128 // Creates a new directory at |file_path|.
129 // Called from FileSystemProxy::CreateDirectory().
130 void CreateDirectory(const base::FilePath
& file_path
,
133 const StatusCallback
& callback
,
134 FileSystemInterface
* file_system
);
136 // Creates a new file at |file_path|.
137 // Called from FileSystemProxy::CreateFile().
138 void CreateFile(const base::FilePath
& file_path
,
140 const StatusCallback
& callback
,
141 FileSystemInterface
* file_system
);
143 // Truncates the file at |file_path| to |length| bytes.
144 // Called from FileSystemProxy::Truncate().
145 void Truncate(const base::FilePath
& file_path
,
147 const StatusCallback
& callback
,
148 FileSystemInterface
* file_system
);
150 // Creates a snapshot for the file at |file_path|.
151 // Called from FileSystemProxy::CreateSnapshotFile().
152 void CreateSnapshotFile(const base::FilePath
& file_path
,
153 const CreateSnapshotFileCallback
& callback
,
154 FileSystemInterface
* file_system
);
156 // Creates a writable snapshot for the file at |file_path|.
157 // After writing operation is done, |close_callback| must be called.
158 void CreateWritableSnapshotFile(
159 const base::FilePath
& file_path
,
160 const CreateWritableSnapshotFileCallback
& callback
,
161 FileSystemInterface
* file_system
);
163 // Opens the file at |file_path| with options |file_flags|.
164 // Called from FileSystemProxy::OpenFile.
165 void OpenFile(const base::FilePath
& file_path
,
167 const OpenFileCallback
& callback
,
168 FileSystemInterface
* file_system
);
170 // Changes timestamp of the file at |file_path| to |last_access_time| and
171 // |last_modified_time|. Called from FileSystemProxy::TouchFile().
172 void TouchFile(const base::FilePath
& file_path
,
173 const base::Time
& last_access_time
,
174 const base::Time
& last_modified_time
,
175 const StatusCallback
& callback
,
176 FileSystemInterface
* file_system
);
178 } // namespace fileapi_internal
181 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILEAPI_WORKER_H_