blob: 2be2d790a62fded4a52ff79d6e2fe389c4415427 [file] [log] [blame]
Mike Lockwooda6c490b2010-06-05 22:45:01 -04001/*
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#define LOG_TAG "MtpProperty"
Mike Lockwooda6c490b2010-06-05 22:45:01 -040018
Kévin PETIT377b2ec2014-02-03 12:35:36 +000019#include <inttypes.h>
Lajos Molnareb5d7f22014-03-24 16:18:36 -070020#include <cutils/compiler.h>
Mike Lockwooda6c490b2010-06-05 22:45:01 -040021#include "MtpDataPacket.h"
Mike Lockwood0c7c7c72010-12-07 11:24:28 -080022#include "MtpDebug.h"
Mike Lockwooda6c490b2010-06-05 22:45:01 -040023#include "MtpProperty.h"
24#include "MtpStringBuffer.h"
25#include "MtpUtils.h"
26
27namespace android {
28
29MtpProperty::MtpProperty()
30 : mCode(0),
31 mType(0),
32 mWriteable(false),
33 mDefaultArrayLength(0),
34 mDefaultArrayValues(NULL),
35 mCurrentArrayLength(0),
36 mCurrentArrayValues(NULL),
Mike Lockwood2bb8c0e2010-08-09 14:49:28 -040037 mGroupCode(0),
Mike Lockwooda6c490b2010-06-05 22:45:01 -040038 mFormFlag(kFormNone),
39 mEnumLength(0),
40 mEnumValues(NULL)
41{
Mike Lockwooddde37202010-09-25 21:21:05 -040042 memset(&mDefaultValue, 0, sizeof(mDefaultValue));
43 memset(&mCurrentValue, 0, sizeof(mCurrentValue));
44 memset(&mMinimumValue, 0, sizeof(mMinimumValue));
45 memset(&mMaximumValue, 0, sizeof(mMaximumValue));
Mike Lockwooda6c490b2010-06-05 22:45:01 -040046}
47
Mike Lockwood21ef7d02010-06-30 17:00:35 -040048MtpProperty::MtpProperty(MtpPropertyCode propCode,
49 MtpDataType type,
50 bool writeable,
51 int defaultValue)
52 : mCode(propCode),
53 mType(type),
54 mWriteable(writeable),
55 mDefaultArrayLength(0),
56 mDefaultArrayValues(NULL),
57 mCurrentArrayLength(0),
58 mCurrentArrayValues(NULL),
Mike Lockwood40ce1f22010-12-01 18:46:23 -050059 mGroupCode(0),
Mike Lockwood21ef7d02010-06-30 17:00:35 -040060 mFormFlag(kFormNone),
61 mEnumLength(0),
62 mEnumValues(NULL)
63{
64 memset(&mDefaultValue, 0, sizeof(mDefaultValue));
65 memset(&mCurrentValue, 0, sizeof(mCurrentValue));
66 memset(&mMinimumValue, 0, sizeof(mMinimumValue));
67 memset(&mMaximumValue, 0, sizeof(mMaximumValue));
68
69 if (defaultValue) {
70 switch (type) {
71 case MTP_TYPE_INT8:
Mike Lockwooddde37202010-09-25 21:21:05 -040072 mDefaultValue.u.i8 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040073 break;
74 case MTP_TYPE_UINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -040075 mDefaultValue.u.u8 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040076 break;
77 case MTP_TYPE_INT16:
Mike Lockwooddde37202010-09-25 21:21:05 -040078 mDefaultValue.u.i16 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040079 break;
80 case MTP_TYPE_UINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -040081 mDefaultValue.u.u16 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040082 break;
83 case MTP_TYPE_INT32:
Mike Lockwooddde37202010-09-25 21:21:05 -040084 mDefaultValue.u.i32 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040085 break;
86 case MTP_TYPE_UINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -040087 mDefaultValue.u.u32 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040088 break;
89 case MTP_TYPE_INT64:
Mike Lockwooddde37202010-09-25 21:21:05 -040090 mDefaultValue.u.i64 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040091 break;
92 case MTP_TYPE_UINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -040093 mDefaultValue.u.u64 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040094 break;
95 default:
Steve Block29357bc2012-01-06 19:20:56 +000096 ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
Mike Lockwood21ef7d02010-06-30 17:00:35 -040097 }
98 }
99}
100
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400101MtpProperty::~MtpProperty() {
102 if (mType == MTP_TYPE_STR) {
103 // free all strings
104 free(mDefaultValue.str);
105 free(mCurrentValue.str);
106 free(mMinimumValue.str);
107 free(mMaximumValue.str);
108 if (mDefaultArrayValues) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800109 for (uint32_t i = 0; i < mDefaultArrayLength; i++)
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400110 free(mDefaultArrayValues[i].str);
111 }
112 if (mCurrentArrayValues) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800113 for (uint32_t i = 0; i < mCurrentArrayLength; i++)
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400114 free(mCurrentArrayValues[i].str);
115 }
116 if (mEnumValues) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800117 for (uint16_t i = 0; i < mEnumLength; i++)
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400118 free(mEnumValues[i].str);
119 }
120 }
121 delete[] mDefaultArrayValues;
122 delete[] mCurrentArrayValues;
123 delete[] mEnumValues;
124}
125
Mike Lockwoodab063842014-11-12 14:20:06 -0800126bool MtpProperty::read(MtpDataPacket& packet) {
127 uint8_t temp8;
128
129 if (!packet.getUInt16(mCode)) return false;
Mike Lockwood5da86482010-12-07 13:51:54 -0800130 bool deviceProp = isDeviceProperty();
Mike Lockwoodab063842014-11-12 14:20:06 -0800131 if (!packet.getUInt16(mType)) return false;
132 if (!packet.getUInt8(temp8)) return false;
133 mWriteable = (temp8 == 1);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400134 switch (mType) {
135 case MTP_TYPE_AINT8:
136 case MTP_TYPE_AUINT8:
137 case MTP_TYPE_AINT16:
138 case MTP_TYPE_AUINT16:
139 case MTP_TYPE_AINT32:
140 case MTP_TYPE_AUINT32:
141 case MTP_TYPE_AINT64:
142 case MTP_TYPE_AUINT64:
143 case MTP_TYPE_AINT128:
144 case MTP_TYPE_AUINT128:
145 mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
Mike Lockwoodab063842014-11-12 14:20:06 -0800146 if (!mDefaultArrayValues) return false;
147 if (deviceProp) {
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400148 mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
Mike Lockwoodab063842014-11-12 14:20:06 -0800149 if (!mCurrentArrayValues) return false;
150 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400151 break;
152 default:
Mike Lockwoodab063842014-11-12 14:20:06 -0800153 if (!readValue(packet, mDefaultValue)) return false;
154 if (deviceProp) {
155 if (!readValue(packet, mCurrentValue)) return false;
156 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400157 }
Mike Lockwoodab063842014-11-12 14:20:06 -0800158 if (!deviceProp) {
159 if (!packet.getUInt32(mGroupCode)) return false;
160 }
161 if (!packet.getUInt8(mFormFlag)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400162
163 if (mFormFlag == kFormRange) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800164 if (!readValue(packet, mMinimumValue)) return false;
165 if (!readValue(packet, mMaximumValue)) return false;
166 if (!readValue(packet, mStepSize)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400167 } else if (mFormFlag == kFormEnum) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800168 if (!packet.getUInt16(mEnumLength)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400169 mEnumValues = new MtpPropertyValue[mEnumLength];
Mike Lockwoodab063842014-11-12 14:20:06 -0800170 for (int i = 0; i < mEnumLength; i++) {
171 if (!readValue(packet, mEnumValues[i])) return false;
172 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400173 }
Mike Lockwoodab063842014-11-12 14:20:06 -0800174
175 return true;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400176}
177
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400178void MtpProperty::write(MtpDataPacket& packet) {
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400179 bool deviceProp = isDeviceProperty();
180
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400181 packet.putUInt16(mCode);
182 packet.putUInt16(mType);
183 packet.putUInt8(mWriteable ? 1 : 0);
184
185 switch (mType) {
186 case MTP_TYPE_AINT8:
187 case MTP_TYPE_AUINT8:
188 case MTP_TYPE_AINT16:
189 case MTP_TYPE_AUINT16:
190 case MTP_TYPE_AINT32:
191 case MTP_TYPE_AUINT32:
192 case MTP_TYPE_AINT64:
193 case MTP_TYPE_AUINT64:
194 case MTP_TYPE_AINT128:
195 case MTP_TYPE_AUINT128:
196 writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400197 if (deviceProp)
198 writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400199 break;
200 default:
201 writeValue(packet, mDefaultValue);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400202 if (deviceProp)
203 writeValue(packet, mCurrentValue);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400204 }
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400205 if (!deviceProp)
Mike Lockwood0fa848d2014-03-07 13:29:59 -0800206 packet.putUInt32(mGroupCode);
207 packet.putUInt8(mFormFlag);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400208 if (mFormFlag == kFormRange) {
209 writeValue(packet, mMinimumValue);
210 writeValue(packet, mMaximumValue);
211 writeValue(packet, mStepSize);
212 } else if (mFormFlag == kFormEnum) {
213 packet.putUInt16(mEnumLength);
214 for (int i = 0; i < mEnumLength; i++)
215 writeValue(packet, mEnumValues[i]);
216 }
217}
218
Mike Lockwooddde37202010-09-25 21:21:05 -0400219void MtpProperty::setDefaultValue(const uint16_t* string) {
220 free(mDefaultValue.str);
221 if (string) {
222 MtpStringBuffer buffer(string);
223 mDefaultValue.str = strdup(buffer);
224 }
225 else
226 mDefaultValue.str = NULL;
227}
228
229void MtpProperty::setCurrentValue(const uint16_t* string) {
230 free(mCurrentValue.str);
231 if (string) {
232 MtpStringBuffer buffer(string);
233 mCurrentValue.str = strdup(buffer);
234 }
235 else
236 mCurrentValue.str = NULL;
237}
238
Mike Lockwood01817262010-11-10 12:48:39 -0500239void MtpProperty::setFormRange(int min, int max, int step) {
240 mFormFlag = kFormRange;
241 switch (mType) {
242 case MTP_TYPE_INT8:
243 mMinimumValue.u.i8 = min;
244 mMaximumValue.u.i8 = max;
245 mStepSize.u.i8 = step;
246 break;
247 case MTP_TYPE_UINT8:
248 mMinimumValue.u.u8 = min;
249 mMaximumValue.u.u8 = max;
250 mStepSize.u.u8 = step;
251 break;
252 case MTP_TYPE_INT16:
253 mMinimumValue.u.i16 = min;
254 mMaximumValue.u.i16 = max;
255 mStepSize.u.i16 = step;
256 break;
257 case MTP_TYPE_UINT16:
258 mMinimumValue.u.u16 = min;
259 mMaximumValue.u.u16 = max;
260 mStepSize.u.u16 = step;
261 break;
262 case MTP_TYPE_INT32:
263 mMinimumValue.u.i32 = min;
264 mMaximumValue.u.i32 = max;
265 mStepSize.u.i32 = step;
266 break;
267 case MTP_TYPE_UINT32:
268 mMinimumValue.u.u32 = min;
269 mMaximumValue.u.u32 = max;
270 mStepSize.u.u32 = step;
271 break;
272 case MTP_TYPE_INT64:
273 mMinimumValue.u.i64 = min;
274 mMaximumValue.u.i64 = max;
275 mStepSize.u.i64 = step;
276 break;
277 case MTP_TYPE_UINT64:
278 mMinimumValue.u.u64 = min;
279 mMaximumValue.u.u64 = max;
280 mStepSize.u.u64 = step;
281 break;
282 default:
Steve Block29357bc2012-01-06 19:20:56 +0000283 ALOGE("unsupported type for MtpProperty::setRange");
Mike Lockwood01817262010-11-10 12:48:39 -0500284 break;
285 }
286}
287
288void MtpProperty::setFormEnum(const int* values, int count) {
289 mFormFlag = kFormEnum;
290 delete[] mEnumValues;
291 mEnumValues = new MtpPropertyValue[count];
292 mEnumLength = count;
293
294 for (int i = 0; i < count; i++) {
295 int value = *values++;
296 switch (mType) {
297 case MTP_TYPE_INT8:
298 mEnumValues[i].u.i8 = value;
299 break;
300 case MTP_TYPE_UINT8:
301 mEnumValues[i].u.u8 = value;
302 break;
303 case MTP_TYPE_INT16:
304 mEnumValues[i].u.i16 = value;
305 break;
306 case MTP_TYPE_UINT16:
307 mEnumValues[i].u.u16 = value;
308 break;
309 case MTP_TYPE_INT32:
310 mEnumValues[i].u.i32 = value;
311 break;
312 case MTP_TYPE_UINT32:
313 mEnumValues[i].u.u32 = value;
314 break;
315 case MTP_TYPE_INT64:
316 mEnumValues[i].u.i64 = value;
317 break;
318 case MTP_TYPE_UINT64:
319 mEnumValues[i].u.u64 = value;
320 break;
321 default:
Steve Block29357bc2012-01-06 19:20:56 +0000322 ALOGE("unsupported type for MtpProperty::setEnum");
Mike Lockwood01817262010-11-10 12:48:39 -0500323 break;
324 }
325 }
326}
327
Mike Lockwoodb892d0e2010-11-23 18:38:55 -0500328void MtpProperty::setFormDateTime() {
329 mFormFlag = kFormDateTime;
330}
331
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400332void MtpProperty::print() {
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800333 MtpString buffer;
334 bool deviceProp = isDeviceProperty();
335 if (deviceProp)
Steve Blockdf64d152012-01-04 20:05:49 +0000336 ALOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800337 else
Steve Blockdf64d152012-01-04 20:05:49 +0000338 ALOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
339 ALOGI(" type %04X", mType);
340 ALOGI(" writeable %s", (mWriteable ? "true" : "false"));
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800341 buffer = " default value: ";
342 print(mDefaultValue, buffer);
Steve Blockdf64d152012-01-04 20:05:49 +0000343 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800344 if (deviceProp) {
345 buffer = " current value: ";
346 print(mCurrentValue, buffer);
Steve Blockdf64d152012-01-04 20:05:49 +0000347 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800348 }
349 switch (mFormFlag) {
350 case kFormNone:
351 break;
352 case kFormRange:
353 buffer = " Range (";
354 print(mMinimumValue, buffer);
355 buffer += ", ";
356 print(mMaximumValue, buffer);
357 buffer += ", ";
358 print(mStepSize, buffer);
Mike Lockwoodfd346262010-12-08 16:08:01 -0800359 buffer += ")";
Steve Blockdf64d152012-01-04 20:05:49 +0000360 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800361 break;
362 case kFormEnum:
363 buffer = " Enum { ";
364 for (int i = 0; i < mEnumLength; i++) {
365 print(mEnumValues[i], buffer);
366 buffer += " ";
367 }
368 buffer += "}";
Steve Blockdf64d152012-01-04 20:05:49 +0000369 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800370 break;
371 case kFormDateTime:
Steve Blockdf64d152012-01-04 20:05:49 +0000372 ALOGI(" DateTime\n");
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800373 break;
374 default:
Steve Blockdf64d152012-01-04 20:05:49 +0000375 ALOGI(" form %d\n", mFormFlag);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800376 break;
377 }
378}
379
380void MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
381 switch (mType) {
382 case MTP_TYPE_INT8:
383 buffer.appendFormat("%d", value.u.i8);
384 break;
385 case MTP_TYPE_UINT8:
386 buffer.appendFormat("%d", value.u.u8);
387 break;
388 case MTP_TYPE_INT16:
389 buffer.appendFormat("%d", value.u.i16);
390 break;
391 case MTP_TYPE_UINT16:
392 buffer.appendFormat("%d", value.u.u16);
393 break;
394 case MTP_TYPE_INT32:
395 buffer.appendFormat("%d", value.u.i32);
396 break;
397 case MTP_TYPE_UINT32:
398 buffer.appendFormat("%d", value.u.u32);
399 break;
400 case MTP_TYPE_INT64:
Kévin PETIT377b2ec2014-02-03 12:35:36 +0000401 buffer.appendFormat("%" PRId64, value.u.i64);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800402 break;
403 case MTP_TYPE_UINT64:
Kévin PETIT377b2ec2014-02-03 12:35:36 +0000404 buffer.appendFormat("%" PRIu64, value.u.u64);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800405 break;
406 case MTP_TYPE_INT128:
407 buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
408 value.u.i128[2], value.u.i128[3]);
409 break;
410 case MTP_TYPE_UINT128:
411 buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
412 value.u.u128[2], value.u.u128[3]);
413 break;
414 case MTP_TYPE_STR:
415 buffer.appendFormat("%s", value.str);
416 break;
417 default:
Steve Block29357bc2012-01-06 19:20:56 +0000418 ALOGE("unsupported type for MtpProperty::print\n");
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800419 break;
420 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400421}
422
Mike Lockwoodab063842014-11-12 14:20:06 -0800423bool MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400424 MtpStringBuffer stringBuffer;
425
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400426 switch (mType) {
427 case MTP_TYPE_INT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400428 case MTP_TYPE_AINT8:
Mike Lockwoodab063842014-11-12 14:20:06 -0800429 if (!packet.getInt8(value.u.i8)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400430 break;
431 case MTP_TYPE_UINT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400432 case MTP_TYPE_AUINT8:
Mike Lockwoodab063842014-11-12 14:20:06 -0800433 if (!packet.getUInt8(value.u.u8)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400434 break;
435 case MTP_TYPE_INT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400436 case MTP_TYPE_AINT16:
Mike Lockwoodab063842014-11-12 14:20:06 -0800437 if (!packet.getInt16(value.u.i16)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400438 break;
439 case MTP_TYPE_UINT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400440 case MTP_TYPE_AUINT16:
Mike Lockwoodab063842014-11-12 14:20:06 -0800441 if (!packet.getUInt16(value.u.u16)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400442 break;
443 case MTP_TYPE_INT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400444 case MTP_TYPE_AINT32:
Mike Lockwoodab063842014-11-12 14:20:06 -0800445 if (!packet.getInt32(value.u.i32)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400446 break;
447 case MTP_TYPE_UINT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400448 case MTP_TYPE_AUINT32:
Mike Lockwoodab063842014-11-12 14:20:06 -0800449 if (!packet.getUInt32(value.u.u32)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400450 break;
451 case MTP_TYPE_INT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400452 case MTP_TYPE_AINT64:
Mike Lockwoodab063842014-11-12 14:20:06 -0800453 if (!packet.getInt64(value.u.i64)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400454 break;
455 case MTP_TYPE_UINT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400456 case MTP_TYPE_AUINT64:
Mike Lockwoodab063842014-11-12 14:20:06 -0800457 if (!packet.getUInt64(value.u.u64)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400458 break;
459 case MTP_TYPE_INT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400460 case MTP_TYPE_AINT128:
Mike Lockwoodab063842014-11-12 14:20:06 -0800461 if (!packet.getInt128(value.u.i128)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400462 break;
463 case MTP_TYPE_UINT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400464 case MTP_TYPE_AUINT128:
Mike Lockwoodab063842014-11-12 14:20:06 -0800465 if (!packet.getUInt128(value.u.u128)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400466 break;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400467 case MTP_TYPE_STR:
Mike Lockwoodab063842014-11-12 14:20:06 -0800468 if (!packet.getString(stringBuffer)) return false;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400469 value.str = strdup(stringBuffer);
470 break;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400471 default:
Steve Block29357bc2012-01-06 19:20:56 +0000472 ALOGE("unknown type %04X in MtpProperty::readValue", mType);
Mike Lockwoodab063842014-11-12 14:20:06 -0800473 return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400474 }
Mike Lockwoodab063842014-11-12 14:20:06 -0800475 return true;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400476}
477
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400478void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400479 MtpStringBuffer stringBuffer;
480
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400481 switch (mType) {
482 case MTP_TYPE_INT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400483 case MTP_TYPE_AINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400484 packet.putInt8(value.u.i8);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400485 break;
486 case MTP_TYPE_UINT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400487 case MTP_TYPE_AUINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400488 packet.putUInt8(value.u.u8);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400489 break;
490 case MTP_TYPE_INT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400491 case MTP_TYPE_AINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400492 packet.putInt16(value.u.i16);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400493 break;
494 case MTP_TYPE_UINT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400495 case MTP_TYPE_AUINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400496 packet.putUInt16(value.u.u16);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400497 break;
498 case MTP_TYPE_INT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400499 case MTP_TYPE_AINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400500 packet.putInt32(value.u.i32);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400501 break;
502 case MTP_TYPE_UINT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400503 case MTP_TYPE_AUINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400504 packet.putUInt32(value.u.u32);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400505 break;
506 case MTP_TYPE_INT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400507 case MTP_TYPE_AINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400508 packet.putInt64(value.u.i64);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400509 break;
510 case MTP_TYPE_UINT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400511 case MTP_TYPE_AUINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400512 packet.putUInt64(value.u.u64);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400513 break;
514 case MTP_TYPE_INT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400515 case MTP_TYPE_AINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400516 packet.putInt128(value.u.i128);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400517 break;
518 case MTP_TYPE_UINT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400519 case MTP_TYPE_AUINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400520 packet.putUInt128(value.u.u128);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400521 break;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400522 case MTP_TYPE_STR:
523 if (value.str)
524 packet.putString(value.str);
525 else
526 packet.putEmptyString();
527 break;
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400528 default:
Steve Block29357bc2012-01-06 19:20:56 +0000529 ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400530 }
531}
532
Mike Lockwoodab063842014-11-12 14:20:06 -0800533MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, uint32_t& length) {
534 if (!packet.getUInt32(length)) return NULL;
535
Lajos Molnareb5d7f22014-03-24 16:18:36 -0700536 // Fail if resulting array is over 2GB. This is because the maximum array
537 // size may be less than SIZE_MAX on some platforms.
538 if ( CC_UNLIKELY(
539 length == 0 ||
540 length >= INT32_MAX / sizeof(MtpPropertyValue)) ) {
541 length = 0;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400542 return NULL;
Lajos Molnareb5d7f22014-03-24 16:18:36 -0700543 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400544 MtpPropertyValue* result = new MtpPropertyValue[length];
Mike Lockwoodab063842014-11-12 14:20:06 -0800545 for (uint32_t i = 0; i < length; i++)
546 if (!readValue(packet, result[i])) {
Daichi Hironob3be0062016-02-25 12:42:58 +0900547 delete [] result;
Mike Lockwoodab063842014-11-12 14:20:06 -0800548 return NULL;
549 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400550 return result;
551}
552
Mike Lockwoodab063842014-11-12 14:20:06 -0800553void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, uint32_t length) {
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400554 packet.putUInt32(length);
Mike Lockwoodab063842014-11-12 14:20:06 -0800555 for (uint32_t i = 0; i < length; i++)
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400556 writeValue(packet, values[i]);
557}
558
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400559} // namespace android