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 27 struct usb_device; 28 struct usb_request; 29 struct usb_endpoint_descriptor; 30 31 namespace android { 32 33 class MtpDeviceInfo; 34 class MtpObjectInfo; 35 class MtpStorageInfo; 36 37 class MtpDevice { 38 private: 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 62 public: 63 MtpDevice(struct usb_device* device, int interface, 64 const struct usb_endpoint_descriptor *ep_in, 65 const struct usb_endpoint_descriptor *ep_out, 66 const struct usb_endpoint_descriptor *ep_intr); 67 68 static MtpDevice* open(const char* deviceName, int fd); 69 70 virtual ~MtpDevice(); 71 72 void initialize(); 73 void close(); 74 void print(); 75 const char* getDeviceName(); 76 77 bool openSession(); 78 bool closeSession(); 79 80 MtpDeviceInfo* getDeviceInfo(); 81 MtpStorageIDList* getStorageIDs(); 82 MtpStorageInfo* getStorageInfo(MtpStorageID storageID); 83 MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, 84 MtpObjectHandle parent); 85 MtpObjectInfo* getObjectInfo(MtpObjectHandle handle); 86 void* getThumbnail(MtpObjectHandle handle, int& outLength); 87 MtpObjectHandle sendObjectInfo(MtpObjectInfo* info); 88 bool sendObject(MtpObjectInfo* info, int srcFD); 89 bool deleteObject(MtpObjectHandle handle); 90 MtpObjectHandle getParent(MtpObjectHandle handle); 91 MtpObjectHandle getStorageID(MtpObjectHandle handle); 92 93 MtpObjectPropertyList* getObjectPropsSupported(MtpObjectFormat format); 94 95 MtpProperty* getDevicePropDesc(MtpDeviceProperty code); 96 MtpProperty* getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format); 97 98 bool readObject(MtpObjectHandle handle, 99 bool (* callback)(void* data, int offset, 100 int length, void* clientData), 101 size_t objectSize, void* clientData); 102 bool readObject(MtpObjectHandle handle, const char* destPath, int group, 103 int perm); 104 105 private: 106 bool sendRequest(MtpOperationCode operation); 107 bool sendData(); 108 bool readData(); 109 bool writeDataHeader(MtpOperationCode operation, int dataLength); 110 MtpResponseCode readResponse(); 111 112 }; 113 114 }; // namespace android 115 116 #endif // _MTP_DEVICE_H 117