xref: /aosp_15_r20/frameworks/av/media/mtp/MtpProperty.cpp (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 #define LOG_TAG "MtpProperty"
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <inttypes.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <cutils/compiler.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <iomanip>
22*ec779b8eSAndroid Build Coastguard Worker #include <sstream>
23*ec779b8eSAndroid Build Coastguard Worker #include <string>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include "MtpDataPacket.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "MtpDebug.h"
27*ec779b8eSAndroid Build Coastguard Worker #include "MtpProperty.h"
28*ec779b8eSAndroid Build Coastguard Worker #include "MtpStringBuffer.h"
29*ec779b8eSAndroid Build Coastguard Worker #include "MtpUtils.h"
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker namespace android {
32*ec779b8eSAndroid Build Coastguard Worker 
MtpProperty()33*ec779b8eSAndroid Build Coastguard Worker MtpProperty::MtpProperty()
34*ec779b8eSAndroid Build Coastguard Worker     :   mCode(0),
35*ec779b8eSAndroid Build Coastguard Worker         mType(0),
36*ec779b8eSAndroid Build Coastguard Worker         mWriteable(false),
37*ec779b8eSAndroid Build Coastguard Worker         mDefaultArrayLength(0),
38*ec779b8eSAndroid Build Coastguard Worker         mDefaultArrayValues(NULL),
39*ec779b8eSAndroid Build Coastguard Worker         mCurrentArrayLength(0),
40*ec779b8eSAndroid Build Coastguard Worker         mCurrentArrayValues(NULL),
41*ec779b8eSAndroid Build Coastguard Worker         mGroupCode(0),
42*ec779b8eSAndroid Build Coastguard Worker         mFormFlag(kFormNone),
43*ec779b8eSAndroid Build Coastguard Worker         mEnumLength(0),
44*ec779b8eSAndroid Build Coastguard Worker         mEnumValues(NULL)
45*ec779b8eSAndroid Build Coastguard Worker {
46*ec779b8eSAndroid Build Coastguard Worker     memset(&mDefaultValue, 0, sizeof(mDefaultValue));
47*ec779b8eSAndroid Build Coastguard Worker     memset(&mCurrentValue, 0, sizeof(mCurrentValue));
48*ec779b8eSAndroid Build Coastguard Worker     memset(&mMinimumValue, 0, sizeof(mMinimumValue));
49*ec779b8eSAndroid Build Coastguard Worker     memset(&mMaximumValue, 0, sizeof(mMaximumValue));
50*ec779b8eSAndroid Build Coastguard Worker }
51*ec779b8eSAndroid Build Coastguard Worker 
MtpProperty(MtpPropertyCode propCode,MtpDataType type,bool writeable,int defaultValue)52*ec779b8eSAndroid Build Coastguard Worker MtpProperty::MtpProperty(MtpPropertyCode propCode,
53*ec779b8eSAndroid Build Coastguard Worker                          MtpDataType type,
54*ec779b8eSAndroid Build Coastguard Worker                          bool writeable,
55*ec779b8eSAndroid Build Coastguard Worker                          int defaultValue)
56*ec779b8eSAndroid Build Coastguard Worker     :   mCode(propCode),
57*ec779b8eSAndroid Build Coastguard Worker         mType(type),
58*ec779b8eSAndroid Build Coastguard Worker         mWriteable(writeable),
59*ec779b8eSAndroid Build Coastguard Worker         mDefaultArrayLength(0),
60*ec779b8eSAndroid Build Coastguard Worker         mDefaultArrayValues(NULL),
61*ec779b8eSAndroid Build Coastguard Worker         mCurrentArrayLength(0),
62*ec779b8eSAndroid Build Coastguard Worker         mCurrentArrayValues(NULL),
63*ec779b8eSAndroid Build Coastguard Worker         mGroupCode(0),
64*ec779b8eSAndroid Build Coastguard Worker         mFormFlag(kFormNone),
65*ec779b8eSAndroid Build Coastguard Worker         mEnumLength(0),
66*ec779b8eSAndroid Build Coastguard Worker         mEnumValues(NULL)
67*ec779b8eSAndroid Build Coastguard Worker {
68*ec779b8eSAndroid Build Coastguard Worker     memset(&mDefaultValue, 0, sizeof(mDefaultValue));
69*ec779b8eSAndroid Build Coastguard Worker     memset(&mCurrentValue, 0, sizeof(mCurrentValue));
70*ec779b8eSAndroid Build Coastguard Worker     memset(&mMinimumValue, 0, sizeof(mMinimumValue));
71*ec779b8eSAndroid Build Coastguard Worker     memset(&mMaximumValue, 0, sizeof(mMaximumValue));
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     if (defaultValue) {
74*ec779b8eSAndroid Build Coastguard Worker         switch (type) {
75*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_INT8:
76*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.i8 = defaultValue;
77*ec779b8eSAndroid Build Coastguard Worker                 break;
78*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_UINT8:
79*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.u8 = defaultValue;
80*ec779b8eSAndroid Build Coastguard Worker                 break;
81*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_INT16:
82*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.i16 = defaultValue;
83*ec779b8eSAndroid Build Coastguard Worker                 break;
84*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_UINT16:
85*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.u16 = defaultValue;
86*ec779b8eSAndroid Build Coastguard Worker                 break;
87*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_INT32:
88*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.i32 = defaultValue;
89*ec779b8eSAndroid Build Coastguard Worker                 break;
90*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_UINT32:
91*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.u32 = defaultValue;
92*ec779b8eSAndroid Build Coastguard Worker                 break;
93*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_INT64:
94*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.i64 = defaultValue;
95*ec779b8eSAndroid Build Coastguard Worker                 break;
96*ec779b8eSAndroid Build Coastguard Worker             case MTP_TYPE_UINT64:
97*ec779b8eSAndroid Build Coastguard Worker                 mDefaultValue.u.u64 = defaultValue;
98*ec779b8eSAndroid Build Coastguard Worker                 break;
99*ec779b8eSAndroid Build Coastguard Worker             default:
100*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
101*ec779b8eSAndroid Build Coastguard Worker         }
102*ec779b8eSAndroid Build Coastguard Worker     }
103*ec779b8eSAndroid Build Coastguard Worker }
104*ec779b8eSAndroid Build Coastguard Worker 
~MtpProperty()105*ec779b8eSAndroid Build Coastguard Worker MtpProperty::~MtpProperty() {
106*ec779b8eSAndroid Build Coastguard Worker     if (mType == MTP_TYPE_STR) {
107*ec779b8eSAndroid Build Coastguard Worker         // free all strings
108*ec779b8eSAndroid Build Coastguard Worker         free(mDefaultValue.str);
109*ec779b8eSAndroid Build Coastguard Worker         free(mCurrentValue.str);
110*ec779b8eSAndroid Build Coastguard Worker         free(mMinimumValue.str);
111*ec779b8eSAndroid Build Coastguard Worker         free(mMaximumValue.str);
112*ec779b8eSAndroid Build Coastguard Worker         if (mDefaultArrayValues) {
113*ec779b8eSAndroid Build Coastguard Worker             for (uint32_t i = 0; i < mDefaultArrayLength; i++)
114*ec779b8eSAndroid Build Coastguard Worker                 free(mDefaultArrayValues[i].str);
115*ec779b8eSAndroid Build Coastguard Worker         }
116*ec779b8eSAndroid Build Coastguard Worker         if (mCurrentArrayValues) {
117*ec779b8eSAndroid Build Coastguard Worker             for (uint32_t i = 0; i < mCurrentArrayLength; i++)
118*ec779b8eSAndroid Build Coastguard Worker                 free(mCurrentArrayValues[i].str);
119*ec779b8eSAndroid Build Coastguard Worker         }
120*ec779b8eSAndroid Build Coastguard Worker         if (mEnumValues) {
121*ec779b8eSAndroid Build Coastguard Worker             for (uint16_t i = 0; i < mEnumLength; i++)
122*ec779b8eSAndroid Build Coastguard Worker                 free(mEnumValues[i].str);
123*ec779b8eSAndroid Build Coastguard Worker         }
124*ec779b8eSAndroid Build Coastguard Worker     }
125*ec779b8eSAndroid Build Coastguard Worker     delete[] mDefaultArrayValues;
126*ec779b8eSAndroid Build Coastguard Worker     delete[] mCurrentArrayValues;
127*ec779b8eSAndroid Build Coastguard Worker     delete[] mEnumValues;
128*ec779b8eSAndroid Build Coastguard Worker }
129*ec779b8eSAndroid Build Coastguard Worker 
read(MtpDataPacket & packet)130*ec779b8eSAndroid Build Coastguard Worker bool MtpProperty::read(MtpDataPacket& packet) {
131*ec779b8eSAndroid Build Coastguard Worker     uint8_t temp8;
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker     if (!packet.getUInt16(mCode)) return false;
134*ec779b8eSAndroid Build Coastguard Worker     bool deviceProp = isDeviceProperty();
135*ec779b8eSAndroid Build Coastguard Worker     if (!packet.getUInt16(mType)) return false;
136*ec779b8eSAndroid Build Coastguard Worker     if (!packet.getUInt8(temp8)) return false;
137*ec779b8eSAndroid Build Coastguard Worker     mWriteable = (temp8 == 1);
138*ec779b8eSAndroid Build Coastguard Worker     switch (mType) {
139*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT8:
140*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT8:
141*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT16:
142*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT16:
143*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT32:
144*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT32:
145*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT64:
146*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT64:
147*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT128:
148*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT128:
149*ec779b8eSAndroid Build Coastguard Worker             mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
150*ec779b8eSAndroid Build Coastguard Worker             if (!mDefaultArrayValues) return false;
151*ec779b8eSAndroid Build Coastguard Worker             if (deviceProp) {
152*ec779b8eSAndroid Build Coastguard Worker                 mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
153*ec779b8eSAndroid Build Coastguard Worker                 if (!mCurrentArrayValues) return false;
154*ec779b8eSAndroid Build Coastguard Worker             }
155*ec779b8eSAndroid Build Coastguard Worker             break;
156*ec779b8eSAndroid Build Coastguard Worker         default:
157*ec779b8eSAndroid Build Coastguard Worker             if (!readValue(packet, mDefaultValue)) return false;
158*ec779b8eSAndroid Build Coastguard Worker             if (deviceProp) {
159*ec779b8eSAndroid Build Coastguard Worker                 if (!readValue(packet, mCurrentValue)) return false;
160*ec779b8eSAndroid Build Coastguard Worker             }
161*ec779b8eSAndroid Build Coastguard Worker     }
162*ec779b8eSAndroid Build Coastguard Worker     if (!deviceProp) {
163*ec779b8eSAndroid Build Coastguard Worker         if (!packet.getUInt32(mGroupCode)) return false;
164*ec779b8eSAndroid Build Coastguard Worker     }
165*ec779b8eSAndroid Build Coastguard Worker     if (!packet.getUInt8(mFormFlag)) return false;
166*ec779b8eSAndroid Build Coastguard Worker 
167*ec779b8eSAndroid Build Coastguard Worker     if (mFormFlag == kFormRange) {
168*ec779b8eSAndroid Build Coastguard Worker             if (!readValue(packet, mMinimumValue)) return false;
169*ec779b8eSAndroid Build Coastguard Worker             if (!readValue(packet, mMaximumValue)) return false;
170*ec779b8eSAndroid Build Coastguard Worker             if (!readValue(packet, mStepSize)) return false;
171*ec779b8eSAndroid Build Coastguard Worker     } else if (mFormFlag == kFormEnum) {
172*ec779b8eSAndroid Build Coastguard Worker         if (!packet.getUInt16(mEnumLength)) return false;
173*ec779b8eSAndroid Build Coastguard Worker         mEnumValues = new MtpPropertyValue[mEnumLength];
174*ec779b8eSAndroid Build Coastguard Worker         for (int i = 0; i < mEnumLength; i++) {
175*ec779b8eSAndroid Build Coastguard Worker             if (!readValue(packet, mEnumValues[i])) return false;
176*ec779b8eSAndroid Build Coastguard Worker         }
177*ec779b8eSAndroid Build Coastguard Worker     }
178*ec779b8eSAndroid Build Coastguard Worker 
179*ec779b8eSAndroid Build Coastguard Worker     return true;
180*ec779b8eSAndroid Build Coastguard Worker }
181*ec779b8eSAndroid Build Coastguard Worker 
write(MtpDataPacket & packet)182*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::write(MtpDataPacket& packet) {
183*ec779b8eSAndroid Build Coastguard Worker     bool deviceProp = isDeviceProperty();
184*ec779b8eSAndroid Build Coastguard Worker 
185*ec779b8eSAndroid Build Coastguard Worker     packet.putUInt16(mCode);
186*ec779b8eSAndroid Build Coastguard Worker     packet.putUInt16(mType);
187*ec779b8eSAndroid Build Coastguard Worker     packet.putUInt8(mWriteable ? 1 : 0);
188*ec779b8eSAndroid Build Coastguard Worker 
189*ec779b8eSAndroid Build Coastguard Worker     switch (mType) {
190*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT8:
191*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT8:
192*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT16:
193*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT16:
194*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT32:
195*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT32:
196*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT64:
197*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT64:
198*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT128:
199*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT128:
200*ec779b8eSAndroid Build Coastguard Worker             writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
201*ec779b8eSAndroid Build Coastguard Worker             if (deviceProp)
202*ec779b8eSAndroid Build Coastguard Worker                 writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
203*ec779b8eSAndroid Build Coastguard Worker             break;
204*ec779b8eSAndroid Build Coastguard Worker         default:
205*ec779b8eSAndroid Build Coastguard Worker             writeValue(packet, mDefaultValue);
206*ec779b8eSAndroid Build Coastguard Worker             if (deviceProp)
207*ec779b8eSAndroid Build Coastguard Worker                 writeValue(packet, mCurrentValue);
208*ec779b8eSAndroid Build Coastguard Worker     }
209*ec779b8eSAndroid Build Coastguard Worker     if (!deviceProp)
210*ec779b8eSAndroid Build Coastguard Worker         packet.putUInt32(mGroupCode);
211*ec779b8eSAndroid Build Coastguard Worker     packet.putUInt8(mFormFlag);
212*ec779b8eSAndroid Build Coastguard Worker     if (mFormFlag == kFormRange) {
213*ec779b8eSAndroid Build Coastguard Worker             writeValue(packet, mMinimumValue);
214*ec779b8eSAndroid Build Coastguard Worker             writeValue(packet, mMaximumValue);
215*ec779b8eSAndroid Build Coastguard Worker             writeValue(packet, mStepSize);
216*ec779b8eSAndroid Build Coastguard Worker     } else if (mFormFlag == kFormEnum) {
217*ec779b8eSAndroid Build Coastguard Worker         packet.putUInt16(mEnumLength);
218*ec779b8eSAndroid Build Coastguard Worker         for (int i = 0; i < mEnumLength; i++)
219*ec779b8eSAndroid Build Coastguard Worker             writeValue(packet, mEnumValues[i]);
220*ec779b8eSAndroid Build Coastguard Worker     }
221*ec779b8eSAndroid Build Coastguard Worker }
222*ec779b8eSAndroid Build Coastguard Worker 
setDefaultValue(const uint16_t * string)223*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setDefaultValue(const uint16_t* string) {
224*ec779b8eSAndroid Build Coastguard Worker     free(mDefaultValue.str);
225*ec779b8eSAndroid Build Coastguard Worker     if (string) {
226*ec779b8eSAndroid Build Coastguard Worker         MtpStringBuffer buffer(string);
227*ec779b8eSAndroid Build Coastguard Worker         mDefaultValue.str = strdup(buffer);
228*ec779b8eSAndroid Build Coastguard Worker     }
229*ec779b8eSAndroid Build Coastguard Worker     else
230*ec779b8eSAndroid Build Coastguard Worker         mDefaultValue.str = NULL;
231*ec779b8eSAndroid Build Coastguard Worker }
232*ec779b8eSAndroid Build Coastguard Worker 
setCurrentValue(const uint16_t * string)233*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setCurrentValue(const uint16_t* string) {
234*ec779b8eSAndroid Build Coastguard Worker     free(mCurrentValue.str);
235*ec779b8eSAndroid Build Coastguard Worker     if (string) {
236*ec779b8eSAndroid Build Coastguard Worker         MtpStringBuffer buffer(string);
237*ec779b8eSAndroid Build Coastguard Worker         mCurrentValue.str = strdup(buffer);
238*ec779b8eSAndroid Build Coastguard Worker     }
239*ec779b8eSAndroid Build Coastguard Worker     else
240*ec779b8eSAndroid Build Coastguard Worker         mCurrentValue.str = NULL;
241*ec779b8eSAndroid Build Coastguard Worker }
242*ec779b8eSAndroid Build Coastguard Worker 
setCurrentValue(const char * string)243*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setCurrentValue(const char* string) {
244*ec779b8eSAndroid Build Coastguard Worker     free(mCurrentValue.str);
245*ec779b8eSAndroid Build Coastguard Worker     if (string) {
246*ec779b8eSAndroid Build Coastguard Worker         MtpStringBuffer buffer(string);
247*ec779b8eSAndroid Build Coastguard Worker         mCurrentValue.str = strdup(buffer);
248*ec779b8eSAndroid Build Coastguard Worker     }
249*ec779b8eSAndroid Build Coastguard Worker     else
250*ec779b8eSAndroid Build Coastguard Worker         mCurrentValue.str = NULL;
251*ec779b8eSAndroid Build Coastguard Worker }
252*ec779b8eSAndroid Build Coastguard Worker 
setCurrentValue(MtpDataPacket & packet)253*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setCurrentValue(MtpDataPacket& packet) {
254*ec779b8eSAndroid Build Coastguard Worker     free(mCurrentValue.str);
255*ec779b8eSAndroid Build Coastguard Worker     mCurrentValue.str = NULL;
256*ec779b8eSAndroid Build Coastguard Worker     readValue(packet, mCurrentValue);
257*ec779b8eSAndroid Build Coastguard Worker }
258*ec779b8eSAndroid Build Coastguard Worker 
setFormRange(int min,int max,int step)259*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setFormRange(int min, int max, int step) {
260*ec779b8eSAndroid Build Coastguard Worker     mFormFlag = kFormRange;
261*ec779b8eSAndroid Build Coastguard Worker     switch (mType) {
262*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT8:
263*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.i8 = min;
264*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.i8 = max;
265*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.i8 = step;
266*ec779b8eSAndroid Build Coastguard Worker             break;
267*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT8:
268*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.u8 = min;
269*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.u8 = max;
270*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.u8 = step;
271*ec779b8eSAndroid Build Coastguard Worker             break;
272*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT16:
273*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.i16 = min;
274*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.i16 = max;
275*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.i16 = step;
276*ec779b8eSAndroid Build Coastguard Worker             break;
277*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT16:
278*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.u16 = min;
279*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.u16 = max;
280*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.u16 = step;
281*ec779b8eSAndroid Build Coastguard Worker             break;
282*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT32:
283*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.i32 = min;
284*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.i32 = max;
285*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.i32 = step;
286*ec779b8eSAndroid Build Coastguard Worker             break;
287*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT32:
288*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.u32 = min;
289*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.u32 = max;
290*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.u32 = step;
291*ec779b8eSAndroid Build Coastguard Worker             break;
292*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT64:
293*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.i64 = min;
294*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.i64 = max;
295*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.i64 = step;
296*ec779b8eSAndroid Build Coastguard Worker             break;
297*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT64:
298*ec779b8eSAndroid Build Coastguard Worker             mMinimumValue.u.u64 = min;
299*ec779b8eSAndroid Build Coastguard Worker             mMaximumValue.u.u64 = max;
300*ec779b8eSAndroid Build Coastguard Worker             mStepSize.u.u64 = step;
301*ec779b8eSAndroid Build Coastguard Worker             break;
302*ec779b8eSAndroid Build Coastguard Worker         default:
303*ec779b8eSAndroid Build Coastguard Worker             ALOGE("unsupported type for MtpProperty::setRange");
304*ec779b8eSAndroid Build Coastguard Worker             break;
305*ec779b8eSAndroid Build Coastguard Worker     }
306*ec779b8eSAndroid Build Coastguard Worker }
307*ec779b8eSAndroid Build Coastguard Worker 
setFormEnum(const int * values,int count)308*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setFormEnum(const int* values, int count) {
309*ec779b8eSAndroid Build Coastguard Worker      mFormFlag = kFormEnum;
310*ec779b8eSAndroid Build Coastguard Worker      delete[] mEnumValues;
311*ec779b8eSAndroid Build Coastguard Worker      mEnumValues = new MtpPropertyValue[count];
312*ec779b8eSAndroid Build Coastguard Worker      mEnumLength = count;
313*ec779b8eSAndroid Build Coastguard Worker 
314*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < count; i++) {
315*ec779b8eSAndroid Build Coastguard Worker         int value = *values++;
316*ec779b8eSAndroid Build Coastguard Worker             switch (mType) {
317*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_INT8:
318*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.i8 = value;
319*ec779b8eSAndroid Build Coastguard Worker                     break;
320*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_UINT8:
321*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.u8 = value;
322*ec779b8eSAndroid Build Coastguard Worker                     break;
323*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_INT16:
324*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.i16 = value;
325*ec779b8eSAndroid Build Coastguard Worker                     break;
326*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_UINT16:
327*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.u16 = value;
328*ec779b8eSAndroid Build Coastguard Worker                     break;
329*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_INT32:
330*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.i32 = value;
331*ec779b8eSAndroid Build Coastguard Worker                     break;
332*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_UINT32:
333*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.u32 = value;
334*ec779b8eSAndroid Build Coastguard Worker                     break;
335*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_INT64:
336*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.i64 = value;
337*ec779b8eSAndroid Build Coastguard Worker                     break;
338*ec779b8eSAndroid Build Coastguard Worker                 case MTP_TYPE_UINT64:
339*ec779b8eSAndroid Build Coastguard Worker                     mEnumValues[i].u.u64 = value;
340*ec779b8eSAndroid Build Coastguard Worker                     break;
341*ec779b8eSAndroid Build Coastguard Worker                 default:
342*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("unsupported type for MtpProperty::setEnum");
343*ec779b8eSAndroid Build Coastguard Worker                     break;
344*ec779b8eSAndroid Build Coastguard Worker         }
345*ec779b8eSAndroid Build Coastguard Worker     }
346*ec779b8eSAndroid Build Coastguard Worker }
347*ec779b8eSAndroid Build Coastguard Worker 
setFormDateTime()348*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::setFormDateTime() {
349*ec779b8eSAndroid Build Coastguard Worker      mFormFlag = kFormDateTime;
350*ec779b8eSAndroid Build Coastguard Worker }
351*ec779b8eSAndroid Build Coastguard Worker 
print()352*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::print() {
353*ec779b8eSAndroid Build Coastguard Worker     std::string buffer;
354*ec779b8eSAndroid Build Coastguard Worker     bool deviceProp = isDeviceProperty();
355*ec779b8eSAndroid Build Coastguard Worker     if (deviceProp)
356*ec779b8eSAndroid Build Coastguard Worker         ALOGI("    %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
357*ec779b8eSAndroid Build Coastguard Worker     else
358*ec779b8eSAndroid Build Coastguard Worker         ALOGI("    %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
359*ec779b8eSAndroid Build Coastguard Worker     ALOGI("    type %04X", mType);
360*ec779b8eSAndroid Build Coastguard Worker     ALOGI("    writeable %s", (mWriteable ? "true" : "false"));
361*ec779b8eSAndroid Build Coastguard Worker     buffer = "    default value: ";
362*ec779b8eSAndroid Build Coastguard Worker     print(mDefaultValue, buffer);
363*ec779b8eSAndroid Build Coastguard Worker     ALOGI("%s", buffer.c_str());
364*ec779b8eSAndroid Build Coastguard Worker     if (deviceProp) {
365*ec779b8eSAndroid Build Coastguard Worker         buffer = "    current value: ";
366*ec779b8eSAndroid Build Coastguard Worker         print(mCurrentValue, buffer);
367*ec779b8eSAndroid Build Coastguard Worker         ALOGI("%s", buffer.c_str());
368*ec779b8eSAndroid Build Coastguard Worker     }
369*ec779b8eSAndroid Build Coastguard Worker     switch (mFormFlag) {
370*ec779b8eSAndroid Build Coastguard Worker         case kFormNone:
371*ec779b8eSAndroid Build Coastguard Worker             break;
372*ec779b8eSAndroid Build Coastguard Worker         case kFormRange:
373*ec779b8eSAndroid Build Coastguard Worker             buffer = "    Range (";
374*ec779b8eSAndroid Build Coastguard Worker             print(mMinimumValue, buffer);
375*ec779b8eSAndroid Build Coastguard Worker             buffer += ", ";
376*ec779b8eSAndroid Build Coastguard Worker             print(mMaximumValue, buffer);
377*ec779b8eSAndroid Build Coastguard Worker             buffer += ", ";
378*ec779b8eSAndroid Build Coastguard Worker             print(mStepSize, buffer);
379*ec779b8eSAndroid Build Coastguard Worker             buffer += ")";
380*ec779b8eSAndroid Build Coastguard Worker             ALOGI("%s", buffer.c_str());
381*ec779b8eSAndroid Build Coastguard Worker             break;
382*ec779b8eSAndroid Build Coastguard Worker         case kFormEnum:
383*ec779b8eSAndroid Build Coastguard Worker             buffer = "    Enum { ";
384*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < mEnumLength; i++) {
385*ec779b8eSAndroid Build Coastguard Worker                 print(mEnumValues[i], buffer);
386*ec779b8eSAndroid Build Coastguard Worker                 buffer += " ";
387*ec779b8eSAndroid Build Coastguard Worker             }
388*ec779b8eSAndroid Build Coastguard Worker             buffer += "}";
389*ec779b8eSAndroid Build Coastguard Worker             ALOGI("%s", buffer.c_str());
390*ec779b8eSAndroid Build Coastguard Worker             break;
391*ec779b8eSAndroid Build Coastguard Worker         case kFormDateTime:
392*ec779b8eSAndroid Build Coastguard Worker             ALOGI("    DateTime\n");
393*ec779b8eSAndroid Build Coastguard Worker             break;
394*ec779b8eSAndroid Build Coastguard Worker         default:
395*ec779b8eSAndroid Build Coastguard Worker             ALOGI("    form %d\n", mFormFlag);
396*ec779b8eSAndroid Build Coastguard Worker             break;
397*ec779b8eSAndroid Build Coastguard Worker     }
398*ec779b8eSAndroid Build Coastguard Worker }
399*ec779b8eSAndroid Build Coastguard Worker 
print(MtpPropertyValue & value,std::string & buffer)400*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::print(MtpPropertyValue& value, std::string& buffer) {
401*ec779b8eSAndroid Build Coastguard Worker     std::ostringstream s;
402*ec779b8eSAndroid Build Coastguard Worker     switch (mType) {
403*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT8:
404*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.i8);
405*ec779b8eSAndroid Build Coastguard Worker             break;
406*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT8:
407*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.u8);
408*ec779b8eSAndroid Build Coastguard Worker             break;
409*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT16:
410*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.i16);
411*ec779b8eSAndroid Build Coastguard Worker             break;
412*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT16:
413*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.u16);
414*ec779b8eSAndroid Build Coastguard Worker             break;
415*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT32:
416*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.i32);
417*ec779b8eSAndroid Build Coastguard Worker             break;
418*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT32:
419*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.u32);
420*ec779b8eSAndroid Build Coastguard Worker             break;
421*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT64:
422*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.i64);
423*ec779b8eSAndroid Build Coastguard Worker             break;
424*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT64:
425*ec779b8eSAndroid Build Coastguard Worker             buffer += std::to_string(value.u.u64);
426*ec779b8eSAndroid Build Coastguard Worker             break;
427*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT128:
428*ec779b8eSAndroid Build Coastguard Worker             for (auto i : value.u.i128) {
429*ec779b8eSAndroid Build Coastguard Worker                 s << std::hex << std::setfill('0') << std::uppercase << i;
430*ec779b8eSAndroid Build Coastguard Worker             }
431*ec779b8eSAndroid Build Coastguard Worker             buffer += s.str();
432*ec779b8eSAndroid Build Coastguard Worker             break;
433*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT128:
434*ec779b8eSAndroid Build Coastguard Worker             for (auto i : value.u.u128) {
435*ec779b8eSAndroid Build Coastguard Worker                 s << std::hex << std::setfill('0') << std::uppercase << i;
436*ec779b8eSAndroid Build Coastguard Worker             }
437*ec779b8eSAndroid Build Coastguard Worker             buffer += s.str();
438*ec779b8eSAndroid Build Coastguard Worker             break;
439*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_STR:
440*ec779b8eSAndroid Build Coastguard Worker             buffer += value.str;
441*ec779b8eSAndroid Build Coastguard Worker             break;
442*ec779b8eSAndroid Build Coastguard Worker         default:
443*ec779b8eSAndroid Build Coastguard Worker             ALOGE("unsupported type for MtpProperty::print\n");
444*ec779b8eSAndroid Build Coastguard Worker             break;
445*ec779b8eSAndroid Build Coastguard Worker     }
446*ec779b8eSAndroid Build Coastguard Worker }
447*ec779b8eSAndroid Build Coastguard Worker 
readValue(MtpDataPacket & packet,MtpPropertyValue & value)448*ec779b8eSAndroid Build Coastguard Worker bool MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
449*ec779b8eSAndroid Build Coastguard Worker     MtpStringBuffer stringBuffer;
450*ec779b8eSAndroid Build Coastguard Worker 
451*ec779b8eSAndroid Build Coastguard Worker     switch (mType) {
452*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT8:
453*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT8:
454*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getInt8(value.u.i8)) return false;
455*ec779b8eSAndroid Build Coastguard Worker             break;
456*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT8:
457*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT8:
458*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getUInt8(value.u.u8)) return false;
459*ec779b8eSAndroid Build Coastguard Worker             break;
460*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT16:
461*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT16:
462*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getInt16(value.u.i16)) return false;
463*ec779b8eSAndroid Build Coastguard Worker             break;
464*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT16:
465*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT16:
466*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getUInt16(value.u.u16)) return false;
467*ec779b8eSAndroid Build Coastguard Worker             break;
468*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT32:
469*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT32:
470*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getInt32(value.u.i32)) return false;
471*ec779b8eSAndroid Build Coastguard Worker             break;
472*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT32:
473*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT32:
474*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getUInt32(value.u.u32)) return false;
475*ec779b8eSAndroid Build Coastguard Worker             break;
476*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT64:
477*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT64:
478*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getInt64(value.u.i64)) return false;
479*ec779b8eSAndroid Build Coastguard Worker             break;
480*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT64:
481*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT64:
482*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getUInt64(value.u.u64)) return false;
483*ec779b8eSAndroid Build Coastguard Worker             break;
484*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT128:
485*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT128:
486*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getInt128(value.u.i128)) return false;
487*ec779b8eSAndroid Build Coastguard Worker             break;
488*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT128:
489*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT128:
490*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getUInt128(value.u.u128)) return false;
491*ec779b8eSAndroid Build Coastguard Worker             break;
492*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_STR:
493*ec779b8eSAndroid Build Coastguard Worker             if (!packet.getString(stringBuffer)) return false;
494*ec779b8eSAndroid Build Coastguard Worker             value.str = strdup(stringBuffer);
495*ec779b8eSAndroid Build Coastguard Worker             break;
496*ec779b8eSAndroid Build Coastguard Worker         default:
497*ec779b8eSAndroid Build Coastguard Worker             ALOGE("unknown type %04X in MtpProperty::readValue", mType);
498*ec779b8eSAndroid Build Coastguard Worker             return false;
499*ec779b8eSAndroid Build Coastguard Worker     }
500*ec779b8eSAndroid Build Coastguard Worker     return true;
501*ec779b8eSAndroid Build Coastguard Worker }
502*ec779b8eSAndroid Build Coastguard Worker 
writeValue(MtpDataPacket & packet,MtpPropertyValue & value)503*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
504*ec779b8eSAndroid Build Coastguard Worker     MtpStringBuffer stringBuffer;
505*ec779b8eSAndroid Build Coastguard Worker 
506*ec779b8eSAndroid Build Coastguard Worker     switch (mType) {
507*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT8:
508*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT8:
509*ec779b8eSAndroid Build Coastguard Worker             packet.putInt8(value.u.i8);
510*ec779b8eSAndroid Build Coastguard Worker             break;
511*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT8:
512*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT8:
513*ec779b8eSAndroid Build Coastguard Worker             packet.putUInt8(value.u.u8);
514*ec779b8eSAndroid Build Coastguard Worker             break;
515*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT16:
516*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT16:
517*ec779b8eSAndroid Build Coastguard Worker             packet.putInt16(value.u.i16);
518*ec779b8eSAndroid Build Coastguard Worker             break;
519*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT16:
520*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT16:
521*ec779b8eSAndroid Build Coastguard Worker             packet.putUInt16(value.u.u16);
522*ec779b8eSAndroid Build Coastguard Worker             break;
523*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT32:
524*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT32:
525*ec779b8eSAndroid Build Coastguard Worker             packet.putInt32(value.u.i32);
526*ec779b8eSAndroid Build Coastguard Worker             break;
527*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT32:
528*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT32:
529*ec779b8eSAndroid Build Coastguard Worker             packet.putUInt32(value.u.u32);
530*ec779b8eSAndroid Build Coastguard Worker             break;
531*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT64:
532*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT64:
533*ec779b8eSAndroid Build Coastguard Worker             packet.putInt64(value.u.i64);
534*ec779b8eSAndroid Build Coastguard Worker             break;
535*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT64:
536*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT64:
537*ec779b8eSAndroid Build Coastguard Worker             packet.putUInt64(value.u.u64);
538*ec779b8eSAndroid Build Coastguard Worker             break;
539*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_INT128:
540*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AINT128:
541*ec779b8eSAndroid Build Coastguard Worker             packet.putInt128(value.u.i128);
542*ec779b8eSAndroid Build Coastguard Worker             break;
543*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_UINT128:
544*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_AUINT128:
545*ec779b8eSAndroid Build Coastguard Worker             packet.putUInt128(value.u.u128);
546*ec779b8eSAndroid Build Coastguard Worker             break;
547*ec779b8eSAndroid Build Coastguard Worker         case MTP_TYPE_STR:
548*ec779b8eSAndroid Build Coastguard Worker             if (value.str)
549*ec779b8eSAndroid Build Coastguard Worker                 packet.putString(value.str);
550*ec779b8eSAndroid Build Coastguard Worker             else
551*ec779b8eSAndroid Build Coastguard Worker                 packet.putEmptyString();
552*ec779b8eSAndroid Build Coastguard Worker             break;
553*ec779b8eSAndroid Build Coastguard Worker         default:
554*ec779b8eSAndroid Build Coastguard Worker             ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
555*ec779b8eSAndroid Build Coastguard Worker     }
556*ec779b8eSAndroid Build Coastguard Worker }
557*ec779b8eSAndroid Build Coastguard Worker 
readArrayValues(MtpDataPacket & packet,uint32_t & length)558*ec779b8eSAndroid Build Coastguard Worker MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, uint32_t& length) {
559*ec779b8eSAndroid Build Coastguard Worker     if (!packet.getUInt32(length)) return NULL;
560*ec779b8eSAndroid Build Coastguard Worker 
561*ec779b8eSAndroid Build Coastguard Worker     // Fail if resulting array is over 2GB.  This is because the maximum array
562*ec779b8eSAndroid Build Coastguard Worker     // size may be less than SIZE_MAX on some platforms.
563*ec779b8eSAndroid Build Coastguard Worker     if ( CC_UNLIKELY(
564*ec779b8eSAndroid Build Coastguard Worker             length == 0 ||
565*ec779b8eSAndroid Build Coastguard Worker             length >= INT32_MAX / sizeof(MtpPropertyValue)) ) {
566*ec779b8eSAndroid Build Coastguard Worker         length = 0;
567*ec779b8eSAndroid Build Coastguard Worker         return NULL;
568*ec779b8eSAndroid Build Coastguard Worker     }
569*ec779b8eSAndroid Build Coastguard Worker     MtpPropertyValue* result = new MtpPropertyValue[length];
570*ec779b8eSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < length; i++)
571*ec779b8eSAndroid Build Coastguard Worker         if (!readValue(packet, result[i])) {
572*ec779b8eSAndroid Build Coastguard Worker             delete [] result;
573*ec779b8eSAndroid Build Coastguard Worker             return NULL;
574*ec779b8eSAndroid Build Coastguard Worker         }
575*ec779b8eSAndroid Build Coastguard Worker     return result;
576*ec779b8eSAndroid Build Coastguard Worker }
577*ec779b8eSAndroid Build Coastguard Worker 
writeArrayValues(MtpDataPacket & packet,MtpPropertyValue * values,uint32_t length)578*ec779b8eSAndroid Build Coastguard Worker void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, uint32_t length) {
579*ec779b8eSAndroid Build Coastguard Worker     packet.putUInt32(length);
580*ec779b8eSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < length; i++)
581*ec779b8eSAndroid Build Coastguard Worker         writeValue(packet, values[i]);
582*ec779b8eSAndroid Build Coastguard Worker }
583*ec779b8eSAndroid Build Coastguard Worker 
584*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
585