blob: b792ba7a1c9404bbfbf4606d1d131924669c405a [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
Elliott Hughes0a620672015-12-04 13:53:18 -080021#include <android-base/strings.h>
Christopher Wiley4582ecb2015-09-25 13:27:45 -070022
Christopher Wiley84c1eac2015-09-23 13:29:28 -070023#include "aidl_language.h"
24#include "logging.h"
25
Christopher Wiley12e894a2016-01-29 11:55:07 -080026using std::string;
Christopher Wiley4582ecb2015-09-25 13:27:45 -070027using android::base::Split;
28using android::base::Join;
29using android::base::Trim;
30
Christopher Wileyfdeb0f42015-09-11 15:38:22 -070031namespace android {
32namespace aidl {
Christopher Wileydb154a52015-09-28 16:32:25 -070033namespace java {
Christopher Wileyfdeb0f42015-09-11 15:38:22 -070034
The Android Open Source Project46c012c2008-10-21 07:00:00 -070035Expression* NULL_VALUE;
36Expression* THIS_VALUE;
37Expression* SUPER_VALUE;
38Expression* TRUE_VALUE;
39Expression* FALSE_VALUE;
40
The Android Open Source Project46c012c2008-10-21 07:00:00 -070041// ================================================================
42
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070043Type::Type(const JavaTypeNamespace* types, const string& name, int kind,
44 bool canWriteToParcel, bool canBeOut)
Christopher Wiley09af4692015-10-30 11:48:25 -070045 : Type(types, "", name, kind, canWriteToParcel, canBeOut, "", -1) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -070046
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070047Type::Type(const JavaTypeNamespace* types, const string& package,
Christopher Wiley09af4692015-10-30 11:48:25 -070048 const string& name, int kind, bool canWriteToParcel,
49 bool canBeOut, const string& declFile, int declLine)
50 : ValidatableType(kind, package, name, declFile, declLine),
51 m_types(types),
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070052 m_package(package),
Christopher Wileye6dee912015-09-22 14:50:23 -070053 m_name(name),
Christopher Wileye6dee912015-09-22 14:50:23 -070054 m_canWriteToParcel(canWriteToParcel),
55 m_canBeOut(canBeOut) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -070056}
57
Christopher Wileye6dee912015-09-22 14:50:23 -070058string Type::CreatorName() const { return ""; }
59
60string Type::InstantiableName() const { return QualifiedName(); }
61
62void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070063 int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070064 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
65 __LINE__, m_qualifiedName.c_str());
66 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
67 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -070068}
69
Christopher Wileye6dee912015-09-22 14:50:23 -070070void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070071 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070072 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
73 __LINE__, m_qualifiedName.c_str());
74 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
75 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -070076}
77
Christopher Wileye6dee912015-09-22 14:50:23 -070078void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070079 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070080 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
81 __LINE__, m_qualifiedName.c_str());
82 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
83 m_qualifiedName + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -070084}
85
Christopher Wiley3637a4d2015-09-22 15:37:59 -070086Expression* Type::BuildWriteToParcelFlags(int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070087 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -070088 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -070089 }
90 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -070091 return new FieldVariable(m_types->ParcelableInterfaceType(),
Christopher Wileye6dee912015-09-22 14:50:23 -070092 "PARCELABLE_WRITE_RETURN_VALUE");
93 }
94 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -070095}
96
97// ================================================================
98
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070099BasicType::BasicType(const JavaTypeNamespace* types, const string& name,
100 const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700101 const string& unmarshallParcel,
102 const string& writeArrayParcel,
103 const string& createArrayParcel,
104 const string& readArrayParcel)
Christopher Wiley09af4692015-10-30 11:48:25 -0700105 : Type(types, name, ValidatableType::KIND_BUILT_IN, true, false),
Christopher Wileye6dee912015-09-22 14:50:23 -0700106 m_marshallParcel(marshallParcel),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800107 m_unmarshallParcel(unmarshallParcel) {
108 m_array_type.reset(new BasicArrayType(types, name, writeArrayParcel,
109 createArrayParcel, readArrayParcel));
110}
Christopher Wileye6dee912015-09-22 14:50:23 -0700111
112void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700113 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700114 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700115}
116
Christopher Wileye6dee912015-09-22 14:50:23 -0700117void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700118 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700119 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700120}
121
Casey Dahlina2f77c42015-12-01 18:26:02 -0800122BasicArrayType::BasicArrayType(const JavaTypeNamespace* types,
123 const string& name,
124 const string& writeArrayParcel,
125 const string& createArrayParcel,
126 const string& readArrayParcel)
Casey Dahlin57dbe242015-12-04 11:44:02 -0800127 : Type(types, name, ValidatableType::KIND_BUILT_IN, true, true),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800128 m_writeArrayParcel(writeArrayParcel),
129 m_createArrayParcel(createArrayParcel),
130 m_readArrayParcel(readArrayParcel) {}
131
132
133void BasicArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700134 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700135 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700136}
137
Casey Dahlina2f77c42015-12-01 18:26:02 -0800138void BasicArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700139 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700140 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700141}
142
Casey Dahlina2f77c42015-12-01 18:26:02 -0800143void BasicArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700144 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700145 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700146}
147
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700148// ================================================================
149
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800150FileDescriptorType::FileDescriptorType(const JavaTypeNamespace* types)
151 : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800152 true, false) {
153 m_array_type.reset(new FileDescriptorArrayType(types));
154}
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800155
156void FileDescriptorType::WriteToParcel(StatementBlock* addTo, Variable* v,
157 Variable* parcel, int flags) const {
158 addTo->Add(new MethodCall(parcel, "writeRawFileDescriptor", 1, v));
159}
160
161void FileDescriptorType::CreateFromParcel(StatementBlock* addTo, Variable* v,
162 Variable* parcel, Variable**) const {
163 addTo->Add(new Assignment(v, new MethodCall(parcel, "readRawFileDescriptor")));
164}
165
Casey Dahlina2f77c42015-12-01 18:26:02 -0800166FileDescriptorArrayType::FileDescriptorArrayType(const JavaTypeNamespace* types)
167 : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN,
168 true, true) {}
169
170void FileDescriptorArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800171 Variable* parcel, int flags) const {
172 addTo->Add(new MethodCall(parcel, "writeRawFileDescriptorArray", 1, v));
173}
174
Casey Dahlina2f77c42015-12-01 18:26:02 -0800175void FileDescriptorArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800176 Variable* parcel, Variable**) const {
177 addTo->Add(new Assignment(v, new MethodCall(parcel, "createRawFileDescriptorArray")));
178}
179
Casey Dahlina2f77c42015-12-01 18:26:02 -0800180void FileDescriptorArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800181 Variable* parcel, Variable**) const {
182 addTo->Add(new MethodCall(parcel, "readRawFileDescriptorArray", 1, v));
183}
184
185// ================================================================
186
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700187BooleanType::BooleanType(const JavaTypeNamespace* types)
Casey Dahlina2f77c42015-12-01 18:26:02 -0800188 : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true, false) {
189 m_array_type.reset(new BooleanArrayType(types));
190}
Christopher Wileye6dee912015-09-22 14:50:23 -0700191
192void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700193 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700194 addTo->Add(new MethodCall(
195 parcel, "writeInt", 1,
196 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700197}
198
Christopher Wileye6dee912015-09-22 14:50:23 -0700199void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700200 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700201 addTo->Add(
202 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
203 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700204}
205
Casey Dahlina2f77c42015-12-01 18:26:02 -0800206BooleanArrayType::BooleanArrayType(const JavaTypeNamespace* types)
207 : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true, true) {}
208
209void BooleanArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700210 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700211 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700212}
213
Casey Dahlina2f77c42015-12-01 18:26:02 -0800214void BooleanArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700215 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700216 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700217}
218
Casey Dahlina2f77c42015-12-01 18:26:02 -0800219void BooleanArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700220 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700221 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700222}
223
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700224// ================================================================
225
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700226CharType::CharType(const JavaTypeNamespace* types)
Casey Dahlina2f77c42015-12-01 18:26:02 -0800227 : Type(types, "char", ValidatableType::KIND_BUILT_IN, true, false) {
228 m_array_type.reset(new CharArrayType(types));
229}
Christopher Wileye6dee912015-09-22 14:50:23 -0700230
231void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700232 Variable* parcel, int flags) const {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700233 addTo->Add(
234 new MethodCall(parcel, "writeInt", 1, new Cast(m_types->IntType(), v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700235}
236
Christopher Wileye6dee912015-09-22 14:50:23 -0700237void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700238 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700239 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700240}
241
Casey Dahlina2f77c42015-12-01 18:26:02 -0800242CharArrayType::CharArrayType(const JavaTypeNamespace* types)
243 : Type(types, "char", ValidatableType::KIND_BUILT_IN, true, true) {}
244
245void CharArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700246 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700247 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700248}
249
Casey Dahlina2f77c42015-12-01 18:26:02 -0800250void CharArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700251 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700252 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700253}
254
Casey Dahlina2f77c42015-12-01 18:26:02 -0800255void CharArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700256 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700257 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700258}
259
260// ================================================================
261
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700262StringType::StringType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700263 : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800264 true, false) {
265 m_array_type.reset(new StringArrayType(types));
266}
Christopher Wileye6dee912015-09-22 14:50:23 -0700267
268string StringType::CreatorName() const {
269 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700270}
271
Christopher Wileye6dee912015-09-22 14:50:23 -0700272void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700273 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700274 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700275}
276
Christopher Wileye6dee912015-09-22 14:50:23 -0700277void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700278 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700279 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700280}
281
Casey Dahlina2f77c42015-12-01 18:26:02 -0800282StringArrayType::StringArrayType(const JavaTypeNamespace* types)
283 : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN,
284 true, true) {}
285
286string StringArrayType::CreatorName() const {
287 return "android.os.Parcel.STRING_CREATOR";
288}
289
290void StringArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700291 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700292 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700293}
294
Casey Dahlina2f77c42015-12-01 18:26:02 -0800295void StringArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700296 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700297 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700298}
299
Casey Dahlina2f77c42015-12-01 18:26:02 -0800300void StringArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700301 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700302 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700303}
304
305// ================================================================
306
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700307CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700308 : Type(types, "java.lang", "CharSequence", ValidatableType::KIND_BUILT_IN,
309 true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700310
311string CharSequenceType::CreatorName() const {
312 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700313}
314
Christopher Wileye6dee912015-09-22 14:50:23 -0700315void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700316 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700317 // if (v != null) {
318 // parcel.writeInt(1);
319 // v.writeToParcel(parcel);
320 // } else {
321 // parcel.writeInt(0);
322 // }
323 IfStatement* elsepart = new IfStatement();
324 elsepart->statements->Add(
325 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
326 IfStatement* ifpart = new IfStatement;
327 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
328 ifpart->elseif = elsepart;
329 ifpart->statements->Add(
330 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700331 ifpart->statements->Add(new MethodCall(m_types->TextUtilsType(),
332 "writeToParcel", 3, v, parcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700333 BuildWriteToParcelFlags(flags)));
334
335 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700336}
337
Christopher Wileye6dee912015-09-22 14:50:23 -0700338void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700339 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700340 // if (0 != parcel.readInt()) {
341 // v = TextUtils.createFromParcel(parcel)
342 // } else {
343 // v = null;
344 // }
345 IfStatement* elsepart = new IfStatement();
346 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700347
Christopher Wileye6dee912015-09-22 14:50:23 -0700348 IfStatement* ifpart = new IfStatement();
349 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
350 new MethodCall(parcel, "readInt"));
351 ifpart->elseif = elsepart;
352 ifpart->statements->Add(new Assignment(
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700353 v, new MethodCall(m_types->TextUtilsType(),
Christopher Wileye6dee912015-09-22 14:50:23 -0700354 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
355
356 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700357}
358
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700359// ================================================================
360
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700361RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700362 : Type(types, "android.os", "RemoteException",
363 ValidatableType::KIND_BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700364
365void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700366 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700367 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700368}
369
Christopher Wileye6dee912015-09-22 14:50:23 -0700370void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700371 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700372 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700373}
374
375// ================================================================
376
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700377RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700378 : Type(types, "java.lang", "RuntimeException",
379 ValidatableType::KIND_BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700380
381void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700382 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700383 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700384}
385
Christopher Wileye6dee912015-09-22 14:50:23 -0700386void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700387 Variable* parcel,
388 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700389 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700390}
391
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700392// ================================================================
393
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700394IBinderType::IBinderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700395 : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800396 true, false) {
397 m_array_type.reset(new IBinderArrayType(types));
398}
Christopher Wileye6dee912015-09-22 14:50:23 -0700399
400void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700401 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700402 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700403}
404
Christopher Wileye6dee912015-09-22 14:50:23 -0700405void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700406 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700407 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700408}
409
Casey Dahlina2f77c42015-12-01 18:26:02 -0800410IBinderArrayType::IBinderArrayType(const JavaTypeNamespace* types)
411 : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN,
412 true, true) {}
413
414void IBinderArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700415 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700416 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700417}
418
Casey Dahlina2f77c42015-12-01 18:26:02 -0800419void IBinderArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700420 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700421 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700422}
423
Casey Dahlina2f77c42015-12-01 18:26:02 -0800424void IBinderArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700425 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700426 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700427}
428
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700429// ================================================================
430
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700431IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700432 : Type(types, "android.os", "IInterface", ValidatableType::KIND_BUILT_IN,
433 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700434
435void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700436 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700437 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700438}
439
Christopher Wileye6dee912015-09-22 14:50:23 -0700440void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700441 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700442 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700443}
444
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700445// ================================================================
446
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700447BinderType::BinderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700448 : Type(types, "android.os", "Binder", ValidatableType::KIND_BUILT_IN,
449 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700450
451void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700452 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700453 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700454}
455
Christopher Wileye6dee912015-09-22 14:50:23 -0700456void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700457 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700458 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700459}
460
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700461// ================================================================
462
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700463BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700464 : Type(types, "android.os", "BinderProxy", ValidatableType::KIND_BUILT_IN,
465 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700466
467void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700468 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700469 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700470}
471
Christopher Wileye6dee912015-09-22 14:50:23 -0700472void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700473 Variable* parcel, Variable**) 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
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700477// ================================================================
478
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700479ParcelType::ParcelType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700480 : Type(types, "android.os", "Parcel", ValidatableType::KIND_BUILT_IN,
481 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700482
483void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700484 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700485 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700486}
487
Christopher Wileye6dee912015-09-22 14:50:23 -0700488void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700489 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700490 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700491}
492
493// ================================================================
494
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700495ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700496 : Type(types, "android.os", "Parcelable", ValidatableType::KIND_BUILT_IN,
497 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700498
499void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700500 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700501 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700502}
503
Christopher Wileye6dee912015-09-22 14:50:23 -0700504void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
505 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700506 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700507 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700508}
509
510// ================================================================
511
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700512MapType::MapType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700513 : Type(types, "java.util", "Map", ValidatableType::KIND_BUILT_IN,
514 true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700515
516void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700517 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700518 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700519}
520
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700521static void EnsureClassLoader(StatementBlock* addTo, Variable** cl,
522 const JavaTypeNamespace* types) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700523 // We don't want to look up the class loader once for every
524 // collection argument, so ensure we do it at most once per method.
525 if (*cl == NULL) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700526 *cl = new Variable(types->ClassLoaderType(), "cl");
Christopher Wileye6dee912015-09-22 14:50:23 -0700527 addTo->Add(new VariableDeclaration(
528 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700529 types->ClassLoaderType()));
Christopher Wileye6dee912015-09-22 14:50:23 -0700530 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700531}
532
Christopher Wileye6dee912015-09-22 14:50:23 -0700533void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700534 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700535 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700536 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700537}
538
Christopher Wileye6dee912015-09-22 14:50:23 -0700539void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700540 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700541 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700542 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700543}
544
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700545// ================================================================
546
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700547ListType::ListType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700548 : Type(types, "java.util", "List", ValidatableType::KIND_BUILT_IN,
549 true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700550
551string ListType::InstantiableName() const { return "java.util.ArrayList"; }
552
553void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700554 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700555 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700556}
557
Christopher Wileye6dee912015-09-22 14:50:23 -0700558void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700559 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700560 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700561 addTo->Add(
562 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700563}
564
Christopher Wileye6dee912015-09-22 14:50:23 -0700565void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700566 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700567 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700568 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700569}
570
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700571// ================================================================
572
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700573UserDataType::UserDataType(const JavaTypeNamespace* types,
574 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700575 bool builtIn, bool canWriteToParcel,
576 const string& declFile, int declLine)
Christopher Wiley09af4692015-10-30 11:48:25 -0700577 : Type(types, package, name,
578 builtIn ? ValidatableType::KIND_BUILT_IN
579 : ValidatableType::KIND_PARCELABLE,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800580 canWriteToParcel, true, declFile, declLine) {
581 m_array_type.reset(new UserDataArrayType(types, package, name, builtIn,
582 canWriteToParcel, declFile,
583 declLine));
584}
Christopher Wileye6dee912015-09-22 14:50:23 -0700585
586string UserDataType::CreatorName() const {
587 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700588}
589
Christopher Wileye6dee912015-09-22 14:50:23 -0700590void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700591 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700592 // if (v != null) {
593 // parcel.writeInt(1);
594 // v.writeToParcel(parcel);
595 // } else {
596 // parcel.writeInt(0);
597 // }
598 IfStatement* elsepart = new IfStatement();
599 elsepart->statements->Add(
600 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
601 IfStatement* ifpart = new IfStatement;
602 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
603 ifpart->elseif = elsepart;
604 ifpart->statements->Add(
605 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
606 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
607 BuildWriteToParcelFlags(flags)));
608
609 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700610}
611
Christopher Wileye6dee912015-09-22 14:50:23 -0700612void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700613 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700614 // if (0 != parcel.readInt()) {
615 // v = CLASS.CREATOR.createFromParcel(parcel)
616 // } else {
617 // v = null;
618 // }
619 IfStatement* elsepart = new IfStatement();
620 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700621
Christopher Wileye6dee912015-09-22 14:50:23 -0700622 IfStatement* ifpart = new IfStatement();
623 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
624 new MethodCall(parcel, "readInt"));
625 ifpart->elseif = elsepart;
626 ifpart->statements->Add(new Assignment(
627 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
628
629 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700630}
631
Christopher Wileye6dee912015-09-22 14:50:23 -0700632void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700633 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700634 // TODO: really, we don't need to have this extra check, but we
635 // don't have two separate marshalling code paths
636 // if (0 != parcel.readInt()) {
637 // v.readFromParcel(parcel)
638 // }
639 IfStatement* ifpart = new IfStatement();
640 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
641 new MethodCall(parcel, "readInt"));
642 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
643 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700644}
645
Casey Dahlina2f77c42015-12-01 18:26:02 -0800646UserDataArrayType::UserDataArrayType(const JavaTypeNamespace* types,
647 const string& package, const string& name,
648 bool builtIn, bool canWriteToParcel,
649 const string& declFile, int declLine)
650 : Type(types, package, name,
651 builtIn ? ValidatableType::KIND_BUILT_IN
652 : ValidatableType::KIND_PARCELABLE,
653 canWriteToParcel, true, declFile, declLine) {}
654
655string UserDataArrayType::CreatorName() const {
656 return QualifiedName() + ".CREATOR";
657}
658
659void UserDataArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700660 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700661 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
662 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700663}
664
Casey Dahlina2f77c42015-12-01 18:26:02 -0800665void UserDataArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700666 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700667 string creator = v->type->QualifiedName() + ".CREATOR";
668 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
669 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700670}
671
Casey Dahlina2f77c42015-12-01 18:26:02 -0800672void UserDataArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700673 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700674 string creator = v->type->QualifiedName() + ".CREATOR";
675 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
676 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700677}
678
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700679// ================================================================
680
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700681InterfaceType::InterfaceType(const JavaTypeNamespace* types,
682 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700683 bool builtIn, bool oneway, const string& declFile,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800684 int declLine, const Type* stub, const Type* proxy)
Christopher Wiley09af4692015-10-30 11:48:25 -0700685 : Type(types, package, name, builtIn ? ValidatableType::KIND_BUILT_IN
686 : ValidatableType::KIND_INTERFACE,
687 true, false, declFile, declLine),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800688 m_oneway(oneway),
689 stub_(stub),
690 proxy_(proxy) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700691
692bool InterfaceType::OneWay() const { return m_oneway; }
693
694void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700695 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700696 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
697 addTo->Add(
698 new MethodCall(parcel, "writeStrongBinder", 1,
699 new Ternary(new Comparison(v, "!=", NULL_VALUE),
700 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700701}
702
Christopher Wileye6dee912015-09-22 14:50:23 -0700703void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700704 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700705 // v = Interface.asInterface(parcel.readStrongBinder());
Christopher Wileye6dee912015-09-22 14:50:23 -0700706 addTo->Add(new Assignment(
Christopher Wiley9ab06232016-01-27 14:55:18 -0800707 v, new MethodCall(stub_, "asInterface", 1,
Christopher Wileye6dee912015-09-22 14:50:23 -0700708 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700709}
710
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700711// ================================================================
712
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700713GenericListType::GenericListType(const JavaTypeNamespace* types,
Christopher Wiley09af4692015-10-30 11:48:25 -0700714 const Type* contained_type)
715 : Type(types, "java.util", "List<" + contained_type->QualifiedName() + ">",
716 ValidatableType::KIND_BUILT_IN, true, true),
717 m_contained_type(contained_type),
718 m_creator(contained_type->CreatorName()) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700719
720string GenericListType::CreatorName() const {
721 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700722}
723
Christopher Wileye6dee912015-09-22 14:50:23 -0700724string GenericListType::InstantiableName() const {
Christopher Wiley09af4692015-10-30 11:48:25 -0700725 return "java.util.ArrayList<" + m_contained_type->QualifiedName() + ">";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700726}
727
Christopher Wileye6dee912015-09-22 14:50:23 -0700728void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700729 Variable* parcel, int flags) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700730 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700731 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700732 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700733 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
734 } else {
735 // parcel.writeTypedListXX(arg);
736 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
737 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700738}
739
Christopher Wileye6dee912015-09-22 14:50:23 -0700740void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700741 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700742 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700743 addTo->Add(
744 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700745 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700746 addTo->Add(
747 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
748 } else {
749 // v = _data.readTypedArrayList(XXX.creator);
750 addTo->Add(
751 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
752 new LiteralExpression(m_creator))));
753 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700754}
755
Christopher Wileye6dee912015-09-22 14:50:23 -0700756void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700757 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700758 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700759 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700760 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700761 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
762 } else {
763 // v = _data.readTypedList(v, XXX.creator);
764 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
765 new LiteralExpression(m_creator)));
766 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700767}
768
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700769// ================================================================
770
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700771ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700772 : Type(types, "java.lang", "ClassLoader", ValidatableType::KIND_BUILT_IN,
773 false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700774
775// ================================================================
776
Christopher Wiley56799522015-10-31 10:17:04 -0700777void JavaTypeNamespace::Init() {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700778 Add(new BasicType(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700779
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700780 m_bool_type = new BooleanType(this);
781 Add(m_bool_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700782
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700783 Add(new BasicType(this, "byte", "writeByte", "readByte", "writeByteArray",
784 "createByteArray", "readByteArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700785
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700786 Add(new CharType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700787
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700788 m_int_type = new BasicType(this, "int", "writeInt", "readInt",
789 "writeIntArray", "createIntArray", "readIntArray");
790 Add(m_int_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700791
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700792 Add(new BasicType(this, "long", "writeLong", "readLong", "writeLongArray",
793 "createLongArray", "readLongArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700794
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700795 Add(new BasicType(this, "float", "writeFloat", "readFloat", "writeFloatArray",
796 "createFloatArray", "readFloatArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700797
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700798 Add(new BasicType(this, "double", "writeDouble", "readDouble",
799 "writeDoubleArray", "createDoubleArray",
800 "readDoubleArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700801
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700802 m_string_type = new class StringType(this);
803 Add(m_string_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700804
Christopher Wiley09af4692015-10-30 11:48:25 -0700805 Add(new Type(this, "java.lang", "Object", ValidatableType::KIND_BUILT_IN,
806 false, false));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700807
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800808 Add(new FileDescriptorType(this));
809
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700810 Add(new CharSequenceType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700811
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700812 Add(new MapType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700813
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700814 Add(new ListType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700815
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700816 m_text_utils_type =
Christopher Wiley09af4692015-10-30 11:48:25 -0700817 new Type(this, "android.text", "TextUtils",
818 ValidatableType::KIND_BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700819 Add(m_text_utils_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700820
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700821 m_remote_exception_type = new class RemoteExceptionType(this);
822 Add(m_remote_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700823
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700824 m_runtime_exception_type = new class RuntimeExceptionType(this);
825 Add(m_runtime_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700826
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700827 m_ibinder_type = new class IBinderType(this);
828 Add(m_ibinder_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700829
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700830 m_iinterface_type = new class IInterfaceType(this);
831 Add(m_iinterface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700832
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700833 m_binder_native_type = new class BinderType(this);
834 Add(m_binder_native_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700835
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700836 m_binder_proxy_type = new class BinderProxyType(this);
837 Add(m_binder_proxy_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700838
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700839 m_parcel_type = new class ParcelType(this);
840 Add(m_parcel_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700841
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700842 m_parcelable_interface_type = new class ParcelableInterfaceType(this);
843 Add(m_parcelable_interface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700844
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700845 m_context_type = new class Type(this, "android.content", "Context",
Christopher Wiley09af4692015-10-30 11:48:25 -0700846 ValidatableType::KIND_BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700847 Add(m_context_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700848
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700849 m_classloader_type = new class ClassLoaderType(this);
850 Add(m_classloader_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700851
852 NULL_VALUE = new LiteralExpression("null");
853 THIS_VALUE = new LiteralExpression("this");
854 SUPER_VALUE = new LiteralExpression("super");
855 TRUE_VALUE = new LiteralExpression("true");
856 FALSE_VALUE = new LiteralExpression("false");
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700857}
Christopher Wileye6dee912015-09-22 14:50:23 -0700858
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800859bool JavaTypeNamespace::AddParcelableType(const AidlParcelable& p,
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700860 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700861 Type* type =
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800862 new UserDataType(this, p.GetPackage(), p.GetName(), false,
863 true, filename, p.GetLine());
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700864 return Add(type);
865}
866
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800867bool JavaTypeNamespace::AddBinderType(const AidlInterface& b,
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700868 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700869 // for interfaces, add the stub, proxy, and interface types.
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800870 Type* stub = new Type(this, b.GetPackage(),
871 b.GetName() + ".Stub", ValidatableType::KIND_GENERATED,
872 false, false, filename, b.GetLine());
873 Type* proxy = new Type(this, b.GetPackage(),
874 b.GetName() + ".Stub.Proxy",
Christopher Wiley09af4692015-10-30 11:48:25 -0700875 ValidatableType::KIND_GENERATED,
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800876 false, false, filename, b.GetLine());
Casey Dahlina2f77c42015-12-01 18:26:02 -0800877 Type* type =
878 new InterfaceType(this, b.GetPackage(), b.GetName(), false,
879 b.IsOneway(), filename, b.GetLine(), stub, proxy);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700880
881 bool success = true;
882 success &= Add(type);
883 success &= Add(stub);
884 success &= Add(proxy);
885 return success;
886}
887
Christopher Wileycd8e8972015-10-26 10:24:35 -0700888bool JavaTypeNamespace::AddListType(const std::string& contained_type_name) {
Christopher Wiley9ab06232016-01-27 14:55:18 -0800889 const Type* contained_type = FindTypeByCanonicalName(contained_type_name);
Christopher Wileycd8e8972015-10-26 10:24:35 -0700890 if (!contained_type) {
Christopher Wiley4582ecb2015-09-25 13:27:45 -0700891 return false;
Christopher Wileye6dee912015-09-22 14:50:23 -0700892 }
Christopher Wiley09af4692015-10-30 11:48:25 -0700893 Add(new GenericListType(this, contained_type));
Christopher Wiley4582ecb2015-09-25 13:27:45 -0700894 return true;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700895}
896
Christopher Wileycd8e8972015-10-26 10:24:35 -0700897bool JavaTypeNamespace::AddMapType(const string& key_type_name,
898 const string& value_type_name) {
899 LOG(ERROR) << "Don't know how to create a Map<K,V> container.";
900 return false;
901}
902
Christopher Wileydb154a52015-09-28 16:32:25 -0700903} // namespace java
Christopher Wileyfdeb0f42015-09-11 15:38:22 -0700904} // namespace aidl
905} // namespace android