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 inline MtpPropertyCode getPropertyCode() const { return mCode; } 85 86 bool read(MtpDataPacket& packet); 87 void write(MtpDataPacket& packet); 88 89 void setDefaultValue(const uint16_t* string); 90 void setCurrentValue(const uint16_t* string); 91 92 void setFormRange(int min, int max, int step); 93 void setFormEnum(const int* values, int count); 94 void setFormDateTime(); 95 96 void print(); 97 void print(MtpPropertyValue& value, MtpString& buffer); 98 isDeviceProperty()99 inline bool isDeviceProperty() const { 100 return ( ((mCode & 0xF000) == 0x5000) 101 || ((mCode & 0xF800) == 0xD000)); 102 } 103 104 private: 105 bool readValue(MtpDataPacket& packet, MtpPropertyValue& value); 106 void writeValue(MtpDataPacket& packet, MtpPropertyValue& value); 107 MtpPropertyValue* readArrayValues(MtpDataPacket& packet, uint32_t& length); 108 void writeArrayValues(MtpDataPacket& packet, 109 MtpPropertyValue* values, uint32_t length); 110 }; 111 112 }; // namespace android 113 114 #endif // _MTP_PROPERTY_H 115