| Index: chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.h
|
| diff --git a/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.h b/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.h
|
| index 82becf3b2df945cff75ea7f97b0d209e9ebbc993..201b314e9f68a2b73a27c8e16b34e190ab647ab9 100644
|
| --- a/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.h
|
| +++ b/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.h
|
| @@ -5,21 +5,15 @@
|
| #ifndef CHROME_BROWSER_MEDIA_GALLERIES_MTP_DEVICE_DELEGATE_IMPL_MAC_H_
|
| #define CHROME_BROWSER_MEDIA_GALLERIES_MTP_DEVICE_DELEGATE_IMPL_MAC_H_
|
|
|
| +#include <list>
|
| +#include <map>
|
| #include <vector>
|
|
|
| #include "base/files/file_path.h"
|
| #include "base/hash_tables.h"
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/platform_file.h"
|
| -#include "base/sequenced_task_runner_helpers.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "webkit/fileapi/file_system_file_util.h"
|
| -#include "webkit/fileapi/media/mtp_device_delegate.h"
|
| -
|
| -namespace base {
|
| -class SequencedTaskRunner;
|
| -}
|
| +#include "webkit/fileapi/media/mtp_device_async_delegate.h"
|
|
|
| namespace chrome {
|
|
|
| @@ -28,94 +22,89 @@ namespace chrome {
|
| // and names of all files notified through the ItemAdded call will be
|
| // all appear as children of that directory. (ItemAdded calls with directories
|
| // will be ignored.)
|
| -class MTPDeviceDelegateImplMac : public fileapi::MTPDeviceDelegate {
|
| +// Note on thread management: This class is thread-compatible: it can be created
|
| +// on any thread, but then mutates all state on the UI thread. The async
|
| +// delegate interface can be invoked on any thread, as it simply forwards calls
|
| +// to the UI thread.
|
| +class MTPDeviceDelegateImplMac : public fileapi::MTPDeviceAsyncDelegate {
|
| public:
|
| MTPDeviceDelegateImplMac(const std::string& device_id,
|
| - const base::FilePath::StringType& synthetic_path,
|
| - base::SequencedTaskRunner* media_task_runner);
|
| + const base::FilePath::StringType& synthetic_path);
|
|
|
| - // MTPDeviceDelegate:
|
| - virtual base::PlatformFileError GetFileInfo(
|
| + // MTPDeviceAsyncDelegate implementation. These functions are called on the
|
| + // IO thread by the async filesystem file util. They forward to
|
| + // similarly-named methods on the UI thread.
|
| + virtual void GetFileInfo(
|
| const base::FilePath& file_path,
|
| - base::PlatformFileInfo* file_info) OVERRIDE;
|
| - virtual scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator>
|
| - CreateFileEnumerator(const base::FilePath& root, bool recursive) OVERRIDE;
|
| - virtual base::PlatformFileError CreateSnapshotFile(
|
| + const GetFileInfoSuccessCallback& success_callback,
|
| + const ErrorCallback& error_callback) OVERRIDE;
|
| + virtual void ReadDirectory(
|
| + const base::FilePath& root,
|
| + const ReadDirectorySuccessCallback& success_callback,
|
| + const ErrorCallback& error_callback) OVERRIDE;
|
| + virtual void CreateSnapshotFile(
|
| const base::FilePath& device_file_path,
|
| const base::FilePath& local_path,
|
| - base::PlatformFileInfo* file_info) OVERRIDE;
|
| + const CreateSnapshotFileSuccessCallback& success_callback,
|
| + const ErrorCallback& error_callback) OVERRIDE;
|
| virtual void CancelPendingTasksAndDeleteDelegate() OVERRIDE;
|
|
|
| - // Forward delegates for ImageCaptureDeviceListener
|
| + // Forward delegates for ImageCaptureDeviceListener. These are
|
| + // invoked in callbacks of the ImageCapture library on the UI thread.
|
| virtual void ItemAdded(const std::string& name,
|
| const base::PlatformFileInfo& info);
|
| virtual void NoMoreItems();
|
| virtual void DownloadedFile(const std::string& name,
|
| base::PlatformFileError error);
|
|
|
| - // Implementation returned by |CreateFileEnumerator()|. Must be deleted
|
| - // before CancelPendingTasksAndDeleteDelegate is called.
|
| - class Enumerator :
|
| - public fileapi::FileSystemFileUtil::AbstractFileEnumerator {
|
| - public:
|
| - explicit Enumerator(MTPDeviceDelegateImplMac* delegate);
|
| - virtual ~Enumerator();
|
| -
|
| - virtual base::FilePath Next() OVERRIDE;
|
| - virtual int64 Size() OVERRIDE;
|
| - virtual base::Time LastModifiedTime() OVERRIDE;
|
| - virtual bool IsDirectory() OVERRIDE;
|
| -
|
| - // Called by the delegate to signal any waiters that the received items
|
| - // list has changed state.
|
| - void ItemsChanged();
|
| -
|
| - private:
|
| - MTPDeviceDelegateImplMac* delegate_;
|
| - size_t position_;
|
| - base::WaitableEvent wait_for_items_;
|
| - };
|
| -
|
| - // GetFile and HasAllFiles called by enumerators.
|
| - base::FilePath GetFile(size_t index);
|
| - bool ReceivedAllFiles();
|
| - void RemoveEnumerator(Enumerator* enumerator);
|
| + // Scheduled when early directory reads are requested. The
|
| + // timeout will signal an ABORT error to the caller if the
|
| + // device metadata cannot be read.
|
| + void ReadDirectoryTimeout(const base::FilePath& root);
|
|
|
| private:
|
| - friend class base::DeleteHelper<MTPDeviceDelegateImplMac>;
|
| -
|
| class DeviceListener;
|
|
|
| virtual ~MTPDeviceDelegateImplMac();
|
|
|
| - std::string device_id_;
|
| - base::FilePath root_path_;
|
| + // Delegate for GetFileInfo, called on the UI thread.
|
| + void GetFileInfoImpl(const base::FilePath& file_path,
|
| + base::PlatformFileInfo* file_info,
|
| + base::PlatformFileError* error);
|
|
|
| - // Stores a reference to worker pool thread. All requests and response of file
|
| - // operations are posted on |media_task_runner_|. All callbacks from the
|
| - // camera will come through this task runner as well.
|
| - scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
|
| + // Delegate for ReadDirectory, called on the UI thread.
|
| + void ReadDirectoryImpl(
|
| + const base::FilePath& root,
|
| + const ReadDirectorySuccessCallback& success_callback,
|
| + const ErrorCallback& error_callback);
|
|
|
| - // Interface object for the camera underlying this MTP session.
|
| - scoped_ptr<DeviceListener> camera_interface_;
|
| + // Delegate for CreateSnapshotFile, called on the UI thread.
|
| + void DownloadFile(
|
| + const base::FilePath& device_file_path,
|
| + const base::FilePath& local_path,
|
| + const CreateSnapshotFileSuccessCallback& success_callback,
|
| + const ErrorCallback& error_callback);
|
|
|
| - // This lock protects all subsequent state. While calling into the delegate
|
| - // from the FileSystem API happens in sequence, these calls may be
|
| - // interleaved with calls on other threads in the sequenced task runner
|
| - // forwarded from the device.
|
| - base::Lock mutex_;
|
| + // Public for closures; should not be called except by
|
| + // CancelTasksAndDeleteDelegate.
|
| + void CancelAndDelete();
|
|
|
| - // Weak pointer to the enumerator which may be listening for files to come in.
|
| - Enumerator* enumerator_;
|
| + // Cancels any outstanding downloads.
|
| + void CancelDownloads();
|
|
|
| - // Stores a map from filename to file metadata received from the camera.
|
| - base::hash_map<base::FilePath::StringType, base::PlatformFileInfo> file_info_;
|
| + // If necessary, notifies the ReadDirectory callback that all data
|
| + // has been read.
|
| + void NotifyReadDir();
|
| +
|
| + std::string device_id_;
|
| + base::FilePath root_path_;
|
|
|
| - // Notification for pending download.
|
| - base::WaitableEvent* file_download_event_;
|
| + // Interface object for the camera underlying this MTP session.
|
| + scoped_ptr<DeviceListener> camera_interface_;
|
|
|
| - // Resulting error code for pending download.
|
| - base::PlatformFileError file_download_error_;
|
| + // Stores a map from filename to file metadata received from the camera.
|
| + base::hash_map<base::FilePath::StringType,
|
| + base::PlatformFileInfo> file_info_;
|
|
|
| // List of files received from the camera.
|
| std::vector<base::FilePath> file_paths_;
|
| @@ -123,6 +112,28 @@ class MTPDeviceDelegateImplMac : public fileapi::MTPDeviceDelegate {
|
| // Set to true when all file metadata has been received from the camera.
|
| bool received_all_files_;
|
|
|
| + typedef std::map<std::string,
|
| + std::pair<CreateSnapshotFileSuccessCallback,
|
| + ErrorCallback> > ReadFileTransactionMap;
|
| +
|
| + struct ReadDirectoryRequest {
|
| + ReadDirectoryRequest(const base::FilePath& dir,
|
| + ReadDirectorySuccessCallback success_cb,
|
| + ErrorCallback error_cb);
|
| + ~ReadDirectoryRequest();
|
| +
|
| + base::FilePath directory;
|
| + ReadDirectorySuccessCallback success_callback;
|
| + ErrorCallback error_callback;
|
| + };
|
| +
|
| + typedef std::list<ReadDirectoryRequest> ReadDirTransactionList;
|
| +
|
| + ReadFileTransactionMap read_file_transactions_;
|
| + ReadDirTransactionList read_dir_transactions_;
|
| +
|
| + base::WeakPtrFactory<MTPDeviceDelegateImplMac> weak_factory_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MTPDeviceDelegateImplMac);
|
| };
|
|
|
|
|