MtpProperty.cpp revision 7cee5d3c3673d9a325d8096eea0ba48258fc656c
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
123e3e76c456baee122de6715ae280130abaddc906cMike Lockwoodvoid MtpProperty::read(MtpDataPacket& packet) {
1247cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    bool deviceProp = isDeviceProperty();
125a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
126a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mCode = packet.getUInt16();
127a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mType = packet.getUInt16();
128a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mWriteable = (packet.getUInt8() == 1);
129a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
130a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT8:
131a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT8:
132a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT16:
133a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT16:
134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT32:
135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT32:
136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT64:
137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT64:
138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AINT128:
139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_AUINT128:
140a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
1417cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1427cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
143a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
144a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
145a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mDefaultValue);
1467cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
14721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                readValue(packet, mCurrentValue);
148a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
1497cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
1507cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood        mGroupCode = packet.getUInt32();
151a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    mFormFlag = packet.getUInt8();
152a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
153a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (mFormFlag == kFormRange) {
154a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMinimumValue);
155a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mMaximumValue);
156a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mStepSize);
157a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    } else if (mFormFlag == kFormEnum) {
158a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumLength = packet.getUInt16();
159a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        mEnumValues = new MtpPropertyValue[mEnumLength];
160a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        for (int i = 0; i < mEnumLength; i++)
161a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            readValue(packet, mEnumValues[i]);
162a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
163a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
164a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
16521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::write(MtpDataPacket& packet) {
1667cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    bool deviceProp = isDeviceProperty();
1677cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood
16821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mCode);
16921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt16(mType);
17021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt8(mWriteable ? 1 : 0);
17121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
17221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
17321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT8:
17421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT8:
17521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT16:
17621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT16:
17721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT32:
17821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT32:
17921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT64:
18021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT64:
18121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AINT128:
18221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_AUINT128:
18321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
1847cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1857cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
18621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
18721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
18821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mDefaultValue);
1897cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood            if (deviceProp)
1907cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood                writeValue(packet, mCurrentValue);
19121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
1922bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood    packet.putUInt32(mGroupCode);
1937cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood    if (!deviceProp)
1947cee5d3c3673d9a325d8096eea0ba48258fc656cMike Lockwood        packet.putUInt8(mFormFlag);
19521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    if (mFormFlag == kFormRange) {
19621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMinimumValue);
19721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mMaximumValue);
19821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mStepSize);
19921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    } else if (mFormFlag == kFormEnum) {
20021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        packet.putUInt16(mEnumLength);
20121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        for (int i = 0; i < mEnumLength; i++)
20221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            writeValue(packet, mEnumValues[i]);
20321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
20421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
20521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
206a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::print() {
207f43c641bf3f8bcb5748f4ae504d434896edc94f5Mike Lockwood    LOGV("MtpProperty %04X\n", mCode);
208f43c641bf3f8bcb5748f4ae504d434896edc94f5Mike Lockwood    LOGV("    type %04X\n", mType);
209f43c641bf3f8bcb5748f4ae504d434896edc94f5Mike Lockwood    LOGV("    writeable %s\n", (mWriteable ? "true" : "false"));
210a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
211a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
212a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodvoid MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
2135cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
2145cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
215a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    switch (mType) {
216a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT8:
2175cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
218a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i8 = packet.getInt8();
219a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
220a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT8:
2215cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
222a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u8 = packet.getUInt8();
223a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
224a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT16:
2255cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
226a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i16 = packet.getInt16();
227a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
228a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT16:
2295cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
230a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u16 = packet.getUInt16();
231a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
232a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT32:
2335cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
234a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i32 = packet.getInt32();
235a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
236a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT32:
2375cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
238a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u32 = packet.getUInt32();
239a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
240a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT64:
2415cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
242a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.i64 = packet.getInt64();
243a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
244a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT64:
2455cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
246a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            value.u64 = packet.getUInt64();
247a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
248a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_INT128:
2495cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
250a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            packet.getInt128(value.i128);
251a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
252a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        case MTP_TYPE_UINT128:
2535cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
254a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            packet.getUInt128(value.u128);
255a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood            break;
2565cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
2575cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            packet.getString(stringBuffer);
2585cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            value.str = strdup(stringBuffer);
2595cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
260a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        default:
2615cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            LOGE("unknown type %04X in MtpProperty::readValue", mType);
262a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    }
263a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
264a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
26521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
2665cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood    MtpStringBuffer stringBuffer;
2675cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood
26821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    switch (mType) {
26921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT8:
2705cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT8:
27121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt8(value.i8);
27221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
27321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT8:
2745cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT8:
27521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt8(value.u8);
27621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
27721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT16:
2785cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT16:
27921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt16(value.i16);
28021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT16:
2825cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT16:
28321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt16(value.u16);
28421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT32:
2865cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT32:
28721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt32(value.i32);
28821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
28921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT32:
2905cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT32:
29121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt32(value.u32);
29221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
29321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT64:
2945cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT64:
29521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt64(value.i64);
29621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
29721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT64:
2985cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT64:
29921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt64(value.u64);
30021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
30121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_INT128:
3025cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AINT128:
30321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putInt128(value.i128);
30421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
30521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        case MTP_TYPE_UINT128:
3065cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_AUINT128:
30721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            packet.putUInt128(value.u128);
30821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood            break;
3095cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood        case MTP_TYPE_STR:
3105cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            if (value.str)
3115cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putString(value.str);
3125cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            else
3135cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood                packet.putEmptyString();
3145cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            break;
31521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        default:
3165cdceca217319bf6a22caf1acadc38c8dc259316Mike Lockwood            LOGE("unknown type %04X in MtpProperty::writeValue", mType);
31721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    }
31821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
31921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
320a6c490b8b2d96ebaab632286029463f932ae3b6bMike LockwoodMtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
321a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    length = packet.getUInt32();
322a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    if (length == 0)
323a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        return NULL;
324a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue* result = new MtpPropertyValue[length];
325a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    for (int i = 0; i < length; i++)
326a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        readValue(packet, result[i]);
327a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    return result;
328a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}
329a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
33021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwoodvoid MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
33121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    packet.putUInt32(length);
33221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    for (int i = 0; i < length; i++)
33321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood        writeValue(packet, values[i]);
33421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood}
33521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
336a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}  // namespace android
337