xref: /aosp_15_r20/frameworks/av/media/mtp/MtpDataPacket.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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