blob: f05661000d469bf3edb865192157fb2ef797fde4 [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 Wiley4582ecb2015-09-25 13:27:45 -070026using android::base::Split;
27using android::base::Join;
28using android::base::Trim;
29
Christopher Wileyfdeb0f42015-09-11 15:38:22 -070030namespace android {
31namespace aidl {
Christopher Wileydb154a52015-09-28 16:32:25 -070032namespace java {
Christopher Wileyfdeb0f42015-09-11 15:38:22 -070033
The Android Open Source Project46c012c2008-10-21 07:00:00 -070034Expression* NULL_VALUE;
35Expression* THIS_VALUE;
36Expression* SUPER_VALUE;
37Expression* TRUE_VALUE;
38Expression* FALSE_VALUE;
39
The Android Open Source Project46c012c2008-10-21 07:00:00 -070040// ================================================================
41
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070042Type::Type(const JavaTypeNamespace* types, const string& name, int kind,
43 bool canWriteToParcel, bool canBeOut)
Christopher Wiley09af4692015-10-30 11:48:25 -070044 : Type(types, "", name, kind, canWriteToParcel, canBeOut, "", -1) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -070045
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070046Type::Type(const JavaTypeNamespace* types, const string& package,
Christopher Wiley09af4692015-10-30 11:48:25 -070047 const string& name, int kind, bool canWriteToParcel,
48 bool canBeOut, const string& declFile, int declLine)
49 : ValidatableType(kind, package, name, declFile, declLine),
50 m_types(types),
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -070051 m_package(package),
Christopher Wileye6dee912015-09-22 14:50:23 -070052 m_name(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
59string Type::InstantiableName() const { return QualifiedName(); }
60
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__,
64 __LINE__, m_qualifiedName.c_str());
65 addTo->Add(new LiteralExpression("/* WriteToParcel error " + m_qualifiedName +
66 " */"));
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__,
72 __LINE__, m_qualifiedName.c_str());
73 addTo->Add(new LiteralExpression("/* CreateFromParcel error " +
74 m_qualifiedName + " */"));
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__,
80 __LINE__, m_qualifiedName.c_str());
81 addTo->Add(new LiteralExpression("/* ReadFromParcel error " +
82 m_qualifiedName + " */"));
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 Wiley8b2d3ee2015-09-23 15:43:01 -0700261StringType::StringType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700262 : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800263 true, false) {
264 m_array_type.reset(new StringArrayType(types));
265}
Christopher Wileye6dee912015-09-22 14:50:23 -0700266
267string StringType::CreatorName() const {
268 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700269}
270
Christopher Wileye6dee912015-09-22 14:50:23 -0700271void StringType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700272 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700273 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700274}
275
Christopher Wileye6dee912015-09-22 14:50:23 -0700276void StringType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700277 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700278 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700279}
280
Casey Dahlina2f77c42015-12-01 18:26:02 -0800281StringArrayType::StringArrayType(const JavaTypeNamespace* types)
282 : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN,
283 true, true) {}
284
285string StringArrayType::CreatorName() const {
286 return "android.os.Parcel.STRING_CREATOR";
287}
288
289void StringArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700290 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700291 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700292}
293
Casey Dahlina2f77c42015-12-01 18:26:02 -0800294void StringArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700295 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700296 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700297}
298
Casey Dahlina2f77c42015-12-01 18:26:02 -0800299void StringArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700300 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700301 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700302}
303
304// ================================================================
305
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700306CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700307 : Type(types, "java.lang", "CharSequence", ValidatableType::KIND_BUILT_IN,
308 true, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700309
310string CharSequenceType::CreatorName() const {
311 return "android.os.Parcel.STRING_CREATOR";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700312}
313
Christopher Wileye6dee912015-09-22 14:50:23 -0700314void CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700315 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700316 // if (v != null) {
317 // parcel.writeInt(1);
318 // v.writeToParcel(parcel);
319 // } else {
320 // parcel.writeInt(0);
321 // }
322 IfStatement* elsepart = new IfStatement();
323 elsepart->statements->Add(
324 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
325 IfStatement* ifpart = new IfStatement;
326 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
327 ifpart->elseif = elsepart;
328 ifpart->statements->Add(
329 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700330 ifpart->statements->Add(new MethodCall(m_types->TextUtilsType(),
331 "writeToParcel", 3, v, parcel,
Christopher Wileye6dee912015-09-22 14:50:23 -0700332 BuildWriteToParcelFlags(flags)));
333
334 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700335}
336
Christopher Wileye6dee912015-09-22 14:50:23 -0700337void CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700338 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700339 // if (0 != parcel.readInt()) {
340 // v = TextUtils.createFromParcel(parcel)
341 // } else {
342 // v = null;
343 // }
344 IfStatement* elsepart = new IfStatement();
345 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700346
Christopher Wileye6dee912015-09-22 14:50:23 -0700347 IfStatement* ifpart = new IfStatement();
348 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
349 new MethodCall(parcel, "readInt"));
350 ifpart->elseif = elsepart;
351 ifpart->statements->Add(new Assignment(
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700352 v, new MethodCall(m_types->TextUtilsType(),
Christopher Wileye6dee912015-09-22 14:50:23 -0700353 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
354
355 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700356}
357
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700358// ================================================================
359
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700360RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700361 : Type(types, "android.os", "RemoteException",
362 ValidatableType::KIND_BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700363
364void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700365 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700366 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700367}
368
Christopher Wileye6dee912015-09-22 14:50:23 -0700369void RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700370 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700371 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700372}
373
374// ================================================================
375
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700376RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700377 : Type(types, "java.lang", "RuntimeException",
378 ValidatableType::KIND_BUILT_IN, false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700379
380void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700381 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700382 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700383}
384
Christopher Wileye6dee912015-09-22 14:50:23 -0700385void RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700386 Variable* parcel,
387 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700388 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700389}
390
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700391// ================================================================
392
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700393IBinderType::IBinderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700394 : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800395 true, false) {
396 m_array_type.reset(new IBinderArrayType(types));
397}
Christopher Wileye6dee912015-09-22 14:50:23 -0700398
399void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700400 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700401 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700402}
403
Christopher Wileye6dee912015-09-22 14:50:23 -0700404void IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700405 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700406 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700407}
408
Casey Dahlina2f77c42015-12-01 18:26:02 -0800409IBinderArrayType::IBinderArrayType(const JavaTypeNamespace* types)
410 : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN,
411 true, true) {}
412
413void IBinderArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700414 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700415 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700416}
417
Casey Dahlina2f77c42015-12-01 18:26:02 -0800418void IBinderArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700419 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700420 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700421}
422
Casey Dahlina2f77c42015-12-01 18:26:02 -0800423void IBinderArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700424 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700425 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700426}
427
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700428// ================================================================
429
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700430IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700431 : Type(types, "android.os", "IInterface", ValidatableType::KIND_BUILT_IN,
432 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700433
434void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700435 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700436 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700437}
438
Christopher Wileye6dee912015-09-22 14:50:23 -0700439void IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700440 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700441 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700442}
443
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700444// ================================================================
445
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700446BinderType::BinderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700447 : Type(types, "android.os", "Binder", ValidatableType::KIND_BUILT_IN,
448 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700449
450void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700451 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700452 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700453}
454
Christopher Wileye6dee912015-09-22 14:50:23 -0700455void BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700456 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700457 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700458}
459
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700460// ================================================================
461
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700462BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700463 : Type(types, "android.os", "BinderProxy", ValidatableType::KIND_BUILT_IN,
464 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700465
466void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700467 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700468 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700469}
470
Christopher Wileye6dee912015-09-22 14:50:23 -0700471void BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700472 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700473 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700474}
475
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700476// ================================================================
477
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700478ParcelType::ParcelType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700479 : Type(types, "android.os", "Parcel", ValidatableType::KIND_BUILT_IN,
480 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700481
482void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700483 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700484 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700485}
486
Christopher Wileye6dee912015-09-22 14:50:23 -0700487void ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700488 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700489 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700490}
491
492// ================================================================
493
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700494ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700495 : Type(types, "android.os", "Parcelable", ValidatableType::KIND_BUILT_IN,
496 false, false) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700497
498void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700499 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700500 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700501}
502
Christopher Wileye6dee912015-09-22 14:50:23 -0700503void ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo,
504 Variable* v, Variable* parcel,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700505 Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700506 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700507}
508
509// ================================================================
510
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700511MapType::MapType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700512 : Type(types, "java.util", "Map", ValidatableType::KIND_BUILT_IN,
513 true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700514
515void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700516 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700517 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700518}
519
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700520static void EnsureClassLoader(StatementBlock* addTo, Variable** cl,
521 const JavaTypeNamespace* types) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700522 // We don't want to look up the class loader once for every
523 // collection argument, so ensure we do it at most once per method.
524 if (*cl == NULL) {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700525 *cl = new Variable(types->ClassLoaderType(), "cl");
Christopher Wileye6dee912015-09-22 14:50:23 -0700526 addTo->Add(new VariableDeclaration(
527 *cl, new LiteralExpression("this.getClass().getClassLoader()"),
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700528 types->ClassLoaderType()));
Christopher Wileye6dee912015-09-22 14:50:23 -0700529 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700530}
531
Christopher Wileye6dee912015-09-22 14:50:23 -0700532void MapType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700533 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700534 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700535 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
Elliott Hughes15f8da22011-07-13 12:10:30 -0700536}
537
Christopher Wileye6dee912015-09-22 14:50:23 -0700538void MapType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700539 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700540 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700541 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700542}
543
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700544// ================================================================
545
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700546ListType::ListType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700547 : Type(types, "java.util", "List", ValidatableType::KIND_BUILT_IN,
548 true, true) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700549
550string ListType::InstantiableName() const { return "java.util.ArrayList"; }
551
552void ListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700553 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700554 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700555}
556
Christopher Wileye6dee912015-09-22 14:50:23 -0700557void ListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700558 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700559 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700560 addTo->Add(
561 new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700562}
563
Christopher Wileye6dee912015-09-22 14:50:23 -0700564void ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700565 Variable* parcel, Variable** cl) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700566 EnsureClassLoader(addTo, cl, m_types);
Christopher Wileye6dee912015-09-22 14:50:23 -0700567 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700568}
569
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700570// ================================================================
571
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700572UserDataType::UserDataType(const JavaTypeNamespace* types,
573 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700574 bool builtIn, bool canWriteToParcel,
575 const string& declFile, int declLine)
Christopher Wiley09af4692015-10-30 11:48:25 -0700576 : Type(types, package, name,
577 builtIn ? ValidatableType::KIND_BUILT_IN
578 : ValidatableType::KIND_PARCELABLE,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800579 canWriteToParcel, true, declFile, declLine) {
580 m_array_type.reset(new UserDataArrayType(types, package, name, builtIn,
581 canWriteToParcel, declFile,
582 declLine));
583}
Christopher Wileye6dee912015-09-22 14:50:23 -0700584
585string UserDataType::CreatorName() const {
586 return QualifiedName() + ".CREATOR";
Joe Onorato44050522011-10-09 17:38:20 -0700587}
588
Christopher Wileye6dee912015-09-22 14:50:23 -0700589void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700590 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700591 // if (v != null) {
592 // parcel.writeInt(1);
593 // v.writeToParcel(parcel);
594 // } else {
595 // parcel.writeInt(0);
596 // }
597 IfStatement* elsepart = new IfStatement();
598 elsepart->statements->Add(
599 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("0")));
600 IfStatement* ifpart = new IfStatement;
601 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
602 ifpart->elseif = elsepart;
603 ifpart->statements->Add(
604 new MethodCall(parcel, "writeInt", 1, new LiteralExpression("1")));
605 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2, parcel,
606 BuildWriteToParcelFlags(flags)));
607
608 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700609}
610
Christopher Wileye6dee912015-09-22 14:50:23 -0700611void UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700612 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700613 // if (0 != parcel.readInt()) {
614 // v = CLASS.CREATOR.createFromParcel(parcel)
615 // } else {
616 // v = null;
617 // }
618 IfStatement* elsepart = new IfStatement();
619 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700620
Christopher Wileye6dee912015-09-22 14:50:23 -0700621 IfStatement* ifpart = new IfStatement();
622 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
623 new MethodCall(parcel, "readInt"));
624 ifpart->elseif = elsepart;
625 ifpart->statements->Add(new Assignment(
626 v, new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
627
628 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700629}
630
Christopher Wileye6dee912015-09-22 14:50:23 -0700631void UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700632 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700633 // TODO: really, we don't need to have this extra check, but we
634 // don't have two separate marshalling code paths
635 // if (0 != parcel.readInt()) {
636 // v.readFromParcel(parcel)
637 // }
638 IfStatement* ifpart = new IfStatement();
639 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
640 new MethodCall(parcel, "readInt"));
641 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
642 addTo->Add(ifpart);
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700643}
644
Casey Dahlina2f77c42015-12-01 18:26:02 -0800645UserDataArrayType::UserDataArrayType(const JavaTypeNamespace* types,
646 const string& package, const string& name,
647 bool builtIn, bool canWriteToParcel,
648 const string& declFile, int declLine)
649 : Type(types, package, name,
650 builtIn ? ValidatableType::KIND_BUILT_IN
651 : ValidatableType::KIND_PARCELABLE,
652 canWriteToParcel, true, declFile, declLine) {}
653
654string UserDataArrayType::CreatorName() const {
655 return QualifiedName() + ".CREATOR";
656}
657
658void UserDataArrayType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700659 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700660 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
661 BuildWriteToParcelFlags(flags)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700662}
663
Casey Dahlina2f77c42015-12-01 18:26:02 -0800664void UserDataArrayType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700665 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700666 string creator = v->type->QualifiedName() + ".CREATOR";
667 addTo->Add(new Assignment(v, new MethodCall(parcel, "createTypedArray", 1,
668 new LiteralExpression(creator))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700669}
670
Casey Dahlina2f77c42015-12-01 18:26:02 -0800671void UserDataArrayType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700672 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700673 string creator = v->type->QualifiedName() + ".CREATOR";
674 addTo->Add(new MethodCall(parcel, "readTypedArray", 2, v,
675 new LiteralExpression(creator)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700676}
677
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700678// ================================================================
679
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700680InterfaceType::InterfaceType(const JavaTypeNamespace* types,
681 const string& package, const string& name,
Christopher Wileye6dee912015-09-22 14:50:23 -0700682 bool builtIn, bool oneway, const string& declFile,
Casey Dahlina2f77c42015-12-01 18:26:02 -0800683 int declLine, const Type* stub, const Type* proxy)
Christopher Wiley09af4692015-10-30 11:48:25 -0700684 : Type(types, package, name, builtIn ? ValidatableType::KIND_BUILT_IN
685 : ValidatableType::KIND_INTERFACE,
686 true, false, declFile, declLine),
Casey Dahlina2f77c42015-12-01 18:26:02 -0800687 m_oneway(oneway),
688 stub_(stub),
689 proxy_(proxy) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700690
691bool InterfaceType::OneWay() const { return m_oneway; }
692
693void InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700694 Variable* parcel, int flags) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700695 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
696 addTo->Add(
697 new MethodCall(parcel, "writeStrongBinder", 1,
698 new Ternary(new Comparison(v, "!=", NULL_VALUE),
699 new MethodCall(v, "asBinder"), NULL_VALUE)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700700}
701
Christopher Wileye6dee912015-09-22 14:50:23 -0700702void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700703 Variable* parcel, Variable**) const {
Christopher Wileye6dee912015-09-22 14:50:23 -0700704 // v = Interface.asInterface(parcel.readStrongBinder());
Christopher Wileye6dee912015-09-22 14:50:23 -0700705 addTo->Add(new Assignment(
Christopher Wiley9ab06232016-01-27 14:55:18 -0800706 v, new MethodCall(stub_, "asInterface", 1,
Christopher Wileye6dee912015-09-22 14:50:23 -0700707 new MethodCall(parcel, "readStrongBinder"))));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700708}
709
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700710// ================================================================
711
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700712GenericListType::GenericListType(const JavaTypeNamespace* types,
Christopher Wiley09af4692015-10-30 11:48:25 -0700713 const Type* contained_type)
714 : Type(types, "java.util", "List<" + contained_type->QualifiedName() + ">",
715 ValidatableType::KIND_BUILT_IN, true, true),
716 m_contained_type(contained_type),
717 m_creator(contained_type->CreatorName()) {}
Christopher Wileye6dee912015-09-22 14:50:23 -0700718
719string GenericListType::CreatorName() const {
720 return "android.os.Parcel.arrayListCreator";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700721}
722
Christopher Wileye6dee912015-09-22 14:50:23 -0700723string GenericListType::InstantiableName() const {
Christopher Wiley09af4692015-10-30 11:48:25 -0700724 return "java.util.ArrayList<" + m_contained_type->QualifiedName() + ">";
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700725}
726
Christopher Wileye6dee912015-09-22 14:50:23 -0700727void GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700728 Variable* parcel, int flags) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700729 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700730 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700731 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700732 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
733 } else {
734 // parcel.writeTypedListXX(arg);
735 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
736 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700737}
738
Christopher Wileye6dee912015-09-22 14:50:23 -0700739void GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700740 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700741 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700742 addTo->Add(
743 new Assignment(v, new MethodCall(parcel, "createStringArrayList", 0)));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700744 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700745 addTo->Add(
746 new Assignment(v, new MethodCall(parcel, "createBinderArrayList", 0)));
747 } else {
748 // v = _data.readTypedArrayList(XXX.creator);
749 addTo->Add(
750 new Assignment(v, new MethodCall(parcel, "createTypedArrayList", 1,
751 new LiteralExpression(m_creator))));
752 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700753}
754
Christopher Wileye6dee912015-09-22 14:50:23 -0700755void GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Christopher Wiley3637a4d2015-09-22 15:37:59 -0700756 Variable* parcel, Variable**) const {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700757 if (m_creator == m_types->StringType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700758 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700759 } else if (m_creator == m_types->IBinderType()->CreatorName()) {
Christopher Wileye6dee912015-09-22 14:50:23 -0700760 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
761 } else {
762 // v = _data.readTypedList(v, XXX.creator);
763 addTo->Add(new MethodCall(parcel, "readTypedList", 2, v,
764 new LiteralExpression(m_creator)));
765 }
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700766}
767
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700768// ================================================================
769
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700770ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
Christopher Wiley09af4692015-10-30 11:48:25 -0700771 : Type(types, "java.lang", "ClassLoader", ValidatableType::KIND_BUILT_IN,
772 false, false) {}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700773
774// ================================================================
775
Christopher Wiley56799522015-10-31 10:17:04 -0700776void JavaTypeNamespace::Init() {
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700777 Add(new BasicType(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700778
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700779 m_bool_type = new BooleanType(this);
780 Add(m_bool_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700781
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700782 Add(new BasicType(this, "byte", "writeByte", "readByte", "writeByteArray",
783 "createByteArray", "readByteArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700784
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700785 Add(new CharType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700786
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700787 m_int_type = new BasicType(this, "int", "writeInt", "readInt",
788 "writeIntArray", "createIntArray", "readIntArray");
789 Add(m_int_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700790
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700791 Add(new BasicType(this, "long", "writeLong", "readLong", "writeLongArray",
792 "createLongArray", "readLongArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700793
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700794 Add(new BasicType(this, "float", "writeFloat", "readFloat", "writeFloatArray",
795 "createFloatArray", "readFloatArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700796
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700797 Add(new BasicType(this, "double", "writeDouble", "readDouble",
798 "writeDoubleArray", "createDoubleArray",
799 "readDoubleArray"));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700800
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700801 m_string_type = new class StringType(this);
802 Add(m_string_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700803
Christopher Wiley09af4692015-10-30 11:48:25 -0700804 Add(new Type(this, "java.lang", "Object", ValidatableType::KIND_BUILT_IN,
805 false, false));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700806
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800807 Add(new FileDescriptorType(this));
808
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700809 Add(new CharSequenceType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700810
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700811 Add(new MapType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700812
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700813 Add(new ListType(this));
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700814
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700815 m_text_utils_type =
Christopher Wiley09af4692015-10-30 11:48:25 -0700816 new Type(this, "android.text", "TextUtils",
817 ValidatableType::KIND_BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700818 Add(m_text_utils_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700819
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700820 m_remote_exception_type = new class RemoteExceptionType(this);
821 Add(m_remote_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700822
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700823 m_runtime_exception_type = new class RuntimeExceptionType(this);
824 Add(m_runtime_exception_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700825
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700826 m_ibinder_type = new class IBinderType(this);
827 Add(m_ibinder_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700828
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700829 m_iinterface_type = new class IInterfaceType(this);
830 Add(m_iinterface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700831
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700832 m_binder_native_type = new class BinderType(this);
833 Add(m_binder_native_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700834
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700835 m_binder_proxy_type = new class BinderProxyType(this);
836 Add(m_binder_proxy_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700837
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700838 m_parcel_type = new class ParcelType(this);
839 Add(m_parcel_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700840
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700841 m_parcelable_interface_type = new class ParcelableInterfaceType(this);
842 Add(m_parcelable_interface_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700843
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700844 m_context_type = new class Type(this, "android.content", "Context",
Christopher Wiley09af4692015-10-30 11:48:25 -0700845 ValidatableType::KIND_BUILT_IN, false, false);
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700846 Add(m_context_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700847
Christopher Wiley60b02ae2015-09-23 16:35:18 -0700848 m_classloader_type = new class ClassLoaderType(this);
849 Add(m_classloader_type);
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700850
851 NULL_VALUE = new LiteralExpression("null");
852 THIS_VALUE = new LiteralExpression("this");
853 SUPER_VALUE = new LiteralExpression("super");
854 TRUE_VALUE = new LiteralExpression("true");
855 FALSE_VALUE = new LiteralExpression("false");
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700856}
Christopher Wileye6dee912015-09-22 14:50:23 -0700857
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800858bool JavaTypeNamespace::AddParcelableType(const AidlParcelable& p,
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700859 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700860 Type* type =
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800861 new UserDataType(this, p.GetPackage(), p.GetName(), false,
862 true, filename, p.GetLine());
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700863 return Add(type);
864}
865
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800866bool JavaTypeNamespace::AddBinderType(const AidlInterface& b,
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700867 const std::string& filename) {
Christopher Wiley8b2d3ee2015-09-23 15:43:01 -0700868 // for interfaces, add the stub, proxy, and interface types.
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800869 Type* stub = new Type(this, b.GetPackage(),
870 b.GetName() + ".Stub", ValidatableType::KIND_GENERATED,
871 false, false, filename, b.GetLine());
872 Type* proxy = new Type(this, b.GetPackage(),
873 b.GetName() + ".Stub.Proxy",
Christopher Wiley09af4692015-10-30 11:48:25 -0700874 ValidatableType::KIND_GENERATED,
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800875 false, false, filename, b.GetLine());
Casey Dahlina2f77c42015-12-01 18:26:02 -0800876 Type* type =
877 new InterfaceType(this, b.GetPackage(), b.GetName(), false,
878 b.IsOneway(), filename, b.GetLine(), stub, proxy);
Christopher Wiley84c1eac2015-09-23 13:29:28 -0700879
880 bool success = true;
881 success &= Add(type);
882 success &= Add(stub);
883 success &= Add(proxy);
884 return success;
885}
886
Christopher Wileycd8e8972015-10-26 10:24:35 -0700887bool JavaTypeNamespace::AddListType(const std::string& contained_type_name) {
Christopher Wiley9ab06232016-01-27 14:55:18 -0800888 const Type* contained_type = FindTypeByCanonicalName(contained_type_name);
Christopher Wileycd8e8972015-10-26 10:24:35 -0700889 if (!contained_type) {
Christopher Wiley4582ecb2015-09-25 13:27:45 -0700890 return false;
Christopher Wileye6dee912015-09-22 14:50:23 -0700891 }
Christopher Wiley09af4692015-10-30 11:48:25 -0700892 Add(new GenericListType(this, contained_type));
Christopher Wiley4582ecb2015-09-25 13:27:45 -0700893 return true;
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700894}
895
Christopher Wileycd8e8972015-10-26 10:24:35 -0700896bool JavaTypeNamespace::AddMapType(const string& key_type_name,
897 const string& value_type_name) {
898 LOG(ERROR) << "Don't know how to create a Map<K,V> container.";
899 return false;
900}
901
Christopher Wileydb154a52015-09-28 16:32:25 -0700902} // namespace java
Christopher Wileyfdeb0f42015-09-11 15:38:22 -0700903} // namespace aidl
904} // namespace android