blob: 98a2ad318ec45eb4fa9a05a2160a69a4b8cb2bc4 [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>
Jerry Zhangbc1d4b42018-03-27 15:25:03 -070021#include <iomanip>
22#include <sstream>
23#include <string>
24
Mike Lockwooda6c490b2010-06-05 22:45:01 -040025#include "MtpDataPacket.h"
Mike Lockwood0c7c7c72010-12-07 11:24:28 -080026#include "MtpDebug.h"
Mike Lockwooda6c490b2010-06-05 22:45:01 -040027#include "MtpProperty.h"
28#include "MtpStringBuffer.h"
29#include "MtpUtils.h"
30
31namespace android {
32
33MtpProperty::MtpProperty()
34 : mCode(0),
35 mType(0),
36 mWriteable(false),
37 mDefaultArrayLength(0),
38 mDefaultArrayValues(NULL),
39 mCurrentArrayLength(0),
40 mCurrentArrayValues(NULL),
Mike Lockwood2bb8c0e2010-08-09 14:49:28 -040041 mGroupCode(0),
Mike Lockwooda6c490b2010-06-05 22:45:01 -040042 mFormFlag(kFormNone),
43 mEnumLength(0),
44 mEnumValues(NULL)
45{
Mike Lockwooddde37202010-09-25 21:21:05 -040046 memset(&mDefaultValue, 0, sizeof(mDefaultValue));
47 memset(&mCurrentValue, 0, sizeof(mCurrentValue));
48 memset(&mMinimumValue, 0, sizeof(mMinimumValue));
49 memset(&mMaximumValue, 0, sizeof(mMaximumValue));
Mike Lockwooda6c490b2010-06-05 22:45:01 -040050}
51
Mike Lockwood21ef7d02010-06-30 17:00:35 -040052MtpProperty::MtpProperty(MtpPropertyCode propCode,
53 MtpDataType type,
54 bool writeable,
55 int defaultValue)
56 : mCode(propCode),
57 mType(type),
58 mWriteable(writeable),
59 mDefaultArrayLength(0),
60 mDefaultArrayValues(NULL),
61 mCurrentArrayLength(0),
62 mCurrentArrayValues(NULL),
Mike Lockwood40ce1f22010-12-01 18:46:23 -050063 mGroupCode(0),
Mike Lockwood21ef7d02010-06-30 17:00:35 -040064 mFormFlag(kFormNone),
65 mEnumLength(0),
66 mEnumValues(NULL)
67{
68 memset(&mDefaultValue, 0, sizeof(mDefaultValue));
69 memset(&mCurrentValue, 0, sizeof(mCurrentValue));
70 memset(&mMinimumValue, 0, sizeof(mMinimumValue));
71 memset(&mMaximumValue, 0, sizeof(mMaximumValue));
72
73 if (defaultValue) {
74 switch (type) {
75 case MTP_TYPE_INT8:
Mike Lockwooddde37202010-09-25 21:21:05 -040076 mDefaultValue.u.i8 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040077 break;
78 case MTP_TYPE_UINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -040079 mDefaultValue.u.u8 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040080 break;
81 case MTP_TYPE_INT16:
Mike Lockwooddde37202010-09-25 21:21:05 -040082 mDefaultValue.u.i16 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040083 break;
84 case MTP_TYPE_UINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -040085 mDefaultValue.u.u16 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040086 break;
87 case MTP_TYPE_INT32:
Mike Lockwooddde37202010-09-25 21:21:05 -040088 mDefaultValue.u.i32 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040089 break;
90 case MTP_TYPE_UINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -040091 mDefaultValue.u.u32 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040092 break;
93 case MTP_TYPE_INT64:
Mike Lockwooddde37202010-09-25 21:21:05 -040094 mDefaultValue.u.i64 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040095 break;
96 case MTP_TYPE_UINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -040097 mDefaultValue.u.u64 = defaultValue;
Mike Lockwood21ef7d02010-06-30 17:00:35 -040098 break;
99 default:
Steve Block29357bc2012-01-06 19:20:56 +0000100 ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400101 }
102 }
103}
104
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400105MtpProperty::~MtpProperty() {
106 if (mType == MTP_TYPE_STR) {
107 // free all strings
108 free(mDefaultValue.str);
109 free(mCurrentValue.str);
110 free(mMinimumValue.str);
111 free(mMaximumValue.str);
112 if (mDefaultArrayValues) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800113 for (uint32_t i = 0; i < mDefaultArrayLength; i++)
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400114 free(mDefaultArrayValues[i].str);
115 }
116 if (mCurrentArrayValues) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800117 for (uint32_t i = 0; i < mCurrentArrayLength; i++)
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400118 free(mCurrentArrayValues[i].str);
119 }
120 if (mEnumValues) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800121 for (uint16_t i = 0; i < mEnumLength; i++)
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400122 free(mEnumValues[i].str);
123 }
124 }
125 delete[] mDefaultArrayValues;
126 delete[] mCurrentArrayValues;
127 delete[] mEnumValues;
128}
129
Mike Lockwoodab063842014-11-12 14:20:06 -0800130bool MtpProperty::read(MtpDataPacket& packet) {
131 uint8_t temp8;
132
133 if (!packet.getUInt16(mCode)) return false;
Mike Lockwood5da86482010-12-07 13:51:54 -0800134 bool deviceProp = isDeviceProperty();
Mike Lockwoodab063842014-11-12 14:20:06 -0800135 if (!packet.getUInt16(mType)) return false;
136 if (!packet.getUInt8(temp8)) return false;
137 mWriteable = (temp8 == 1);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400138 switch (mType) {
139 case MTP_TYPE_AINT8:
140 case MTP_TYPE_AUINT8:
141 case MTP_TYPE_AINT16:
142 case MTP_TYPE_AUINT16:
143 case MTP_TYPE_AINT32:
144 case MTP_TYPE_AUINT32:
145 case MTP_TYPE_AINT64:
146 case MTP_TYPE_AUINT64:
147 case MTP_TYPE_AINT128:
148 case MTP_TYPE_AUINT128:
149 mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
Mike Lockwoodab063842014-11-12 14:20:06 -0800150 if (!mDefaultArrayValues) return false;
151 if (deviceProp) {
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400152 mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
Mike Lockwoodab063842014-11-12 14:20:06 -0800153 if (!mCurrentArrayValues) return false;
154 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400155 break;
156 default:
Mike Lockwoodab063842014-11-12 14:20:06 -0800157 if (!readValue(packet, mDefaultValue)) return false;
158 if (deviceProp) {
159 if (!readValue(packet, mCurrentValue)) return false;
160 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400161 }
Mike Lockwoodab063842014-11-12 14:20:06 -0800162 if (!deviceProp) {
163 if (!packet.getUInt32(mGroupCode)) return false;
164 }
165 if (!packet.getUInt8(mFormFlag)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400166
167 if (mFormFlag == kFormRange) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800168 if (!readValue(packet, mMinimumValue)) return false;
169 if (!readValue(packet, mMaximumValue)) return false;
170 if (!readValue(packet, mStepSize)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400171 } else if (mFormFlag == kFormEnum) {
Mike Lockwoodab063842014-11-12 14:20:06 -0800172 if (!packet.getUInt16(mEnumLength)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400173 mEnumValues = new MtpPropertyValue[mEnumLength];
Mike Lockwoodab063842014-11-12 14:20:06 -0800174 for (int i = 0; i < mEnumLength; i++) {
175 if (!readValue(packet, mEnumValues[i])) return false;
176 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400177 }
Mike Lockwoodab063842014-11-12 14:20:06 -0800178
179 return true;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400180}
181
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400182void MtpProperty::write(MtpDataPacket& packet) {
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400183 bool deviceProp = isDeviceProperty();
184
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400185 packet.putUInt16(mCode);
186 packet.putUInt16(mType);
187 packet.putUInt8(mWriteable ? 1 : 0);
188
189 switch (mType) {
190 case MTP_TYPE_AINT8:
191 case MTP_TYPE_AUINT8:
192 case MTP_TYPE_AINT16:
193 case MTP_TYPE_AUINT16:
194 case MTP_TYPE_AINT32:
195 case MTP_TYPE_AUINT32:
196 case MTP_TYPE_AINT64:
197 case MTP_TYPE_AUINT64:
198 case MTP_TYPE_AINT128:
199 case MTP_TYPE_AUINT128:
200 writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400201 if (deviceProp)
202 writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400203 break;
204 default:
205 writeValue(packet, mDefaultValue);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400206 if (deviceProp)
207 writeValue(packet, mCurrentValue);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400208 }
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400209 if (!deviceProp)
Mike Lockwood0fa848d2014-03-07 13:29:59 -0800210 packet.putUInt32(mGroupCode);
211 packet.putUInt8(mFormFlag);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400212 if (mFormFlag == kFormRange) {
213 writeValue(packet, mMinimumValue);
214 writeValue(packet, mMaximumValue);
215 writeValue(packet, mStepSize);
216 } else if (mFormFlag == kFormEnum) {
217 packet.putUInt16(mEnumLength);
218 for (int i = 0; i < mEnumLength; i++)
219 writeValue(packet, mEnumValues[i]);
220 }
221}
222
Mike Lockwooddde37202010-09-25 21:21:05 -0400223void MtpProperty::setDefaultValue(const uint16_t* string) {
224 free(mDefaultValue.str);
225 if (string) {
226 MtpStringBuffer buffer(string);
227 mDefaultValue.str = strdup(buffer);
228 }
229 else
230 mDefaultValue.str = NULL;
231}
232
233void MtpProperty::setCurrentValue(const uint16_t* string) {
234 free(mCurrentValue.str);
235 if (string) {
236 MtpStringBuffer buffer(string);
237 mCurrentValue.str = strdup(buffer);
238 }
239 else
240 mCurrentValue.str = NULL;
241}
242
James Wei8d96aa82021-06-19 20:48:10 +0800243void MtpProperty::setCurrentValue(const char* string) {
244 free(mCurrentValue.str);
245 if (string) {
246 MtpStringBuffer buffer(string);
247 mCurrentValue.str = strdup(buffer);
248 }
249 else
250 mCurrentValue.str = NULL;
251}
252
Daichi Hirono66a9abe2016-03-24 20:56:13 +0900253void MtpProperty::setCurrentValue(MtpDataPacket& packet) {
254 free(mCurrentValue.str);
255 mCurrentValue.str = NULL;
256 readValue(packet, mCurrentValue);
257}
258
Mike Lockwood01817262010-11-10 12:48:39 -0500259void MtpProperty::setFormRange(int min, int max, int step) {
260 mFormFlag = kFormRange;
261 switch (mType) {
262 case MTP_TYPE_INT8:
263 mMinimumValue.u.i8 = min;
264 mMaximumValue.u.i8 = max;
265 mStepSize.u.i8 = step;
266 break;
267 case MTP_TYPE_UINT8:
268 mMinimumValue.u.u8 = min;
269 mMaximumValue.u.u8 = max;
270 mStepSize.u.u8 = step;
271 break;
272 case MTP_TYPE_INT16:
273 mMinimumValue.u.i16 = min;
274 mMaximumValue.u.i16 = max;
275 mStepSize.u.i16 = step;
276 break;
277 case MTP_TYPE_UINT16:
278 mMinimumValue.u.u16 = min;
279 mMaximumValue.u.u16 = max;
280 mStepSize.u.u16 = step;
281 break;
282 case MTP_TYPE_INT32:
283 mMinimumValue.u.i32 = min;
284 mMaximumValue.u.i32 = max;
285 mStepSize.u.i32 = step;
286 break;
287 case MTP_TYPE_UINT32:
288 mMinimumValue.u.u32 = min;
289 mMaximumValue.u.u32 = max;
290 mStepSize.u.u32 = step;
291 break;
292 case MTP_TYPE_INT64:
293 mMinimumValue.u.i64 = min;
294 mMaximumValue.u.i64 = max;
295 mStepSize.u.i64 = step;
296 break;
297 case MTP_TYPE_UINT64:
298 mMinimumValue.u.u64 = min;
299 mMaximumValue.u.u64 = max;
300 mStepSize.u.u64 = step;
301 break;
302 default:
Steve Block29357bc2012-01-06 19:20:56 +0000303 ALOGE("unsupported type for MtpProperty::setRange");
Mike Lockwood01817262010-11-10 12:48:39 -0500304 break;
305 }
306}
307
308void MtpProperty::setFormEnum(const int* values, int count) {
309 mFormFlag = kFormEnum;
310 delete[] mEnumValues;
311 mEnumValues = new MtpPropertyValue[count];
312 mEnumLength = count;
313
314 for (int i = 0; i < count; i++) {
315 int value = *values++;
316 switch (mType) {
317 case MTP_TYPE_INT8:
318 mEnumValues[i].u.i8 = value;
319 break;
320 case MTP_TYPE_UINT8:
321 mEnumValues[i].u.u8 = value;
322 break;
323 case MTP_TYPE_INT16:
324 mEnumValues[i].u.i16 = value;
325 break;
326 case MTP_TYPE_UINT16:
327 mEnumValues[i].u.u16 = value;
328 break;
329 case MTP_TYPE_INT32:
330 mEnumValues[i].u.i32 = value;
331 break;
332 case MTP_TYPE_UINT32:
333 mEnumValues[i].u.u32 = value;
334 break;
335 case MTP_TYPE_INT64:
336 mEnumValues[i].u.i64 = value;
337 break;
338 case MTP_TYPE_UINT64:
339 mEnumValues[i].u.u64 = value;
340 break;
341 default:
Steve Block29357bc2012-01-06 19:20:56 +0000342 ALOGE("unsupported type for MtpProperty::setEnum");
Mike Lockwood01817262010-11-10 12:48:39 -0500343 break;
344 }
345 }
346}
347
Mike Lockwoodb892d0e2010-11-23 18:38:55 -0500348void MtpProperty::setFormDateTime() {
349 mFormFlag = kFormDateTime;
350}
351
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400352void MtpProperty::print() {
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700353 std::string buffer;
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800354 bool deviceProp = isDeviceProperty();
355 if (deviceProp)
Steve Blockdf64d152012-01-04 20:05:49 +0000356 ALOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800357 else
Steve Blockdf64d152012-01-04 20:05:49 +0000358 ALOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
359 ALOGI(" type %04X", mType);
360 ALOGI(" writeable %s", (mWriteable ? "true" : "false"));
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800361 buffer = " default value: ";
362 print(mDefaultValue, buffer);
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700363 ALOGI("%s", buffer.c_str());
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800364 if (deviceProp) {
365 buffer = " current value: ";
366 print(mCurrentValue, buffer);
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700367 ALOGI("%s", buffer.c_str());
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800368 }
369 switch (mFormFlag) {
370 case kFormNone:
371 break;
372 case kFormRange:
373 buffer = " Range (";
374 print(mMinimumValue, buffer);
375 buffer += ", ";
376 print(mMaximumValue, buffer);
377 buffer += ", ";
378 print(mStepSize, buffer);
Mike Lockwoodfd346262010-12-08 16:08:01 -0800379 buffer += ")";
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700380 ALOGI("%s", buffer.c_str());
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800381 break;
382 case kFormEnum:
383 buffer = " Enum { ";
384 for (int i = 0; i < mEnumLength; i++) {
385 print(mEnumValues[i], buffer);
386 buffer += " ";
387 }
388 buffer += "}";
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700389 ALOGI("%s", buffer.c_str());
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800390 break;
391 case kFormDateTime:
Steve Blockdf64d152012-01-04 20:05:49 +0000392 ALOGI(" DateTime\n");
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800393 break;
394 default:
Steve Blockdf64d152012-01-04 20:05:49 +0000395 ALOGI(" form %d\n", mFormFlag);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800396 break;
397 }
398}
399
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700400void MtpProperty::print(MtpPropertyValue& value, std::string& buffer) {
401 std::ostringstream s;
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800402 switch (mType) {
403 case MTP_TYPE_INT8:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700404 buffer += std::to_string(value.u.i8);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800405 break;
406 case MTP_TYPE_UINT8:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700407 buffer += std::to_string(value.u.u8);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800408 break;
409 case MTP_TYPE_INT16:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700410 buffer += std::to_string(value.u.i16);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800411 break;
412 case MTP_TYPE_UINT16:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700413 buffer += std::to_string(value.u.u16);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800414 break;
415 case MTP_TYPE_INT32:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700416 buffer += std::to_string(value.u.i32);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800417 break;
418 case MTP_TYPE_UINT32:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700419 buffer += std::to_string(value.u.u32);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800420 break;
421 case MTP_TYPE_INT64:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700422 buffer += std::to_string(value.u.i64);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800423 break;
424 case MTP_TYPE_UINT64:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700425 buffer += std::to_string(value.u.u64);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800426 break;
427 case MTP_TYPE_INT128:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700428 for (auto i : value.u.i128) {
429 s << std::hex << std::setfill('0') << std::uppercase << i;
430 }
431 buffer += s.str();
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800432 break;
433 case MTP_TYPE_UINT128:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700434 for (auto i : value.u.u128) {
435 s << std::hex << std::setfill('0') << std::uppercase << i;
436 }
437 buffer += s.str();
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800438 break;
439 case MTP_TYPE_STR:
Jerry Zhangbc1d4b42018-03-27 15:25:03 -0700440 buffer += value.str;
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800441 break;
442 default:
Steve Block29357bc2012-01-06 19:20:56 +0000443 ALOGE("unsupported type for MtpProperty::print\n");
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800444 break;
445 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400446}
447
Mike Lockwoodab063842014-11-12 14:20:06 -0800448bool MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400449 MtpStringBuffer stringBuffer;
450
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400451 switch (mType) {
452 case MTP_TYPE_INT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400453 case MTP_TYPE_AINT8:
Mike Lockwoodab063842014-11-12 14:20:06 -0800454 if (!packet.getInt8(value.u.i8)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400455 break;
456 case MTP_TYPE_UINT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400457 case MTP_TYPE_AUINT8:
Mike Lockwoodab063842014-11-12 14:20:06 -0800458 if (!packet.getUInt8(value.u.u8)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400459 break;
460 case MTP_TYPE_INT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400461 case MTP_TYPE_AINT16:
Mike Lockwoodab063842014-11-12 14:20:06 -0800462 if (!packet.getInt16(value.u.i16)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400463 break;
464 case MTP_TYPE_UINT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400465 case MTP_TYPE_AUINT16:
Mike Lockwoodab063842014-11-12 14:20:06 -0800466 if (!packet.getUInt16(value.u.u16)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400467 break;
468 case MTP_TYPE_INT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400469 case MTP_TYPE_AINT32:
Mike Lockwoodab063842014-11-12 14:20:06 -0800470 if (!packet.getInt32(value.u.i32)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400471 break;
472 case MTP_TYPE_UINT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400473 case MTP_TYPE_AUINT32:
Mike Lockwoodab063842014-11-12 14:20:06 -0800474 if (!packet.getUInt32(value.u.u32)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400475 break;
476 case MTP_TYPE_INT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400477 case MTP_TYPE_AINT64:
Mike Lockwoodab063842014-11-12 14:20:06 -0800478 if (!packet.getInt64(value.u.i64)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400479 break;
480 case MTP_TYPE_UINT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400481 case MTP_TYPE_AUINT64:
Mike Lockwoodab063842014-11-12 14:20:06 -0800482 if (!packet.getUInt64(value.u.u64)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400483 break;
484 case MTP_TYPE_INT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400485 case MTP_TYPE_AINT128:
Mike Lockwoodab063842014-11-12 14:20:06 -0800486 if (!packet.getInt128(value.u.i128)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400487 break;
488 case MTP_TYPE_UINT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400489 case MTP_TYPE_AUINT128:
Mike Lockwoodab063842014-11-12 14:20:06 -0800490 if (!packet.getUInt128(value.u.u128)) return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400491 break;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400492 case MTP_TYPE_STR:
Mike Lockwoodab063842014-11-12 14:20:06 -0800493 if (!packet.getString(stringBuffer)) return false;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400494 value.str = strdup(stringBuffer);
495 break;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400496 default:
Steve Block29357bc2012-01-06 19:20:56 +0000497 ALOGE("unknown type %04X in MtpProperty::readValue", mType);
Mike Lockwoodab063842014-11-12 14:20:06 -0800498 return false;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400499 }
Mike Lockwoodab063842014-11-12 14:20:06 -0800500 return true;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400501}
502
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400503void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400504 MtpStringBuffer stringBuffer;
505
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400506 switch (mType) {
507 case MTP_TYPE_INT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400508 case MTP_TYPE_AINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400509 packet.putInt8(value.u.i8);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400510 break;
511 case MTP_TYPE_UINT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400512 case MTP_TYPE_AUINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400513 packet.putUInt8(value.u.u8);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400514 break;
515 case MTP_TYPE_INT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400516 case MTP_TYPE_AINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400517 packet.putInt16(value.u.i16);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400518 break;
519 case MTP_TYPE_UINT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400520 case MTP_TYPE_AUINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400521 packet.putUInt16(value.u.u16);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400522 break;
523 case MTP_TYPE_INT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400524 case MTP_TYPE_AINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400525 packet.putInt32(value.u.i32);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400526 break;
527 case MTP_TYPE_UINT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400528 case MTP_TYPE_AUINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400529 packet.putUInt32(value.u.u32);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400530 break;
531 case MTP_TYPE_INT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400532 case MTP_TYPE_AINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400533 packet.putInt64(value.u.i64);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400534 break;
535 case MTP_TYPE_UINT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400536 case MTP_TYPE_AUINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400537 packet.putUInt64(value.u.u64);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400538 break;
539 case MTP_TYPE_INT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400540 case MTP_TYPE_AINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400541 packet.putInt128(value.u.i128);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400542 break;
543 case MTP_TYPE_UINT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400544 case MTP_TYPE_AUINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400545 packet.putUInt128(value.u.u128);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400546 break;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400547 case MTP_TYPE_STR:
548 if (value.str)
549 packet.putString(value.str);
550 else
551 packet.putEmptyString();
552 break;
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400553 default:
Steve Block29357bc2012-01-06 19:20:56 +0000554 ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400555 }
556}
557
Mike Lockwoodab063842014-11-12 14:20:06 -0800558MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, uint32_t& length) {
559 if (!packet.getUInt32(length)) return NULL;
560
Lajos Molnareb5d7f22014-03-24 16:18:36 -0700561 // Fail if resulting array is over 2GB. This is because the maximum array
562 // size may be less than SIZE_MAX on some platforms.
563 if ( CC_UNLIKELY(
564 length == 0 ||
565 length >= INT32_MAX / sizeof(MtpPropertyValue)) ) {
566 length = 0;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400567 return NULL;
Lajos Molnareb5d7f22014-03-24 16:18:36 -0700568 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400569 MtpPropertyValue* result = new MtpPropertyValue[length];
Mike Lockwoodab063842014-11-12 14:20:06 -0800570 for (uint32_t i = 0; i < length; i++)
571 if (!readValue(packet, result[i])) {
Daichi Hironob3be0062016-02-25 12:42:58 +0900572 delete [] result;
Mike Lockwoodab063842014-11-12 14:20:06 -0800573 return NULL;
574 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400575 return result;
576}
577
Mike Lockwoodab063842014-11-12 14:20:06 -0800578void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, uint32_t length) {
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400579 packet.putUInt32(length);
Mike Lockwoodab063842014-11-12 14:20:06 -0800580 for (uint32_t i = 0; i < length; i++)
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400581 writeValue(packet, values[i]);
582}
583
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400584} // namespace android