1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
// Copyright (c) 2012 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.
#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_H_
#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_H_
#include <string>
#include <vector>
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/chromeos/drive/change_list_loader_observer.h"
#include "chrome/browser/chromeos/drive/file_system/operation_delegate.h"
#include "chrome/browser/chromeos/drive/file_system_interface.h"
#include "google_apis/drive/drive_api_error_codes.h"
class PrefService;
namespace base {
class SequencedTaskRunner;
} // namespace base
namespace google_apis {
class AboutResource;
class ResourceEntry;
} // namespace google_apis
namespace drive {
struct ClientContext;
class EventLogger;
class FileCacheEntry;
class FileSystemObserver;
class JobScheduler;
namespace internal {
class AboutResourceLoader;
class ChangeListLoader;
class DirectoryLoader;
class FileCache;
class LoaderController;
class ResourceMetadata;
class SyncClient;
} // namespace internal
namespace file_system {
class CopyOperation;
class CreateDirectoryOperation;
class CreateFileOperation;
class DownloadOperation;
class GetFileForSavingOperation;
class MoveOperation;
class OpenFileOperation;
class RemoveOperation;
class SearchOperation;
class SetPropertyOperation;
class TouchOperation;
class TruncateOperation;
} // namespace file_system
// The production implementation of FileSystemInterface.
class FileSystem : public FileSystemInterface,
public internal::ChangeListLoaderObserver,
public file_system::OperationDelegate {
public:
FileSystem(PrefService* pref_service,
EventLogger* logger,
internal::FileCache* cache,
JobScheduler* scheduler,
internal::ResourceMetadata* resource_metadata,
base::SequencedTaskRunner* blocking_task_runner,
const base::FilePath& temporary_file_directory);
~FileSystem() override;
// FileSystemInterface overrides.
void AddObserver(FileSystemObserver* observer) override;
void RemoveObserver(FileSystemObserver* observer) override;
void CheckForUpdates() override;
void Search(const std::string& search_query,
const GURL& next_link,
const SearchCallback& callback) override;
void SearchMetadata(const std::string& query,
int options,
int at_most_num_matches,
const SearchMetadataCallback& callback) override;
void SearchByHashes(const std::set<std::string>& hashes,
const SearchByHashesCallback& callback) override;
void TransferFileFromLocalToRemote(
const base::FilePath& local_src_file_path,
const base::FilePath& remote_dest_file_path,
const FileOperationCallback& callback) override;
void OpenFile(const base::FilePath& file_path,
OpenMode open_mode,
const std::string& mime_type,
const OpenFileCallback& callback) override;
void Copy(const base::FilePath& src_file_path,
const base::FilePath& dest_file_path,
bool preserve_last_modified,
const FileOperationCallback& callback) override;
void Move(const base::FilePath& src_file_path,
const base::FilePath& dest_file_path,
const FileOperationCallback& callback) override;
void Remove(const base::FilePath& file_path,
bool is_recursive,
const FileOperationCallback& callback) override;
void CreateDirectory(const base::FilePath& directory_path,
bool is_exclusive,
bool is_recursive,
const FileOperationCallback& callback) override;
void CreateFile(const base::FilePath& file_path,
bool is_exclusive,
const std::string& mime_type,
const FileOperationCallback& callback) override;
void TouchFile(const base::FilePath& file_path,
const base::Time& last_access_time,
const base::Time& last_modified_time,
const FileOperationCallback& callback) override;
void TruncateFile(const base::FilePath& file_path,
int64 length,
const FileOperationCallback& callback) override;
void Pin(const base::FilePath& file_path,
const FileOperationCallback& callback) override;
void Unpin(const base::FilePath& file_path,
const FileOperationCallback& callback) override;
void GetFile(const base::FilePath& file_path,
const GetFileCallback& callback) override;
void GetFileForSaving(const base::FilePath& file_path,
const GetFileCallback& callback) override;
base::Closure GetFileContent(
const base::FilePath& file_path,
const GetFileContentInitializedCallback& initialized_callback,
const google_apis::GetContentCallback& get_content_callback,
const FileOperationCallback& completion_callback) override;
void GetResourceEntry(const base::FilePath& file_path,
const GetResourceEntryCallback& callback) override;
void ReadDirectory(const base::FilePath& directory_path,
const ReadDirectoryEntriesCallback& entries_callback,
const FileOperationCallback& completion_callback) override;
void GetAvailableSpace(const GetAvailableSpaceCallback& callback) override;
void GetShareUrl(const base::FilePath& file_path,
const GURL& embed_origin,
const GetShareUrlCallback& callback) override;
void GetMetadata(const GetFilesystemMetadataCallback& callback) override;
void MarkCacheFileAsMounted(const base::FilePath& drive_file_path,
const MarkMountedCallback& callback) override;
void MarkCacheFileAsUnmounted(const base::FilePath& cache_file_path,
const FileOperationCallback& callback) override;
void AddPermission(const base::FilePath& drive_file_path,
const std::string& email,
google_apis::drive::PermissionRole role,
const FileOperationCallback& callback) override;
void SetProperty(const base::FilePath& drive_file_path,
google_apis::drive::Property::Visibility visibility,
const std::string& key,
const std::string& value,
const FileOperationCallback& callback) override;
void Reset(const FileOperationCallback& callback) override;
void GetPathFromResourceId(const std::string& resource_id,
const GetFilePathCallback& callback) override;
void FreeDiskSpaceIfNeededFor(int64 num_bytes,
const FreeDiskSpaceCallback& callback) override;
// file_system::OperationDelegate overrides.
void OnFileChangedByOperation(const FileChange& changed_files) override;
void OnEntryUpdatedByOperation(const ClientContext& context,
const std::string& local_id) override;
void OnDriveSyncError(file_system::DriveSyncErrorType type,
const std::string& local_id) override;
bool WaitForSyncComplete(const std::string& local_id,
const FileOperationCallback& callback) override;
// ChangeListLoader::Observer overrides.
// Used to propagate events from ChangeListLoader.
void OnDirectoryReloaded(const base::FilePath& directory_path) override;
void OnFileChanged(const FileChange& changed_files) override;
void OnLoadFromServerComplete() override;
void OnInitialLoadComplete() override;
// Used by tests.
internal::ChangeListLoader* change_list_loader_for_testing() {
return change_list_loader_.get();
}
internal::SyncClient* sync_client_for_testing() { return sync_client_.get(); }
private:
struct CreateDirectoryParams;
// Used for initialization and Reset(). (Re-)initializes sub components that
// need to be recreated during the reset of resource metadata and the cache.
void ResetComponents();
// Part of CreateDirectory(). Called after ReadDirectory()
// is called and made sure that the resource metadata is loaded.
void CreateDirectoryAfterRead(const CreateDirectoryParams& params,
FileError error);
void FinishPin(const FileOperationCallback& callback,
const std::string* local_id,
FileError error);
void FinishUnpin(const FileOperationCallback& callback,
const std::string* local_id,
FileError error);
// Callback for handling about resource fetch.
void OnGetAboutResource(
const GetAvailableSpaceCallback& callback,
google_apis::DriveApiErrorCode status,
scoped_ptr<google_apis::AboutResource> about_resource);
// Part of CheckForUpdates(). Called when
// ChangeListLoader::CheckForUpdates() is complete.
void OnUpdateChecked(FileError error);
// Part of GetResourceEntry().
// Called when ReadDirectory() is complete.
void GetResourceEntryAfterRead(const base::FilePath& file_path,
const GetResourceEntryCallback& callback,
FileError error);
// Part of GetShareUrl. Resolves the resource entry to get the resource it,
// and then uses it to ask for the share url. |callback| must not be null.
void GetShareUrlAfterGetResourceEntry(const base::FilePath& file_path,
const GURL& embed_origin,
const GetShareUrlCallback& callback,
ResourceEntry* entry,
FileError error);
void OnGetResourceEntryForGetShareUrl(const GetShareUrlCallback& callback,
google_apis::DriveApiErrorCode status,
const GURL& share_url);
// Part of AddPermission.
void AddPermissionAfterGetResourceEntry(
const std::string& email,
google_apis::drive::PermissionRole role,
const FileOperationCallback& callback,
ResourceEntry* entry,
FileError error);
// Part of OnDriveSyncError().
virtual void OnDriveSyncErrorAfterGetFilePath(
file_system::DriveSyncErrorType type,
const base::FilePath* file_path,
FileError error);
// Used to get Drive related preferences.
PrefService* pref_service_;
// Sub components owned by DriveIntegrationService.
EventLogger* logger_;
internal::FileCache* cache_;
JobScheduler* scheduler_;
internal::ResourceMetadata* resource_metadata_;
// Time of the last update check.
base::Time last_update_check_time_;
// Error of the last update check.
FileError last_update_check_error_;
// Used to load about resource.
scoped_ptr<internal::AboutResourceLoader> about_resource_loader_;
// Used to control ChangeListLoader.
scoped_ptr<internal::LoaderController> loader_controller_;
// The loader is used to load the change lists.
scoped_ptr<internal::ChangeListLoader> change_list_loader_;
scoped_ptr<internal::DirectoryLoader> directory_loader_;
scoped_ptr<internal::SyncClient> sync_client_;
ObserverList<FileSystemObserver> observers_;
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
base::FilePath temporary_file_directory_;
// Implementation of each file system operation.
scoped_ptr<file_system::CopyOperation> copy_operation_;
scoped_ptr<file_system::CreateDirectoryOperation> create_directory_operation_;
scoped_ptr<file_system::CreateFileOperation> create_file_operation_;
scoped_ptr<file_system::MoveOperation> move_operation_;
scoped_ptr<file_system::OpenFileOperation> open_file_operation_;
scoped_ptr<file_system::RemoveOperation> remove_operation_;
scoped_ptr<file_system::TouchOperation> touch_operation_;
scoped_ptr<file_system::TruncateOperation> truncate_operation_;
scoped_ptr<file_system::DownloadOperation> download_operation_;
scoped_ptr<file_system::SearchOperation> search_operation_;
scoped_ptr<file_system::GetFileForSavingOperation>
get_file_for_saving_operation_;
scoped_ptr<file_system::SetPropertyOperation> set_property_operation_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate the weak pointers before any other members are destroyed.
base::WeakPtrFactory<FileSystem> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(FileSystem);
};
} // namespace drive
#endif // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_H_
|