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