MtpProperty.cpp revision 377b2ec9a2885f9b6405b07ba900a9e3f4349c38
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>
20a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpDataPacket.h"
210c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood#include "MtpDebug.h"
22a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpProperty.h"
23a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpStringBuffer.h"
24a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpUtils.h"
25a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
26a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodnamespace android {
27a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
28a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::MtpProperty()
29a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    :   mCode(0),
30a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mType(0),
31a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mWriteable(false),
32a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayLength(0),
33a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayValues(NULL),
34a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayLength(0),
35a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayValues(NULL),
362bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood        mGroupCode(0),
37a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mFormFlag(kFormNone),
38a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength(0),
39a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues(NULL)
40a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood{
41dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
42dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
43dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
44dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
45a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
46a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
4721ef7d0e70c5ad599bc2602cb484f8cd647055caMike LockwoodMtpProperty::MtpProperty(MtpPropertyCode propCode,
4821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         MtpDataType type,
4921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         bool writeable,
5021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         int defaultValue)
5121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    :   mCode(propCode),
5221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mType(type),
5321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mWriteable(writeable),
5421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayLength(0),
5521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayValues(NULL),
5621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayLength(0),
5721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayValues(NULL),
5840ce1f262cc4edbc8b7c470830325466263acaecMike Lockwood        mGroupCode(0),
5921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mFormFlag(kFormNone),
6021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumLength(0),
6121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumValues(NULL)
6221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood{
6321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
6421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
6521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
6621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
6721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
6821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (defaultValue) {
6921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        switch (type) {
7021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT8:
71dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i8 = defaultValue;
7221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT8:
74dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u8 = defaultValue;
7521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT16:
77dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i16 = defaultValue;
7821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT16:
80dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u16 = defaultValue;
8121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT32:
83dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i32 = defaultValue;
8421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT32:
86dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u32 = defaultValue;
8721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT64:
89dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.i64 = defaultValue;
9021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT64:
92dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood                mDefaultValue.u.u64 = defaultValue;
9321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            default:
9529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
9621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        }
9721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
9821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
9921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
100a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::~MtpProperty() {
101a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mType == MTP_TYPE_STR) {
102a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        // free all strings
103a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mDefaultValue.str);
104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mCurrentValue.str);
105a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMinimumValue.str);
106a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMaximumValue.str);
107a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mDefaultArrayValues) {
108a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mDefaultArrayLength; i++)
109a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mDefaultArrayValues[i].str);
110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mCurrentArrayValues) {
112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mCurrentArrayLength; i++)
113a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mCurrentArrayValues[i].str);
114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
115a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mEnumValues) {
116a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mEnumLength; i++)
117a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mEnumValues[i].str);
118a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
119a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
120a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mDefaultArrayValues;
121a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mCurrentArrayValues;
122a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mEnumValues;
123a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
124a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
125e3e76c456baee122de6715ae280130abaddc906cMike Lockwoodvoid MtpProperty::read(MtpDataPacket& packet) {
126a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCode = packet.getUInt16();
1275da864845e024833c4c7f641acd7c88187a6bc1eMike Lockwood    bool deviceProp = isDeviceProperty();
128a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mType = packet.getUInt16();
129a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mWriteable = (packet.getUInt8() == 1);
130a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
131a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT8:
132a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT8:
133a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT16:
134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT16:
135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT32:
136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT32:
137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT64:
138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT64:
139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT128:
140a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT128:
141a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
1427cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1437cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
144a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
145a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
146a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mDefaultValue);
1477cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
14821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                readValue(packet, mCurrentValue);
149a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
1507cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
1517cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood        mGroupCode = packet.getUInt32();
152a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mFormFlag = packet.getUInt8();
153a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
154a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mFormFlag == kFormRange) {
155a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMinimumValue);
156a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMaximumValue);
157a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mStepSize);
158a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    } else if (mFormFlag == kFormEnum) {
159a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength = packet.getUInt16();
160a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues = new MtpPropertyValue[mEnumLength];
161a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        for (int i = 0; i < mEnumLength; i++)
162a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mEnumValues[i]);
163a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
164a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
165a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
16621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::write(MtpDataPacket& packet) {
1677cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    bool deviceProp = isDeviceProperty();
1687cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood
16921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mCode);
17021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mType);
17121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mWriteable ? 1 : 0);
17221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
17321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
17421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT8:
17521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT8:
17621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT16:
17721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT16:
17821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT32:
17921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT32:
18021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT64:
18121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT64:
18221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT128:
18321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT128:
18421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
1857cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1867cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
18721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
18821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
18921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mDefaultValue);
1907cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1917cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeValue(packet, mCurrentValue);
19221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
1932bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood    packet.putUInt32(mGroupCode);
1947cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
1957cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood        packet.putUInt8(mFormFlag);
19621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (mFormFlag == kFormRange) {
19721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMinimumValue);
19821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMaximumValue);
19921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mStepSize);
20021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    } else if (mFormFlag == kFormEnum) {
20121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        packet.putUInt16(mEnumLength);
20221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        for (int i = 0; i < mEnumLength; i++)
20321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mEnumValues[i]);
20421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
20521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
20621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
207dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodvoid MtpProperty::setDefaultValue(const uint16_t* string) {
208dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    free(mDefaultValue.str);
209dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    if (string) {
210dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        MtpStringBuffer buffer(string);
211dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mDefaultValue.str = strdup(buffer);
212dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    }
213dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    else
214dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mDefaultValue.str = NULL;
215dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood}
216dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
217dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodvoid MtpProperty::setCurrentValue(const uint16_t* string) {
218dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    free(mCurrentValue.str);
219dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    if (string) {
220dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        MtpStringBuffer buffer(string);
221dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mCurrentValue.str = strdup(buffer);
222dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    }
223dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    else
224dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        mCurrentValue.str = NULL;
225dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood}
226dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
2270181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwoodvoid MtpProperty::setFormRange(int min, int max, int step) {
2280181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    mFormFlag = kFormRange;
2290181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    switch (mType) {
2300181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT8:
2310181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i8 = min;
2320181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i8 = max;
2330181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i8 = step;
2340181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2350181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT8:
2360181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u8 = min;
2370181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u8 = max;
2380181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u8 = step;
2390181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2400181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT16:
2410181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i16 = min;
2420181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i16 = max;
2430181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i16 = step;
2440181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2450181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT16:
2460181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u16 = min;
2470181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u16 = max;
2480181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u16 = step;
2490181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2500181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT32:
2510181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i32 = min;
2520181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i32 = max;
2530181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i32 = step;
2540181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2550181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT32:
2560181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u32 = min;
2570181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u32 = max;
2580181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u32 = step;
2590181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2600181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_INT64:
2610181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.i64 = min;
2620181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.i64 = max;
2630181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.i64 = step;
2640181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2650181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        case MTP_TYPE_UINT64:
2660181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMinimumValue.u.u64 = min;
2670181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mMaximumValue.u.u64 = max;
2680181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            mStepSize.u.u64 = step;
2690181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2700181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        default:
27129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unsupported type for MtpProperty::setRange");
2720181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            break;
2730181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    }
2740181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood}
2750181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
2760181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwoodvoid MtpProperty::setFormEnum(const int* values, int count) {
2770181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mFormFlag = kFormEnum;
2780181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     delete[] mEnumValues;
2790181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mEnumValues = new MtpPropertyValue[count];
2800181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood     mEnumLength = count;
2810181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
2820181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    for (int i = 0; i < count; i++) {
2830181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        int value = *values++;
2840181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood            switch (mType) {
2850181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT8:
2860181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i8 = value;
2870181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2880181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT8:
2890181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u8 = value;
2900181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2910181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT16:
2920181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i16 = value;
2930181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2940181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT16:
2950181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u16 = value;
2960181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
2970181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT32:
2980181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i32 = value;
2990181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3000181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT32:
3010181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u32 = value;
3020181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3030181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_INT64:
3040181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.i64 = value;
3050181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3060181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                case MTP_TYPE_UINT64:
3070181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    mEnumValues[i].u.u64 = value;
3080181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3090181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                default:
31029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("unsupported type for MtpProperty::setEnum");
3110181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood                    break;
3120181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood        }
3130181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    }
3140181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood}
3150181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
316b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwoodvoid MtpProperty::setFormDateTime() {
317b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood     mFormFlag = kFormDateTime;
318b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood}
319b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood
320a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::print() {
3210c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    MtpString buffer;
3220c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    bool deviceProp = isDeviceProperty();
3230c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    if (deviceProp)
324df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("    %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
3250c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    else
326df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("    %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
327df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("    type %04X", mType);
328df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("    writeable %s", (mWriteable ? "true" : "false"));
3290c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    buffer = "    default value: ";
3300c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    print(mDefaultValue, buffer);
331df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    ALOGI("%s", (const char *)buffer);
3320c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    if (deviceProp) {
3330c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        buffer = "    current value: ";
3340c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        print(mCurrentValue, buffer);
335df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("%s", (const char *)buffer);
3360c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
3370c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    switch (mFormFlag) {
3380c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormNone:
3390c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3400c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormRange:
3410c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer = "    Range (";
3420c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mMinimumValue, buffer);
3430c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += ", ";
3440c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mMaximumValue, buffer);
3450c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += ", ";
3460c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            print(mStepSize, buffer);
347fd34626771a63d3a835863e1b4bf71dcb26e28d8Mike Lockwood            buffer += ")";
348df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("%s", (const char *)buffer);
3490c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3500c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormEnum:
3510c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer = "    Enum { ";
3520c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            for (int i = 0; i < mEnumLength; i++) {
3530c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                print(mEnumValues[i], buffer);
3540c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                buffer += " ";
3550c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            }
3560c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer += "}";
357df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("%s", (const char *)buffer);
3580c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3590c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case kFormDateTime:
360df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("    DateTime\n");
3610c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3620c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        default:
363df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("    form %d\n", mFormFlag);
3640c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3650c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
3660c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood}
3670c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood
3680c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwoodvoid MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
3690c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    switch (mType) {
3700c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT8:
3710c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i8);
3720c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3730c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT8:
3740c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u8);
3750c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3760c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT16:
3770c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i16);
3780c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3790c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT16:
3800c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u16);
3810c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3820c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT32:
3830c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.i32);
3840c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3850c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT32:
3860c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%d", value.u.u32);
3870c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3880c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT64:
389377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            buffer.appendFormat("%" PRId64, value.u.i64);
3900c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3910c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT64:
392377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            buffer.appendFormat("%" PRIu64, value.u.u64);
3930c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3940c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_INT128:
3950c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
3960c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                    value.u.i128[2], value.u.i128[3]);
3970c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
3980c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_UINT128:
3990c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
4000c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood                    value.u.u128[2], value.u.u128[3]);
4010c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4020c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        case MTP_TYPE_STR:
4030c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            buffer.appendFormat("%s", value.str);
4040c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4050c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood        default:
40629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unsupported type for MtpProperty::print\n");
4070c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood            break;
4080c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    }
409a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
410a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
411a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
4125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
4135cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
414a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
415a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT8:
4165cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
417dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i8 = packet.getInt8();
418a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
419a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT8:
4205cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
421dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u8 = packet.getUInt8();
422a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
423a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT16:
4245cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
425dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i16 = packet.getInt16();
426a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
427a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT16:
4285cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
429dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u16 = packet.getUInt16();
430a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
431a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT32:
4325cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
433dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i32 = packet.getInt32();
434a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
435a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT32:
4365cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
437dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u32 = packet.getUInt32();
438a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
439a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT64:
4405cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
441dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.i64 = packet.getInt64();
442a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
443a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT64:
4445cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
445dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            value.u.u64 = packet.getUInt64();
446a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
447a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT128:
4485cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
449dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.getInt128(value.u.i128);
450a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
451a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT128:
4525cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
453dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.getUInt128(value.u.u128);
454a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
4555cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
4565cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            packet.getString(stringBuffer);
4575cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            value.str = strdup(stringBuffer);
4585cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
459a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
46029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unknown type %04X in MtpProperty::readValue", mType);
461a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
462a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
463a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
46421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
4655cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
4665cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
46721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
46821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT8:
4695cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
470dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt8(value.u.i8);
47121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
47221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT8:
4735cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
474dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt8(value.u.u8);
47521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
47621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT16:
4775cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
478dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt16(value.u.i16);
47921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
48021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT16:
4815cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
482dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt16(value.u.u16);
48321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
48421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT32:
4855cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
486dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt32(value.u.i32);
48721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
48821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT32:
4895cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
490dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt32(value.u.u32);
49121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT64:
4935cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
494dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt64(value.u.i64);
49521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
49621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT64:
4975cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
498dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt64(value.u.u64);
49921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
50021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT128:
5015cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
502dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putInt128(value.u.i128);
50321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
50421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT128:
5055cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
506dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood            packet.putUInt128(value.u.u128);
50721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
5085cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
5095cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            if (value.str)
5105cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putString(value.str);
5115cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            else
5125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putEmptyString();
5135cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
51421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
51529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
51621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
51721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
51821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
519a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
520a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    length = packet.getUInt32();
521a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (length == 0)
522a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        return NULL;
523a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue* result = new MtpPropertyValue[length];
524a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    for (int i = 0; i < length; i++)
525a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        readValue(packet, result[i]);
526a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    return result;
527a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
528a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
52921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
53021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt32(length);
53121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    for (int i = 0; i < length; i++)
53221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        writeValue(packet, values[i]);
53321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
53421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
535a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}  // namespace android
536