blob: 18d27a24ce387c6128b330c156b9a5848db418df [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 Wileyd21bfee2016-01-29 15:11:38 -080052 m_javaType((package.empty()) ? name : package + "." + name),
Christopher Wileye6dee912015-09-22 14:50:23 -070053 m_canWriteToParcel(canWriteToParcel),
54 m_canBeOut(canBeOut) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -070055}
56
Christopher Wileye6dee912015-09-22 14:50:23 -070057string Type::CreatorName() const { return ""; }
58
Christopher Wileyd21bfee2016-01-29 15:11:38 -080059string Type::InstantiableName() const { return JavaType(); }
Christopher Wileye6dee912015-09-22 14:50:23 -070060
61void Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070062 int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070063 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn", __FILE__,
Christopher Wileyd21bfee2016-01-29 15:11:38 -080064 __LINE__, m_javaType.c_str());
65 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_javaType +
Christopher Wileye6dee912015-09-22 14:50:23 -070066 " */"));
Christopher Wileyf690be52015-09-14 15:19:10 -070067}
68
Christopher Wileye6dee912015-09-22 14:50:23 -070069void Type::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070070 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070071 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
Christopher Wileyd21bfee2016-01-29 15:11:38 -080072 __LINE__, m_javaType.c_str());
Christopher Wileye6dee912015-09-22 14:50:23 -070073 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
Christopher Wileyd21bfee2016-01-29 15:11:38 -080074 m_javaType + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -070075}
76
Christopher Wileye6dee912015-09-22 14:50:23 -070077void Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -070078 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070079 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", __FILE__,
Christopher Wileyd21bfee2016-01-29 15:11:38 -080080 __LINE__, m_javaType.c_str());
Christopher Wileye6dee912015-09-22 14:50:23 -070081 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
Christopher Wileyd21bfee2016-01-29 15:11:38 -080082 m_javaType + " */"));
The Android Open Source Project46c012c2008-10-21 07:00:00 -070083}
84
Christopher Wiley3637a4d2015-09-22 15:37:59 -070085Expression* Type::BuildWriteToParcelFlags(int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -070086 if (flags == 0) {
The Android Open Source Project46c012c2008-10-21 07:00:00 -070087 return new LiteralExpression("0");
Christopher Wileye6dee912015-09-22 14:50:23 -070088 }
89 if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -070090 return new FieldVariable(m_types->ParcelableInterfaceType(),
Christopher Wileye6dee912015-09-22 14:50:23 -070091 "PARCELABLE_WRITE_RETURN_VALUE");
92 }
93 return new LiteralExpression("0");
The Android Open Source Project46c012c2008-10-21 07:00:00 -070094}
95
96// ================================================================
97
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070098BasicType::BasicType(const JavaTypeNamespace* types, const string& name,
99 const string& marshallParcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700100 const string& unmarshallParcel,
101 const string& writeArrayParcel,
102 const string& createArrayParcel,
103 const string& readArrayParcel)
Christopher Wiley09af4692015-10-30 11:48:25 -0700104 : Type(types, name, ValidatableType::KIND_BUILT_IN, true, false),
Christopher Wileye6dee912015-09-22 14:50:23 -0700105 m_marshallParcel(marshallParcel),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800106 m_unmarshallParcel(unmarshallParcel) {
107 m_array_type.reset(new BasicArrayType(types, name, writeArrayParcel,
108 createArrayParcel, readArrayParcel));
109}
Christopher Wileye6dee912015-09-22 14:50:23 -0700110
111void BasicType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700112 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700113 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700114}
115
Christopher Wileye6dee912015-09-22 14:50:23 -0700116void BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700117 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700118 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700119}
120
Casey Dahlina2f77c42015-12-01 18:26:02 -0800121BasicArrayType::BasicArrayType(const JavaTypeNamespace* types,
122 const string& name,
123 const string& writeArrayParcel,
124 const string& createArrayParcel,
125 const string& readArrayParcel)
Casey Dahlin57dbe242015-12-04 11:44:02 -0800126 : Type(types, name, ValidatableType::KIND_BUILT_IN, true, true),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800127 m_writeArrayParcel(writeArrayParcel),
128 m_createArrayParcel(createArrayParcel),
129 m_readArrayParcel(readArrayParcel) {}
130
131
132void BasicArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700133 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700134 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700135}
136
Casey Dahlina2f77c42015-12-01 18:26:02 -0800137void BasicArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700138 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700139 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700140}
141
Casey Dahlina2f77c42015-12-01 18:26:02 -0800142void BasicArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700143 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700144 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700145}
146
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700147// ================================================================
148
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800149FileDescriptorType::FileDescriptorType(const JavaTypeNamespace* types)
150 : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800151 true, false) {
152 m_array_type.reset(new FileDescriptorArrayType(types));
153}
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800154
155void FileDescriptorType::WriteToParcel(StatementBlock* addTo, Variable* v,
156 Variable* parcel, int flags) const {
157 addTo->Add(new MethodCall(parcel, "writeRawFileDescriptor", 1, v));
158}
159
160void FileDescriptorType::CreateFromParcel(StatementBlock* addTo, Variable* v,
161 Variable* parcel, Variable**) const {
162 addTo->Add(new Assignment(v, new MethodCall(parcel, "readRawFileDescriptor")));
163}
164
Casey Dahlina2f77c42015-12-01 18:26:02 -0800165FileDescriptorArrayType::FileDescriptorArrayType(const JavaTypeNamespace* types)
166 : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN,
167 true, true) {}
168
169void FileDescriptorArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800170 Variable* parcel, int flags) const {
171 addTo->Add(new MethodCall(parcel, "writeRawFileDescriptorArray", 1, v));
172}
173
Casey Dahlina2f77c42015-12-01 18:26:02 -0800174void FileDescriptorArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800175 Variable* parcel, Variable**) const {
176 addTo->Add(new Assignment(v, new MethodCall(parcel, "createRawFileDescriptorArray")));
177}
178
Casey Dahlina2f77c42015-12-01 18:26:02 -0800179void FileDescriptorArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800180 Variable* parcel, Variable**) const {
181 addTo->Add(new MethodCall(parcel, "readRawFileDescriptorArray", 1, v));
182}
183
184// ================================================================
185
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700186BooleanType::BooleanType(const JavaTypeNamespace* types)
Casey Dahlina2f77c42015-12-01 18:26:02 -0800187 : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true, false) {
188 m_array_type.reset(new BooleanArrayType(types));
189}
Christopher Wileye6dee912015-09-22 14:50:23 -0700190
191void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700192 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700193 addTo->Add(new MethodCall(
194 parcel, "writeInt", 1,
195 new Ternary(v, new LiteralExpression("1"), new LiteralExpression("0"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700196}
197
Christopher Wileye6dee912015-09-22 14:50:23 -0700198void BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700199 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700200 addTo->Add(
201 new Assignment(v, new Comparison(new LiteralExpression("0"), "!=",
202 new MethodCall(parcel, "readInt"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700203}
204
Casey Dahlina2f77c42015-12-01 18:26:02 -0800205BooleanArrayType::BooleanArrayType(const JavaTypeNamespace* types)
206 : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true, true) {}
207
208void BooleanArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700209 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700210 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700211}
212
Casey Dahlina2f77c42015-12-01 18:26:02 -0800213void BooleanArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700214 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700215 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700216}
217
Casey Dahlina2f77c42015-12-01 18:26:02 -0800218void BooleanArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700219 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700220 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700221}
222
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700223// ================================================================
224
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700225CharType::CharType(const JavaTypeNamespace* types)
Casey Dahlina2f77c42015-12-01 18:26:02 -0800226 : Type(types, "char", ValidatableType::KIND_BUILT_IN, true, false) {
227 m_array_type.reset(new CharArrayType(types));
228}
Christopher Wileye6dee912015-09-22 14:50:23 -0700229
230void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700231 Variable* parcel, int flags) const {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700232 addTo->Add(
233 new MethodCall(parcel, "writeInt", 1, new Cast(m_types->IntType(), v)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700234}
235
Christopher Wileye6dee912015-09-22 14:50:23 -0700236void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700237 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700238 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700239}
240
Casey Dahlina2f77c42015-12-01 18:26:02 -0800241CharArrayType::CharArrayType(const JavaTypeNamespace* types)
242 : Type(types, "char", ValidatableType::KIND_BUILT_IN, true, true) {}
243
244void CharArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700245 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700246 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700247}
248
Casey Dahlina2f77c42015-12-01 18:26:02 -0800249void CharArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700250 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700251 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700252}
253
Casey Dahlina2f77c42015-12-01 18:26:02 -0800254void CharArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700255 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700256 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700257}
258
259// ================================================================
260
Christopher Wiley9f403722016-01-27 16:04:11 -0800261StringType::StringType(const JavaTypeNamespace* types,
262 const std::string& package,
263 const std::string& class_name)
264 : Type(types, package, class_name,
265 ValidatableType::KIND_BUILT_IN, true, false) {
266 m_array_type.reset(new StringArrayType(types));
Casey Dahlina2f77c42015-12-01 18:26:02 -0800267}
Christopher Wileye6dee912015-09-22 14:50:23 -0700268
269string StringType::CreatorName() const {
270 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700271}
272
Christopher Wileye6dee912015-09-22 14:50:23 -0700273void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700274 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700275 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700276}
277
Christopher Wileye6dee912015-09-22 14:50:23 -0700278void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700279 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700280 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700281}
282
Casey Dahlina2f77c42015-12-01 18:26:02 -0800283StringArrayType::StringArrayType(const JavaTypeNamespace* types)
284 : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN,
285 true, true) {}
286
287string StringArrayType::CreatorName() const {
288 return "android.os.Parcel.STRING_CREATOR";
289}
290
291void StringArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700292 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700293 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700294}
295
Casey Dahlina2f77c42015-12-01 18:26:02 -0800296void StringArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700297 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700298 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700299}
300
Casey Dahlina2f77c42015-12-01 18:26:02 -0800301void StringArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700302 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700303 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700304}
305
306// ================================================================
307
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700308CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700309 : Type(types, "java.lang", "CharSequence", ValidatableType::KIND_BUILT_IN,
310 true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700311
312string CharSequenceType::CreatorName() const {
313 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700314}
315
Christopher Wileye6dee912015-09-22 14:50:23 -0700316void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700317 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700318 // if (v != null) {
319 // parcel.writeInt(1);
320 // v.writeToParcel(parcel);
321 // } else {
322 // parcel.writeInt(0);
323 // }
324 IfStatement* elsepart = new IfStatement();
325 elsepart->statements->Add(
326 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
327 IfStatement* ifpart = new IfStatement;
328 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
329 ifpart->elseif = elsepart;
330 ifpart->statements->Add(
331 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700332 ifpart->statements->Add(new MethodCall(m_types->TextUtilsType(),
333 "writeToParcel", 3, v, parcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700334 BuildWriteToParcelFlags(flags)));
335
336 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700337}
338
Christopher Wileye6dee912015-09-22 14:50:23 -0700339void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700340 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700341 // if (0 != parcel.readInt()) {
342 // v = TextUtils.createFromParcel(parcel)
343 // } else {
344 // v = null;
345 // }
346 IfStatement* elsepart = new IfStatement();
347 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700348
Christopher Wileye6dee912015-09-22 14:50:23 -0700349 IfStatement* ifpart = new IfStatement();
350 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
351 new MethodCall(parcel, "readInt"));
352 ifpart->elseif = elsepart;
353 ifpart->statements->Add(new Assignment(
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700354 v, new MethodCall(m_types->TextUtilsType(),
Christopher Wileye6dee912015-09-22 14:50:23 -0700355 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
356
357 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700358}
359
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700360// ================================================================
361
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700362RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700363 : Type(types, "android.os", "RemoteException",
364 ValidatableType::KIND_BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700365
366void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700367 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700368 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700369}
370
Christopher Wileye6dee912015-09-22 14:50:23 -0700371void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700372 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700373 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700374}
375
376// ================================================================
377
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700378RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700379 : Type(types, "java.lang", "RuntimeException",
380 ValidatableType::KIND_BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700381
382void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700383 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700384 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700385}
386
Christopher Wileye6dee912015-09-22 14:50:23 -0700387void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700388 Variable* parcel,
389 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700390 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700391}
392
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700393// ================================================================
394
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700395IBinderType::IBinderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700396 : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800397 true, false) {
398 m_array_type.reset(new IBinderArrayType(types));
399}
Christopher Wileye6dee912015-09-22 14:50:23 -0700400
401void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700402 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700403 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700404}
405
Christopher Wileye6dee912015-09-22 14:50:23 -0700406void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700407 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700408 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700409}
410
Casey Dahlina2f77c42015-12-01 18:26:02 -0800411IBinderArrayType::IBinderArrayType(const JavaTypeNamespace* types)
412 : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN,
413 true, true) {}
414
415void IBinderArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700416 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700417 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700418}
419
Casey Dahlina2f77c42015-12-01 18:26:02 -0800420void IBinderArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700421 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700422 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700423}
424
Casey Dahlina2f77c42015-12-01 18:26:02 -0800425void IBinderArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700426 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700427 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700428}
429
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700430// ================================================================
431
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700432IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700433 : Type(types, "android.os", "IInterface", ValidatableType::KIND_BUILT_IN,
434 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700435
436void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700437 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700438 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700439}
440
Christopher Wileye6dee912015-09-22 14:50:23 -0700441void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700442 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700443 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700444}
445
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700446// ================================================================
447
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700448BinderType::BinderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700449 : Type(types, "android.os", "Binder", ValidatableType::KIND_BUILT_IN,
450 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700451
452void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700453 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700454 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700455}
456
Christopher Wileye6dee912015-09-22 14:50:23 -0700457void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700458 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700459 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700460}
461
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700462// ================================================================
463
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700464BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700465 : Type(types, "android.os", "BinderProxy", ValidatableType::KIND_BUILT_IN,
466 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700467
468void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700469 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700470 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700471}
472
Christopher Wileye6dee912015-09-22 14:50:23 -0700473void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700474 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700475 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700476}
477
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700478// ================================================================
479
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700480ParcelType::ParcelType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700481 : Type(types, "android.os", "Parcel", ValidatableType::KIND_BUILT_IN,
482 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700483
484void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700485 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700486 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700487}
488
Christopher Wileye6dee912015-09-22 14:50:23 -0700489void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700490 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700491 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700492}
493
494// ================================================================
495
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700496ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700497 : Type(types, "android.os", "Parcelable", ValidatableType::KIND_BUILT_IN,
498 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700499
500void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700501 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700502 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700503}
504
Christopher Wileye6dee912015-09-22 14:50:23 -0700505void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
506 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700507 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700508 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700509}
510
511// ================================================================
512
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700513MapType::MapType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700514 : Type(types, "java.util", "Map", ValidatableType::KIND_BUILT_IN,
515 true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700516
517void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700518 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700519 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700520}
521
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700522static void EnsureClassLoader(StatementBlock* addTo, Variable** cl,
523 const JavaTypeNamespace* types) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700524 // We don't want to look up the class loader once for every
525 // collection argument, so ensure we do it at most once per method.
526 if (*cl == NULL) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700527 *cl = new Variable(types->ClassLoaderType(), "cl");
Christopher Wileye6dee912015-09-22 14:50:23 -0700528 addTo->Add(new VariableDeclaration(
529 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700530 types->ClassLoaderType()));
Christopher Wileye6dee912015-09-22 14:50:23 -0700531 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700532}
533
Christopher Wileye6dee912015-09-22 14:50:23 -0700534void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700535 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700536 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700537 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700538}
539
Christopher Wileye6dee912015-09-22 14:50:23 -0700540void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700541 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700542 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700543 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700544}
545
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700546// ================================================================
547
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700548ListType::ListType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700549 : Type(types, "java.util", "List", ValidatableType::KIND_BUILT_IN,
550 true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700551
552string ListType::InstantiableName() const { return "java.util.ArrayList"; }
553
554void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700555 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700556 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700557}
558
Christopher Wileye6dee912015-09-22 14:50:23 -0700559void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700560 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700561 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700562 addTo->Add(
563 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700564}
565
Christopher Wileye6dee912015-09-22 14:50:23 -0700566void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700567 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700568 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700569 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700570}
571
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700572// ================================================================
573
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700574UserDataType::UserDataType(const JavaTypeNamespace* types,
575 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700576 bool builtIn, bool canWriteToParcel,
577 const string& declFile, int declLine)
Christopher Wiley09af4692015-10-30 11:48:25 -0700578 : Type(types, package, name,
579 builtIn ? ValidatableType::KIND_BUILT_IN
580 : ValidatableType::KIND_PARCELABLE,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800581 canWriteToParcel, true, declFile, declLine) {
582 m_array_type.reset(new UserDataArrayType(types, package, name, builtIn,
583 canWriteToParcel, declFile,
584 declLine));
585}
Christopher Wileye6dee912015-09-22 14:50:23 -0700586
587string UserDataType::CreatorName() const {
Christopher Wileyd21bfee2016-01-29 15:11:38 -0800588 return JavaType() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700589}
590
Christopher Wileye6dee912015-09-22 14:50:23 -0700591void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700592 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700593 // if (v != null) {
594 // parcel.writeInt(1);
595 // v.writeToParcel(parcel);
596 // } else {
597 // parcel.writeInt(0);
598 // }
599 IfStatement* elsepart = new IfStatement();
600 elsepart->statements->Add(
601 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
602 IfStatement* ifpart = new IfStatement;
603 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
604 ifpart->elseif = elsepart;
605 ifpart->statements->Add(
606 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
607 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
608 BuildWriteToParcelFlags(flags)));
609
610 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700611}
612
Christopher Wileye6dee912015-09-22 14:50:23 -0700613void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700614 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700615 // if (0 != parcel.readInt()) {
616 // v = CLASS.CREATOR.createFromParcel(parcel)
617 // } else {
618 // v = null;
619 // }
620 IfStatement* elsepart = new IfStatement();
621 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700622
Christopher Wileye6dee912015-09-22 14:50:23 -0700623 IfStatement* ifpart = new IfStatement();
624 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
625 new MethodCall(parcel, "readInt"));
626 ifpart->elseif = elsepart;
627 ifpart->statements->Add(new Assignment(
628 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
629
630 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700631}
632
Christopher Wileye6dee912015-09-22 14:50:23 -0700633void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700634 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700635 // TODO: really, we don't need to have this extra check, but we
636 // don't have two separate marshalling code paths
637 // if (0 != parcel.readInt()) {
638 // v.readFromParcel(parcel)
639 // }
640 IfStatement* ifpart = new IfStatement();
641 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
642 new MethodCall(parcel, "readInt"));
643 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
644 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700645}
646
Casey Dahlina2f77c42015-12-01 18:26:02 -0800647UserDataArrayType::UserDataArrayType(const JavaTypeNamespace* types,
648 const string& package, const string& name,
649 bool builtIn, bool canWriteToParcel,
650 const string& declFile, int declLine)
651 : Type(types, package, name,
652 builtIn ? ValidatableType::KIND_BUILT_IN
653 : ValidatableType::KIND_PARCELABLE,
654 canWriteToParcel, true, declFile, declLine) {}
655
656string UserDataArrayType::CreatorName() const {
Christopher Wileyd21bfee2016-01-29 15:11:38 -0800657 return JavaType() + ".CREATOR";
Casey Dahlina2f77c42015-12-01 18:26:02 -0800658}
659
660void UserDataArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700661 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700662 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
663 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700664}
665
Casey Dahlina2f77c42015-12-01 18:26:02 -0800666void UserDataArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700667 Variable* parcel, Variable**) const {
Christopher Wileyd21bfee2016-01-29 15:11:38 -0800668 string creator = v->type->JavaType() + ".CREATOR";
Christopher Wileye6dee912015-09-22 14:50:23 -0700669 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
670 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700671}
672
Casey Dahlina2f77c42015-12-01 18:26:02 -0800673void UserDataArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700674 Variable* parcel, Variable**) const {
Christopher Wileyd21bfee2016-01-29 15:11:38 -0800675 string creator = v->type->JavaType() + ".CREATOR";
Christopher Wileye6dee912015-09-22 14:50:23 -0700676 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
677 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700678}
679
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700680// ================================================================
681
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700682InterfaceType::InterfaceType(const JavaTypeNamespace* types,
683 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700684 bool builtIn, bool oneway, const string& declFile,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800685 int declLine, const Type* stub, const Type* proxy)
Christopher Wiley09af4692015-10-30 11:48:25 -0700686 : Type(types, package, name, builtIn ? ValidatableType::KIND_BUILT_IN
687 : ValidatableType::KIND_INTERFACE,
688 true, false, declFile, declLine),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800689 m_oneway(oneway),
690 stub_(stub),
691 proxy_(proxy) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700692
693bool InterfaceType::OneWay() const { return m_oneway; }
694
695void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700696 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700697 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
698 addTo->Add(
699 new MethodCall(parcel, "writeStrongBinder", 1,
700 new Ternary(new Comparison(v, "!=", NULL_VALUE),
701 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700702}
703
Christopher Wileye6dee912015-09-22 14:50:23 -0700704void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700705 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700706 // v = Interface.asInterface(parcel.readStrongBinder());
Christopher Wileye6dee912015-09-22 14:50:23 -0700707 addTo->Add(new Assignment(
Christopher Wiley9ab06232016-01-27 14:55:18 -0800708 v, new MethodCall(stub_, "asInterface", 1,
Christopher Wileye6dee912015-09-22 14:50:23 -0700709 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700710}
711
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700712// ================================================================
713
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700714GenericListType::GenericListType(const JavaTypeNamespace* types,
Christopher Wiley09af4692015-10-30 11:48:25 -0700715 const Type* contained_type)
Christopher Wiley5d9bc932016-02-01 13:23:16 -0800716 : Type(types, "java.util", "List<" + contained_type->CanonicalName() + ">",
Christopher Wiley09af4692015-10-30 11:48:25 -0700717 ValidatableType::KIND_BUILT_IN, true, true),
718 m_contained_type(contained_type),
719 m_creator(contained_type->CreatorName()) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700720
721string GenericListType::CreatorName() const {
722 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700723}
724
Christopher Wileye6dee912015-09-22 14:50:23 -0700725string GenericListType::InstantiableName() const {
Christopher Wileyd21bfee2016-01-29 15:11:38 -0800726 return "java.util.ArrayList<" + m_contained_type->JavaType() + ">";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700727}
728
Christopher Wileye6dee912015-09-22 14:50:23 -0700729void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700730 Variable* parcel, int flags) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700731 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700732 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700733 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700734 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
735 } else {
736 // parcel.writeTypedListXX(arg);
737 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
738 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700739}
740
Christopher Wileye6dee912015-09-22 14:50:23 -0700741void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700742 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700743 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700744 addTo->Add(
745 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700746 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700747 addTo->Add(
748 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
749 } else {
750 // v = _data.readTypedArrayList(XXX.creator);
751 addTo->Add(
752 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
753 new LiteralExpression(m_creator))));
754 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700755}
756
Christopher Wileye6dee912015-09-22 14:50:23 -0700757void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700758 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700759 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700760 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700761 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700762 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
763 } else {
764 // v = _data.readTypedList(v, XXX.creator);
765 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
766 new LiteralExpression(m_creator)));
767 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700768}
769
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700770// ================================================================
771
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700772ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700773 : Type(types, "java.lang", "ClassLoader", ValidatableType::KIND_BUILT_IN,
774 false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700775
776// ================================================================
777
Christopher Wiley56799522015-10-31 10:17:04 -0700778void JavaTypeNamespace::Init() {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700779 Add(new BasicType(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700780
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700781 m_bool_type = new BooleanType(this);
782 Add(m_bool_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700783
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700784 Add(new BasicType(this, "byte", "writeByte", "readByte", "writeByteArray",
785 "createByteArray", "readByteArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700786
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700787 Add(new CharType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700788
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700789 m_int_type = new BasicType(this, "int", "writeInt", "readInt",
790 "writeIntArray", "createIntArray", "readIntArray");
791 Add(m_int_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700792
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700793 Add(new BasicType(this, "long", "writeLong", "readLong", "writeLongArray",
794 "createLongArray", "readLongArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700795
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700796 Add(new BasicType(this, "float", "writeFloat", "readFloat", "writeFloatArray",
797 "createFloatArray", "readFloatArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700798
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700799 Add(new BasicType(this, "double", "writeDouble", "readDouble",
800 "writeDoubleArray", "createDoubleArray",
801 "readDoubleArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700802
Christopher Wiley9f403722016-01-27 16:04:11 -0800803 m_string_type = new class StringType(this, "java.lang", "String");
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700804 Add(m_string_type);
Christopher Wiley9f403722016-01-27 16:04:11 -0800805 Add(new class StringType(this, ::android::aidl::kAidlReservedTypePackage,
806 ::android::aidl::kUtf8InCppStringClass));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700807
Christopher Wiley09af4692015-10-30 11:48:25 -0700808 Add(new Type(this, "java.lang", "Object", ValidatableType::KIND_BUILT_IN,
809 false, false));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700810
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800811 Add(new FileDescriptorType(this));
812
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700813 Add(new CharSequenceType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700814
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700815 Add(new MapType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700816
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700817 Add(new ListType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700818
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700819 m_text_utils_type =
Christopher Wiley09af4692015-10-30 11:48:25 -0700820 new Type(this, "android.text", "TextUtils",
821 ValidatableType::KIND_BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700822 Add(m_text_utils_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700823
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700824 m_remote_exception_type = new class RemoteExceptionType(this);
825 Add(m_remote_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700826
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700827 m_runtime_exception_type = new class RuntimeExceptionType(this);
828 Add(m_runtime_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700829
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700830 m_ibinder_type = new class IBinderType(this);
831 Add(m_ibinder_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700832
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700833 m_iinterface_type = new class IInterfaceType(this);
834 Add(m_iinterface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700835
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700836 m_binder_native_type = new class BinderType(this);
837 Add(m_binder_native_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700838
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700839 m_binder_proxy_type = new class BinderProxyType(this);
840 Add(m_binder_proxy_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700841
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700842 m_parcel_type = new class ParcelType(this);
843 Add(m_parcel_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700844
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700845 m_parcelable_interface_type = new class ParcelableInterfaceType(this);
846 Add(m_parcelable_interface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700847
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700848 m_context_type = new class Type(this, "android.content", "Context",
Christopher Wiley09af4692015-10-30 11:48:25 -0700849 ValidatableType::KIND_BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700850 Add(m_context_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700851
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700852 m_classloader_type = new class ClassLoaderType(this);
853 Add(m_classloader_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700854
855 NULL_VALUE = new LiteralExpression("null");
856 THIS_VALUE = new LiteralExpression("this");
857 SUPER_VALUE = new LiteralExpression("super");
858 TRUE_VALUE = new LiteralExpression("true");
859 FALSE_VALUE = new LiteralExpression("false");
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700860}
Christopher Wileye6dee912015-09-22 14:50:23 -0700861
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800862bool JavaTypeNamespace::AddParcelableType(const AidlParcelable& p,
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700863 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700864 Type* type =
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800865 new UserDataType(this, p.GetPackage(), p.GetName(), false,
866 true, filename, p.GetLine());
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700867 return Add(type);
868}
869
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800870bool JavaTypeNamespace::AddBinderType(const AidlInterface& b,
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700871 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700872 // for interfaces, add the stub, proxy, and interface types.
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800873 Type* stub = new Type(this, b.GetPackage(),
874 b.GetName() + ".Stub", ValidatableType::KIND_GENERATED,
875 false, false, filename, b.GetLine());
876 Type* proxy = new Type(this, b.GetPackage(),
877 b.GetName() + ".Stub.Proxy",
Christopher Wiley09af4692015-10-30 11:48:25 -0700878 ValidatableType::KIND_GENERATED,
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800879 false, false, filename, b.GetLine());
Casey Dahlina2f77c42015-12-01 18:26:02 -0800880 Type* type =
881 new InterfaceType(this, b.GetPackage(), b.GetName(), false,
882 b.IsOneway(), filename, b.GetLine(), stub, proxy);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700883
884 bool success = true;
885 success &= Add(type);
886 success &= Add(stub);
887 success &= Add(proxy);
888 return success;
889}
890
Christopher Wileycd8e8972015-10-26 10:24:35 -0700891bool JavaTypeNamespace::AddListType(const std::string& contained_type_name) {
Christopher Wiley9ab06232016-01-27 14:55:18 -0800892 const Type* contained_type = FindTypeByCanonicalName(contained_type_name);
Christopher Wileycd8e8972015-10-26 10:24:35 -0700893 if (!contained_type) {
Christopher Wiley4582ecb2015-09-25 13:27:45 -0700894 return false;
Christopher Wileye6dee912015-09-22 14:50:23 -0700895 }
Christopher Wiley09af4692015-10-30 11:48:25 -0700896 Add(new GenericListType(this, contained_type));
Christopher Wiley4582ecb2015-09-25 13:27:45 -0700897 return true;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700898}
899
Christopher Wileycd8e8972015-10-26 10:24:35 -0700900bool JavaTypeNamespace::AddMapType(const string& key_type_name,
901 const string& value_type_name) {
902 LOG(ERROR) << "Don't know how to create a Map<K,V> container.";
903 return false;
904}
905
Christopher Wileydb154a52015-09-28 16:32:25 -0700906} // namespace java
Christopher Wileyfdeb0f42015-09-11 15:38:22 -0700907} // namespace aidl
908} // namespace android