1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _MTP_PROPERTY_H 18 #define _MTP_PROPERTY_H 19 20 #include "MtpTypes.h" 21 22 namespace android { 23 24 class MtpDataPacket; 25 26 struct MtpPropertyValue { 27 union { 28 int8_t i8; 29 uint8_t u8; 30 int16_t i16; 31 uint16_t u16; 32 int32_t i32; 33 uint32_t u32; 34 int64_t i64; 35 uint64_t u64; 36 int128_t i128; 37 uint128_t u128; 38 } u; 39 // string in UTF8 format 40 char* str; 41 }; 42 43 class MtpProperty { 44 public: 45 MtpPropertyCode mCode; 46 MtpDataType mType; 47 bool mWriteable; 48 MtpPropertyValue mDefaultValue; 49 MtpPropertyValue mCurrentValue; 50 51 // for array types 52 uint32_t mDefaultArrayLength; 53 MtpPropertyValue* mDefaultArrayValues; 54 uint32_t mCurrentArrayLength; 55 MtpPropertyValue* mCurrentArrayValues; 56 57 enum { 58 kFormNone = 0, 59 kFormRange = 1, 60 kFormEnum = 2, 61 kFormDateTime = 3, 62 }; 63 64 uint32_t mGroupCode; 65 uint8_t mFormFlag; 66 67 // for range form 68 MtpPropertyValue mMinimumValue; 69 MtpPropertyValue mMaximumValue; 70 MtpPropertyValue mStepSize; 71 72 // for enum form 73 uint16_t mEnumLength; 74 MtpPropertyValue* mEnumValues; 75 76 public: 77 MtpProperty(); 78 MtpProperty(MtpPropertyCode propCode, 79 MtpDataType type, 80 bool writeable = false, 81 int defaultValue = 0); 82 virtual ~MtpProperty(); 83 getPropertyCode()84 MtpPropertyCode getPropertyCode() const { return mCode; } getDataType()85 MtpDataType getDataType() const { return mType; } 86 87 bool read(MtpDataPacket& packet); 88 void write(MtpDataPacket& packet); 89 90 void setDefaultValue(const uint16_t* string); 91 void setCurrentValue(const uint16_t* string); 92 void setCurrentValue(MtpDataPacket& packet); getCurrentValue()93 const MtpPropertyValue& getCurrentValue() { return mCurrentValue; } 94 95 void setFormRange(int min, int max, int step); 96 void setFormEnum(const int* values, int count); 97 void setFormDateTime(); 98 99 void print(); 100 void print(MtpPropertyValue& value, MtpString& buffer); 101 isDeviceProperty()102 inline bool isDeviceProperty() const { 103 return ( ((mCode & 0xF000) == 0x5000) 104 || ((mCode & 0xF800) == 0xD000)); 105 } 106 107 private: 108 bool readValue(MtpDataPacket& packet, MtpPropertyValue& value); 109 void writeValue(MtpDataPacket& packet, MtpPropertyValue& value); 110 MtpPropertyValue* readArrayValues(MtpDataPacket& packet, uint32_t& length); 111 void writeArrayValues(MtpDataPacket& packet, 112 MtpPropertyValue* values, uint32_t length); 113 }; 114 115 }; // namespace android 116 117 #endif // _MTP_PROPERTY_H 118