Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1945)

Unified Diff: chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.h

Issue 12255023: [Media Galleries] Switch Mac MTP delegate to async interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nits Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
};
« no previous file with comments | « no previous file | chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698