156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood/* 256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * Copyright (C) 2010 The Android Open Source Project 356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * 456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * you may not use this file except in compliance with the License. 656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * You may obtain a copy of the License at 756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * 856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * 1056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * Unless required by applicable law or agreed to in writing, software 1156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * See the License for the specific language governing permissions and 1456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood * limitations under the License. 1556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood */ 1656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 1756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#ifndef _MTP_DATA_PACKET_H 1856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#define _MTP_DATA_PACKET_H 1956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 2056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#include "MtpPacket.h" 2156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#include "mtp.h" 2256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 23215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwoodstruct usb_device; 24215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwoodstruct usb_request; 25215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood 268d3257a7dc10e1b3fda03e00f40d1b65d699ff23Mike Lockwoodnamespace android { 278d3257a7dc10e1b3fda03e00f40d1b65d699ff23Mike Lockwood 289bbc2ea9ad4904f16016941795ba12e2c7a8a439Mike Lockwoodclass MtpStringBuffer; 299bbc2ea9ad4904f16016941795ba12e2c7a8a439Mike Lockwood 3056118b5b385adad0ff301f67be2cf601432d94baMike Lockwoodclass MtpDataPacket : public MtpPacket { 3156118b5b385adad0ff301f67be2cf601432d94baMike Lockwoodprivate: 3256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood // current offset for get/put methods 3356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood int mOffset; 3456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 3556118b5b385adad0ff301f67be2cf601432d94baMike Lockwoodpublic: 3656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood MtpDataPacket(); 3756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood virtual ~MtpDataPacket(); 3856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 3956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood virtual void reset(); 4056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 4156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void setOperationCode(MtpOperationCode code); 4256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void setTransactionID(MtpTransactionID id); 4356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 44de6d73acec2e0e2a4ac17dd452ddb4bb347c3f68Mike Lockwood inline const uint8_t* getData() const { return mBuffer + MTP_CONTAINER_HEADER_SIZE; } 4556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline uint8_t getUInt8() { return (uint8_t)mBuffer[mOffset++]; } 4656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline int8_t getInt8() { return (int8_t)mBuffer[mOffset++]; } 4756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood uint16_t getUInt16(); 4856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline int16_t getInt16() { return (int16_t)getUInt16(); } 4956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood uint32_t getUInt32(); 5056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline int32_t getInt32() { return (int32_t)getUInt32(); } 5156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood uint64_t getUInt64(); 5256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline int64_t getInt64() { return (int64_t)getUInt64(); } 5390f4873446b08980102e3bc8893a220dec5ebf2eMike Lockwood void getUInt128(uint128_t& value); 5490f4873446b08980102e3bc8893a220dec5ebf2eMike Lockwood inline void getInt128(int128_t& value) { getUInt128((uint128_t&)value); } 5556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void getString(MtpStringBuffer& string); 5656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 575bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood Int8List* getAInt8(); 585bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood UInt8List* getAUInt8(); 595bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood Int16List* getAInt16(); 605bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood UInt16List* getAUInt16(); 615bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood Int32List* getAInt32(); 625bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood UInt32List* getAUInt32(); 635bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood Int64List* getAInt64(); 645bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood UInt64List* getAUInt64(); 655bae7f615b6375820f61b28f6792cb2d01aab54bMike Lockwood 6656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putInt8(int8_t value); 6756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putUInt8(uint8_t value); 6856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putInt16(int16_t value); 6956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putUInt16(uint16_t value); 7056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putInt32(int32_t value); 7156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putUInt32(uint32_t value); 7256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putInt64(int64_t value); 7356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putUInt64(uint64_t value); 7490f4873446b08980102e3bc8893a220dec5ebf2eMike Lockwood void putInt128(const int128_t& value); 7590f4873446b08980102e3bc8893a220dec5ebf2eMike Lockwood void putUInt128(const uint128_t& value); 76828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood void putInt128(int64_t value); 77828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood void putUInt128(uint64_t value); 7856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 7956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAInt8(const int8_t* values, int count); 8056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAUInt8(const uint8_t* values, int count); 8156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAInt16(const int16_t* values, int count); 8256118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAUInt16(const uint16_t* values, int count); 834b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood void putAUInt16(const UInt16List* values); 8456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAInt32(const int32_t* values, int count); 8556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAUInt32(const uint32_t* values, int count); 8656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAUInt32(const UInt32List* list); 8756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAInt64(const int64_t* values, int count); 8856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putAUInt64(const uint64_t* values, int count); 8956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putString(const MtpStringBuffer& string); 9056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood void putString(const char* string); 91d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood void putString(const uint16_t* string); 929e837861b28b8186da0791c9a4e72f8a128a980cMike Lockwood inline void putEmptyString() { putUInt8(0); } 9356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline void putEmptyArray() { putUInt32(0); } 9456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 9556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 9656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#ifdef MTP_DEVICE 9756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood // fill our buffer with data from the given file descriptor 9856118b5b385adad0ff301f67be2cf601432d94baMike Lockwood int read(int fd); 9956118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 10056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood // write our data to the given file descriptor 10156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood int write(int fd); 102c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood int writeData(int fd, void* data, uint32_t length); 10356118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#endif 10456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 10556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#ifdef MTP_HOST 106215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int read(struct usb_request *request); 107215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int readData(struct usb_request *request, void* buffer, int length); 108215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int readDataAsync(struct usb_request *req); 109215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int readDataWait(struct usb_device *device); 110215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int readDataHeader(struct usb_request *ep); 111215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood 112215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int writeDataHeader(struct usb_request *ep, uint32_t length); 113215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int write(struct usb_request *ep); 114215b682b8a02ac51d820b8e301d50431bdd09b3dMike Lockwood int write(struct usb_request *ep, void* buffer, uint32_t length); 11556118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#endif 11656118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 11756118b5b385adad0ff301f67be2cf601432d94baMike Lockwood inline bool hasData() const { return mPacketSize > MTP_CONTAINER_HEADER_SIZE; } 118954c267725d64a37655d6f3a00de6a5aa00ddaf8Mike Lockwood inline uint32_t getContainerLength() const { return MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); } 119dda568609232cdf82a2f050b0d0727627f49d448Mike Lockwood void* getData(int& outLength) const; 12056118b5b385adad0ff301f67be2cf601432d94baMike Lockwood}; 12156118b5b385adad0ff301f67be2cf601432d94baMike Lockwood 1228d3257a7dc10e1b3fda03e00f40d1b65d699ff23Mike Lockwood}; // namespace android 1238d3257a7dc10e1b3fda03e00f40d1b65d699ff23Mike Lockwood 12456118b5b385adad0ff301f67be2cf601432d94baMike Lockwood#endif // _MTP_DATA_PACKET_H 125