blob: 1dc3ab835d447d82646608d0eb60bdd6f26f312d [file] [log] [blame]
Christopher Wiley775fa1f2015-09-22 15:00:12 -07001/*
2 * Copyright (C) 2015, 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#include "type_java.h"
The Android Open Source Project46c012c2008-10-21 07:00:00 -070018
David 'Digit' Turnera3372982014-03-04 16:43:41 +010019#include <sys/types.h>
20
Christopher Wileyfdeb0f42015-09-11 15:38:22 -070021namespace android {
22namespace aidl {
23
The Android Open Source Project46c012c2008-10-21 07:00:00 -070024Namespace NAMES;
25
26Type* VOID_TYPE;
27Type* BOOLEAN_TYPE;
28Type* BYTE_TYPE;
29Type* CHAR_TYPE;
30Type* INT_TYPE;
31Type* LONG_TYPE;
32Type* FLOAT_TYPE;
33Type* DOUBLE_TYPE;
34Type* STRING_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070035Type* OBJECT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070036Type* CHAR_SEQUENCE_TYPE;
37Type* TEXT_UTILS_TYPE;
38Type* REMOTE_EXCEPTION_TYPE;
39Type* RUNTIME_EXCEPTION_TYPE;
40Type* IBINDER_TYPE;
41Type* IINTERFACE_TYPE;
42Type* BINDER_NATIVE_TYPE;
43Type* BINDER_PROXY_TYPE;
44Type* PARCEL_TYPE;
45Type* PARCELABLE_INTERFACE_TYPE;
Joe Onoratoc596cfe2011-08-30 17:24:17 -070046Type* CONTEXT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070047Type* MAP_TYPE;
48Type* LIST_TYPE;
49Type* CLASSLOADER_TYPE;
50
51Expression* NULL_VALUE;
52Expression* THIS_VALUE;
53Expression* SUPER_VALUE;
54Expression* TRUE_VALUE;
55Expression* FALSE_VALUE;
56
Christopher Wileye6dee912015-09-22 14:50:23 -070057void register_base_types() {
58 VOID_TYPE = new BasicType("void", "XXX", "XXX", "XXX", "XXX", "XXX");
59 NAMES.Add(VOID_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070060
Christopher Wileye6dee912015-09-22 14:50:23 -070061 BOOLEAN_TYPE = new BooleanType();
62 NAMES.Add(BOOLEAN_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070063
Christopher Wileye6dee912015-09-22 14:50:23 -070064 BYTE_TYPE = new BasicType("byte", "writeByte", "readByte", "writeByteArray",
65 "createByteArray", "readByteArray");
66 NAMES.Add(BYTE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070067
Christopher Wileye6dee912015-09-22 14:50:23 -070068 CHAR_TYPE = new CharType();
69 NAMES.Add(CHAR_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070070
Christopher Wileye6dee912015-09-22 14:50:23 -070071 INT_TYPE = new BasicType("int", "writeInt", "readInt", "writeIntArray",
72 "createIntArray", "readIntArray");
73 NAMES.Add(INT_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070074
Christopher Wileye6dee912015-09-22 14:50:23 -070075 LONG_TYPE = new BasicType("long", "writeLong", "readLong", "writeLongArray",
76 "createLongArray", "readLongArray");
77 NAMES.Add(LONG_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070078
Christopher Wileye6dee912015-09-22 14:50:23 -070079 FLOAT_TYPE =
80 new BasicType("float", "writeFloat", "readFloat", "writeFloatArray",
81 "createFloatArray", "readFloatArray");
82 NAMES.Add(FLOAT_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070083
Christopher Wileye6dee912015-09-22 14:50:23 -070084 DOUBLE_TYPE =
85 new BasicType("double", "writeDouble", "readDouble", "writeDoubleArray",
86 "createDoubleArray", "readDoubleArray");
87 NAMES.Add(DOUBLE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070088
Christopher Wileye6dee912015-09-22 14:50:23 -070089 STRING_TYPE = new StringType();
90 NAMES.Add(STRING_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070091
Christopher Wileye6dee912015-09-22 14:50:23 -070092 OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false);
93 NAMES.Add(OBJECT_TYPE);
Joe Onoratoc596cfe2011-08-30 17:24:17 -070094
Christopher Wileye6dee912015-09-22 14:50:23 -070095 CHAR_SEQUENCE_TYPE = new CharSequenceType();
96 NAMES.Add(CHAR_SEQUENCE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070097
Christopher Wileye6dee912015-09-22 14:50:23 -070098 MAP_TYPE = new MapType();
99 NAMES.Add(MAP_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700100
Christopher Wileye6dee912015-09-22 14:50:23 -0700101 LIST_TYPE = new ListType();
102 NAMES.Add(LIST_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700103
Christopher Wileye6dee912015-09-22 14:50:23 -0700104 TEXT_UTILS_TYPE =
105 new Type("android.text", "TextUtils", Type::BUILT_IN, false, false);
106 NAMES.Add(TEXT_UTILS_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700107
Christopher Wileye6dee912015-09-22 14:50:23 -0700108 REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
109 NAMES.Add(REMOTE_EXCEPTION_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700110
Christopher Wileye6dee912015-09-22 14:50:23 -0700111 RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
112 NAMES.Add(RUNTIME_EXCEPTION_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700113
Christopher Wileye6dee912015-09-22 14:50:23 -0700114 IBINDER_TYPE = new IBinderType();
115 NAMES.Add(IBINDER_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700116
Christopher Wileye6dee912015-09-22 14:50:23 -0700117 IINTERFACE_TYPE = new IInterfaceType();
118 NAMES.Add(IINTERFACE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700119
Christopher Wileye6dee912015-09-22 14:50:23 -0700120 BINDER_NATIVE_TYPE = new BinderType();
121 NAMES.Add(BINDER_NATIVE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700122
Christopher Wileye6dee912015-09-22 14:50:23 -0700123 BINDER_PROXY_TYPE = new BinderProxyType();
124 NAMES.Add(BINDER_PROXY_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700125
Christopher Wileye6dee912015-09-22 14:50:23 -0700126 PARCEL_TYPE = new ParcelType();
127 NAMES.Add(PARCEL_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700128
Christopher Wileye6dee912015-09-22 14:50:23 -0700129 PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
130 NAMES.Add(PARCELABLE_INTERFACE_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700131
Christopher Wileye6dee912015-09-22 14:50:23 -0700132 CONTEXT_TYPE =
133 new Type("android.content", "Context", Type::BUILT_IN, false, false);
134 NAMES.Add(CONTEXT_TYPE);
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700135
Christopher Wileye6dee912015-09-22 14:50:23 -0700136 CLASSLOADER_TYPE = new ClassLoaderType();
137 NAMES.Add(CLASSLOADER_TYPE);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700138
Christopher Wileye6dee912015-09-22 14:50:23 -0700139 NULL_VALUE = new LiteralExpression("null");
140 THIS_VALUE = new LiteralExpression("this");
141 SUPER_VALUE = new LiteralExpression("super");
142 TRUE_VALUE = new LiteralExpression("true");
143 FALSE_VALUE = new LiteralExpression("false");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700144
Christopher Wileye6dee912015-09-22 14:50:23 -0700145 NAMES.AddGenericType("java.util", "List", 1);
146 NAMES.AddGenericType("java.util", "Map", 2);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700147}
148
Christopher Wileye6dee912015-09-22 14:50:23 -0700149static Type* make_generic_type(const string& package, const string& name,
150 const vector<Type*>& args) {
151 if (package == "java.util" && name == "List") {
152 return new GenericListType("java.util", "List", args);
153 }
154 return NULL;
155 // return new GenericType(package, name, args);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700156}
157
158// ================================================================
159
Casey Dahlin88868fc2015-09-01 13:21:26 -0700160Type::Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut)
Christopher Wileye6dee912015-09-22 14:50:23 -0700161 : m_package(),
162 m_name(name),
163 m_declFile(""),
164 m_declLine(-1),
165 m_kind(kind),
166 m_canWriteToParcel(canWriteToParcel),
167 m_canBeOut(canBeOut) {
168 m_qualifiedName = name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700169}
170
Christopher Wileye6dee912015-09-22 14:50:23 -0700171Type::Type(const string& package, const string& name, int kind,
172 bool canWriteToParcel, bool canBeOut, const string& declFile,
173 int declLine)
174 : m_package(package),
175 m_name(name),
176 m_declFile(declFile),
177 m_declLine(declLine),
178 m_kind(kind),
179 m_canWriteToParcel(canWriteToParcel),
180 m_canBeOut(canBeOut) {
181 if (package.length() > 0) {
182 m_qualifiedName = package;
183 m_qualifiedName += '.';
184 }
185 m_qualifiedName += name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700186}
187
Christopher Wileye6dee912015-09-22 14:50:23 -0700188Type::~Type() {}
189
190string Type::HumanReadableKind() const {
191 switch (Kind()) {
192 case INTERFACE:
193 return "an interface";
194 case USERDATA:
195 return "a user data";
196 default:
197 return "ERROR";
198 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700199}
200
Christopher Wileye6dee912015-09-22 14:50:23 -0700201bool Type::CanBeArray() const { return false; }
202
203string Type::ImportType() const { return m_qualifiedName; }
204
205string Type::CreatorName() const { return ""; }
206
207string Type::InstantiableName() const { return QualifiedName(); }
208
209void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700210 int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700211 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
212 __LINE__, m_qualifiedName.c_str());
213 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
214 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -0700215}
216
Christopher Wileye6dee912015-09-22 14:50:23 -0700217void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700218 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700219 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
220 __LINE__, m_qualifiedName.c_str());
221 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
222 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700223}
224
Christopher Wileye6dee912015-09-22 14:50:23 -0700225void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700226 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700227 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
228 __LINE__, m_qualifiedName.c_str());
229 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
230 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700231}
232
Christopher Wileye6dee912015-09-22 14:50:23 -0700233void Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700234 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700235 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
236 __LINE__, m_qualifiedName.c_str());
237 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error " +
238 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700239}
240
Christopher Wileye6dee912015-09-22 14:50:23 -0700241void Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700242 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700243 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
244 __LINE__, m_qualifiedName.c_str());
245 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error " +
246 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700247}
248
Christopher Wileye6dee912015-09-22 14:50:23 -0700249void Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700250 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700251 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
252 __LINE__, m_qualifiedName.c_str());
253 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error " +
254 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700255}
256
Christopher Wileye6dee912015-09-22 14:50:23 -0700257void Type::SetQualifiedName(const string& qualified) {
258 m_qualifiedName = qualified;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700259}
260
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700261Expression* Type::BuildWriteToParcelFlags(int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700262 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700263 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -0700264 }
265 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
266 return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
267 "PARCELABLE_WRITE_RETURN_VALUE");
268 }
269 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700270}
271
272// ================================================================
273
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700274BasicType::BasicType(const string& name, const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700275 const string& unmarshallParcel,
276 const string& writeArrayParcel,
277 const string& createArrayParcel,
278 const string& readArrayParcel)
279 : Type(name, BUILT_IN, true, false),
280 m_marshallParcel(marshallParcel),
281 m_unmarshallParcel(unmarshallParcel),
282 m_writeArrayParcel(writeArrayParcel),
283 m_createArrayParcel(createArrayParcel),
284 m_readArrayParcel(readArrayParcel) {}
285
286void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700287 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700288 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700289}
290
Christopher Wileye6dee912015-09-22 14:50:23 -0700291void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700292 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700293 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700294}
295
Christopher Wileye6dee912015-09-22 14:50:23 -0700296bool BasicType::CanBeArray() const { return true; }
297
298void BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700299 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700300 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700301}
302
Christopher Wileye6dee912015-09-22 14:50:23 -0700303void BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700304 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700305 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700306}
307
Christopher Wileye6dee912015-09-22 14:50:23 -0700308void BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700309 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700310 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700311}
312
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700313// ================================================================
314
Christopher Wileye6dee912015-09-22 14:50:23 -0700315BooleanType::BooleanType() : Type("boolean", BUILT_IN, true, false) {}
316
317void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700318 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700319 addTo->Add(new MethodCall(
320 parcel, "writeInt", 1,
321 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700322}
323
Christopher Wileye6dee912015-09-22 14:50:23 -0700324void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700325 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700326 addTo->Add(
327 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
328 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700329}
330
Christopher Wileye6dee912015-09-22 14:50:23 -0700331bool BooleanType::CanBeArray() const { return true; }
332
333void BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700334 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700335 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700336}
337
Christopher Wileye6dee912015-09-22 14:50:23 -0700338void BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700339 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700340 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700341}
342
Christopher Wileye6dee912015-09-22 14:50:23 -0700343void BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700344 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700345 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700346}
347
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700348// ================================================================
349
Christopher Wileye6dee912015-09-22 14:50:23 -0700350CharType::CharType() : Type("char", BUILT_IN, true, false) {}
351
352void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700353 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700354 addTo->Add(new MethodCall(parcel, "writeInt", 1, new Cast(INT_TYPE, v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700355}
356
Christopher Wileye6dee912015-09-22 14:50:23 -0700357void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700358 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700359 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700360}
361
Christopher Wileye6dee912015-09-22 14:50:23 -0700362bool CharType::CanBeArray() const { return true; }
363
364void CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700365 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700366 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700367}
368
Christopher Wileye6dee912015-09-22 14:50:23 -0700369void CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700370 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700371 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700372}
373
Christopher Wileye6dee912015-09-22 14:50:23 -0700374void CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700375 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700376 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700377}
378
379// ================================================================
380
Christopher Wileye6dee912015-09-22 14:50:23 -0700381StringType::StringType() : Type("java.lang", "String", BUILT_IN, true, false) {}
382
383string StringType::CreatorName() const {
384 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700385}
386
Christopher Wileye6dee912015-09-22 14:50:23 -0700387void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700388 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700389 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700390}
391
Christopher Wileye6dee912015-09-22 14:50:23 -0700392void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700393 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700394 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700395}
396
Christopher Wileye6dee912015-09-22 14:50:23 -0700397bool StringType::CanBeArray() const { return true; }
398
399void StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700400 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700401 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700402}
403
Christopher Wileye6dee912015-09-22 14:50:23 -0700404void StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700405 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700406 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700407}
408
Christopher Wileye6dee912015-09-22 14:50:23 -0700409void StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700410 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700411 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700412}
413
414// ================================================================
415
416CharSequenceType::CharSequenceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700417 : Type("java.lang", "CharSequence", BUILT_IN, true, false) {}
418
419string CharSequenceType::CreatorName() const {
420 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700421}
422
Christopher Wileye6dee912015-09-22 14:50:23 -0700423void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700424 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700425 // if (v != null) {
426 // parcel.writeInt(1);
427 // v.writeToParcel(parcel);
428 // } else {
429 // parcel.writeInt(0);
430 // }
431 IfStatement* elsepart = new IfStatement();
432 elsepart->statements->Add(
433 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
434 IfStatement* ifpart = new IfStatement;
435 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
436 ifpart->elseif = elsepart;
437 ifpart->statements->Add(
438 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
439 ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel", 3, v,
440 parcel,
441 BuildWriteToParcelFlags(flags)));
442
443 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700444}
445
Christopher Wileye6dee912015-09-22 14:50:23 -0700446void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700447 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700448 // if (0 != parcel.readInt()) {
449 // v = TextUtils.createFromParcel(parcel)
450 // } else {
451 // v = null;
452 // }
453 IfStatement* elsepart = new IfStatement();
454 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700455
Christopher Wileye6dee912015-09-22 14:50:23 -0700456 IfStatement* ifpart = new IfStatement();
457 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
458 new MethodCall(parcel, "readInt"));
459 ifpart->elseif = elsepart;
460 ifpart->statements->Add(new Assignment(
461 v, new MethodCall(TEXT_UTILS_TYPE,
462 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
463
464 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700465}
466
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700467// ================================================================
468
469RemoteExceptionType::RemoteExceptionType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700470 : Type("android.os", "RemoteException", BUILT_IN, false, false) {}
471
472void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700473 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700474 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700475}
476
Christopher Wileye6dee912015-09-22 14:50:23 -0700477void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700478 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700479 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700480}
481
482// ================================================================
483
484RuntimeExceptionType::RuntimeExceptionType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700485 : Type("java.lang", "RuntimeException", BUILT_IN, false, false) {}
486
487void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700488 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700489 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700490}
491
Christopher Wileye6dee912015-09-22 14:50:23 -0700492void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700493 Variable* parcel,
494 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700495 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700496}
497
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700498// ================================================================
499
500IBinderType::IBinderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700501 : Type("android.os", "IBinder", BUILT_IN, true, false) {}
502
503void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700504 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700505 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700506}
507
Christopher Wileye6dee912015-09-22 14:50:23 -0700508void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700509 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700510 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700511}
512
Christopher Wileye6dee912015-09-22 14:50:23 -0700513void IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700514 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700515 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700516}
517
Christopher Wileye6dee912015-09-22 14:50:23 -0700518void IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700519 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700520 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700521}
522
Christopher Wileye6dee912015-09-22 14:50:23 -0700523void IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700524 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700525 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700526}
527
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700528// ================================================================
529
530IInterfaceType::IInterfaceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700531 : Type("android.os", "IInterface", BUILT_IN, false, false) {}
532
533void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700534 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700535 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700536}
537
Christopher Wileye6dee912015-09-22 14:50:23 -0700538void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700539 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700540 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700541}
542
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700543// ================================================================
544
545BinderType::BinderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700546 : Type("android.os", "Binder", BUILT_IN, false, false) {}
547
548void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700549 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700550 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700551}
552
Christopher Wileye6dee912015-09-22 14:50:23 -0700553void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700554 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700555 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700556}
557
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700558// ================================================================
559
560BinderProxyType::BinderProxyType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700561 : Type("android.os", "BinderProxy", BUILT_IN, false, false) {}
562
563void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700564 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700565 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700566}
567
Christopher Wileye6dee912015-09-22 14:50:23 -0700568void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700569 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700570 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700571}
572
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700573// ================================================================
574
575ParcelType::ParcelType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700576 : Type("android.os", "Parcel", BUILT_IN, false, false) {}
577
578void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700579 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700580 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700581}
582
Christopher Wileye6dee912015-09-22 14:50:23 -0700583void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700584 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700585 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700586}
587
588// ================================================================
589
590ParcelableInterfaceType::ParcelableInterfaceType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700591 : Type("android.os", "Parcelable", BUILT_IN, false, false) {}
592
593void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700594 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700595 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700596}
597
Christopher Wileye6dee912015-09-22 14:50:23 -0700598void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
599 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700600 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700601 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700602}
603
604// ================================================================
605
Christopher Wileye6dee912015-09-22 14:50:23 -0700606MapType::MapType() : Type("java.util", "Map", BUILT_IN, true, true) {}
607
608void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700609 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700610 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700611}
612
Christopher Wileye6dee912015-09-22 14:50:23 -0700613static void EnsureClassLoader(StatementBlock* addTo, Variable** cl) {
614 // We don't want to look up the class loader once for every
615 // collection argument, so ensure we do it at most once per method.
616 if (*cl == NULL) {
617 *cl = new Variable(CLASSLOADER_TYPE, "cl");
618 addTo->Add(new VariableDeclaration(
619 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
620 CLASSLOADER_TYPE));
621 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700622}
623
Christopher Wileye6dee912015-09-22 14:50:23 -0700624void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700625 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700626 EnsureClassLoader(addTo, cl);
627 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700628}
629
Christopher Wileye6dee912015-09-22 14:50:23 -0700630void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700631 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700632 EnsureClassLoader(addTo, cl);
633 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700634}
635
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700636// ================================================================
637
Christopher Wileye6dee912015-09-22 14:50:23 -0700638ListType::ListType() : Type("java.util", "List", BUILT_IN, true, true) {}
639
640string ListType::InstantiableName() const { return "java.util.ArrayList"; }
641
642void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700643 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700644 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700645}
646
Christopher Wileye6dee912015-09-22 14:50:23 -0700647void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700648 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700649 EnsureClassLoader(addTo, cl);
650 addTo->Add(
651 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700652}
653
Christopher Wileye6dee912015-09-22 14:50:23 -0700654void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700655 Variable* parcel, Variable** cl) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700656 EnsureClassLoader(addTo, cl);
657 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700658}
659
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700660// ================================================================
661
Joe Onoratobaaf9c82011-10-09 22:31:16 -0700662UserDataType::UserDataType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700663 bool builtIn, bool canWriteToParcel,
664 const string& declFile, int declLine)
665 : Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, true,
666 declFile, declLine) {}
667
668string UserDataType::CreatorName() const {
669 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700670}
671
Christopher Wileye6dee912015-09-22 14:50:23 -0700672void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700673 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700674 // if (v != null) {
675 // parcel.writeInt(1);
676 // v.writeToParcel(parcel);
677 // } else {
678 // parcel.writeInt(0);
679 // }
680 IfStatement* elsepart = new IfStatement();
681 elsepart->statements->Add(
682 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
683 IfStatement* ifpart = new IfStatement;
684 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
685 ifpart->elseif = elsepart;
686 ifpart->statements->Add(
687 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
688 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
689 BuildWriteToParcelFlags(flags)));
690
691 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700692}
693
Christopher Wileye6dee912015-09-22 14:50:23 -0700694void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700695 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700696 // if (0 != parcel.readInt()) {
697 // v = CLASS.CREATOR.createFromParcel(parcel)
698 // } else {
699 // v = null;
700 // }
701 IfStatement* elsepart = new IfStatement();
702 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700703
Christopher Wileye6dee912015-09-22 14:50:23 -0700704 IfStatement* ifpart = new IfStatement();
705 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
706 new MethodCall(parcel, "readInt"));
707 ifpart->elseif = elsepart;
708 ifpart->statements->Add(new Assignment(
709 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
710
711 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700712}
713
Christopher Wileye6dee912015-09-22 14:50:23 -0700714void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700715 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700716 // TODO: really, we don't need to have this extra check, but we
717 // don't have two separate marshalling code paths
718 // if (0 != parcel.readInt()) {
719 // v.readFromParcel(parcel)
720 // }
721 IfStatement* ifpart = new IfStatement();
722 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
723 new MethodCall(parcel, "readInt"));
724 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
725 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700726}
727
Christopher Wileye6dee912015-09-22 14:50:23 -0700728bool UserDataType::CanBeArray() const { return true; }
729
730void UserDataType::WriteArrayToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700731 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700732 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
733 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700734}
735
Christopher Wileye6dee912015-09-22 14:50:23 -0700736void UserDataType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700737 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700738 string creator = v->type->QualifiedName() + ".CREATOR";
739 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
740 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700741}
742
Christopher Wileye6dee912015-09-22 14:50:23 -0700743void UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700744 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700745 string creator = v->type->QualifiedName() + ".CREATOR";
746 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
747 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700748}
749
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700750// ================================================================
751
752InterfaceType::InterfaceType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700753 bool builtIn, bool oneway, const string& declFile,
754 int declLine)
755 : Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, declFile,
756 declLine),
757 m_oneway(oneway) {}
758
759bool InterfaceType::OneWay() const { return m_oneway; }
760
761void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700762 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700763 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
764 addTo->Add(
765 new MethodCall(parcel, "writeStrongBinder", 1,
766 new Ternary(new Comparison(v, "!=", NULL_VALUE),
767 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700768}
769
Christopher Wileye6dee912015-09-22 14:50:23 -0700770void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700771 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700772 // v = Interface.asInterface(parcel.readStrongBinder());
773 string type = v->type->QualifiedName();
774 type += ".Stub";
775 addTo->Add(new Assignment(
776 v, new MethodCall(NAMES.Find(type), "asInterface", 1,
777 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700778}
779
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700780// ================================================================
781
782GenericType::GenericType(const string& package, const string& name,
783 const vector<Type*>& args)
Christopher Wileye6dee912015-09-22 14:50:23 -0700784 : Type(package, name, BUILT_IN, true, true) {
785 m_args = args;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700786
Christopher Wileye6dee912015-09-22 14:50:23 -0700787 m_importName = package + '.' + name;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700788
Christopher Wileye6dee912015-09-22 14:50:23 -0700789 string gen = "<";
790 int N = args.size();
791 for (int i = 0; i < N; i++) {
792 Type* t = args[i];
793 gen += t->QualifiedName();
794 if (i != N - 1) {
795 gen += ',';
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700796 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700797 }
798 gen += '>';
799 m_genericArguments = gen;
800 SetQualifiedName(m_importName + gen);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700801}
802
Christopher Wileye6dee912015-09-22 14:50:23 -0700803const vector<Type*>& GenericType::GenericArgumentTypes() const {
804 return m_args;
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700805}
806
Christopher Wileye6dee912015-09-22 14:50:23 -0700807string GenericType::GenericArguments() const { return m_genericArguments; }
808
809string GenericType::ImportType() const { return m_importName; }
810
811void GenericType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700812 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700813 fprintf(stderr, "implement GenericType::WriteToParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700814}
815
Christopher Wileye6dee912015-09-22 14:50:23 -0700816void GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700817 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700818 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700819}
820
Christopher Wileye6dee912015-09-22 14:50:23 -0700821void GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700822 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700823 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700824}
825
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700826// ================================================================
827
828GenericListType::GenericListType(const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700829 const vector<Type*>& args)
830 : GenericType(package, name, args), m_creator(args[0]->CreatorName()) {}
831
832string GenericListType::CreatorName() const {
833 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700834}
835
Christopher Wileye6dee912015-09-22 14:50:23 -0700836string GenericListType::InstantiableName() const {
837 return "java.util.ArrayList" + GenericArguments();
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700838}
839
Christopher Wileye6dee912015-09-22 14:50:23 -0700840void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700841 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700842 if (m_creator == STRING_TYPE->CreatorName()) {
843 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
844 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
845 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
846 } else {
847 // parcel.writeTypedListXX(arg);
848 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
849 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700850}
851
Christopher Wileye6dee912015-09-22 14:50:23 -0700852void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700853 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700854 if (m_creator == STRING_TYPE->CreatorName()) {
855 addTo->Add(
856 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
857 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
858 addTo->Add(
859 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
860 } else {
861 // v = _data.readTypedArrayList(XXX.creator);
862 addTo->Add(
863 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
864 new LiteralExpression(m_creator))));
865 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700866}
867
Christopher Wileye6dee912015-09-22 14:50:23 -0700868void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700869 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700870 if (m_creator == STRING_TYPE->CreatorName()) {
871 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
872 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
873 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
874 } else {
875 // v = _data.readTypedList(v, XXX.creator);
876 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
877 new LiteralExpression(m_creator)));
878 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700879}
880
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700881// ================================================================
882
883ClassLoaderType::ClassLoaderType()
Christopher Wileye6dee912015-09-22 14:50:23 -0700884 : Type("java.lang", "ClassLoader", BUILT_IN, false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700885
886// ================================================================
887
Christopher Wileye6dee912015-09-22 14:50:23 -0700888Namespace::Namespace() {}
889
890Namespace::~Namespace() {
891 int N = m_types.size();
892 for (int i = 0; i < N; i++) {
893 delete m_types[i];
894 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700895}
896
Christopher Wileye6dee912015-09-22 14:50:23 -0700897void Namespace::Add(Type* type) {
898 Type* t = Find(type->QualifiedName());
899 if (t == NULL) {
900 m_types.push_back(type);
901 }
902}
903
904void Namespace::AddGenericType(const string& package, const string& name,
905 int args) {
906 Generic g;
907 g.package = package;
908 g.name = name;
909 g.qualified = package + '.' + name;
910 g.args = args;
911 m_generics.push_back(g);
912}
913
914Type* Namespace::Find(const string& name) const {
915 int N = m_types.size();
916 for (int i = 0; i < N; i++) {
917 if (m_types[i]->QualifiedName() == name) {
918 return m_types[i];
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700919 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700920 }
921 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700922}
923
Christopher Wileye6dee912015-09-22 14:50:23 -0700924Type* Namespace::Find(const char* package, const char* name) const {
925 string s;
926 if (package != nullptr && *package != '\0') {
927 s += package;
928 s += '.';
929 }
930 s += name;
931 return Find(s);
932}
933
934static string normalize_generic(const string& s) {
935 string r;
936 int N = s.size();
937 for (int i = 0; i < N; i++) {
938 char c = s[i];
939 if (!isspace(c)) {
940 r += c;
941 }
942 }
943 return r;
944}
945
946Type* Namespace::Search(const string& name) {
947 // an exact match wins
948 Type* result = Find(name);
949 if (result != NULL) {
950 return result;
951 }
952
953 // try the class names
954 // our language doesn't allow you to not specify outer classes
955 // when referencing an inner class. that could be changed, and this
956 // would be the place to do it, but I don't think the complexity in
957 // scoping rules is worth it.
958 int N = m_types.size();
959 for (int i = 0; i < N; i++) {
960 if (m_types[i]->Name() == name) {
961 return m_types[i];
962 }
963 }
964
965 // we got to here and it's not a generic, give up
966 if (name.find('<') == name.npos) {
967 return NULL;
968 }
969
970 // remove any whitespace
971 string normalized = normalize_generic(name);
972
973 // find the part before the '<', find a generic for it
974 ssize_t baseIndex = normalized.find('<');
975 string base(normalized.c_str(), baseIndex);
976 const Generic* g = search_generic(base);
977 if (g == NULL) {
978 return NULL;
979 }
980
981 // For each of the args, do a recursive search on it. We don't allow
982 // generics within generics like Java does, because we're really limiting
983 // them to just built-in container classes, at least for now. Our syntax
984 // ensures this right now as well.
985 vector<Type*> args;
986 size_t start = baseIndex + 1;
987 size_t end = start;
988 while (normalized[start] != '\0') {
989 end = normalized.find(',', start);
990 if (end == normalized.npos) {
991 end = normalized.find('>', start);
992 }
993 string s(normalized.c_str() + start, end - start);
994 Type* t = this->Search(s);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700995 if (t == NULL) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700996 // maybe we should print a warning here?
997 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700998 }
Christopher Wileye6dee912015-09-22 14:50:23 -0700999 args.push_back(t);
1000 start = end + 1;
1001 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001002
Christopher Wileye6dee912015-09-22 14:50:23 -07001003 // construct a GenericType, add it to our name set so they always get
1004 // the same object, and return it.
1005 result = make_generic_type(g->package, g->name, args);
1006 if (result == NULL) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001007 return NULL;
Christopher Wileye6dee912015-09-22 14:50:23 -07001008 }
1009
1010 this->Add(result);
1011 return this->Find(result->QualifiedName());
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001012}
1013
Christopher Wileye6dee912015-09-22 14:50:23 -07001014const Namespace::Generic* Namespace::search_generic(const string& name) const {
1015 int N = m_generics.size();
1016
1017 // first exact match
1018 for (int i = 0; i < N; i++) {
1019 const Generic& g = m_generics[i];
1020 if (g.qualified == name) {
1021 return &g;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001022 }
Christopher Wileye6dee912015-09-22 14:50:23 -07001023 }
1024
1025 // then name match
1026 for (int i = 0; i < N; i++) {
1027 const Generic& g = m_generics[i];
1028 if (g.name == name) {
1029 return &g;
1030 }
1031 }
1032
1033 return NULL;
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001034}
1035
Christopher Wileye6dee912015-09-22 14:50:23 -07001036void Namespace::Dump() const {
1037 int n = m_types.size();
1038 for (int i = 0; i < n; i++) {
1039 Type* t = m_types[i];
1040 printf("type: package=%s name=%s qualifiedName=%s\n", t->Package().c_str(),
1041 t->Name().c_str(), t->QualifiedName().c_str());
1042 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001043}
Christopher Wileyfdeb0f42015-09-11 15:38:22 -07001044
1045} // namespace aidl
1046} // namespace android