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