blob: c50090120fda545042fd0ef21e3af6971ffcfc9e [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) {
109 for (int i = 0; i < mDefaultArrayLength; i++)
110 free(mDefaultArrayValues[i].str);
111 }
112 if (mCurrentArrayValues) {
113 for (int i = 0; i < mCurrentArrayLength; i++)
114 free(mCurrentArrayValues[i].str);
115 }
116 if (mEnumValues) {
117 for (int i = 0; i < mEnumLength; i++)
118 free(mEnumValues[i].str);
119 }
120 }
121 delete[] mDefaultArrayValues;
122 delete[] mCurrentArrayValues;
123 delete[] mEnumValues;
124}
125
Mike Lockwoode3e76c42010-09-02 14:57:30 -0400126void MtpProperty::read(MtpDataPacket& packet) {
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400127 mCode = packet.getUInt16();
Mike Lockwood5da86482010-12-07 13:51:54 -0800128 bool deviceProp = isDeviceProperty();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400129 mType = packet.getUInt16();
130 mWriteable = (packet.getUInt8() == 1);
131 switch (mType) {
132 case MTP_TYPE_AINT8:
133 case MTP_TYPE_AUINT8:
134 case MTP_TYPE_AINT16:
135 case MTP_TYPE_AUINT16:
136 case MTP_TYPE_AINT32:
137 case MTP_TYPE_AUINT32:
138 case MTP_TYPE_AINT64:
139 case MTP_TYPE_AUINT64:
140 case MTP_TYPE_AINT128:
141 case MTP_TYPE_AUINT128:
142 mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400143 if (deviceProp)
144 mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400145 break;
146 default:
147 readValue(packet, mDefaultValue);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400148 if (deviceProp)
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400149 readValue(packet, mCurrentValue);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400150 }
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400151 if (!deviceProp)
152 mGroupCode = packet.getUInt32();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400153 mFormFlag = packet.getUInt8();
154
155 if (mFormFlag == kFormRange) {
156 readValue(packet, mMinimumValue);
157 readValue(packet, mMaximumValue);
158 readValue(packet, mStepSize);
159 } else if (mFormFlag == kFormEnum) {
160 mEnumLength = packet.getUInt16();
161 mEnumValues = new MtpPropertyValue[mEnumLength];
162 for (int i = 0; i < mEnumLength; i++)
163 readValue(packet, mEnumValues[i]);
164 }
165}
166
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400167void MtpProperty::write(MtpDataPacket& packet) {
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400168 bool deviceProp = isDeviceProperty();
169
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400170 packet.putUInt16(mCode);
171 packet.putUInt16(mType);
172 packet.putUInt8(mWriteable ? 1 : 0);
173
174 switch (mType) {
175 case MTP_TYPE_AINT8:
176 case MTP_TYPE_AUINT8:
177 case MTP_TYPE_AINT16:
178 case MTP_TYPE_AUINT16:
179 case MTP_TYPE_AINT32:
180 case MTP_TYPE_AUINT32:
181 case MTP_TYPE_AINT64:
182 case MTP_TYPE_AUINT64:
183 case MTP_TYPE_AINT128:
184 case MTP_TYPE_AUINT128:
185 writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400186 if (deviceProp)
187 writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400188 break;
189 default:
190 writeValue(packet, mDefaultValue);
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400191 if (deviceProp)
192 writeValue(packet, mCurrentValue);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400193 }
Mike Lockwood7cee5d32010-09-25 08:37:59 -0400194 if (!deviceProp)
Mike Lockwood0fa848d2014-03-07 13:29:59 -0800195 packet.putUInt32(mGroupCode);
196 packet.putUInt8(mFormFlag);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400197 if (mFormFlag == kFormRange) {
198 writeValue(packet, mMinimumValue);
199 writeValue(packet, mMaximumValue);
200 writeValue(packet, mStepSize);
201 } else if (mFormFlag == kFormEnum) {
202 packet.putUInt16(mEnumLength);
203 for (int i = 0; i < mEnumLength; i++)
204 writeValue(packet, mEnumValues[i]);
205 }
206}
207
Mike Lockwooddde37202010-09-25 21:21:05 -0400208void MtpProperty::setDefaultValue(const uint16_t* string) {
209 free(mDefaultValue.str);
210 if (string) {
211 MtpStringBuffer buffer(string);
212 mDefaultValue.str = strdup(buffer);
213 }
214 else
215 mDefaultValue.str = NULL;
216}
217
218void MtpProperty::setCurrentValue(const uint16_t* string) {
219 free(mCurrentValue.str);
220 if (string) {
221 MtpStringBuffer buffer(string);
222 mCurrentValue.str = strdup(buffer);
223 }
224 else
225 mCurrentValue.str = NULL;
226}
227
Mike Lockwood01817262010-11-10 12:48:39 -0500228void MtpProperty::setFormRange(int min, int max, int step) {
229 mFormFlag = kFormRange;
230 switch (mType) {
231 case MTP_TYPE_INT8:
232 mMinimumValue.u.i8 = min;
233 mMaximumValue.u.i8 = max;
234 mStepSize.u.i8 = step;
235 break;
236 case MTP_TYPE_UINT8:
237 mMinimumValue.u.u8 = min;
238 mMaximumValue.u.u8 = max;
239 mStepSize.u.u8 = step;
240 break;
241 case MTP_TYPE_INT16:
242 mMinimumValue.u.i16 = min;
243 mMaximumValue.u.i16 = max;
244 mStepSize.u.i16 = step;
245 break;
246 case MTP_TYPE_UINT16:
247 mMinimumValue.u.u16 = min;
248 mMaximumValue.u.u16 = max;
249 mStepSize.u.u16 = step;
250 break;
251 case MTP_TYPE_INT32:
252 mMinimumValue.u.i32 = min;
253 mMaximumValue.u.i32 = max;
254 mStepSize.u.i32 = step;
255 break;
256 case MTP_TYPE_UINT32:
257 mMinimumValue.u.u32 = min;
258 mMaximumValue.u.u32 = max;
259 mStepSize.u.u32 = step;
260 break;
261 case MTP_TYPE_INT64:
262 mMinimumValue.u.i64 = min;
263 mMaximumValue.u.i64 = max;
264 mStepSize.u.i64 = step;
265 break;
266 case MTP_TYPE_UINT64:
267 mMinimumValue.u.u64 = min;
268 mMaximumValue.u.u64 = max;
269 mStepSize.u.u64 = step;
270 break;
271 default:
Steve Block29357bc2012-01-06 19:20:56 +0000272 ALOGE("unsupported type for MtpProperty::setRange");
Mike Lockwood01817262010-11-10 12:48:39 -0500273 break;
274 }
275}
276
277void MtpProperty::setFormEnum(const int* values, int count) {
278 mFormFlag = kFormEnum;
279 delete[] mEnumValues;
280 mEnumValues = new MtpPropertyValue[count];
281 mEnumLength = count;
282
283 for (int i = 0; i < count; i++) {
284 int value = *values++;
285 switch (mType) {
286 case MTP_TYPE_INT8:
287 mEnumValues[i].u.i8 = value;
288 break;
289 case MTP_TYPE_UINT8:
290 mEnumValues[i].u.u8 = value;
291 break;
292 case MTP_TYPE_INT16:
293 mEnumValues[i].u.i16 = value;
294 break;
295 case MTP_TYPE_UINT16:
296 mEnumValues[i].u.u16 = value;
297 break;
298 case MTP_TYPE_INT32:
299 mEnumValues[i].u.i32 = value;
300 break;
301 case MTP_TYPE_UINT32:
302 mEnumValues[i].u.u32 = value;
303 break;
304 case MTP_TYPE_INT64:
305 mEnumValues[i].u.i64 = value;
306 break;
307 case MTP_TYPE_UINT64:
308 mEnumValues[i].u.u64 = value;
309 break;
310 default:
Steve Block29357bc2012-01-06 19:20:56 +0000311 ALOGE("unsupported type for MtpProperty::setEnum");
Mike Lockwood01817262010-11-10 12:48:39 -0500312 break;
313 }
314 }
315}
316
Mike Lockwoodb892d0e2010-11-23 18:38:55 -0500317void MtpProperty::setFormDateTime() {
318 mFormFlag = kFormDateTime;
319}
320
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400321void MtpProperty::print() {
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800322 MtpString buffer;
323 bool deviceProp = isDeviceProperty();
324 if (deviceProp)
Steve Blockdf64d152012-01-04 20:05:49 +0000325 ALOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800326 else
Steve Blockdf64d152012-01-04 20:05:49 +0000327 ALOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
328 ALOGI(" type %04X", mType);
329 ALOGI(" writeable %s", (mWriteable ? "true" : "false"));
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800330 buffer = " default value: ";
331 print(mDefaultValue, buffer);
Steve Blockdf64d152012-01-04 20:05:49 +0000332 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800333 if (deviceProp) {
334 buffer = " current value: ";
335 print(mCurrentValue, buffer);
Steve Blockdf64d152012-01-04 20:05:49 +0000336 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800337 }
338 switch (mFormFlag) {
339 case kFormNone:
340 break;
341 case kFormRange:
342 buffer = " Range (";
343 print(mMinimumValue, buffer);
344 buffer += ", ";
345 print(mMaximumValue, buffer);
346 buffer += ", ";
347 print(mStepSize, buffer);
Mike Lockwoodfd346262010-12-08 16:08:01 -0800348 buffer += ")";
Steve Blockdf64d152012-01-04 20:05:49 +0000349 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800350 break;
351 case kFormEnum:
352 buffer = " Enum { ";
353 for (int i = 0; i < mEnumLength; i++) {
354 print(mEnumValues[i], buffer);
355 buffer += " ";
356 }
357 buffer += "}";
Steve Blockdf64d152012-01-04 20:05:49 +0000358 ALOGI("%s", (const char *)buffer);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800359 break;
360 case kFormDateTime:
Steve Blockdf64d152012-01-04 20:05:49 +0000361 ALOGI(" DateTime\n");
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800362 break;
363 default:
Steve Blockdf64d152012-01-04 20:05:49 +0000364 ALOGI(" form %d\n", mFormFlag);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800365 break;
366 }
367}
368
369void MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
370 switch (mType) {
371 case MTP_TYPE_INT8:
372 buffer.appendFormat("%d", value.u.i8);
373 break;
374 case MTP_TYPE_UINT8:
375 buffer.appendFormat("%d", value.u.u8);
376 break;
377 case MTP_TYPE_INT16:
378 buffer.appendFormat("%d", value.u.i16);
379 break;
380 case MTP_TYPE_UINT16:
381 buffer.appendFormat("%d", value.u.u16);
382 break;
383 case MTP_TYPE_INT32:
384 buffer.appendFormat("%d", value.u.i32);
385 break;
386 case MTP_TYPE_UINT32:
387 buffer.appendFormat("%d", value.u.u32);
388 break;
389 case MTP_TYPE_INT64:
Kévin PETIT377b2ec2014-02-03 12:35:36 +0000390 buffer.appendFormat("%" PRId64, value.u.i64);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800391 break;
392 case MTP_TYPE_UINT64:
Kévin PETIT377b2ec2014-02-03 12:35:36 +0000393 buffer.appendFormat("%" PRIu64, value.u.u64);
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800394 break;
395 case MTP_TYPE_INT128:
396 buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
397 value.u.i128[2], value.u.i128[3]);
398 break;
399 case MTP_TYPE_UINT128:
400 buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
401 value.u.u128[2], value.u.u128[3]);
402 break;
403 case MTP_TYPE_STR:
404 buffer.appendFormat("%s", value.str);
405 break;
406 default:
Steve Block29357bc2012-01-06 19:20:56 +0000407 ALOGE("unsupported type for MtpProperty::print\n");
Mike Lockwood0c7c7c72010-12-07 11:24:28 -0800408 break;
409 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400410}
411
412void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400413 MtpStringBuffer stringBuffer;
414
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400415 switch (mType) {
416 case MTP_TYPE_INT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400417 case MTP_TYPE_AINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400418 value.u.i8 = packet.getInt8();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400419 break;
420 case MTP_TYPE_UINT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400421 case MTP_TYPE_AUINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400422 value.u.u8 = packet.getUInt8();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400423 break;
424 case MTP_TYPE_INT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400425 case MTP_TYPE_AINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400426 value.u.i16 = packet.getInt16();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400427 break;
428 case MTP_TYPE_UINT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400429 case MTP_TYPE_AUINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400430 value.u.u16 = packet.getUInt16();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400431 break;
432 case MTP_TYPE_INT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400433 case MTP_TYPE_AINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400434 value.u.i32 = packet.getInt32();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400435 break;
436 case MTP_TYPE_UINT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400437 case MTP_TYPE_AUINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400438 value.u.u32 = packet.getUInt32();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400439 break;
440 case MTP_TYPE_INT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400441 case MTP_TYPE_AINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400442 value.u.i64 = packet.getInt64();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400443 break;
444 case MTP_TYPE_UINT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400445 case MTP_TYPE_AUINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400446 value.u.u64 = packet.getUInt64();
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400447 break;
448 case MTP_TYPE_INT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400449 case MTP_TYPE_AINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400450 packet.getInt128(value.u.i128);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400451 break;
452 case MTP_TYPE_UINT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400453 case MTP_TYPE_AUINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400454 packet.getUInt128(value.u.u128);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400455 break;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400456 case MTP_TYPE_STR:
457 packet.getString(stringBuffer);
458 value.str = strdup(stringBuffer);
459 break;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400460 default:
Steve Block29357bc2012-01-06 19:20:56 +0000461 ALOGE("unknown type %04X in MtpProperty::readValue", mType);
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400462 }
463}
464
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400465void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400466 MtpStringBuffer stringBuffer;
467
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400468 switch (mType) {
469 case MTP_TYPE_INT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400470 case MTP_TYPE_AINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400471 packet.putInt8(value.u.i8);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400472 break;
473 case MTP_TYPE_UINT8:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400474 case MTP_TYPE_AUINT8:
Mike Lockwooddde37202010-09-25 21:21:05 -0400475 packet.putUInt8(value.u.u8);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400476 break;
477 case MTP_TYPE_INT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400478 case MTP_TYPE_AINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400479 packet.putInt16(value.u.i16);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400480 break;
481 case MTP_TYPE_UINT16:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400482 case MTP_TYPE_AUINT16:
Mike Lockwooddde37202010-09-25 21:21:05 -0400483 packet.putUInt16(value.u.u16);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400484 break;
485 case MTP_TYPE_INT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400486 case MTP_TYPE_AINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400487 packet.putInt32(value.u.i32);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400488 break;
489 case MTP_TYPE_UINT32:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400490 case MTP_TYPE_AUINT32:
Mike Lockwooddde37202010-09-25 21:21:05 -0400491 packet.putUInt32(value.u.u32);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400492 break;
493 case MTP_TYPE_INT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400494 case MTP_TYPE_AINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400495 packet.putInt64(value.u.i64);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400496 break;
497 case MTP_TYPE_UINT64:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400498 case MTP_TYPE_AUINT64:
Mike Lockwooddde37202010-09-25 21:21:05 -0400499 packet.putUInt64(value.u.u64);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400500 break;
501 case MTP_TYPE_INT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400502 case MTP_TYPE_AINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400503 packet.putInt128(value.u.i128);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400504 break;
505 case MTP_TYPE_UINT128:
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400506 case MTP_TYPE_AUINT128:
Mike Lockwooddde37202010-09-25 21:21:05 -0400507 packet.putUInt128(value.u.u128);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400508 break;
Mike Lockwood5cdceca2010-07-20 09:47:41 -0400509 case MTP_TYPE_STR:
510 if (value.str)
511 packet.putString(value.str);
512 else
513 packet.putEmptyString();
514 break;
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400515 default:
Steve Block29357bc2012-01-06 19:20:56 +0000516 ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400517 }
518}
519
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400520MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
521 length = packet.getUInt32();
Lajos Molnareb5d7f22014-03-24 16:18:36 -0700522 // Fail if resulting array is over 2GB. This is because the maximum array
523 // size may be less than SIZE_MAX on some platforms.
524 if ( CC_UNLIKELY(
525 length == 0 ||
526 length >= INT32_MAX / sizeof(MtpPropertyValue)) ) {
527 length = 0;
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400528 return NULL;
Lajos Molnareb5d7f22014-03-24 16:18:36 -0700529 }
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400530 MtpPropertyValue* result = new MtpPropertyValue[length];
531 for (int i = 0; i < length; i++)
532 readValue(packet, result[i]);
533 return result;
534}
535
Mike Lockwood21ef7d02010-06-30 17:00:35 -0400536void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
537 packet.putUInt32(length);
538 for (int i = 0; i < length; i++)
539 writeValue(packet, values[i]);
540}
541
Mike Lockwooda6c490b2010-06-05 22:45:01 -0400542} // namespace android