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