1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef DEVICE_MEDIA_TRANSFER_PROTOCOL_MEDIA_TRANSFER_PROTOCOL_MANAGER_H_
6 #define DEVICE_MEDIA_TRANSFER_PROTOCOL_MEDIA_TRANSFER_PROTOCOL_MANAGER_H_
11 #include "base/callback.h"
12 #include "base/memory/ref_counted.h"
13 #include "build/build_config.h"
15 #if !defined(OS_LINUX)
16 #error "Only used on Linux and ChromeOS"
23 class SequencedTaskRunner
;
28 // This class handles the interaction with mtpd.
29 // Other classes can add themselves as observers.
30 class MediaTransferProtocolManager
{
32 // A callback to handle the result of OpenStorage.
33 // The first argument is the returned handle.
34 // The second argument is true if there was an error.
35 typedef base::Callback
<void(const std::string
& handle
,
36 bool error
)> OpenStorageCallback
;
38 // A callback to handle the result of CloseStorage.
39 // The argument is true if there was an error.
40 typedef base::Callback
<void(bool error
)> CloseStorageCallback
;
42 // A callback to handle the result of ReadDirectory.
43 // The first argument is a vector of file entries.
44 // The second argument is true if there are more file entries.
45 // The third argument is true if there was an error.
46 typedef base::Callback
<void(const std::vector
<MtpFileEntry
>& file_entries
,
48 bool error
)> ReadDirectoryCallback
;
50 // A callback to handle the result of ReadFileChunk.
51 // The first argument is a string containing the file data.
52 // The second argument is true if there was an error.
53 typedef base::Callback
<void(const std::string
& data
,
54 bool error
)> ReadFileCallback
;
56 // A callback to handle the result of GetFileInfo.
57 // The first argument is a file entry.
58 // The second argument is true if there was an error.
59 typedef base::Callback
<void(const MtpFileEntry
& file_entry
,
60 bool error
)> GetFileInfoCallback
;
62 // Implement this interface to be notified about MTP storage
63 // attachment / detachment events.
66 virtual ~Observer() {}
68 // A function called after a MTP storage has been attached / detached.
69 virtual void StorageChanged(bool is_attached
,
70 const std::string
& storage_name
) = 0;
73 virtual ~MediaTransferProtocolManager() {}
76 virtual void AddObserver(Observer
* observer
) = 0;
78 // Removes an observer.
79 virtual void RemoveObserver(Observer
* observer
) = 0;
81 // Returns a vector of available MTP storages.
82 virtual const std::vector
<std::string
> GetStorages() const = 0;
84 // On success, returns the the metadata for |storage_name|.
85 // Otherwise returns NULL.
86 virtual const MtpStorageInfo
* GetStorageInfo(
87 const std::string
& storage_name
) const = 0;
89 // Opens |storage_name| in |mode| and runs |callback|.
90 virtual void OpenStorage(const std::string
& storage_name
,
91 const std::string
& mode
,
92 const OpenStorageCallback
& callback
) = 0;
94 // Close |storage_handle| and runs |callback|.
95 virtual void CloseStorage(const std::string
& storage_handle
,
96 const CloseStorageCallback
& callback
) = 0;
98 // Reads directory entries from |file_id| on |storage_handle| and runs
100 virtual void ReadDirectory(const std::string
& storage_handle
,
102 const ReadDirectoryCallback
& callback
) = 0;
104 // Reads file data from |file_id| on |storage_handle| and runs |callback|.
105 // Reads |count| bytes of data starting at |offset|.
106 virtual void ReadFileChunk(const std::string
& storage_handle
,
110 const ReadFileCallback
& callback
) = 0;
112 // Gets the file metadata for |file_id| on |storage_handle| and runs
114 virtual void GetFileInfo(const std::string
& storage_handle
,
116 const GetFileInfoCallback
& callback
) = 0;
118 // Creates and returns the global MediaTransferProtocolManager instance.
119 // On Linux, |task_runner| specifies the task runner to process asynchronous
121 // On ChromeOS, |task_runner| should just be set to NULL because ChromeOS
122 // already has a dedicated message loop proxy.
123 static MediaTransferProtocolManager
* Initialize(
124 scoped_refptr
<base::SequencedTaskRunner
> task_runner
);
127 } // namespace device
129 #endif // DEVICE_MEDIA_TRANSFER_PROTOCOL_MEDIA_TRANSFER_PROTOCOL_MANAGER_H_