| // Copyright (c) 2013 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_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_ASYNC_DELEGATE_H_ |
| #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_ASYNC_DELEGATE_H_ |
| |
| #include "base/callback.h" |
| #include "base/files/file.h" |
| #include "base/memory/ref_counted.h" |
| #include "webkit/browser/fileapi/async_file_util.h" |
| |
| namespace base { |
| class FilePath; |
| } |
| |
| namespace net { |
| class IOBuffer; |
| } |
| |
| // Asynchronous delegate for media transfer protocol (MTP) device to perform |
| // media device file system operations. Class that implements this |
| // delegate does the actual communication with the MTP device. |
| // The lifetime of the delegate is managed by the MTPDeviceMapService class. |
| // Member functions and callbacks run on the IO thread. |
| class MTPDeviceAsyncDelegate { |
| public: |
| // A callback to be called when GetFileInfo method call succeeds. |
| typedef base::Callback< |
| void(const base::File::Info& file_info)> GetFileInfoSuccessCallback; |
| |
| // A callback to be called when ReadDirectory method call succeeds. |
| typedef base::Callback< |
| void(const fileapi::AsyncFileUtil::EntryList& file_list, |
| bool has_more)> ReadDirectorySuccessCallback; |
| |
| // A callback to be called when GetFileInfo/ReadDirectory/CreateSnapshot |
| // method call fails. |
| typedef base::Callback<void(base::File::Error error)> ErrorCallback; |
| |
| // A callback to be called when CreateSnapshotFile method call succeeds. |
| typedef base::Callback< |
| void(const base::File::Info& file_info, |
| const base::FilePath& local_path)> CreateSnapshotFileSuccessCallback; |
| |
| // A callback to be called when ReadBytes method call succeeds. |
| typedef base::Callback< |
| void(const base::File::Info& file_info, |
| int bytes_read)> ReadBytesSuccessCallback; |
| |
| struct ReadBytesRequest { |
| ReadBytesRequest(const std::string& device_file_relative_path, |
| net::IOBuffer* buf, int64 offset, int buf_len, |
| const ReadBytesSuccessCallback& success_callback, |
| const ErrorCallback& error_callback); |
| ~ReadBytesRequest(); |
| |
| std::string device_file_relative_path; |
| scoped_refptr<net::IOBuffer> buf; |
| int64 offset; |
| int buf_len; |
| ReadBytesSuccessCallback success_callback; |
| ErrorCallback error_callback; |
| }; |
| |
| // Gets information about the given |file_path| and invokes the appropriate |
| // callback asynchronously when complete. |
| virtual void GetFileInfo( |
| const base::FilePath& file_path, |
| const GetFileInfoSuccessCallback& success_callback, |
| const ErrorCallback& error_callback) = 0; |
| |
| // Enumerates the |root| directory contents and invokes the appropriate |
| // callback asynchronously when complete. |
| virtual void ReadDirectory( |
| const base::FilePath& root, |
| const ReadDirectorySuccessCallback& success_callback, |
| const ErrorCallback& error_callback) = 0; |
| |
| // Copy the contents of |device_file_path| to |local_path|. Invokes the |
| // appropriate callback asynchronously when complete. |
| virtual void CreateSnapshotFile( |
| const base::FilePath& device_file_path, |
| const base::FilePath& local_path, |
| const CreateSnapshotFileSuccessCallback& success_callback, |
| const ErrorCallback& error_callback) = 0; |
| |
| // Platform-specific implementations that are streaming don't create a local |
| // snapshot file. Blobs are instead FileSystemURL backed and read in a stream. |
| virtual bool IsStreaming() = 0; |
| |
| // Reads up to |buf_len| bytes from |device_file_path| into |buf|. Invokes the |
| // appropriate callback asynchronously when complete. Only valid when |
| // IsStreaming() is true. |
| virtual void ReadBytes( |
| const base::FilePath& device_file_path, |
| net::IOBuffer* buf, int64 offset, int buf_len, |
| const ReadBytesSuccessCallback& success_callback, |
| const ErrorCallback& error_callback) = 0; |
| |
| // Called when the |
| // (1) Browser application is in shutdown mode (or) |
| // (2) Last extension using this MTP device is destroyed (or) |
| // (3) Attached MTP device is removed (or) |
| // (4) User revoked the MTP device gallery permission. |
| // Ownership of |MTPDeviceAsyncDelegate| is handed off to the delegate |
| // implementation class by this call. This function should take care of |
| // cancelling all the pending tasks before deleting itself. |
| virtual void CancelPendingTasksAndDeleteDelegate() = 0; |
| |
| protected: |
| // Always destruct this object via CancelPendingTasksAndDeleteDelegate(). |
| virtual ~MTPDeviceAsyncDelegate() {} |
| }; |
| |
| typedef base::Callback<void(MTPDeviceAsyncDelegate*)> |
| CreateMTPDeviceAsyncDelegateCallback; |
| |
| void CreateMTPDeviceAsyncDelegate( |
| const base::FilePath::StringType& device_location, |
| const CreateMTPDeviceAsyncDelegateCallback& callback); |
| |
| #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_ASYNC_DELEGATE_H_ |