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#ifndef _MTP_PROPERTY_H
18a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#define _MTP_PROPERTY_H
19a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
20a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include "MtpTypes.h"
21a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
22a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodnamespace android {
23a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
24a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodclass MtpDataPacket;
25a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
26dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwoodstruct MtpPropertyValue {
27dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    union {
28dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        int8_t          i8;
29dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        uint8_t         u8;
30dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        int16_t         i16;
31dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        uint16_t        u16;
32dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        int32_t         i32;
33dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        uint32_t        u32;
34dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        int64_t         i64;
35dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        uint64_t        u64;
36dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        int128_t        i128;
37dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood        uint128_t       u128;
38dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    } u;
39dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    // string in UTF8 format
40dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    char*               str;
41dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood};
42dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
43a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodclass MtpProperty {
44a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodpublic:
45a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyCode     mCode;
46a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpDataType         mType;
47a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    bool                mWriteable;
48a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue    mDefaultValue;
49a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue    mCurrentValue;
50a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
51a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    // for array types
52ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    uint32_t            mDefaultArrayLength;
53a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue*   mDefaultArrayValues;
54ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    uint32_t            mCurrentArrayLength;
55a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue*   mCurrentArrayValues;
56a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
57a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    enum {
58a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        kFormNone = 0,
59a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        kFormRange = 1,
60a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood        kFormEnum = 2,
61b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood        kFormDateTime = 3,
62a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    };
632bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood
642bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood    uint32_t            mGroupCode;
65a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    uint8_t             mFormFlag;
66a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
67a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    // for range form
68a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue    mMinimumValue;
69a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue    mMaximumValue;
70a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue    mStepSize;
71a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
72a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    // for enum form
73ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    uint16_t            mEnumLength;
74a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    MtpPropertyValue*   mEnumValues;
75a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
76a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodpublic:
77a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood                        MtpProperty();
7821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                        MtpProperty(MtpPropertyCode propCode,
7921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                                     MtpDataType type,
8021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                                     bool writeable = false,
8121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood                                     int defaultValue = 0);
82a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    virtual             ~MtpProperty();
83a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
8421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    inline MtpPropertyCode getPropertyCode() const { return mCode; }
8521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood
86ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    bool                read(MtpDataPacket& packet);
8721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    void                write(MtpDataPacket& packet);
88a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
89dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    void                setDefaultValue(const uint16_t* string);
90dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood    void                setCurrentValue(const uint16_t* string);
91dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood
920181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    void                setFormRange(int min, int max, int step);
930181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood    void                setFormEnum(const int* values, int count);
94b892d0e5556ed6ded3e0548f75ab16fc2e3d92c3Mike Lockwood    void                setFormDateTime();
950181726d0cc2d0fc6f6a53b6479dcf0fc41b9499Mike Lockwood
96a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood    void                print();
970c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood    void                print(MtpPropertyValue& value, MtpString& buffer);
98a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
99e3e76c456baee122de6715ae280130abaddc906cMike Lockwood    inline bool         isDeviceProperty() const {
100e3e76c456baee122de6715ae280130abaddc906cMike Lockwood                            return (   ((mCode & 0xF000) == 0x5000)
101e3e76c456baee122de6715ae280130abaddc906cMike Lockwood                                    || ((mCode & 0xF800) == 0xD000));
102e3e76c456baee122de6715ae280130abaddc906cMike Lockwood                        }
103e3e76c456baee122de6715ae280130abaddc906cMike Lockwood
104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodprivate:
105ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    bool                readValue(MtpDataPacket& packet, MtpPropertyValue& value);
10621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood    void                writeValue(MtpDataPacket& packet, MtpPropertyValue& value);
107ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood    MtpPropertyValue*   readArrayValues(MtpDataPacket& packet, uint32_t& length);
108e3e76c456baee122de6715ae280130abaddc906cMike Lockwood    void                writeArrayValues(MtpDataPacket& packet,
109ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood                                            MtpPropertyValue* values, uint32_t length);
110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood};
111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}; // namespace android
113a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood
114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#endif // _MTP_PROPERTY_H
115