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
|
// Copyright 2014 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_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_H_
#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_H_
#include <string>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/chromeos/file_system_provider/abort_callback.h"
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_observer.h"
#include "chrome/browser/chromeos/file_system_provider/request_manager.h"
#include "storage/browser/fileapi/async_file_util.h"
#include "storage/browser/fileapi/watcher_manager.h"
#include "url/gurl.h"
class Profile;
namespace net {
class IOBuffer;
} // namespace net
namespace base {
class FilePath;
} // namespace base
namespace extensions {
class EventRouter;
} // namespace extensions
namespace chromeos {
namespace file_system_provider {
class NotificationManagerInterface;
// Automatically calls the |update_callback| after all of the callbacks created
// with |CreateCallback| are called.
//
// It's used to update tags of watchers once a notification about a change is
// handled. It is to make sure that the change notification is fully handled
// before remembering the new tag.
//
// It is necessary to update the tag after all observers handle it fully, so
// in case of shutdown or a crash we get the notifications again.
class AutoUpdater : public base::RefCounted<AutoUpdater> {
public:
explicit AutoUpdater(const base::Closure& update_callback);
// Creates a new callback which needs to be called before the update callback
// is called.
base::Closure CreateCallback();
private:
friend class base::RefCounted<AutoUpdater>;
// Called once the callback created with |CreateCallback| is executed. Once
// all of such callbacks are called, then the update callback is invoked.
void OnPendingCallback();
virtual ~AutoUpdater();
base::Closure update_callback_;
int created_callbacks_;
int pending_callbacks_;
};
// Provided file system implementation. Forwards requests between providers and
// clients.
class ProvidedFileSystem : public ProvidedFileSystemInterface {
public:
ProvidedFileSystem(Profile* profile,
const ProvidedFileSystemInfo& file_system_info);
virtual ~ProvidedFileSystem();
// Sets a custom event router. Used in unit tests to mock out the real
// extension.
void SetEventRouterForTesting(extensions::EventRouter* event_router);
// Sets a custom notification manager. It will recreate the request manager,
// so is must be called just after creating ProvideFileSystem instance.
// Used by unit tests.
void SetNotificationManagerForTesting(
scoped_ptr<NotificationManagerInterface> notification_manager);
// ProvidedFileSystemInterface overrides.
virtual AbortCallback RequestUnmount(
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback GetMetadata(
const base::FilePath& entry_path,
MetadataFieldMask fields,
const GetMetadataCallback& callback) override;
virtual AbortCallback ReadDirectory(
const base::FilePath& directory_path,
const storage::AsyncFileUtil::ReadDirectoryCallback& callback) override;
virtual AbortCallback OpenFile(const base::FilePath& file_path,
OpenFileMode mode,
const OpenFileCallback& callback) override;
virtual AbortCallback CloseFile(
int file_handle,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback ReadFile(
int file_handle,
net::IOBuffer* buffer,
int64 offset,
int length,
const ReadChunkReceivedCallback& callback) override;
virtual AbortCallback CreateDirectory(
const base::FilePath& directory_path,
bool recursive,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback DeleteEntry(
const base::FilePath& entry_path,
bool recursive,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback CreateFile(
const base::FilePath& file_path,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback CopyEntry(
const base::FilePath& source_path,
const base::FilePath& target_path,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback MoveEntry(
const base::FilePath& source_path,
const base::FilePath& target_path,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback Truncate(
const base::FilePath& file_path,
int64 length,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback WriteFile(
int file_handle,
net::IOBuffer* buffer,
int64 offset,
int length,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual AbortCallback AddWatcher(
const GURL& origin,
const base::FilePath& entry_path,
bool recursive,
bool persistent,
const storage::AsyncFileUtil::StatusCallback& callback,
const storage::WatcherManager::NotificationCallback&
notification_callback) override;
virtual void RemoveWatcher(
const GURL& origin,
const base::FilePath& entry_path,
bool recursive,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual const ProvidedFileSystemInfo& GetFileSystemInfo() const override;
virtual RequestManager* GetRequestManager() override;
virtual Watchers* GetWatchers() override;
virtual void AddObserver(ProvidedFileSystemObserver* observer) override;
virtual void RemoveObserver(ProvidedFileSystemObserver* observer) override;
virtual void Notify(
const base::FilePath& entry_path,
bool recursive,
storage::WatcherManager::ChangeType change_type,
scoped_ptr<ProvidedFileSystemObserver::Changes> changes,
const std::string& tag,
const storage::AsyncFileUtil::StatusCallback& callback) override;
virtual base::WeakPtr<ProvidedFileSystemInterface> GetWeakPtr() override;
private:
// Aborts an operation executed with a request id equal to
// |operation_request_id|. The request is removed immediately on the C++ side
// despite being handled by the providing extension or not.
void Abort(int operation_request_id,
const storage::AsyncFileUtil::StatusCallback& callback);
// Called when adding a watcher is completed with either success or en error.
void OnAddWatcherCompleted(
const base::FilePath& entry_path,
bool recursive,
const Subscriber& subscriber,
const storage::AsyncFileUtil::StatusCallback& callback,
base::File::Error result);
// Called when all observers finished handling the change notification. It
// updates the tag to |tag| for the entry at |entry_path|.
void OnNotifyCompleted(
const base::FilePath& entry_path,
bool recursive,
storage::WatcherManager::ChangeType change_type,
scoped_ptr<ProvidedFileSystemObserver::Changes> changes,
const std::string& tag,
const storage::AsyncFileUtil::StatusCallback& callback);
Profile* profile_; // Not owned.
extensions::EventRouter* event_router_; // Not owned. May be NULL.
ProvidedFileSystemInfo file_system_info_;
scoped_ptr<NotificationManagerInterface> notification_manager_;
scoped_ptr<RequestManager> request_manager_;
Watchers watchers_;
ObserverList<ProvidedFileSystemObserver> observers_;
base::WeakPtrFactory<ProvidedFileSystem> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ProvidedFileSystem);
};
} // namespace file_system_provider
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_H_
|