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