1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef _MTP_DATA_PACKET_H 18*ec779b8eSAndroid Build Coastguard Worker #define _MTP_DATA_PACKET_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include "MtpPacket.h" 21*ec779b8eSAndroid Build Coastguard Worker #include "mtp.h" 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker struct usb_device; 24*ec779b8eSAndroid Build Coastguard Worker struct usb_request; 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker namespace android { 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker class IMtpHandle; 29*ec779b8eSAndroid Build Coastguard Worker class MtpStringBuffer; 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker class MtpDataPacket : public MtpPacket { 32*ec779b8eSAndroid Build Coastguard Worker private: 33*ec779b8eSAndroid Build Coastguard Worker // current offset for get/put methods 34*ec779b8eSAndroid Build Coastguard Worker size_t mOffset; 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker public: 37*ec779b8eSAndroid Build Coastguard Worker MtpDataPacket(); 38*ec779b8eSAndroid Build Coastguard Worker virtual ~MtpDataPacket(); 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker virtual void reset(); 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker void setOperationCode(MtpOperationCode code); 43*ec779b8eSAndroid Build Coastguard Worker void setTransactionID(MtpTransactionID id); 44*ec779b8eSAndroid Build Coastguard Worker getData()45*ec779b8eSAndroid Build Coastguard Worker inline const uint8_t* getData() const { return mBuffer + MTP_CONTAINER_HEADER_SIZE; } 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker bool getUInt8(uint8_t& value); getInt8(int8_t & value)48*ec779b8eSAndroid Build Coastguard Worker inline bool getInt8(int8_t& value) { return getUInt8((uint8_t&)value); } 49*ec779b8eSAndroid Build Coastguard Worker bool getUInt16(uint16_t& value); getInt16(int16_t & value)50*ec779b8eSAndroid Build Coastguard Worker inline bool getInt16(int16_t& value) { return getUInt16((uint16_t&)value); } 51*ec779b8eSAndroid Build Coastguard Worker bool getUInt32(uint32_t& value); getInt32(int32_t & value)52*ec779b8eSAndroid Build Coastguard Worker inline bool getInt32(int32_t& value) { return getUInt32((uint32_t&)value); } 53*ec779b8eSAndroid Build Coastguard Worker bool getUInt64(uint64_t& value); getInt64(int64_t & value)54*ec779b8eSAndroid Build Coastguard Worker inline bool getInt64(int64_t& value) { return getUInt64((uint64_t&)value); } 55*ec779b8eSAndroid Build Coastguard Worker bool getUInt128(uint128_t& value); getInt128(int128_t & value)56*ec779b8eSAndroid Build Coastguard Worker inline bool getInt128(int128_t& value) { return getUInt128((uint128_t&)value); } 57*ec779b8eSAndroid Build Coastguard Worker bool getString(MtpStringBuffer& string); 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker Int8List* getAInt8(); 60*ec779b8eSAndroid Build Coastguard Worker UInt8List* getAUInt8(); 61*ec779b8eSAndroid Build Coastguard Worker Int16List* getAInt16(); 62*ec779b8eSAndroid Build Coastguard Worker UInt16List* getAUInt16(); 63*ec779b8eSAndroid Build Coastguard Worker Int32List* getAInt32(); 64*ec779b8eSAndroid Build Coastguard Worker UInt32List* getAUInt32(); 65*ec779b8eSAndroid Build Coastguard Worker Int64List* getAInt64(); 66*ec779b8eSAndroid Build Coastguard Worker UInt64List* getAUInt64(); 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker void putInt8(int8_t value); 69*ec779b8eSAndroid Build Coastguard Worker void putUInt8(uint8_t value); 70*ec779b8eSAndroid Build Coastguard Worker void putInt16(int16_t value); 71*ec779b8eSAndroid Build Coastguard Worker void putUInt16(uint16_t value); 72*ec779b8eSAndroid Build Coastguard Worker void putInt32(int32_t value); 73*ec779b8eSAndroid Build Coastguard Worker void putUInt32(uint32_t value); 74*ec779b8eSAndroid Build Coastguard Worker void putInt64(int64_t value); 75*ec779b8eSAndroid Build Coastguard Worker void putUInt64(uint64_t value); 76*ec779b8eSAndroid Build Coastguard Worker void putInt128(const int128_t& value); 77*ec779b8eSAndroid Build Coastguard Worker void putUInt128(const uint128_t& value); 78*ec779b8eSAndroid Build Coastguard Worker void putInt128(int64_t value); 79*ec779b8eSAndroid Build Coastguard Worker void putUInt128(uint64_t value); 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker void putAInt8(const int8_t* values, int count); 82*ec779b8eSAndroid Build Coastguard Worker void putAUInt8(const uint8_t* values, int count); 83*ec779b8eSAndroid Build Coastguard Worker void putAInt16(const int16_t* values, int count); 84*ec779b8eSAndroid Build Coastguard Worker void putAUInt16(const uint16_t* values, int count); 85*ec779b8eSAndroid Build Coastguard Worker void putAUInt16(const UInt16List* values); 86*ec779b8eSAndroid Build Coastguard Worker void putAInt32(const int32_t* values, int count); 87*ec779b8eSAndroid Build Coastguard Worker void putAUInt32(const uint32_t* values, int count); 88*ec779b8eSAndroid Build Coastguard Worker void putAUInt32(const UInt32List* list); 89*ec779b8eSAndroid Build Coastguard Worker void putAInt64(const int64_t* values, int count); 90*ec779b8eSAndroid Build Coastguard Worker void putAUInt64(const uint64_t* values, int count); 91*ec779b8eSAndroid Build Coastguard Worker void putString(const MtpStringBuffer& string); 92*ec779b8eSAndroid Build Coastguard Worker void putString(const char* string); 93*ec779b8eSAndroid Build Coastguard Worker void putString(const uint16_t* string); putEmptyString()94*ec779b8eSAndroid Build Coastguard Worker inline void putEmptyString() { putUInt8(0); } putEmptyArray()95*ec779b8eSAndroid Build Coastguard Worker inline void putEmptyArray() { putUInt32(0); } 96*ec779b8eSAndroid Build Coastguard Worker 97*ec779b8eSAndroid Build Coastguard Worker #ifdef MTP_DEVICE 98*ec779b8eSAndroid Build Coastguard Worker // fill our buffer with data from the given usb handle 99*ec779b8eSAndroid Build Coastguard Worker int read(IMtpHandle *h); 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker // write our data to the given usb handle 102*ec779b8eSAndroid Build Coastguard Worker int write(IMtpHandle *h); 103*ec779b8eSAndroid Build Coastguard Worker int writeData(IMtpHandle *h, void* data, uint32_t length); 104*ec779b8eSAndroid Build Coastguard Worker #endif 105*ec779b8eSAndroid Build Coastguard Worker 106*ec779b8eSAndroid Build Coastguard Worker #ifdef MTP_HOST 107*ec779b8eSAndroid Build Coastguard Worker int read(struct usb_request *request); 108*ec779b8eSAndroid Build Coastguard Worker int readData(struct usb_request *request, void* buffer, int length); 109*ec779b8eSAndroid Build Coastguard Worker int readDataAsync(struct usb_request *req); 110*ec779b8eSAndroid Build Coastguard Worker int readDataWait(struct usb_device *device); 111*ec779b8eSAndroid Build Coastguard Worker int readDataHeader(struct usb_request *ep); 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker // Write a whole data packet with payload to the end point given by a request. |divisionMode| 114*ec779b8eSAndroid Build Coastguard Worker // specifies whether to divide header and payload. See |UrbPacketDivisionMode| for meanings of 115*ec779b8eSAndroid Build Coastguard Worker // each value. Return the number of bytes (including header size) sent to the device on success. 116*ec779b8eSAndroid Build Coastguard Worker // Otherwise -1. 117*ec779b8eSAndroid Build Coastguard Worker int write(struct usb_request *request, UrbPacketDivisionMode divisionMode); 118*ec779b8eSAndroid Build Coastguard Worker // Similar to previous write method but it reads the payload from |fd|. If |size| is larger than 119*ec779b8eSAndroid Build Coastguard Worker // MTP_BUFFER_SIZE, the data will be sent by multiple bulk transfer requests. 120*ec779b8eSAndroid Build Coastguard Worker // Return type (int64_t) is used to handle the case that the size can be larger than 2GB. 121*ec779b8eSAndroid Build Coastguard Worker int64_t write(struct usb_request *request, UrbPacketDivisionMode divisionMode, 122*ec779b8eSAndroid Build Coastguard Worker int fd, size_t size); 123*ec779b8eSAndroid Build Coastguard Worker #endif 124*ec779b8eSAndroid Build Coastguard Worker hasData()125*ec779b8eSAndroid Build Coastguard Worker inline bool hasData() const { return mPacketSize > MTP_CONTAINER_HEADER_SIZE; } getContainerLength()126*ec779b8eSAndroid Build Coastguard Worker inline uint32_t getContainerLength() const { return MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); } 127*ec779b8eSAndroid Build Coastguard Worker void* getData(int* outLength) const; 128*ec779b8eSAndroid Build Coastguard Worker }; 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker }; // namespace android 131*ec779b8eSAndroid Build Coastguard Worker 132*ec779b8eSAndroid Build Coastguard Worker #endif // _MTP_DATA_PACKET_H 133