116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood/* 216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * you may not use this file except in compliance with the License. 616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * You may obtain a copy of the License at 716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 1016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * See the License for the specific language governing permissions and 1416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * limitations under the License. 1516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood */ 1616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 1716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#ifndef _MTP_DATA_PACKET_H 1816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#define _MTP_DATA_PACKET_H 1916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 2016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpPacket.h" 2116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "mtp.h" 2216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangclass IMtpHandle; 2442d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwoodstruct usb_device; 2542d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwoodstruct usb_request; 2642d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood 277850ef999740f214a1990a9c090d3f3865d435aaMike Lockwoodnamespace android { 287850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood 295cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwoodclass MtpStringBuffer; 305cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood 3116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodclass MtpDataPacket : public MtpPacket { 3216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodprivate: 3316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood // current offset for get/put methods 34ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood size_t mOffset; 3516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 3616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwoodpublic: 3716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood MtpDataPacket(); 3816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood virtual ~MtpDataPacket(); 3916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 4016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood virtual void reset(); 4116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 4216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void setOperationCode(MtpOperationCode code); 4316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void setTransactionID(MtpTransactionID id); 4416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 45ef441d965504dbf31c5db690e5b34fcdcecd92ffMike Lockwood inline const uint8_t* getData() const { return mBuffer + MTP_CONTAINER_HEADER_SIZE; } 46ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood 47ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood bool getUInt8(uint8_t& value); 48ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood inline bool getInt8(int8_t& value) { return getUInt8((uint8_t&)value); } 49ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood bool getUInt16(uint16_t& value); 50ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood inline bool getInt16(int16_t& value) { return getUInt16((uint16_t&)value); } 51ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood bool getUInt32(uint32_t& value); 52ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood inline bool getInt32(int32_t& value) { return getUInt32((uint32_t&)value); } 53ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood bool getUInt64(uint64_t& value); 54ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood inline bool getInt64(int64_t& value) { return getUInt64((uint64_t&)value); } 55ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood bool getUInt128(uint128_t& value); 56ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood inline bool getInt128(int128_t& value) { return getUInt128((uint128_t&)value); } 57ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood bool getString(MtpStringBuffer& string); 5816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 59335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood Int8List* getAInt8(); 60335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood UInt8List* getAUInt8(); 61335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood Int16List* getAInt16(); 62335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood UInt16List* getAUInt16(); 63335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood Int32List* getAInt32(); 64335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood UInt32List* getAUInt32(); 65335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood Int64List* getAInt64(); 66335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood UInt64List* getAUInt64(); 67335dd2be955607f2632eabc25045857f2cc8b674Mike Lockwood 6816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putInt8(int8_t value); 6916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putUInt8(uint8_t value); 7016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putInt16(int16_t value); 7116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putUInt16(uint16_t value); 7216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putInt32(int32_t value); 7316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putUInt32(uint32_t value); 7416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putInt64(int64_t value); 7516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putUInt64(uint64_t value); 76a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood void putInt128(const int128_t& value); 77a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood void putUInt128(const uint128_t& value); 788277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood void putInt128(int64_t value); 798277cec96ffa55082962591bca1c55abbeec8c26Mike Lockwood void putUInt128(uint64_t value); 8016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 8116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAInt8(const int8_t* values, int count); 8216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAUInt8(const uint8_t* values, int count); 8316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAInt16(const int16_t* values, int count); 8416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAUInt16(const uint16_t* values, int count); 85782aef17c9921a3bf401a0432878df5031f2328bMike Lockwood void putAUInt16(const UInt16List* values); 8616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAInt32(const int32_t* values, int count); 8716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAUInt32(const uint32_t* values, int count); 8816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAUInt32(const UInt32List* list); 8916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAInt64(const int64_t* values, int count); 9016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putAUInt64(const uint64_t* values, int count); 9116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putString(const MtpStringBuffer& string); 9216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood void putString(const char* string); 931865a5ddcfe7b0e8dc211419aea1094b1491a5fdMike Lockwood void putString(const uint16_t* string); 94de1e37aad04640ef76f3c017b65adca087c7be0fMike Lockwood inline void putEmptyString() { putUInt8(0); } 9516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood inline void putEmptyArray() { putUInt32(0); } 9616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 9716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#ifdef MTP_DEVICE 98487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang // fill our buffer with data from the given usb handle 99487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int read(IMtpHandle *h); 10016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 101487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang // write our data to the given usb handle 102487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int write(IMtpHandle *h); 103487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int writeData(IMtpHandle *h, void* data, uint32_t length); 10416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#endif 10516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 10616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#ifdef MTP_HOST 10742d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood int read(struct usb_request *request); 10842d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood int readData(struct usb_request *request, void* buffer, int length); 10942d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood int readDataAsync(struct usb_request *req); 11042d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood int readDataWait(struct usb_device *device); 11142d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood int readDataHeader(struct usb_request *ep); 11242d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood 113d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono // Write a whole data packet with payload to the end point given by a request. |divisionMode| 114d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono // specifies whether to divide header and payload. See |UrbPacketDivisionMode| for meanings of 115d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono // each value. Return the number of bytes (including header size) sent to the device on success. 116d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono // Otherwise -1. 117d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono int write(struct usb_request *request, UrbPacketDivisionMode divisionMode); 118d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono // Similar to previous write method but it reads the payload from |fd|. If |size| is larger than 119d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono // MTP_BUFFER_SIZE, the data will be sent by multiple bulk transfer requests. 120d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono int write(struct usb_request *request, UrbPacketDivisionMode divisionMode, 121d4b4296b401162a7a42f757c96e3652b82255b13Daichi Hirono int fd, size_t size); 12216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#endif 12316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 12416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood inline bool hasData() const { return mPacketSize > MTP_CONTAINER_HEADER_SIZE; } 125b9ff444a7eaf7ffd43970c0477110c6808bd4a7cMike Lockwood inline uint32_t getContainerLength() const { return MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); } 1264fd9a8b9865addfedbcd84d5c9efea0f647086a0Daichi Hirono void* getData(int* outLength) const; 12716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood}; 12816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 1297850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood}; // namespace android 1307850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood 13116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#endif // _MTP_DATA_PACKET_H 132