MtpDevice.h revision 4fd9a8b9865addfedbcd84d5c9efea0f647086a0
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef _MTP_DEVICE_H 18#define _MTP_DEVICE_H 19 20#include "MtpRequestPacket.h" 21#include "MtpDataPacket.h" 22#include "MtpResponsePacket.h" 23#include "MtpTypes.h" 24 25#include <utils/threads.h> 26 27struct usb_device; 28struct usb_request; 29struct usb_endpoint_descriptor; 30 31namespace android { 32 33class MtpDeviceInfo; 34class MtpObjectInfo; 35class MtpStorageInfo; 36 37class MtpDevice { 38private: 39 struct usb_device* mDevice; 40 int mInterface; 41 struct usb_request* mRequestIn1; 42 struct usb_request* mRequestIn2; 43 struct usb_request* mRequestOut; 44 struct usb_request* mRequestIntr; 45 MtpDeviceInfo* mDeviceInfo; 46 MtpPropertyList mDeviceProperties; 47 48 // current session ID 49 MtpSessionID mSessionID; 50 // current transaction ID 51 MtpTransactionID mTransactionID; 52 53 MtpRequestPacket mRequest; 54 MtpDataPacket mData; 55 MtpResponsePacket mResponse; 56 // set to true if we received a response packet instead of a data packet 57 bool mReceivedResponse; 58 59 // to ensure only one MTP transaction at a time 60 Mutex mMutex; 61 62public: 63 typedef bool (*ReadObjectCallback)(void* data, int offset, int length, void* clientData); 64 MtpDevice(struct usb_device* device, int interface, 65 const struct usb_endpoint_descriptor *ep_in, 66 const struct usb_endpoint_descriptor *ep_out, 67 const struct usb_endpoint_descriptor *ep_intr); 68 69 static MtpDevice* open(const char* deviceName, int fd); 70 71 virtual ~MtpDevice(); 72 73 void initialize(); 74 void close(); 75 void print(); 76 const char* getDeviceName(); 77 78 bool openSession(); 79 bool closeSession(); 80 81 MtpDeviceInfo* getDeviceInfo(); 82 MtpStorageIDList* getStorageIDs(); 83 MtpStorageInfo* getStorageInfo(MtpStorageID storageID); 84 MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, 85 MtpObjectHandle parent); 86 MtpObjectInfo* getObjectInfo(MtpObjectHandle handle); 87 void* getThumbnail(MtpObjectHandle handle, int& outLength); 88 MtpObjectHandle sendObjectInfo(MtpObjectInfo* info); 89 bool sendObject(MtpObjectInfo* info, int srcFD); 90 bool deleteObject(MtpObjectHandle handle); 91 MtpObjectHandle getParent(MtpObjectHandle handle); 92 MtpObjectHandle getStorageID(MtpObjectHandle handle); 93 94 MtpObjectPropertyList* getObjectPropsSupported(MtpObjectFormat format); 95 96 MtpProperty* getDevicePropDesc(MtpDeviceProperty code); 97 MtpProperty* getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format); 98 99 bool readObject(MtpObjectHandle handle, ReadObjectCallback callback, 100 size_t objectSize, void* clientData); 101 bool readObject(MtpObjectHandle handle, const char* destPath, int group, 102 int perm); 103 bool readObject(MtpObjectHandle handle, int fd); 104 105private: 106 // If |objectSize| is not NULL, it checks object size before reading data bytes. 107 bool readObjectInternal(MtpObjectHandle handle, ReadObjectCallback callback, 108 const size_t* objectSize, void* clientData); 109 bool sendRequest(MtpOperationCode operation); 110 bool sendData(); 111 bool readData(); 112 bool writeDataHeader(MtpOperationCode operation, int dataLength); 113 MtpResponseCode readResponse(); 114 115}; 116 117}; // namespace android 118 119#endif // _MTP_DEVICE_H 120