blob: 995f58929afa7fa4dc977efc94340c34b5b28d78 [file] [log] [blame]
Mike Lockwood90f48732010-06-05 22:45:01 -04001/*
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#define LOG_TAG "MtpProperty"
Mike Lockwood90f48732010-06-05 22:45:01 -040018
19#include "MtpDataPacket.h"
20#include "MtpProperty.h"
21#include "MtpStringBuffer.h"
22#include "MtpUtils.h"
23
24namespace android {
25
26MtpProperty::MtpProperty()
27 : mCode(0),
28 mType(0),
29 mWriteable(false),
30 mDefaultArrayLength(0),
31 mDefaultArrayValues(NULL),
32 mCurrentArrayLength(0),
33 mCurrentArrayValues(NULL),
Mike Lockwood97c8d902010-08-09 14:49:28 -040034 mGroupCode(0),
Mike Lockwood90f48732010-06-05 22:45:01 -040035 mFormFlag(kFormNone),
36 mEnumLength(0),
37 mEnumValues(NULL)
38{
39 mDefaultValue.str = NULL;
40 mCurrentValue.str = NULL;
41 mMinimumValue.str = NULL;
42 mMaximumValue.str = NULL;
43}
44
Mike Lockwood767c5e42010-06-30 17:00:35 -040045MtpProperty::MtpProperty(MtpPropertyCode propCode,
46 MtpDataType type,
47 bool writeable,
48 int defaultValue)
49 : mCode(propCode),
50 mType(type),
51 mWriteable(writeable),
52 mDefaultArrayLength(0),
53 mDefaultArrayValues(NULL),
54 mCurrentArrayLength(0),
55 mCurrentArrayValues(NULL),
Mike Lockwood97c8d902010-08-09 14:49:28 -040056 mGroupCode(0),
Mike Lockwood767c5e42010-06-30 17:00:35 -040057 mFormFlag(kFormNone),
58 mEnumLength(0),
59 mEnumValues(NULL)
60{
61 memset(&mDefaultValue, 0, sizeof(mDefaultValue));
62 memset(&mCurrentValue, 0, sizeof(mCurrentValue));
63 memset(&mMinimumValue, 0, sizeof(mMinimumValue));
64 memset(&mMaximumValue, 0, sizeof(mMaximumValue));
65
66 if (defaultValue) {
67 switch (type) {
68 case MTP_TYPE_INT8:
69 mDefaultValue.i8 = defaultValue;
70 break;
71 case MTP_TYPE_UINT8:
72 mDefaultValue.u8 = defaultValue;
73 break;
74 case MTP_TYPE_INT16:
75 mDefaultValue.i16 = defaultValue;
76 break;
77 case MTP_TYPE_UINT16:
78 mDefaultValue.u16 = defaultValue;
79 break;
80 case MTP_TYPE_INT32:
81 mDefaultValue.i32 = defaultValue;
82 break;
83 case MTP_TYPE_UINT32:
84 mDefaultValue.u32 = defaultValue;
85 break;
86 case MTP_TYPE_INT64:
87 mDefaultValue.i64 = defaultValue;
88 break;
89 case MTP_TYPE_UINT64:
90 mDefaultValue.u64 = defaultValue;
91 break;
92 default:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -040093 LOGE("unknown type %04X in MtpProperty::MtpProperty", type);
Mike Lockwood767c5e42010-06-30 17:00:35 -040094 }
95 }
96}
97
Mike Lockwood90f48732010-06-05 22:45:01 -040098MtpProperty::~MtpProperty() {
99 if (mType == MTP_TYPE_STR) {
100 // free all strings
101 free(mDefaultValue.str);
102 free(mCurrentValue.str);
103 free(mMinimumValue.str);
104 free(mMaximumValue.str);
105 if (mDefaultArrayValues) {
106 for (int i = 0; i < mDefaultArrayLength; i++)
107 free(mDefaultArrayValues[i].str);
108 }
109 if (mCurrentArrayValues) {
110 for (int i = 0; i < mCurrentArrayLength; i++)
111 free(mCurrentArrayValues[i].str);
112 }
113 if (mEnumValues) {
114 for (int i = 0; i < mEnumLength; i++)
115 free(mEnumValues[i].str);
116 }
117 }
118 delete[] mDefaultArrayValues;
119 delete[] mCurrentArrayValues;
120 delete[] mEnumValues;
121}
122
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400123void MtpProperty::read(MtpDataPacket& packet) {
Mike Lockwood564ff842010-09-25 08:37:59 -0400124 bool deviceProp = isDeviceProperty();
Mike Lockwood90f48732010-06-05 22:45:01 -0400125
126 mCode = packet.getUInt16();
127 mType = packet.getUInt16();
128 mWriteable = (packet.getUInt8() == 1);
129 switch (mType) {
130 case MTP_TYPE_AINT8:
131 case MTP_TYPE_AUINT8:
132 case MTP_TYPE_AINT16:
133 case MTP_TYPE_AUINT16:
134 case MTP_TYPE_AINT32:
135 case MTP_TYPE_AUINT32:
136 case MTP_TYPE_AINT64:
137 case MTP_TYPE_AUINT64:
138 case MTP_TYPE_AINT128:
139 case MTP_TYPE_AUINT128:
140 mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
Mike Lockwood564ff842010-09-25 08:37:59 -0400141 if (deviceProp)
142 mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
Mike Lockwood90f48732010-06-05 22:45:01 -0400143 break;
144 default:
145 readValue(packet, mDefaultValue);
Mike Lockwood564ff842010-09-25 08:37:59 -0400146 if (deviceProp)
Mike Lockwood767c5e42010-06-30 17:00:35 -0400147 readValue(packet, mCurrentValue);
Mike Lockwood90f48732010-06-05 22:45:01 -0400148 }
Mike Lockwood564ff842010-09-25 08:37:59 -0400149 if (!deviceProp)
150 mGroupCode = packet.getUInt32();
Mike Lockwood90f48732010-06-05 22:45:01 -0400151 mFormFlag = packet.getUInt8();
152
153 if (mFormFlag == kFormRange) {
154 readValue(packet, mMinimumValue);
155 readValue(packet, mMaximumValue);
156 readValue(packet, mStepSize);
157 } else if (mFormFlag == kFormEnum) {
158 mEnumLength = packet.getUInt16();
159 mEnumValues = new MtpPropertyValue[mEnumLength];
160 for (int i = 0; i < mEnumLength; i++)
161 readValue(packet, mEnumValues[i]);
162 }
163}
164
Mike Lockwood767c5e42010-06-30 17:00:35 -0400165void MtpProperty::write(MtpDataPacket& packet) {
Mike Lockwood564ff842010-09-25 08:37:59 -0400166 bool deviceProp = isDeviceProperty();
167
Mike Lockwood767c5e42010-06-30 17:00:35 -0400168 packet.putUInt16(mCode);
169 packet.putUInt16(mType);
170 packet.putUInt8(mWriteable ? 1 : 0);
171
172 switch (mType) {
173 case MTP_TYPE_AINT8:
174 case MTP_TYPE_AUINT8:
175 case MTP_TYPE_AINT16:
176 case MTP_TYPE_AUINT16:
177 case MTP_TYPE_AINT32:
178 case MTP_TYPE_AUINT32:
179 case MTP_TYPE_AINT64:
180 case MTP_TYPE_AUINT64:
181 case MTP_TYPE_AINT128:
182 case MTP_TYPE_AUINT128:
183 writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
Mike Lockwood564ff842010-09-25 08:37:59 -0400184 if (deviceProp)
185 writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
Mike Lockwood767c5e42010-06-30 17:00:35 -0400186 break;
187 default:
188 writeValue(packet, mDefaultValue);
Mike Lockwood564ff842010-09-25 08:37:59 -0400189 if (deviceProp)
190 writeValue(packet, mCurrentValue);
Mike Lockwood767c5e42010-06-30 17:00:35 -0400191 }
Mike Lockwood97c8d902010-08-09 14:49:28 -0400192 packet.putUInt32(mGroupCode);
Mike Lockwood564ff842010-09-25 08:37:59 -0400193 if (!deviceProp)
194 packet.putUInt8(mFormFlag);
Mike Lockwood767c5e42010-06-30 17:00:35 -0400195 if (mFormFlag == kFormRange) {
196 writeValue(packet, mMinimumValue);
197 writeValue(packet, mMaximumValue);
198 writeValue(packet, mStepSize);
199 } else if (mFormFlag == kFormEnum) {
200 packet.putUInt16(mEnumLength);
201 for (int i = 0; i < mEnumLength; i++)
202 writeValue(packet, mEnumValues[i]);
203 }
204}
205
Mike Lockwood90f48732010-06-05 22:45:01 -0400206void MtpProperty::print() {
Mike Lockwood456d8e62010-07-27 11:50:34 -0400207 LOGV("MtpProperty %04X\n", mCode);
208 LOGV(" type %04X\n", mType);
209 LOGV(" writeable %s\n", (mWriteable ? "true" : "false"));
Mike Lockwood90f48732010-06-05 22:45:01 -0400210}
211
212void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400213 MtpStringBuffer stringBuffer;
214
Mike Lockwood90f48732010-06-05 22:45:01 -0400215 switch (mType) {
216 case MTP_TYPE_INT8:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400217 case MTP_TYPE_AINT8:
Mike Lockwood90f48732010-06-05 22:45:01 -0400218 value.i8 = packet.getInt8();
219 break;
220 case MTP_TYPE_UINT8:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400221 case MTP_TYPE_AUINT8:
Mike Lockwood90f48732010-06-05 22:45:01 -0400222 value.u8 = packet.getUInt8();
223 break;
224 case MTP_TYPE_INT16:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400225 case MTP_TYPE_AINT16:
Mike Lockwood90f48732010-06-05 22:45:01 -0400226 value.i16 = packet.getInt16();
227 break;
228 case MTP_TYPE_UINT16:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400229 case MTP_TYPE_AUINT16:
Mike Lockwood90f48732010-06-05 22:45:01 -0400230 value.u16 = packet.getUInt16();
231 break;
232 case MTP_TYPE_INT32:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400233 case MTP_TYPE_AINT32:
Mike Lockwood90f48732010-06-05 22:45:01 -0400234 value.i32 = packet.getInt32();
235 break;
236 case MTP_TYPE_UINT32:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400237 case MTP_TYPE_AUINT32:
Mike Lockwood90f48732010-06-05 22:45:01 -0400238 value.u32 = packet.getUInt32();
239 break;
240 case MTP_TYPE_INT64:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400241 case MTP_TYPE_AINT64:
Mike Lockwood90f48732010-06-05 22:45:01 -0400242 value.i64 = packet.getInt64();
243 break;
244 case MTP_TYPE_UINT64:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400245 case MTP_TYPE_AUINT64:
Mike Lockwood90f48732010-06-05 22:45:01 -0400246 value.u64 = packet.getUInt64();
247 break;
248 case MTP_TYPE_INT128:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400249 case MTP_TYPE_AINT128:
Mike Lockwood90f48732010-06-05 22:45:01 -0400250 packet.getInt128(value.i128);
251 break;
252 case MTP_TYPE_UINT128:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400253 case MTP_TYPE_AUINT128:
Mike Lockwood90f48732010-06-05 22:45:01 -0400254 packet.getUInt128(value.u128);
255 break;
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400256 case MTP_TYPE_STR:
257 packet.getString(stringBuffer);
258 value.str = strdup(stringBuffer);
259 break;
Mike Lockwood90f48732010-06-05 22:45:01 -0400260 default:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400261 LOGE("unknown type %04X in MtpProperty::readValue", mType);
Mike Lockwood90f48732010-06-05 22:45:01 -0400262 }
263}
264
Mike Lockwood767c5e42010-06-30 17:00:35 -0400265void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400266 MtpStringBuffer stringBuffer;
267
Mike Lockwood767c5e42010-06-30 17:00:35 -0400268 switch (mType) {
269 case MTP_TYPE_INT8:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400270 case MTP_TYPE_AINT8:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400271 packet.putInt8(value.i8);
272 break;
273 case MTP_TYPE_UINT8:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400274 case MTP_TYPE_AUINT8:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400275 packet.putUInt8(value.u8);
276 break;
277 case MTP_TYPE_INT16:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400278 case MTP_TYPE_AINT16:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400279 packet.putInt16(value.i16);
280 break;
281 case MTP_TYPE_UINT16:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400282 case MTP_TYPE_AUINT16:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400283 packet.putUInt16(value.u16);
284 break;
285 case MTP_TYPE_INT32:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400286 case MTP_TYPE_AINT32:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400287 packet.putInt32(value.i32);
288 break;
289 case MTP_TYPE_UINT32:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400290 case MTP_TYPE_AUINT32:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400291 packet.putUInt32(value.u32);
292 break;
293 case MTP_TYPE_INT64:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400294 case MTP_TYPE_AINT64:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400295 packet.putInt64(value.i64);
296 break;
297 case MTP_TYPE_UINT64:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400298 case MTP_TYPE_AUINT64:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400299 packet.putUInt64(value.u64);
300 break;
301 case MTP_TYPE_INT128:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400302 case MTP_TYPE_AINT128:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400303 packet.putInt128(value.i128);
304 break;
305 case MTP_TYPE_UINT128:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400306 case MTP_TYPE_AUINT128:
Mike Lockwood767c5e42010-06-30 17:00:35 -0400307 packet.putUInt128(value.u128);
308 break;
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400309 case MTP_TYPE_STR:
310 if (value.str)
311 packet.putString(value.str);
312 else
313 packet.putEmptyString();
314 break;
Mike Lockwood767c5e42010-06-30 17:00:35 -0400315 default:
Mike Lockwood9bbc2ea2010-07-20 09:47:41 -0400316 LOGE("unknown type %04X in MtpProperty::writeValue", mType);
Mike Lockwood767c5e42010-06-30 17:00:35 -0400317 }
318}
319
Mike Lockwood90f48732010-06-05 22:45:01 -0400320MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
321 length = packet.getUInt32();
322 if (length == 0)
323 return NULL;
324 MtpPropertyValue* result = new MtpPropertyValue[length];
325 for (int i = 0; i < length; i++)
326 readValue(packet, result[i]);
327 return result;
328}
329
Mike Lockwood767c5e42010-06-30 17:00:35 -0400330void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
331 packet.putUInt32(length);
332 for (int i = 0; i < length; i++)
333 writeValue(packet, values[i]);
334}
335
Mike Lockwood90f48732010-06-05 22:45:01 -0400336} // namespace android