12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_ASYNC_DELEGATE_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_ASYNC_DELEGATE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IOBuffer;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Asynchronous delegate for media transfer protocol (MTP) device to perform
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// media device file system operations. Class that implements this
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// delegate does the actual communication with the MTP device.
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The lifetime of the delegate is managed by the MTPDeviceMapService class.
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Member functions and callbacks run on the IO thread.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MTPDeviceAsyncDelegate {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A callback to be called when GetFileInfo method call succeeds.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      void(const base::File::Info& file_info)> GetFileInfoSuccessCallback;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A callback to be called when ReadDirectory method call succeeds.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      void(const storage::AsyncFileUtil::EntryList& file_list, bool has_more)>
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ReadDirectorySuccessCallback;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A callback to be called when GetFileInfo/ReadDirectory/CreateSnapshot
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // method call fails.
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::Callback<void(base::File::Error error)> ErrorCallback;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A callback to be called when CreateSnapshotFile method call succeeds.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      void(const base::File::Info& file_info,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           const base::FilePath& local_path)> CreateSnapshotFileSuccessCallback;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A callback to be called when ReadBytes method call succeeds.
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef base::Callback<
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      void(const base::File::Info& file_info,
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           int bytes_read)> ReadBytesSuccessCallback;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct ReadBytesRequest {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ReadBytesRequest(uint32 file_id,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     net::IOBuffer* buf, int64 offset, int buf_len,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     const ReadBytesSuccessCallback& success_callback,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     const ErrorCallback& error_callback);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ~ReadBytesRequest();
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    uint32 file_id;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<net::IOBuffer> buf;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int64 offset;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int buf_len;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ReadBytesSuccessCallback success_callback;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ErrorCallback error_callback;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets information about the given |file_path| and invokes the appropriate
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callback asynchronously when complete.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetFileInfo(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& file_path,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GetFileInfoSuccessCallback& success_callback,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ErrorCallback& error_callback) = 0;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enumerates the |root| directory contents and invokes the appropriate
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callback asynchronously when complete.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ReadDirectory(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& root,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ReadDirectorySuccessCallback& success_callback,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ErrorCallback& error_callback) = 0;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Copy the contents of |device_file_path| to |local_path|. Invokes the
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // appropriate callback asynchronously when complete.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CreateSnapshotFile(
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& device_file_path,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& local_path,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const CreateSnapshotFileSuccessCallback& success_callback,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ErrorCallback& error_callback) = 0;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Platform-specific implementations that are streaming don't create a local
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // snapshot file. Blobs are instead FileSystemURL backed and read in a stream.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsStreaming() = 0;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Reads up to |buf_len| bytes from |device_file_path| into |buf|. Invokes the
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // appropriate callback asynchronously when complete. Only valid when
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // IsStreaming() is true.
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ReadBytes(const base::FilePath& device_file_path,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const scoped_refptr<net::IOBuffer>& buf,
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         int64 offset,
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         int buf_len,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const ReadBytesSuccessCallback& success_callback,
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const ErrorCallback& error_callback) = 0;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when the
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (1) Browser application is in shutdown mode (or)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (2) Last extension using this MTP device is destroyed (or)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (3) Attached MTP device is removed (or)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (4) User revoked the MTP device gallery permission.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ownership of |MTPDeviceAsyncDelegate| is handed off to the delegate
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // implementation class by this call. This function should take care of
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // cancelling all the pending tasks before deleting itself.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelPendingTasksAndDeleteDelegate() = 0;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Always destruct this object via CancelPendingTasksAndDeleteDelegate().
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MTPDeviceAsyncDelegate() {}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)typedef base::Callback<void(MTPDeviceAsyncDelegate*)>
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    CreateMTPDeviceAsyncDelegateCallback;
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void CreateMTPDeviceAsyncDelegate(
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::FilePath::StringType& device_location,
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const CreateMTPDeviceAsyncDelegateCallback& callback);
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MTP_DEVICE_ASYNC_DELEGATE_H_
125