// Copyright (c) 2012 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 DEVICE_MEDIA_TRANSFER_PROTOCOL_MEDIA_TRANSFER_PROTOCOL_MANAGER_H_ #define DEVICE_MEDIA_TRANSFER_PROTOCOL_MEDIA_TRANSFER_PROTOCOL_MANAGER_H_ #include #include #include "base/callback.h" #include "base/memory/ref_counted.h" #include "build/build_config.h" #if !defined(OS_LINUX) #error "Only used on Linux and ChromeOS" #endif class MtpFileEntry; class MtpStorageInfo; namespace base { class MessageLoopProxy; } namespace device { // This class handles the interaction with mtpd. // Other classes can add themselves as observers. class MediaTransferProtocolManager { public: // A callback to handle the result of OpenStorage. // The first argument is the returned handle. // The second argument is true if there was an error. typedef base::Callback OpenStorageCallback; // A callback to handle the result of CloseStorage. // The argument is true if there was an error. typedef base::Callback CloseStorageCallback; // A callback to handle the result of ReadDirectoryByPath/Id. // The first argument is a vector of file entries. // The second argument is true if there was an error. typedef base::Callback& file_entries, bool error)> ReadDirectoryCallback; // A callback to handle the result of ReadFileChunkByPath/Id. // The first argument is a string containing the file data. // The second argument is true if there was an error. typedef base::Callback ReadFileCallback; // A callback to handle the result of GetFileInfoByPath/Id. // The first argument is a file entry. // The second argument is true if there was an error. typedef base::Callback GetFileInfoCallback; // Implement this interface to be notified about MTP storage // attachment / detachment events. class Observer { public: virtual ~Observer() {} // A function called after a MTP storage has been attached / detached. virtual void StorageChanged(bool is_attached, const std::string& storage_name) = 0; }; virtual ~MediaTransferProtocolManager() {} // Adds an observer. virtual void AddObserver(Observer* observer) = 0; // Removes an observer. virtual void RemoveObserver(Observer* observer) = 0; // Returns a vector of available MTP storages. virtual const std::vector GetStorages() const = 0; // On success, returns the the metadata for |storage_name|. // Otherwise returns NULL. virtual const MtpStorageInfo* GetStorageInfo( const std::string& storage_name) const = 0; // Opens |storage_name| in |mode| and runs |callback|. virtual void OpenStorage(const std::string& storage_name, const std::string& mode, const OpenStorageCallback& callback) = 0; // Close |storage_handle| and runs |callback|. virtual void CloseStorage(const std::string& storage_handle, const CloseStorageCallback& callback) = 0; // Reads directory entries from |path| on |storage_handle| and runs // |callback|. virtual void ReadDirectoryByPath(const std::string& storage_handle, const std::string& path, const ReadDirectoryCallback& callback) = 0; // Reads directory entries from |file_id| on |storage_handle| and runs // |callback|. virtual void ReadDirectoryById(const std::string& storage_handle, uint32 file_id, const ReadDirectoryCallback& callback) = 0; // Reads file data from |path| on |storage_handle| and runs |callback|. // Reads |count| bytes of data starting at |offset|. virtual void ReadFileChunkByPath(const std::string& storage_handle, const std::string& path, uint32 offset, uint32 count, const ReadFileCallback& callback) = 0; // Reads file data from |file_id| on |storage_handle| and runs |callback|. // Reads |count| bytes of data starting at |offset|. virtual void ReadFileChunkById(const std::string& storage_handle, uint32 file_id, uint32 offset, uint32 count, const ReadFileCallback& callback) = 0; // Gets the file metadata for |path| on |storage_handle| and runs |callback|. virtual void GetFileInfoByPath(const std::string& storage_handle, const std::string& path, const GetFileInfoCallback& callback) = 0; // Gets the file metadata for |file_id| on |storage_handle| and runs // |callback|. virtual void GetFileInfoById(const std::string& storage_handle, uint32 file_id, const GetFileInfoCallback& callback) = 0; // Creates the global MediaTransferProtocolManager instance. // On Linux, |loop_proxy| specifies the message loop proxy to process // asynchronous operations. // On ChromeOS, |loop_proxy| is set to NULL because ChromeOS already has a // dedicated message loop proxy. static void Initialize(scoped_refptr loop_proxy); // Destroys the global MediaTransferProtocolManager instance if it exists. static void Shutdown(); // Returns a pointer to the global MediaTransferProtocolManager instance. // Initialize() should already have been called. static MediaTransferProtocolManager* GetInstance(); }; } // namespace device #endif // DEVICE_MEDIA_TRANSFER_PROTOCOL_MEDIA_TRANSFER_PROTOCOL_MANAGER_H_