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