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
22namespace android {
23
24class MtpDataPacket;
25
26struct 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
43class MtpProperty {
44public:
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
76public:
77                        MtpProperty();
78                        MtpProperty(MtpPropertyCode propCode,
79                                     MtpDataType type,
80                                     bool writeable = false,
81                                     int defaultValue = 0);
82    virtual             ~MtpProperty();
83
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
99    inline bool         isDeviceProperty() const {
100                            return (   ((mCode & 0xF000) == 0x5000)
101                                    || ((mCode & 0xF800) == 0xD000));
102                        }
103
104private:
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