MtpProperty.cpp revision 5cdceca217319bf6a22caf1acadc38c8dc259316
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"
20a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpProperty.h"
21a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpStringBuffer.h"
22a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpUtils.h"
23a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
24a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodnamespace android {
25a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
26a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::MtpProperty()
27a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    :   mCode(0),
28a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mType(0),
29a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mWriteable(false),
30a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayLength(0),
31a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mDefaultArrayValues(NULL),
32a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayLength(0),
33a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mCurrentArrayValues(NULL),
34a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mFormFlag(kFormNone),
35a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength(0),
36a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues(NULL)
37a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood{
38a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mDefaultValue.str = NULL;
39a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCurrentValue.str = NULL;
40a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mMinimumValue.str = NULL;
41a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mMaximumValue.str = NULL;
42a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
43a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
4421ef7d0e70c5ad599bc2602cb484f8cd647055caMike LockwoodMtpProperty::MtpProperty(MtpPropertyCode propCode,
4521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         MtpDataType type,
4621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         bool writeable,
4721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         int defaultValue)
4821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    :   mCode(propCode),
4921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mType(type),
5021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mWriteable(writeable),
5121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayLength(0),
5221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayValues(NULL),
5321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayLength(0),
5421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayValues(NULL),
5521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mFormFlag(kFormNone),
5621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumLength(0),
5721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumValues(NULL)
5821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood{
5921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
6021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
6121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
6221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
6321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
6421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (defaultValue) {
6521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        switch (type) {
6621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT8:
6721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i8 = defaultValue;
6821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
6921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT8:
7021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u8 = defaultValue;
7121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT16:
7321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i16 = defaultValue;
7421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT16:
7621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u16 = defaultValue;
7721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT32:
7921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i32 = defaultValue;
8021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT32:
8221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u32 = defaultValue;
8321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT64:
8521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i64 = defaultValue;
8621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT64:
8821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u64 = defaultValue;
8921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            default:
915cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                LOGE("unknown type %04X in MtpProperty::MtpProperty", type);
9221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        }
9321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
9421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
9521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
96a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::~MtpProperty() {
97a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mType == MTP_TYPE_STR) {
98a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        // free all strings
99a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mDefaultValue.str);
100a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mCurrentValue.str);
101a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMinimumValue.str);
102a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMaximumValue.str);
103a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mDefaultArrayValues) {
104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mDefaultArrayLength; i++)
105a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mDefaultArrayValues[i].str);
106a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
107a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mCurrentArrayValues) {
108a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mCurrentArrayLength; i++)
109a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mCurrentArrayValues[i].str);
110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mEnumValues) {
112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mEnumLength; i++)
113a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mEnumValues[i].str);
114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
115a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
116a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mDefaultArrayValues;
117a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mCurrentArrayValues;
118a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mEnumValues;
119a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
120a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
12121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::read(MtpDataPacket& packet, bool deviceProp) {
122a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
123a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCode = packet.getUInt16();
124a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mType = packet.getUInt16();
125a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mWriteable = (packet.getUInt8() == 1);
126a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
127a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT8:
128a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT8:
129a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT16:
130a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT16:
131a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT32:
132a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT32:
133a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT64:
134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT64:
135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT128:
136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT128:
137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
140a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
141a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mDefaultValue);
14221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            if (deviceProp)
14321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                readValue(packet, mCurrentValue);
144a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
145a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mFormFlag = packet.getUInt8();
146a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
147a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mFormFlag == kFormRange) {
148a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMinimumValue);
149a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMaximumValue);
150a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mStepSize);
151a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    } else if (mFormFlag == kFormEnum) {
152a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength = packet.getUInt16();
153a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues = new MtpPropertyValue[mEnumLength];
154a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        for (int i = 0; i < mEnumLength; i++)
155a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mEnumValues[i]);
156a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
157a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
158a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
15921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood// FIXME - only works for object properties
16021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::write(MtpDataPacket& packet) {
16121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mCode);
16221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mType);
16321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mWriteable ? 1 : 0);
16421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
16521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
16621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT8:
16721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT8:
16821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT16:
16921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT16:
17021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT32:
17121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT32:
17221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT64:
17321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT64:
17421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT128:
17521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT128:
17621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
17721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
17821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
17921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mDefaultValue);
18021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
18121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mFormFlag);
18221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (mFormFlag == kFormRange) {
18321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMinimumValue);
18421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMaximumValue);
18521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mStepSize);
18621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    } else if (mFormFlag == kFormEnum) {
18721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        packet.putUInt16(mEnumLength);
18821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        for (int i = 0; i < mEnumLength; i++)
18921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mEnumValues[i]);
19021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
19121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
19221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
193a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::print() {
194a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    LOGD("MtpProperty %04X\n", mCode);
195a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    LOGD("    type %04X\n", mType);
196a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    LOGD("    writeable %s\n", (mWriteable ? "true" : "false"));
197a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
198a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
199a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
2005cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
2015cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
202a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
203a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT8:
2045cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
205a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i8 = packet.getInt8();
206a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
207a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT8:
2085cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
209a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u8 = packet.getUInt8();
210a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
211a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT16:
2125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
213a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i16 = packet.getInt16();
214a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
215a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT16:
2165cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
217a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u16 = packet.getUInt16();
218a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
219a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT32:
2205cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
221a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i32 = packet.getInt32();
222a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
223a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT32:
2245cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
225a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u32 = packet.getUInt32();
226a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
227a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT64:
2285cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
229a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i64 = packet.getInt64();
230a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
231a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT64:
2325cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
233a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u64 = packet.getUInt64();
234a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
235a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT128:
2365cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
237a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            packet.getInt128(value.i128);
238a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
239a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT128:
2405cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
241a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            packet.getUInt128(value.u128);
242a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
2435cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
2445cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            packet.getString(stringBuffer);
2455cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            value.str = strdup(stringBuffer);
2465cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
247a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
2485cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            LOGE("unknown type %04X in MtpProperty::readValue", mType);
249a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
250a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
251a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
25221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
2535cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
2545cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
25521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
25621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT8:
2575cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
25821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt8(value.i8);
25921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
26021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT8:
2615cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
26221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt8(value.u8);
26321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
26421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT16:
2655cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
26621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt16(value.i16);
26721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
26821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT16:
2695cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
27021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt16(value.u16);
27121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
27221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT32:
2735cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
27421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt32(value.i32);
27521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
27621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT32:
2775cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
27821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt32(value.u32);
27921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT64:
2815cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
28221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt64(value.i64);
28321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT64:
2855cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
28621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt64(value.u64);
28721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT128:
2895cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
29021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt128(value.i128);
29121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
29221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT128:
2935cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
29421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt128(value.u128);
29521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
2965cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
2975cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            if (value.str)
2985cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putString(value.str);
2995cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            else
3005cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putEmptyString();
3015cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
30221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
3035cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            LOGE("unknown type %04X in MtpProperty::writeValue", mType);
30421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
30521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
30621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
307a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
308a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    length = packet.getUInt32();
309a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (length == 0)
310a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        return NULL;
311a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue* result = new MtpPropertyValue[length];
312a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    for (int i = 0; i < length; i++)
313a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        readValue(packet, result[i]);
314a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    return result;
315a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
316a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
31721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
31821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt32(length);
31921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    for (int i = 0; i < length; i++)
32021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        writeValue(packet, values[i]);
32121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
32221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
323a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}  // namespace android
324