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
19a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpDataPacket.h"
200c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood#include "MtpDebug.h"
21a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpProperty.h"
22a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpStringBuffer.h"
23a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpUtils.h"
24a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
25a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodnamespace android {
26a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
27a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::MtpProperty()
28a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    :   mCode(0),
29a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mType(0),
30a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mWriteable(false),
31a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayLength(0),
32a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayValues(NULL),
33a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayLength(0),
34a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayValues(NULL),
352bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood        mGroupCode(0),
36a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mFormFlag(kFormNone),
37a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength(0),
38a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues(NULL)
39a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood{
40dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
41dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
42dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
43dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
44a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
45a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
4621ef7d0e70c5ad599bc2602cb484f8cd647055caMike LockwoodMtpProperty::MtpProperty(MtpPropertyCode propCode,
4721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         MtpDataType type,
4821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         bool writeable,
4921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         int defaultValue)
5021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    :   mCode(propCode),
5121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mType(type),
5221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mWriteable(writeable),
5321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayLength(0),
5421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayValues(NULL),
5521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayLength(0),
5621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayValues(NULL),
5740ce1f262cc4edbc8b7c470830325466263acaecMike Lockwood        mGroupCode(0),
5821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mFormFlag(kFormNone),
5921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumLength(0),
6021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumValues(NULL)
6121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood{
6221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
6321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
6421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
6521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
6621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
6721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (defaultValue) {
6821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        switch (type) {
6921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT8:
70dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i8 = defaultValue;
7121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT8:
73dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u8 = defaultValue;
7421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT16:
76dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i16 = defaultValue;
7721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT16:
79dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u16 = defaultValue;
8021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT32:
82dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i32 = defaultValue;
8321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT32:
85dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u32 = defaultValue;
8621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT64:
88dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i64 = defaultValue;
8921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT64:
91dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u64 = defaultValue;
9221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            default:
9429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
9521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        }
9621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
9721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
9821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
99a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::~MtpProperty() {
100a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mType == MTP_TYPE_STR) {
101a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        // free all strings
102a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mDefaultValue.str);
103a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mCurrentValue.str);
104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMinimumValue.str);
105a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMaximumValue.str);
106a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mDefaultArrayValues) {
107a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mDefaultArrayLength; i++)
108a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mDefaultArrayValues[i].str);
109a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mCurrentArrayValues) {
111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mCurrentArrayLength; i++)
112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mCurrentArrayValues[i].str);
113a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mEnumValues) {
115a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mEnumLength; i++)
116a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mEnumValues[i].str);
117a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
118a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
119a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mDefaultArrayValues;
120a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mCurrentArrayValues;
121a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mEnumValues;
122a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
123a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
124e3e76c456baee122de6715ae280130abaddc906cMike Lockwoodvoid MtpProperty::read(MtpDataPacket& packet) {
125a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCode = packet.getUInt16();
1265da864845e024833c4c7f641acd7c88187a6bc1eMike Lockwood    bool deviceProp = isDeviceProperty();
127a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mType = packet.getUInt16();
128a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mWriteable = (packet.getUInt8() == 1);
129a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
130a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT8:
131a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT8:
132a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT16:
133a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT16:
134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT32:
135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT32:
136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT64:
137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT64:
138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT128:
139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT128:
140a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
1417cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1427cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
143a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
144a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
145a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mDefaultValue);
1467cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
14721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                readValue(packet, mCurrentValue);
148a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
1497cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
1507cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood        mGroupCode = packet.getUInt32();
151a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mFormFlag = packet.getUInt8();
152a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
153a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mFormFlag == kFormRange) {
154a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMinimumValue);
155a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMaximumValue);
156a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mStepSize);
157a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    } else if (mFormFlag == kFormEnum) {
158a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength = packet.getUInt16();
159a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues = new MtpPropertyValue[mEnumLength];
160a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        for (int i = 0; i < mEnumLength; i++)
161a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mEnumValues[i]);
162a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
163a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
164a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
16521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::write(MtpDataPacket& packet) {
1667cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    bool deviceProp = isDeviceProperty();
1677cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood
16821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mCode);
16921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mType);
17021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mWriteable ? 1 : 0);
17121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
17221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
17321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT8:
17421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT8:
17521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT16:
17621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT16:
17721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT32:
17821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT32:
17921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT64:
18021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT64:
18121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT128:
18221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT128:
18321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
1847cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1857cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
18621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
18721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
18821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mDefaultValue);
1897cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1907cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeValue(packet, mCurrentValue);
19121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
1922bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood    packet.putUInt32(mGroupCode);
1937cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
1947cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood        packet.putUInt8(mFormFlag);
19521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (mFormFlag == kFormRange) {
19621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMinimumValue);
19721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMaximumValue);
19821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mStepSize);
19921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    } else if (mFormFlag == kFormEnum) {
20021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        packet.putUInt16(mEnumLength);
20121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        for (int i = 0; i < mEnumLength; i++)
20221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mEnumValues[i]);
20321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
20421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
20521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
206dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodvoid MtpProperty::setDefaultValue(const uint16_t* string) {
207dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    free(mDefaultValue.str);
208dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    if (string) {
209dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        MtpStringBuffer buffer(string);
210dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mDefaultValue.str = strdup(buffer);
211dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    }
212dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    else
213dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mDefaultValue.str = NULL;
214dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood}
215dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
216dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodvoid MtpProperty::setCurrentValue(const uint16_t* string) {
217dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    free(mCurrentValue.str);
218dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    if (string) {
219dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        MtpStringBuffer buffer(string);
220dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mCurrentValue.str = strdup(buffer);
221dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    }
222dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    else
223dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mCurrentValue.str = NULL;
224dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood}
225dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
2260181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwoodvoid MtpProperty::setFormRange(int min, int max, int step) {
2270181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    mFormFlag = kFormRange;
2280181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    switch (mType) {
2290181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT8:
2300181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i8 = min;
2310181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i8 = max;
2320181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i8 = step;
2330181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2340181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT8:
2350181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u8 = min;
2360181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u8 = max;
2370181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u8 = step;
2380181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2390181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT16:
2400181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i16 = min;
2410181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i16 = max;
2420181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i16 = step;
2430181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2440181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT16:
2450181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u16 = min;
2460181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u16 = max;
2470181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u16 = step;
2480181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2490181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT32:
2500181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i32 = min;
2510181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i32 = max;
2520181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i32 = step;
2530181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2540181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT32:
2550181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u32 = min;
2560181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u32 = max;
2570181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u32 = step;
2580181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2590181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT64:
2600181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i64 = min;
2610181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i64 = max;
2620181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i64 = step;
2630181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2640181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT64:
2650181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u64 = min;
2660181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u64 = max;
2670181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u64 = step;
2680181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2690181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        default:
27029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unsupported type for MtpProperty::setRange");
2710181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2720181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    }
2730181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood}
2740181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
2750181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwoodvoid MtpProperty::setFormEnum(const int* values, int count) {
2760181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mFormFlag = kFormEnum;
2770181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     delete[] mEnumValues;
2780181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mEnumValues = new MtpPropertyValue[count];
2790181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mEnumLength = count;
2800181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
2810181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    for (int i = 0; i < count; i++) {
2820181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        int value = *values++;
2830181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            switch (mType) {
2840181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT8:
2850181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i8 = value;
2860181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2870181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT8:
2880181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u8 = value;
2890181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2900181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT16:
2910181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i16 = value;
2920181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2930181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT16:
2940181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u16 = value;
2950181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2960181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT32:
2970181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i32 = value;
2980181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2990181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT32:
3000181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u32 = value;
3010181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3020181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT64:
3030181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i64 = value;
3040181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3050181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT64:
3060181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u64 = value;
3070181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3080181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                default:
30929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("unsupported type for MtpProperty::setEnum");
3100181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3110181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        }
3120181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    }
3130181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood}
3140181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
315b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwoodvoid MtpProperty::setFormDateTime() {
316b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood     mFormFlag = kFormDateTime;
317b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood}
318b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood
319a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::print() {
3200c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    MtpString buffer;
3210c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    bool deviceProp = isDeviceProperty();
3220c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    if (deviceProp)
323df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("    %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
3240c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    else
325df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("    %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
326df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("    type %04X", mType);
327df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("    writeable %s", (mWriteable ? "true" : "false"));
3280c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    buffer = "    default value: ";
3290c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    print(mDefaultValue, buffer);
330df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("%s", (const char *)buffer);
3310c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    if (deviceProp) {
3320c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        buffer = "    current value: ";
3330c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        print(mCurrentValue, buffer);
334df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("%s", (const char *)buffer);
3350c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
3360c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    switch (mFormFlag) {
3370c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormNone:
3380c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3390c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormRange:
3400c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer = "    Range (";
3410c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mMinimumValue, buffer);
3420c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += ", ";
3430c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mMaximumValue, buffer);
3440c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += ", ";
3450c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mStepSize, buffer);
346fd34626771a63d3a835863e1b4bf71dcb26e28d8Mike Lockwood            buffer += ")";
347df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("%s", (const char *)buffer);
3480c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3490c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormEnum:
3500c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer = "    Enum { ";
3510c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            for (int i = 0; i < mEnumLength; i++) {
3520c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                print(mEnumValues[i], buffer);
3530c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                buffer += " ";
3540c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            }
3550c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += "}";
356df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("%s", (const char *)buffer);
3570c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3580c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormDateTime:
359df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("    DateTime\n");
3600c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3610c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        default:
362df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("    form %d\n", mFormFlag);
3630c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3640c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
3650c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood}
3660c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood
3670c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwoodvoid MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
3680c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    switch (mType) {
3690c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT8:
3700c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i8);
3710c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3720c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT8:
3730c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u8);
3740c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3750c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT16:
3760c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i16);
3770c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3780c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT16:
3790c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u16);
3800c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3810c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT32:
3820c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i32);
3830c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3840c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT32:
3850c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u32);
3860c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3870c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT64:
3880c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%lld", value.u.i64);
3890c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3900c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT64:
3910c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%lld", value.u.u64);
3920c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3930c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT128:
3940c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
3950c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                    value.u.i128[2], value.u.i128[3]);
3960c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3970c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT128:
3980c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
3990c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                    value.u.u128[2], value.u.u128[3]);
4000c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4010c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_STR:
4020c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%s", value.str);
4030c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4040c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        default:
40529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unsupported type for MtpProperty::print\n");
4060c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4070c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
408a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
409a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
410a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
4115cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
4125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
413a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
414a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT8:
4155cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
416dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i8 = packet.getInt8();
417a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
418a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT8:
4195cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
420dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u8 = packet.getUInt8();
421a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
422a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT16:
4235cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
424dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i16 = packet.getInt16();
425a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
426a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT16:
4275cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
428dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u16 = packet.getUInt16();
429a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
430a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT32:
4315cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
432dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i32 = packet.getInt32();
433a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
434a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT32:
4355cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
436dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u32 = packet.getUInt32();
437a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
438a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT64:
4395cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
440dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i64 = packet.getInt64();
441a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
442a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT64:
4435cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
444dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u64 = packet.getUInt64();
445a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
446a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT128:
4475cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
448dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.getInt128(value.u.i128);
449a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
450a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT128:
4515cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
452dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.getUInt128(value.u.u128);
453a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
4545cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
4555cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            packet.getString(stringBuffer);
4565cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            value.str = strdup(stringBuffer);
4575cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
458a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
45929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unknown type %04X in MtpProperty::readValue", mType);
460a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
461a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
462a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
46321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
4645cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
4655cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
46621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
46721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT8:
4685cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
469dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt8(value.u.i8);
47021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
47121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT8:
4725cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
473dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt8(value.u.u8);
47421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
47521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT16:
4765cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
477dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt16(value.u.i16);
47821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
47921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT16:
4805cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
481dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt16(value.u.u16);
48221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
48321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT32:
4845cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
485dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt32(value.u.i32);
48621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
48721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT32:
4885cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
489dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt32(value.u.u32);
49021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT64:
4925cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
493dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt64(value.u.i64);
49421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT64:
4965cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
497dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt64(value.u.u64);
49821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT128:
5005cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
501dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt128(value.u.i128);
50221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
50321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT128:
5045cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
505dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt128(value.u.u128);
50621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
5075cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
5085cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            if (value.str)
5095cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putString(value.str);
5105cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            else
5115cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putEmptyString();
5125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
51321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
51429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
51521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
51621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
51721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
518a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
519a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    length = packet.getUInt32();
520a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (length == 0)
521a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        return NULL;
522a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue* result = new MtpPropertyValue[length];
523a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    for (int i = 0; i < length; i++)
524a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        readValue(packet, result[i]);
525a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    return result;
526a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
527a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
52821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
52921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt32(length);
53021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    for (int i = 0; i < length; i++)
53121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        writeValue(packet, values[i]);
53221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
53321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
534a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}  // namespace android
535