summaryrefslogtreecommitdiffstats
path: root/mtp/ffs/MtpProperty.h
blob: 43ec7c3f671e7d4198a87092925b5d6e820dcaf3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _MTP_PROPERTY_H
#define _MTP_PROPERTY_H

#include "MtpTypes.h"

#include <string>

class MtpDataPacket;

struct MtpPropertyValue {
	union {
		int8_t			i8;
		uint8_t			u8;
		int16_t			i16;
		uint16_t		u16;
		int32_t			i32;
		uint32_t		u32;
		int64_t			i64;
		uint64_t		u64;
		int128_t		i128;
		uint128_t		u128;
	} u;
	// string in UTF8 format
	char*				str;
};

class MtpProperty {
public:
	MtpPropertyCode		mCode;
	MtpDataType			mType;
	bool				mWriteable;
	MtpPropertyValue	mDefaultValue;
	MtpPropertyValue	mCurrentValue;

	// for array types
	uint32_t			mDefaultArrayLength;
	MtpPropertyValue*	mDefaultArrayValues;
	uint32_t			mCurrentArrayLength;
	MtpPropertyValue*	mCurrentArrayValues;

	enum {
		kFormNone = 0,
		kFormRange = 1,
		kFormEnum = 2,
		kFormDateTime = 3,
	};

	uint32_t			mGroupCode;
	uint8_t				mFormFlag;

	// for range form
	MtpPropertyValue	mMinimumValue;
	MtpPropertyValue	mMaximumValue;
	MtpPropertyValue	mStepSize;

	// for enum form
	uint16_t			mEnumLength;
	MtpPropertyValue*	mEnumValues;

public:
						MtpProperty();
						MtpProperty(MtpPropertyCode propCode,
									 MtpDataType type,
									 bool writeable = false,
									 int defaultValue = 0);
	virtual				~MtpProperty();

	MtpPropertyCode getPropertyCode() const { return mCode; }
	MtpDataType getDataType() const { return mType; }

	bool				read(MtpDataPacket& packet);
	void				write(MtpDataPacket& packet);

	void				setDefaultValue(const uint16_t* string);
	void				setCurrentValue(const uint16_t* string);
	void				setCurrentValue(MtpDataPacket& packet);
	const MtpPropertyValue& getCurrentValue() { return mCurrentValue; }

	void				setFormRange(int min, int max, int step);
	void				setFormEnum(const int* values, int count);
	void				setFormDateTime();

	void				print();

	inline bool			isDeviceProperty() const {
							return (   ((mCode & 0xF000) == 0x5000)
									|| ((mCode & 0xF800) == 0xD000));
						}

private:
	bool				readValue(MtpDataPacket& packet, MtpPropertyValue& value);
	void				writeValue(MtpDataPacket& packet, MtpPropertyValue& value);
	MtpPropertyValue*	readArrayValues(MtpDataPacket& packet, uint32_t& length);
	void				writeArrayValues(MtpDataPacket& packet,
											MtpPropertyValue* values, uint32_t length);
	void				print(MtpPropertyValue& value, std::string& buffer);
};

#endif // _MTP_PROPERTY_H