Home | History | Annotate | Download | only in mtp
      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     int                 mDefaultArrayLength;
     53     MtpPropertyValue*   mDefaultArrayValues;
     54     int                 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     int                 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 
     84     inline MtpPropertyCode getPropertyCode() const { return mCode; }
     85 
     86     void                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 
    104 private:
    105     void                readValue(MtpDataPacket& packet, MtpPropertyValue& value);
    106     void                writeValue(MtpDataPacket& packet, MtpPropertyValue& value);
    107     MtpPropertyValue*   readArrayValues(MtpDataPacket& packet, int& length);
    108     void                writeArrayValues(MtpDataPacket& packet,
    109                                             MtpPropertyValue* values, int length);
    110 };
    111 
    112 }; // namespace android
    113 
    114 #endif // _MTP_PROPERTY_H
    115