14be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi/* 24be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 34be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * 44be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 54be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * you may not use this file except in compliance with the License. 64be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * You may obtain a copy of the License at 74be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * 84be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 94be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * 104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * See the License for the specific language governing permissions and 144be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * limitations under the License. 154be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi */ 164be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 17172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#ifndef _MTP_DEVICE_H 18172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#define _MTP_DEVICE_H 19172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 207e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "MtpEventPacket.h" 214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "MtpDataPacket.h" 224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "MtpRequestPacket.h" 234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "MtpResponsePacket.h" 244be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "MtpTypes.h" 254be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 264be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include <utils/threads.h> 274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 28172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivistruct usb_device; 29172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivistruct usb_request; 30172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivistruct usb_endpoint_descriptor; 31172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivinamespace android { 339cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi 349cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviclass MtpDeviceInfo; 359cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviclass MtpEventPacket; 369cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviclass MtpObjectInfo; 379cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviclass MtpStorageInfo; 389cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi 39172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Triviclass MtpDevice { 40172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Triviprivate: 41172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi struct usb_device* mDevice; 42172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi int mInterface; 43f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi struct usb_request* mRequestIn1; 44f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi struct usb_request* mRequestIn2; 45f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi struct usb_request* mRequestOut; 46f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi struct usb_request* mRequestIntr; 47f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi MtpDeviceInfo* mDeviceInfo; 48f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi MtpPropertyList mDeviceProperties; 49f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 50172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi // current session ID 51172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpSessionID mSessionID; 52172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi // current transaction ID 53172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpTransactionID mTransactionID; 5467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 55172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpRequestPacket mRequest; 56172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpDataPacket mData; 57f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi MtpResponsePacket mResponse; 58172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpEventPacket mEventPacket; 59172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 60f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi // set to true if we received a response packet instead of a data packet 61172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi bool mReceivedResponse; 62172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi bool mProcessingEvent; 63172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi int mCurrentEventHandle; 64172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 6567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi // to check if a sendObject request follows the last sendObjectInfo request. 66172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpTransactionID mLastSendObjectInfoTransactionID; 67172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectHandle mLastSendObjectInfoObjectHandle; 68172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 6967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi // to ensure only one MTP transaction at a time 7067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi Mutex mMutex; 715b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi Mutex mEventMutex; 7267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi Mutex mEventMutexForInterrupt; 735b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 745b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi // Remember the device's packet division mode. 7567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi UrbPacketDivisionMode mPacketDivisionMode; 765b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 7767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivipublic: 785b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi typedef bool (*ReadObjectCallback) 795b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi (void* data, uint32_t offset, uint32_t length, void* clientData); 8067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 815b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi MtpDevice(struct usb_device* device, 825b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi int interface, 8367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi const struct usb_endpoint_descriptor *ep_in, 845b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi const struct usb_endpoint_descriptor *ep_out, 855b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi const struct usb_endpoint_descriptor *ep_intr); 865b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 8767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi static MtpDevice* open(const char* deviceName, int fd); 88172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 89172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi virtual ~MtpDevice(); 90172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 91172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi void initialize(); 92172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi void close(); 93172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi void print(); 94172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi const char* getDeviceName(); 95172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 96172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi bool openSession(); 97172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi bool closeSession(); 98172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 99172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpDeviceInfo* getDeviceInfo(); 100172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpStorageIDList* getStorageIDs(); 101172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpStorageInfo* getStorageInfo(MtpStorageID storageID); 102172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, 103172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectHandle parent); 104172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectInfo* getObjectInfo(MtpObjectHandle handle); 105172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi void* getThumbnail(MtpObjectHandle handle, int& outLength); 106172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectHandle sendObjectInfo(MtpObjectInfo* info); 107172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi bool sendObject(MtpObjectHandle handle, int size, int srcFD); 108172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi bool deleteObject(MtpObjectHandle handle); 109172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectHandle getParent(MtpObjectHandle handle); 110172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpStorageID getStorageID(MtpObjectHandle handle); 111172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi 112172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi MtpObjectPropertyList* getObjectPropsSupported(MtpObjectFormat format); 113 114 MtpProperty* getDevicePropDesc(MtpDeviceProperty code); 115 MtpProperty* getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format); 116 117 // Reads value of |property| for |handle|. Returns true on success. 118 bool getObjectPropValue(MtpObjectHandle handle, MtpProperty* property); 119 120 bool readObject(MtpObjectHandle handle, ReadObjectCallback callback, 121 uint32_t objectSize, void* clientData); 122 bool readObject(MtpObjectHandle handle, const char* destPath, int group, 123 int perm); 124 bool readObject(MtpObjectHandle handle, int fd); 125 bool readPartialObject(MtpObjectHandle handle, 126 uint32_t offset, 127 uint32_t size, 128 uint32_t *writtenSize, 129 ReadObjectCallback callback, 130 void* clientData); 131 bool readPartialObject64(MtpObjectHandle handle, 132 uint64_t offset, 133 uint32_t size, 134 uint32_t *writtenSize, 135 ReadObjectCallback callback, 136 void* clientData); 137 // Starts a request to read MTP event from MTP device. It returns a request handle that 138 // can be used for blocking read or cancel. If other thread has already been processing an 139 // event returns -1. 140 int submitEventRequest(); 141 // Waits for MTP event from the device and returns MTP event code. It blocks the current thread 142 // until it receives an event from the device. |handle| should be a request handle returned 143 // by |submitEventRequest|. The function writes event parameters to |parameters|. Returns 0 for 144 // cancellations. Returns -1 for errors. 145 int reapEventRequest(int handle, uint32_t (*parameters)[3]); 146 // Cancels an event request. |handle| should be request handle returned by 147 // |submitEventRequest|. If there is a thread blocked by |reapEventRequest| with the same 148 // |handle|, the thread will resume. 149 void discardEventRequest(int handle); 150 151private: 152 // If |objectSize| is not NULL, it checks object size before reading data bytes. 153 bool readObjectInternal(MtpObjectHandle handle, 154 ReadObjectCallback callback, 155 const uint32_t* objectSize, 156 void* clientData); 157 // If |objectSize| is not NULL, it checks object size before reading data bytes. 158 bool readData(ReadObjectCallback callback, 159 const uint32_t* objectSize, 160 uint32_t* writtenData, 161 void* clientData); 162 bool sendRequest(MtpOperationCode operation); 163 bool sendData(); 164 bool readData(); 165 bool writeDataHeader(MtpOperationCode operation, int dataLength); 166 MtpResponseCode readResponse(); 167}; 168 169}; // namespace android 170 171#endif // _MTP_DEVICE_H 172