MtpProperty.cpp revision 2bb8c0e7c4e4093f4161ff5e98cef51c87193859
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),
342bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood        mGroupCode(0),
35a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mFormFlag(kFormNone),
36a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength(0),
37a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues(NULL)
38a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood{
39a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mDefaultValue.str = NULL;
40a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCurrentValue.str = NULL;
41a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mMinimumValue.str = NULL;
42a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mMaximumValue.str = NULL;
43a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
44a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
4521ef7d0e70c5ad599bc2602cb484f8cd647055caMike LockwoodMtpProperty::MtpProperty(MtpPropertyCode propCode,
4621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         MtpDataType type,
4721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         bool writeable,
4821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                         int defaultValue)
4921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    :   mCode(propCode),
5021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mType(type),
5121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mWriteable(writeable),
5221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayLength(0),
5321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mDefaultArrayValues(NULL),
5421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayLength(0),
5521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mCurrentArrayValues(NULL),
562bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood        mGroupCode(0),
5721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mFormFlag(kFormNone),
5821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumLength(0),
5921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        mEnumValues(NULL)
6021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood{
6121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mDefaultValue, 0, sizeof(mDefaultValue));
6221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mCurrentValue, 0, sizeof(mCurrentValue));
6321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMinimumValue, 0, sizeof(mMinimumValue));
6421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    memset(&mMaximumValue, 0, sizeof(mMaximumValue));
6521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
6621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (defaultValue) {
6721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        switch (type) {
6821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT8:
6921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i8 = defaultValue;
7021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT8:
7221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u8 = defaultValue;
7321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT16:
7521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i16 = defaultValue;
7621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
7721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT16:
7821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u16 = defaultValue;
7921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT32:
8121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i32 = defaultValue;
8221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT32:
8421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u32 = defaultValue;
8521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_INT64:
8721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.i64 = defaultValue;
8821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
8921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            case MTP_TYPE_UINT64:
9021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                mDefaultValue.u64 = defaultValue;
9121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                break;
9221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            default:
935cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                LOGE("unknown type %04X in MtpProperty::MtpProperty", type);
9421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        }
9521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
9621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
9721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
98a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpProperty::~MtpProperty() {
99a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mType == MTP_TYPE_STR) {
100a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        // free all strings
101a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mDefaultValue.str);
102a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mCurrentValue.str);
103a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMinimumValue.str);
104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        free(mMaximumValue.str);
105a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mDefaultArrayValues) {
106a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mDefaultArrayLength; i++)
107a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mDefaultArrayValues[i].str);
108a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
109a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mCurrentArrayValues) {
110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mCurrentArrayLength; i++)
111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mCurrentArrayValues[i].str);
112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
113a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        if (mEnumValues) {
114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            for (int i = 0; i < mEnumLength; i++)
115a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                free(mEnumValues[i].str);
116a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        }
117a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
118a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mDefaultArrayValues;
119a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mCurrentArrayValues;
120a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    delete[] mEnumValues;
121a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
122a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
12321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::read(MtpDataPacket& packet, bool deviceProp) {
124a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
125a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCode = packet.getUInt16();
126a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mType = packet.getUInt16();
127a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mWriteable = (packet.getUInt8() == 1);
128a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
129a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT8:
130a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT8:
131a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT16:
132a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT16:
133a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT32:
134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT32:
135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT64:
136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT64:
137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT128:
138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT128:
139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
140a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
141a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
142a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
143a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mDefaultValue);
14421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            if (deviceProp)
14521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                readValue(packet, mCurrentValue);
146a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
1472bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood    mGroupCode = packet.getUInt32();
148a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mFormFlag = packet.getUInt8();
149a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
150a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mFormFlag == kFormRange) {
151a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMinimumValue);
152a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMaximumValue);
153a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mStepSize);
154a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    } else if (mFormFlag == kFormEnum) {
155a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength = packet.getUInt16();
156a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues = new MtpPropertyValue[mEnumLength];
157a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        for (int i = 0; i < mEnumLength; i++)
158a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mEnumValues[i]);
159a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
160a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
161a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
16221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood// FIXME - only works for object properties
16321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::write(MtpDataPacket& packet) {
16421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mCode);
16521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mType);
16621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mWriteable ? 1 : 0);
16721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
16821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
16921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT8:
17021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT8:
17121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT16:
17221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT16:
17321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT32:
17421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT32:
17521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT64:
17621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT64:
17721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT128:
17821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT128:
17921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
18021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
18121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
18221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mDefaultValue);
18321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
1842bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood    packet.putUInt32(mGroupCode);
18521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mFormFlag);
18621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (mFormFlag == kFormRange) {
18721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMinimumValue);
18821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMaximumValue);
18921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mStepSize);
19021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    } else if (mFormFlag == kFormEnum) {
19121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        packet.putUInt16(mEnumLength);
19221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        for (int i = 0; i < mEnumLength; i++)
19321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mEnumValues[i]);
19421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
19521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
19621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
197a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::print() {
198f43c641bf3f8bcb5748f4ae504d434896edc94f5Mike Lockwood    LOGV("MtpProperty %04X\n", mCode);
199f43c641bf3f8bcb5748f4ae504d434896edc94f5Mike Lockwood    LOGV("    type %04X\n", mType);
200f43c641bf3f8bcb5748f4ae504d434896edc94f5Mike Lockwood    LOGV("    writeable %s\n", (mWriteable ? "true" : "false"));
201a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
202a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
203a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
2045cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
2055cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
206a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
207a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT8:
2085cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
209a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i8 = packet.getInt8();
210a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
211a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT8:
2125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
213a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u8 = packet.getUInt8();
214a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
215a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT16:
2165cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
217a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i16 = packet.getInt16();
218a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
219a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT16:
2205cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
221a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u16 = packet.getUInt16();
222a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
223a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT32:
2245cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
225a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i32 = packet.getInt32();
226a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
227a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT32:
2285cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
229a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u32 = packet.getUInt32();
230a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
231a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT64:
2325cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
233a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i64 = packet.getInt64();
234a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
235a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT64:
2365cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
237a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u64 = packet.getUInt64();
238a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
239a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT128:
2405cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
241a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            packet.getInt128(value.i128);
242a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
243a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT128:
2445cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
245a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            packet.getUInt128(value.u128);
246a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
2475cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
2485cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            packet.getString(stringBuffer);
2495cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            value.str = strdup(stringBuffer);
2505cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
251a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
2525cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            LOGE("unknown type %04X in MtpProperty::readValue", mType);
253a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
254a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
255a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
25621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
2575cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
2585cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
25921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
26021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT8:
2615cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
26221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt8(value.i8);
26321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
26421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT8:
2655cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
26621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt8(value.u8);
26721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
26821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT16:
2695cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
27021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt16(value.i16);
27121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
27221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT16:
2735cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
27421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt16(value.u16);
27521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
27621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT32:
2775cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
27821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt32(value.i32);
27921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT32:
2815cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
28221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt32(value.u32);
28321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT64:
2855cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
28621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt64(value.i64);
28721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT64:
2895cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
29021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt64(value.u64);
29121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
29221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT128:
2935cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
29421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt128(value.i128);
29521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
29621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT128:
2975cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
29821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt128(value.u128);
29921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
3005cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
3015cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            if (value.str)
3025cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putString(value.str);
3035cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            else
3045cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putEmptyString();
3055cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
30621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
3075cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            LOGE("unknown type %04X in MtpProperty::writeValue", mType);
30821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
30921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
31021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
311a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
312a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    length = packet.getUInt32();
313a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (length == 0)
314a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        return NULL;
315a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue* result = new MtpPropertyValue[length];
316a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    for (int i = 0; i < length; i++)
317a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        readValue(packet, result[i]);
318a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    return result;
319a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
320a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
32121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
32221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt32(length);
32321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    for (int i = 0; i < length; i++)
32421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        writeValue(packet, values[i]);
32521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
32621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
327a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}  // namespace android
328