1a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood/*
2a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * Copyright (C) 2010 The Android Open Source Project
3a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood *
4a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * you may not use this file except in compliance with the License.
6a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * You may obtain a copy of the License at
7a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood *
8a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood *
10a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * Unless required by applicable law or agreed to in writing, software
11a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * See the License for the specific language governing permissions and
14a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * limitations under the License.
15a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood */
16a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
17a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#define LOG_TAG "MtpProperty"
18a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
19377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h>
20eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar#include <cutils/compiler.h>
21a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpDataPacket.h"
220c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood#include "MtpDebug.h"
23a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpProperty.h"
24a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpStringBuffer.h"
25a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpUtils.h"
26a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
27a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodnamespace android {
28a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
29a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::MtpProperty()
30a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    :   mCode(0),
31a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mType(0),
32a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mWriteable(false),
33a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayLength(0),
34a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayValues(NULL),
35a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayLength(0),
36a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayValues(NULL),
372bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood        mGroupCode(0),
38a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mFormFlag(kFormNone),
39a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength(0),
40a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues(NULL)
41a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood{
42dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
43dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
44dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
45dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
46a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
47a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
4821ef7d0e70c5ad599bc2602cb484f8cd647055caMike LockwoodMtpProperty::MtpProperty(MtpPropertyCode propCode,
4921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         MtpDataType type,
5021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         bool writeable,
5121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         int defaultValue)
5221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    :   mCode(propCode),
5321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mType(type),
5421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mWriteable(writeable),
5521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayLength(0),
5621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayValues(NULL),
5721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayLength(0),
5821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayValues(NULL),
5940ce1f262cc4edbc8b7c470830325466263acaecMike Lockwood        mGroupCode(0),
6021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mFormFlag(kFormNone),
6121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumLength(0),
6221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumValues(NULL)
6321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood{
6421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
6521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
6621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
6721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
6821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
6921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (defaultValue) {
7021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        switch (type) {
7121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT8:
72dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i8 = defaultValue;
7321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT8:
75dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u8 = defaultValue;
7621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT16:
78dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i16 = defaultValue;
7921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT16:
81dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u16 = defaultValue;
8221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT32:
84dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i32 = defaultValue;
8521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT32:
87dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u32 = defaultValue;
8821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT64:
90dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i64 = defaultValue;
9121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT64:
93dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u64 = defaultValue;
9421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            default:
9629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
9721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        }
9821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
9921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
10021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
101a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::~MtpProperty() {
102a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mType == MTP_TYPE_STR) {
103a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        // free all strings
104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mDefaultValue.str);
105a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mCurrentValue.str);
106a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMinimumValue.str);
107a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMaximumValue.str);
108a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mDefaultArrayValues) {
109ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            for (uint32_t i = 0; i < mDefaultArrayLength; i++)
110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mDefaultArrayValues[i].str);
111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mCurrentArrayValues) {
113ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            for (uint32_t i = 0; i < mCurrentArrayLength; i++)
114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mCurrentArrayValues[i].str);
115a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
116a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mEnumValues) {
117ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            for (uint16_t i = 0; i < mEnumLength; i++)
118a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mEnumValues[i].str);
119a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
120a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
121a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mDefaultArrayValues;
122a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mCurrentArrayValues;
123a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mEnumValues;
124a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
125a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
126ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwoodbool MtpProperty::read(MtpDataPacket& packet) {
127ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    uint8_t temp8;
128ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood
129ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    if (!packet.getUInt16(mCode)) return false;
1305da864845e024833c4c7f641acd7c88187a6bc1eMike Lockwood    bool deviceProp = isDeviceProperty();
131ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    if (!packet.getUInt16(mType)) return false;
132ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    if (!packet.getUInt8(temp8)) return false;
133ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    mWriteable = (temp8 == 1);
134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT8:
136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT8:
137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT16:
138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT16:
139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT32:
140a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT32:
141a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT64:
142a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT64:
143a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT128:
144a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT128:
145a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
146ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!mDefaultArrayValues) return false;
147ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (deviceProp) {
1487cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
149ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood                if (!mCurrentArrayValues) return false;
150ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            }
151a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
152a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
153ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!readValue(packet, mDefaultValue)) return false;
154ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (deviceProp) {
155ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood                if (!readValue(packet, mCurrentValue)) return false;
156ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            }
157a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
158ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    if (!deviceProp) {
159ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood        if (!packet.getUInt32(mGroupCode)) return false;
160ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    }
161ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    if (!packet.getUInt8(mFormFlag)) return false;
162a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
163a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mFormFlag == kFormRange) {
164ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!readValue(packet, mMinimumValue)) return false;
165ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!readValue(packet, mMaximumValue)) return false;
166ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!readValue(packet, mStepSize)) return false;
167a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    } else if (mFormFlag == kFormEnum) {
168ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood        if (!packet.getUInt16(mEnumLength)) return false;
169a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues = new MtpPropertyValue[mEnumLength];
170ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood        for (int i = 0; i < mEnumLength; i++) {
171ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!readValue(packet, mEnumValues[i])) return false;
172ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood        }
173a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
174ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood
175ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    return true;
176a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
177a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
17821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::write(MtpDataPacket& packet) {
1797cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    bool deviceProp = isDeviceProperty();
1807cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood
18121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mCode);
18221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mType);
18321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mWriteable ? 1 : 0);
18421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
18521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
18621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT8:
18721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT8:
18821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT16:
18921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT16:
19021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT32:
19121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT32:
19221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT64:
19321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT64:
19421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT128:
19521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT128:
19621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
1977cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1987cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
19921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
20021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
20121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mDefaultValue);
2027cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
2037cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeValue(packet, mCurrentValue);
20421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
2057cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
2060fa848d780cf990a2860637f40432d28594c85a3Mike Lockwood        packet.putUInt32(mGroupCode);
2070fa848d780cf990a2860637f40432d28594c85a3Mike Lockwood    packet.putUInt8(mFormFlag);
20821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (mFormFlag == kFormRange) {
20921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMinimumValue);
21021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMaximumValue);
21121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mStepSize);
21221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    } else if (mFormFlag == kFormEnum) {
21321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        packet.putUInt16(mEnumLength);
21421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        for (int i = 0; i < mEnumLength; i++)
21521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mEnumValues[i]);
21621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
21721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
21821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
219dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodvoid MtpProperty::setDefaultValue(const uint16_t* string) {
220dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    free(mDefaultValue.str);
221dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    if (string) {
222dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        MtpStringBuffer buffer(string);
223dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mDefaultValue.str = strdup(buffer);
224dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    }
225dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    else
226dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mDefaultValue.str = NULL;
227dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood}
228dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
229dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodvoid MtpProperty::setCurrentValue(const uint16_t* string) {
230dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    free(mCurrentValue.str);
231dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    if (string) {
232dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        MtpStringBuffer buffer(string);
233dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mCurrentValue.str = strdup(buffer);
234dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    }
235dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    else
236dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mCurrentValue.str = NULL;
237dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood}
238dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
23966a9abef47f7c8bd438bb1897617ebad3858c736Daichi Hironovoid MtpProperty::setCurrentValue(MtpDataPacket& packet) {
24066a9abef47f7c8bd438bb1897617ebad3858c736Daichi Hirono    free(mCurrentValue.str);
24166a9abef47f7c8bd438bb1897617ebad3858c736Daichi Hirono    mCurrentValue.str = NULL;
24266a9abef47f7c8bd438bb1897617ebad3858c736Daichi Hirono    readValue(packet, mCurrentValue);
24366a9abef47f7c8bd438bb1897617ebad3858c736Daichi Hirono}
24466a9abef47f7c8bd438bb1897617ebad3858c736Daichi Hirono
2450181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwoodvoid MtpProperty::setFormRange(int min, int max, int step) {
2460181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    mFormFlag = kFormRange;
2470181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    switch (mType) {
2480181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT8:
2490181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i8 = min;
2500181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i8 = max;
2510181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i8 = step;
2520181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2530181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT8:
2540181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u8 = min;
2550181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u8 = max;
2560181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u8 = step;
2570181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2580181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT16:
2590181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i16 = min;
2600181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i16 = max;
2610181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i16 = step;
2620181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2630181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT16:
2640181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u16 = min;
2650181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u16 = max;
2660181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u16 = step;
2670181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2680181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT32:
2690181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i32 = min;
2700181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i32 = max;
2710181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i32 = step;
2720181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2730181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT32:
2740181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u32 = min;
2750181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u32 = max;
2760181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u32 = step;
2770181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2780181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT64:
2790181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i64 = min;
2800181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i64 = max;
2810181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i64 = step;
2820181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2830181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT64:
2840181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u64 = min;
2850181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u64 = max;
2860181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u64 = step;
2870181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2880181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        default:
28929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unsupported type for MtpProperty::setRange");
2900181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2910181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    }
2920181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood}
2930181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
2940181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwoodvoid MtpProperty::setFormEnum(const int* values, int count) {
2950181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mFormFlag = kFormEnum;
2960181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     delete[] mEnumValues;
2970181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mEnumValues = new MtpPropertyValue[count];
2980181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mEnumLength = count;
2990181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
3000181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    for (int i = 0; i < count; i++) {
3010181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        int value = *values++;
3020181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            switch (mType) {
3030181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT8:
3040181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i8 = value;
3050181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3060181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT8:
3070181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u8 = value;
3080181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3090181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT16:
3100181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i16 = value;
3110181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3120181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT16:
3130181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u16 = value;
3140181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3150181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT32:
3160181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i32 = value;
3170181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3180181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT32:
3190181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u32 = value;
3200181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3210181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT64:
3220181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i64 = value;
3230181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3240181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT64:
3250181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u64 = value;
3260181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3270181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                default:
32829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("unsupported type for MtpProperty::setEnum");
3290181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3300181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        }
3310181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    }
3320181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood}
3330181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
334b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwoodvoid MtpProperty::setFormDateTime() {
335b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood     mFormFlag = kFormDateTime;
336b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood}
337b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood
338a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::print() {
3390c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    MtpString buffer;
3400c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    bool deviceProp = isDeviceProperty();
3410c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    if (deviceProp)
342df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("    %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
3430c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    else
344df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("    %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
345df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("    type %04X", mType);
346df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("    writeable %s", (mWriteable ? "true" : "false"));
3470c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    buffer = "    default value: ";
3480c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    print(mDefaultValue, buffer);
349df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("%s", (const char *)buffer);
3500c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    if (deviceProp) {
3510c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        buffer = "    current value: ";
3520c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        print(mCurrentValue, buffer);
353df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("%s", (const char *)buffer);
3540c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
3550c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    switch (mFormFlag) {
3560c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormNone:
3570c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3580c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormRange:
3590c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer = "    Range (";
3600c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mMinimumValue, buffer);
3610c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += ", ";
3620c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mMaximumValue, buffer);
3630c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += ", ";
3640c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mStepSize, buffer);
365fd34626771a63d3a835863e1b4bf71dcb26e28d8Mike Lockwood            buffer += ")";
366df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("%s", (const char *)buffer);
3670c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3680c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormEnum:
3690c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer = "    Enum { ";
3700c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            for (int i = 0; i < mEnumLength; i++) {
3710c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                print(mEnumValues[i], buffer);
3720c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                buffer += " ";
3730c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            }
3740c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += "}";
375df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("%s", (const char *)buffer);
3760c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3770c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormDateTime:
378df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("    DateTime\n");
3790c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3800c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        default:
381df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("    form %d\n", mFormFlag);
3820c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3830c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
3840c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood}
3850c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood
3860c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwoodvoid MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
3870c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    switch (mType) {
3880c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT8:
3890c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i8);
3900c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3910c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT8:
3920c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u8);
3930c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3940c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT16:
3950c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i16);
3960c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3970c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT16:
3980c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u16);
3990c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4000c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT32:
4010c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i32);
4020c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4030c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT32:
4040c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u32);
4050c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4060c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT64:
407377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            buffer.appendFormat("%" PRId64, value.u.i64);
4080c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4090c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT64:
410377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            buffer.appendFormat("%" PRIu64, value.u.u64);
4110c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4120c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT128:
4130c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
4140c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                    value.u.i128[2], value.u.i128[3]);
4150c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4160c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT128:
4170c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
4180c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                    value.u.u128[2], value.u.u128[3]);
4190c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4200c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_STR:
4210c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%s", value.str);
4220c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4230c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        default:
42429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unsupported type for MtpProperty::print\n");
4250c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4260c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
427a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
428a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
429ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwoodbool MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
4305cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
4315cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
432a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
433a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT8:
4345cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
435ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getInt8(value.u.i8)) return false;
436a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
437a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT8:
4385cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
439ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getUInt8(value.u.u8)) return false;
440a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
441a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT16:
4425cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
443ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getInt16(value.u.i16)) return false;
444a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
445a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT16:
4465cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
447ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getUInt16(value.u.u16)) return false;
448a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
449a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT32:
4505cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
451ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getInt32(value.u.i32)) return false;
452a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
453a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT32:
4545cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
455ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getUInt32(value.u.u32)) return false;
456a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
457a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT64:
4585cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
459ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getInt64(value.u.i64)) return false;
460a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
461a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT64:
4625cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
463ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getUInt64(value.u.u64)) return false;
464a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
465a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT128:
4665cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
467ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getInt128(value.u.i128)) return false;
468a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
469a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT128:
4705cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
471ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getUInt128(value.u.u128)) return false;
472a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
4735cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
474ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            if (!packet.getString(stringBuffer)) return false;
4755cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            value.str = strdup(stringBuffer);
4765cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
477a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
47829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unknown type %04X in MtpProperty::readValue", mType);
479ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            return false;
480a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
481ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    return true;
482a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
483a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
48421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
4855cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
4865cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
48721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
48821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT8:
4895cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
490dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt8(value.u.i8);
49121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT8:
4935cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
494dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt8(value.u.u8);
49521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT16:
4975cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
498dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt16(value.u.i16);
49921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
50021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT16:
5015cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
502dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt16(value.u.u16);
50321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
50421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT32:
5055cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
506dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt32(value.u.i32);
50721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
50821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT32:
5095cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
510dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt32(value.u.u32);
51121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
51221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT64:
5135cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
514dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt64(value.u.i64);
51521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
51621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT64:
5175cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
518dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt64(value.u.u64);
51921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
52021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT128:
5215cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
522dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt128(value.u.i128);
52321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
52421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT128:
5255cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
526dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt128(value.u.u128);
52721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
5285cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
5295cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            if (value.str)
5305cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putString(value.str);
5315cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            else
5325cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putEmptyString();
5335cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
53421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
53529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
53621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
53721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
53821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
539ab063847e6e893740749029a04cce1f6b7345ed5Mike LockwoodMtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, uint32_t& length) {
540ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    if (!packet.getUInt32(length)) return NULL;
541ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood
542eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar    // Fail if resulting array is over 2GB.  This is because the maximum array
543eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar    // size may be less than SIZE_MAX on some platforms.
544eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar    if ( CC_UNLIKELY(
545eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar            length == 0 ||
546eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar            length >= INT32_MAX / sizeof(MtpPropertyValue)) ) {
547eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar        length = 0;
548a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        return NULL;
549eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar    }
550a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue* result = new MtpPropertyValue[length];
551ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    for (uint32_t i = 0; i < length; i++)
552ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood        if (!readValue(packet, result[i])) {
553b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono            delete [] result;
554ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood            return NULL;
555ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood        }
556a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    return result;
557a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
558a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
559ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwoodvoid MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, uint32_t length) {
56021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt32(length);
561ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    for (uint32_t i = 0; i < length; i++)
56221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        writeValue(packet, values[i]);
56321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
56421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
565a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}  // namespace android
566