blob: 35902557d6ac648afaaa10dd73491ffa643f92b5 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001#include "Type.h"
2
3Namespace NAMES;
4
5Type* VOID_TYPE;
6Type* BOOLEAN_TYPE;
7Type* BYTE_TYPE;
8Type* CHAR_TYPE;
9Type* INT_TYPE;
10Type* LONG_TYPE;
11Type* FLOAT_TYPE;
12Type* DOUBLE_TYPE;
13Type* STRING_TYPE;
Joe Onoratofdfe2ff2011-08-30 17:24:17 -070014Type* OBJECT_TYPE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080015Type* CHAR_SEQUENCE_TYPE;
16Type* TEXT_UTILS_TYPE;
17Type* REMOTE_EXCEPTION_TYPE;
18Type* RUNTIME_EXCEPTION_TYPE;
19Type* IBINDER_TYPE;
20Type* IINTERFACE_TYPE;
21Type* BINDER_NATIVE_TYPE;
22Type* BINDER_PROXY_TYPE;
23Type* PARCEL_TYPE;
24Type* PARCELABLE_INTERFACE_TYPE;
Joe Onoratofdfe2ff2011-08-30 17:24:17 -070025Type* CONTEXT_TYPE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026Type* MAP_TYPE;
27Type* LIST_TYPE;
28Type* CLASSLOADER_TYPE;
Joe Onoratofdfe2ff2011-08-30 17:24:17 -070029Type* RPC_SERVICE_BASE_TYPE;
30Type* RPC_DATA_TYPE;
31Type* RPC_BROKER_TYPE;
32Type* RPC_ENDPOINT_INFO_TYPE;
33Type* RPC_RESULT_HANDLER_TYPE;
34Type* RPC_ERROR_TYPE;
35Type* RPC_ERROR_LISTENER_TYPE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036
37Expression* NULL_VALUE;
38Expression* THIS_VALUE;
39Expression* SUPER_VALUE;
40Expression* TRUE_VALUE;
41Expression* FALSE_VALUE;
42
43void
44register_base_types()
45{
Joe Onorato05ffbe72011-09-02 15:28:36 -070046 VOID_TYPE = new BasicType("void",
47 "XXX", "XXX", "XXX", "XXX", "XXX",
48 "XXX", "XXX", "XXX", "XXX", "XXX");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080049 NAMES.Add(VOID_TYPE);
50
51 BOOLEAN_TYPE = new BooleanType();
52 NAMES.Add(BOOLEAN_TYPE);
53
Joe Onorato05ffbe72011-09-02 15:28:36 -070054 BYTE_TYPE = new BasicType("byte",
55 "writeByte", "readByte", "writeByteArray", "createByteArray", "readByteArray",
56 "putByte", "getByte", "putByteArray", "createByteArray", "getByteArray");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080057 NAMES.Add(BYTE_TYPE);
58
59 CHAR_TYPE = new CharType();
60 NAMES.Add(CHAR_TYPE);
61
Joe Onorato05ffbe72011-09-02 15:28:36 -070062 INT_TYPE = new BasicType("int",
63 "writeInt", "readInt", "writeIntArray", "createIntArray", "readIntArray",
64 "putInteger", "getInteger", "putIntegerArray", "createIntegerArray", "getIntegerArray");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080065 NAMES.Add(INT_TYPE);
66
Joe Onorato05ffbe72011-09-02 15:28:36 -070067 LONG_TYPE = new BasicType("long",
68 "writeLong", "readLong", "writeLongArray", "createLongArray", "readLongArray",
69 "putLong", "getLong", "putLongArray", "createLongArray", "getLongArray");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080070 NAMES.Add(LONG_TYPE);
71
Joe Onorato05ffbe72011-09-02 15:28:36 -070072 FLOAT_TYPE = new BasicType("float",
73 "writeFloat", "readFloat", "writeFloatArray", "createFloatArray", "readFloatArray",
74 "putFloat", "getFloat", "putFloatArray", "createFloatArray", "getFloatArray");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080075 NAMES.Add(FLOAT_TYPE);
76
Joe Onorato05ffbe72011-09-02 15:28:36 -070077 DOUBLE_TYPE = new BasicType("double",
78 "writeDouble", "readDouble", "writeDoubleArray", "createDoubleArray", "readDoubleArray",
79 "putDouble", "getDouble", "putDoubleArray", "createDoubleArray", "getDoubleArray");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080080 NAMES.Add(DOUBLE_TYPE);
81
82 STRING_TYPE = new StringType();
83 NAMES.Add(STRING_TYPE);
84
Joe Onorato7db766c2011-09-15 21:31:15 -070085 OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false, false);
Joe Onoratofdfe2ff2011-08-30 17:24:17 -070086 NAMES.Add(OBJECT_TYPE);
87
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088 CHAR_SEQUENCE_TYPE = new CharSequenceType();
89 NAMES.Add(CHAR_SEQUENCE_TYPE);
90
91 MAP_TYPE = new MapType();
92 NAMES.Add(MAP_TYPE);
93
94 LIST_TYPE = new ListType();
95 NAMES.Add(LIST_TYPE);
96
Joe Onorato7db766c2011-09-15 21:31:15 -070097 TEXT_UTILS_TYPE = new Type("android.text", "TextUtils", Type::BUILT_IN, false, false, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098 NAMES.Add(TEXT_UTILS_TYPE);
99
100 REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
101 NAMES.Add(REMOTE_EXCEPTION_TYPE);
102
103 RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
104 NAMES.Add(RUNTIME_EXCEPTION_TYPE);
105
106 IBINDER_TYPE = new IBinderType();
107 NAMES.Add(IBINDER_TYPE);
108
109 IINTERFACE_TYPE = new IInterfaceType();
110 NAMES.Add(IINTERFACE_TYPE);
111
112 BINDER_NATIVE_TYPE = new BinderType();
113 NAMES.Add(BINDER_NATIVE_TYPE);
114
115 BINDER_PROXY_TYPE = new BinderProxyType();
116 NAMES.Add(BINDER_PROXY_TYPE);
117
118 PARCEL_TYPE = new ParcelType();
119 NAMES.Add(PARCEL_TYPE);
120
121 PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
122 NAMES.Add(PARCELABLE_INTERFACE_TYPE);
123
Joe Onorato7db766c2011-09-15 21:31:15 -0700124 CONTEXT_TYPE = new Type("android.content", "Context", Type::BUILT_IN, false, false, false);
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700125 NAMES.Add(CONTEXT_TYPE);
126
127 RPC_SERVICE_BASE_TYPE = new Type("com.android.athome.service", "AndroidAtHomeService",
Joe Onorato7db766c2011-09-15 21:31:15 -0700128 Type::BUILT_IN, false, false, false);
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700129 NAMES.Add(RPC_SERVICE_BASE_TYPE);
130
Joe Onorato1eb72042011-09-06 11:01:17 -0700131 RPC_DATA_TYPE = new RpcDataType();
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700132 NAMES.Add(RPC_DATA_TYPE);
133
134 RPC_BROKER_TYPE = new Type("com.android.athome.utils", "AndroidAtHomeBroker",
Joe Onorato7db766c2011-09-15 21:31:15 -0700135 Type::BUILT_IN, false, false, false);
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700136 NAMES.Add(RPC_BROKER_TYPE);
137
138 RPC_ENDPOINT_INFO_TYPE = new ParcelableType("com.android.athome.rpc", "EndpointInfo",
139 true, __FILE__, __LINE__);
140 NAMES.Add(RPC_ENDPOINT_INFO_TYPE);
141
142 RPC_RESULT_HANDLER_TYPE = new ParcelableType("com.android.athome.rpc", "RpcResultHandler",
143 true, __FILE__, __LINE__);
144 NAMES.Add(RPC_RESULT_HANDLER_TYPE);
145
146 RPC_ERROR_TYPE = new ParcelableType("com.android.athome.rpc", "RpcError",
147 true, __FILE__, __LINE__);
148 NAMES.Add(RPC_ERROR_TYPE);
149
150 RPC_ERROR_LISTENER_TYPE = new Type("com.android.athome.rpc", "RpcErrorHandler",
Joe Onorato7db766c2011-09-15 21:31:15 -0700151 Type::BUILT_IN, false, false, false);
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700152 NAMES.Add(RPC_ERROR_LISTENER_TYPE);
153
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154 CLASSLOADER_TYPE = new ClassLoaderType();
155 NAMES.Add(CLASSLOADER_TYPE);
156
157 NULL_VALUE = new LiteralExpression("null");
158 THIS_VALUE = new LiteralExpression("this");
159 SUPER_VALUE = new LiteralExpression("super");
160 TRUE_VALUE = new LiteralExpression("true");
161 FALSE_VALUE = new LiteralExpression("false");
162
163 NAMES.AddGenericType("java.util", "List", 1);
164 NAMES.AddGenericType("java.util", "Map", 2);
165}
166
167static Type*
168make_generic_type(const string& package, const string& name,
169 const vector<Type*>& args)
170{
171 if (package == "java.util" && name == "List") {
172 return new GenericListType("java.util", "List", args);
173 }
174 return NULL;
175 //return new GenericType(package, name, args);
176}
177
178// ================================================================
179
Joe Onorato7db766c2011-09-15 21:31:15 -0700180Type::Type(const string& name, int kind, bool canWriteToParcel, bool canWriteToRpcData,
181 bool canBeOut)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800182 :m_package(),
183 m_name(name),
184 m_declFile(""),
185 m_declLine(-1),
186 m_kind(kind),
187 m_canWriteToParcel(canWriteToParcel),
Joe Onorato7db766c2011-09-15 21:31:15 -0700188 m_canWriteToRpcData(canWriteToRpcData),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189 m_canBeOut(canBeOut)
190{
191 m_qualifiedName = name;
192}
193
194Type::Type(const string& package, const string& name,
Joe Onorato7db766c2011-09-15 21:31:15 -0700195 int kind, bool canWriteToParcel, bool canWriteToRpcData,
196 bool canBeOut, const string& declFile, int declLine)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 :m_package(package),
198 m_name(name),
199 m_declFile(declFile),
200 m_declLine(declLine),
201 m_kind(kind),
202 m_canWriteToParcel(canWriteToParcel),
Joe Onorato7db766c2011-09-15 21:31:15 -0700203 m_canWriteToRpcData(canWriteToRpcData),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800204 m_canBeOut(canBeOut)
205{
206 if (package.length() > 0) {
207 m_qualifiedName = package;
208 m_qualifiedName += '.';
209 }
210 m_qualifiedName += name;
211}
212
213Type::~Type()
214{
215}
216
217bool
218Type::CanBeArray() const
219{
220 return false;
221}
222
223string
224Type::ImportType() const
225{
226 return m_qualifiedName;
227}
228
229string
230Type::CreatorName() const
231{
232 return "";
233}
234
235string
236Type::InstantiableName() const
237{
238 return QualifiedName();
239}
240
241
242void
243Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
244{
245 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn",
246 __FILE__, __LINE__, m_qualifiedName.c_str());
247 addTo->Add(new LiteralExpression("/* WriteToParcel error "
248 + m_qualifiedName + " */"));
249}
250
251void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700252Type::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800253{
254 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
255 __FILE__, __LINE__, m_qualifiedName.c_str());
256 addTo->Add(new LiteralExpression("/* CreateFromParcel error "
257 + m_qualifiedName + " */"));
258}
259
260void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700261Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800262{
263 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
264 __FILE__, __LINE__, m_qualifiedName.c_str());
265 addTo->Add(new LiteralExpression("/* ReadFromParcel error "
266 + m_qualifiedName + " */"));
267}
268
269void
270Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
271{
272 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
273 __FILE__, __LINE__, m_qualifiedName.c_str());
274 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error "
275 + m_qualifiedName + " */"));
276}
277
278void
279Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700280 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800281{
282 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
283 __FILE__, __LINE__, m_qualifiedName.c_str());
284 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error "
285 + m_qualifiedName + " */"));
286}
287
288void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700289Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800290{
291 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
292 __FILE__, __LINE__, m_qualifiedName.c_str());
293 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error "
294 + m_qualifiedName + " */"));
295}
296
297void
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700298Type::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
299 Variable* data, int flags)
300{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700301 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700302 __FILE__, __LINE__, m_qualifiedName.c_str());
303 addTo->Add(new LiteralExpression("/* WriteToRpcData error "
304 + m_qualifiedName + " */"));
305}
306
307void
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700308Type::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
309 Variable** cl)
310{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700311 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700312 __FILE__, __LINE__, m_qualifiedName.c_str());
313 addTo->Add(new LiteralExpression("/* ReadFromRpcData error "
314 + m_qualifiedName + " */"));
315}
316
317void
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318Type::SetQualifiedName(const string& qualified)
319{
320 m_qualifiedName = qualified;
321}
322
323Expression*
324Type::BuildWriteToParcelFlags(int flags)
325{
326 if (flags == 0) {
327 return new LiteralExpression("0");
328 }
329 if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0) {
330 return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
331 "PARCELABLE_WRITE_RETURN_VALUE");
332 }
333 return new LiteralExpression("0");
334}
335
336// ================================================================
337
Joe Onorato05ffbe72011-09-02 15:28:36 -0700338BasicType::BasicType(const string& name, const string& marshallParcel,
339 const string& unmarshallParcel, const string& writeArrayParcel,
340 const string& createArrayParcel, const string& readArrayParcel,
341 const string& marshallRpc, const string& unmarshallRpc,
342 const string& writeArrayRpc, const string& createArrayRpc, const string& readArrayRpc)
Joe Onorato7db766c2011-09-15 21:31:15 -0700343 :Type(name, BUILT_IN, true, true, false),
Joe Onorato05ffbe72011-09-02 15:28:36 -0700344 m_marshallParcel(marshallParcel),
345 m_unmarshallParcel(unmarshallParcel),
346 m_writeArrayParcel(writeArrayParcel),
347 m_createArrayParcel(createArrayParcel),
348 m_readArrayParcel(readArrayParcel),
349 m_marshallRpc(marshallRpc),
350 m_unmarshallRpc(unmarshallRpc),
351 m_writeArrayRpc(writeArrayRpc),
352 m_createArrayRpc(createArrayRpc),
353 m_readArrayRpc(readArrayRpc)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800354{
355}
356
357void
358BasicType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
359{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700360 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800361}
362
363void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700364BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800365{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700366 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800367}
368
369bool
370BasicType::CanBeArray() const
371{
372 return true;
373}
374
375void
376BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
377{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700378 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800379}
380
381void
382BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700383 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800384{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700385 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800386}
387
388void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700389BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800390{
Joe Onorato05ffbe72011-09-02 15:28:36 -0700391 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800392}
393
Joe Onorato05ffbe72011-09-02 15:28:36 -0700394void
395BasicType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
396 Variable* data, int flags)
397{
398 addTo->Add(new MethodCall(data, m_marshallRpc, 2, k, v));
399}
400
401void
402BasicType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
403 Variable** cl)
404{
405 addTo->Add(new Assignment(v, new MethodCall(data, m_unmarshallRpc, 1, k)));
406}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800407
408// ================================================================
409
410BooleanType::BooleanType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700411 :Type("boolean", BUILT_IN, true, true, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800412{
413}
414
415void
416BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
417{
418 addTo->Add(new MethodCall(parcel, "writeInt", 1,
419 new Ternary(v, new LiteralExpression("1"),
420 new LiteralExpression("0"))));
421}
422
423void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700424BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800425{
426 addTo->Add(new Assignment(v, new Comparison(new LiteralExpression("0"),
427 "!=", new MethodCall(parcel, "readInt"))));
428}
429
430bool
431BooleanType::CanBeArray() const
432{
433 return true;
434}
435
436void
437BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
438{
439 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
440}
441
442void
443BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700444 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800445{
446 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
447}
448
449void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700450BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800451{
452 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
453}
454
Joe Onorato05ffbe72011-09-02 15:28:36 -0700455void
456BooleanType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
457 Variable* data, int flags)
458{
459 addTo->Add(new MethodCall(data, "putBoolean", 2, k, v));
460}
461
462void
463BooleanType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
464 Variable** cl)
465{
466 addTo->Add(new Assignment(v, new MethodCall(data, "getBoolean", 1, k)));
467}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800468
469// ================================================================
470
471CharType::CharType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700472 :Type("char", BUILT_IN, true, true, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800473{
474}
475
476void
477CharType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
478{
479 addTo->Add(new MethodCall(parcel, "writeInt", 1,
480 new Cast(INT_TYPE, v)));
481}
482
483void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700484CharType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800485{
486 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
487}
488
489bool
490CharType::CanBeArray() const
491{
492 return true;
493}
494
495void
496CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
497{
498 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
499}
500
501void
502CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700503 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800504{
505 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
506}
507
508void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700509CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800510{
511 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
512}
513
Joe Onorato05ffbe72011-09-02 15:28:36 -0700514void
515CharType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
516 Variable* data, int flags)
517{
518 addTo->Add(new MethodCall(data, "putChar", 2, k, v));
519}
520
521void
522CharType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
523 Variable** cl)
524{
525 addTo->Add(new Assignment(v, new MethodCall(data, "getChar", 1, k)));
526}
527
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800528// ================================================================
529
530StringType::StringType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700531 :Type("java.lang", "String", BUILT_IN, true, true, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800532{
533}
534
535string
536StringType::CreatorName() const
537{
538 return "android.os.Parcel.STRING_CREATOR";
539}
540
541void
542StringType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
543{
544 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
545}
546
547void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700548StringType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800549{
550 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
551}
552
553bool
554StringType::CanBeArray() const
555{
556 return true;
557}
558
559void
560StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
561{
562 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
563}
564
565void
566StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700567 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800568{
569 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
570}
571
572void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700573StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800574{
575 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
576}
577
Joe Onoratofdfe2ff2011-08-30 17:24:17 -0700578void
579StringType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
580 Variable* data, int flags)
581{
582 addTo->Add(new MethodCall(data, "putString", 2, k, v));
583}
584
585void
586StringType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
587 Variable* data, Variable**)
588{
589 addTo->Add(new Assignment(v, new MethodCall(data, "getString", 1, k)));
590}
591
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800592// ================================================================
593
594CharSequenceType::CharSequenceType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700595 :Type("java.lang", "CharSequence", BUILT_IN, true, true, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800596{
597}
598
599string
600CharSequenceType::CreatorName() const
601{
602 return "android.os.Parcel.STRING_CREATOR";
603}
604
605void
606CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
607{
608 // if (v != null) {
609 // parcel.writeInt(1);
610 // v.writeToParcel(parcel);
611 // } else {
612 // parcel.writeInt(0);
613 // }
614 IfStatement* elsepart = new IfStatement();
615 elsepart->statements->Add(new MethodCall(parcel, "writeInt", 1,
616 new LiteralExpression("0")));
617 IfStatement* ifpart = new IfStatement;
618 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
619 ifpart->elseif = elsepart;
620 ifpart->statements->Add(new MethodCall(parcel, "writeInt", 1,
621 new LiteralExpression("1")));
622 ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel",
623 3, v, parcel, BuildWriteToParcelFlags(flags)));
624
625 addTo->Add(ifpart);
626}
627
628void
629CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700630 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800631{
632 // if (0 != parcel.readInt()) {
633 // v = TextUtils.createFromParcel(parcel)
634 // } else {
635 // v = null;
636 // }
637 IfStatement* elsepart = new IfStatement();
638 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
639
640 IfStatement* ifpart = new IfStatement();
641 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
642 new MethodCall(parcel, "readInt"));
643 ifpart->elseif = elsepart;
644 ifpart->statements->Add(new Assignment(v,
645 new MethodCall(TEXT_UTILS_TYPE,
646 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
647
648 addTo->Add(ifpart);
649}
650
651
652// ================================================================
653
654RemoteExceptionType::RemoteExceptionType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700655 :Type("android.os", "RemoteException", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800656{
657}
658
659void
660RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
661{
662 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
663}
664
665void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700666RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800667{
668 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
669}
670
671// ================================================================
672
673RuntimeExceptionType::RuntimeExceptionType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700674 :Type("java.lang", "RuntimeException", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800675{
676}
677
678void
679RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
680{
681 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
682}
683
684void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700685RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800686{
687 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
688}
689
690
691// ================================================================
692
693IBinderType::IBinderType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700694 :Type("android.os", "IBinder", BUILT_IN, true, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800695{
696}
697
698void
699IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
700{
701 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
702}
703
704void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700705IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800706{
707 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
708}
709
710void
711IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
712{
713 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
714}
715
716void
717IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700718 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800719{
720 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
721}
722
723void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700724IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800725{
726 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
727}
728
729
730// ================================================================
731
732IInterfaceType::IInterfaceType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700733 :Type("android.os", "IInterface", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800734{
735}
736
737void
738IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
739{
740 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
741}
742
743void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700744IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800745{
746 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
747}
748
749
750// ================================================================
751
752BinderType::BinderType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700753 :Type("android.os", "Binder", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800754{
755}
756
757void
758BinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
759{
760 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
761}
762
763void
764BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700765 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800766{
767 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
768}
769
770
771// ================================================================
772
773BinderProxyType::BinderProxyType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700774 :Type("android.os", "BinderProxy", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800775{
776}
777
778void
779BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
780{
781 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
782}
783
784void
785BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700786 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800787{
788 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
789}
790
791
792// ================================================================
793
794ParcelType::ParcelType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700795 :Type("android.os", "Parcel", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800796{
797}
798
799void
800ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
801{
802 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
803}
804
805void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700806ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800807{
808 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
809}
810
811// ================================================================
812
813ParcelableInterfaceType::ParcelableInterfaceType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700814 :Type("android.os", "Parcelable", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800815{
816}
817
818void
819ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
820{
821 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
822}
823
824void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700825ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800826{
827 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
828}
829
830// ================================================================
831
832MapType::MapType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700833 :Type("java.util", "Map", BUILT_IN, true, false, true)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800834{
835}
836
837void
838MapType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
839{
840 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
841}
842
Elliott Hughesb9eba862011-07-13 12:10:30 -0700843static void EnsureClassLoader(StatementBlock* addTo, Variable** cl)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800844{
Elliott Hughesb9eba862011-07-13 12:10:30 -0700845 // We don't want to look up the class loader once for every
846 // collection argument, so ensure we do it at most once per method.
847 if (*cl == NULL) {
848 *cl = new Variable(CLASSLOADER_TYPE, "cl");
849 addTo->Add(new VariableDeclaration(*cl,
850 new LiteralExpression("this.getClass().getClassLoader()"),
851 CLASSLOADER_TYPE));
852 }
853}
854
855void
856MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
857{
858 EnsureClassLoader(addTo, cl);
859 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800860}
861
862void
Joe Onorato05ffbe72011-09-02 15:28:36 -0700863MapType::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800864{
Elliott Hughesb9eba862011-07-13 12:10:30 -0700865 EnsureClassLoader(addTo, cl);
866 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800867}
868
869
870// ================================================================
871
872ListType::ListType()
Joe Onorato7db766c2011-09-15 21:31:15 -0700873 :Type("java.util", "List", BUILT_IN, true, true, true)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800874{
875}
876
877string
878ListType::InstantiableName() const
879{
880 return "java.util.ArrayList";
881}
882
883void
884ListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
885{
886 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
887}
888
889void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700890ListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800891{
Elliott Hughesb9eba862011-07-13 12:10:30 -0700892 EnsureClassLoader(addTo, cl);
893 addTo->Add(new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800894}
895
896void
897ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700898 Variable* parcel, Variable** cl)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800899{
Elliott Hughesb9eba862011-07-13 12:10:30 -0700900 EnsureClassLoader(addTo, cl);
901 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800902}
903
Joe Onorato05ffbe72011-09-02 15:28:36 -0700904void
905ListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
906 Variable* data, int flags)
907{
908 addTo->Add(new MethodCall(data, "putList", 2, k, v));
909}
910
911void
912ListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
913 Variable** cl)
914{
915 addTo->Add(new Assignment(v, new MethodCall(data, "getList", 1, k)));
916}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800917
918// ================================================================
919
920ParcelableType::ParcelableType(const string& package, const string& name,
921 bool builtIn, const string& declFile, int declLine)
Joe Onorato7db766c2011-09-15 21:31:15 -0700922 :Type(package, name, builtIn ? BUILT_IN : PARCELABLE, true, false, true,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800923 declFile, declLine)
924{
925}
926
927string
928ParcelableType::CreatorName() const
929{
930 return QualifiedName() + ".CREATOR";
931}
932
933void
934ParcelableType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
935{
936 // if (v != null) {
937 // parcel.writeInt(1);
938 // v.writeToParcel(parcel);
939 // } else {
940 // parcel.writeInt(0);
941 // }
942 IfStatement* elsepart = new IfStatement();
943 elsepart->statements->Add(new MethodCall(parcel, "writeInt", 1,
944 new LiteralExpression("0")));
945 IfStatement* ifpart = new IfStatement;
946 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
947 ifpart->elseif = elsepart;
948 ifpart->statements->Add(new MethodCall(parcel, "writeInt", 1,
949 new LiteralExpression("1")));
950 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2,
951 parcel, BuildWriteToParcelFlags(flags)));
952
953 addTo->Add(ifpart);
954}
955
956void
Elliott Hughesb9eba862011-07-13 12:10:30 -0700957ParcelableType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800958{
959 // if (0 != parcel.readInt()) {
960 // v = CLASS.CREATOR.createFromParcel(parcel)
961 // } else {
962 // v = null;
963 // }
964 IfStatement* elsepart = new IfStatement();
965 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
966
967 IfStatement* ifpart = new IfStatement();
968 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
969 new MethodCall(parcel, "readInt"));
970 ifpart->elseif = elsepart;
971 ifpart->statements->Add(new Assignment(v,
972 new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
973
974 addTo->Add(ifpart);
975}
976
977void
978ParcelableType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -0700979 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800980{
981 // TODO: really, we don't need to have this extra check, but we
982 // don't have two separate marshalling code paths
983 // if (0 != parcel.readInt()) {
984 // v.readFromParcel(parcel)
985 // }
986 IfStatement* ifpart = new IfStatement();
987 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
988 new MethodCall(parcel, "readInt"));
989 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
990 addTo->Add(ifpart);
991}
992
993bool
994ParcelableType::CanBeArray() const
995{
996 return true;
997}
998
999void
1000ParcelableType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1001{
1002 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
1003 BuildWriteToParcelFlags(flags)));
1004}
1005
1006void
1007ParcelableType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -07001008 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001009{
1010 string creator = v->type->QualifiedName() + ".CREATOR";
1011 addTo->Add(new Assignment(v, new MethodCall(parcel,
1012 "createTypedArray", 1, new LiteralExpression(creator))));
1013}
1014
1015void
Elliott Hughesb9eba862011-07-13 12:10:30 -07001016ParcelableType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001017{
1018 string creator = v->type->QualifiedName() + ".CREATOR";
1019 addTo->Add(new MethodCall(parcel, "readTypedArray", 2,
1020 v, new LiteralExpression(creator)));
1021}
1022
Joe Onorato7db766c2011-09-15 21:31:15 -07001023// ================================================================
1024
1025FlattenableType::FlattenableType(const string& package, const string& name,
1026 bool builtIn, const string& declFile, int declLine)
1027 :Type(package, name, builtIn ? BUILT_IN : PARCELABLE, false, true, true,
1028 declFile, declLine)
1029{
1030}
1031
1032string
1033FlattenableType::CreatorName() const
1034{
1035 return QualifiedName() + ".CREATOR";
1036}
1037
1038void
1039FlattenableType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1040 Variable* data, int flags)
1041{
1042 // if (v != null) {
1043 // RpcData _obj = new RpcData();
1044 // v.writeToRpcData(_obj);
1045 // data.putRpcData(k, obj);
1046 // }
1047 IfStatement* ifpart = new IfStatement;
1048 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
1049 Variable* _obj = new Variable(RPC_DATA_TYPE, "_obj");
1050 ifpart->statements->Add(new VariableDeclaration(_obj, new NewExpression(RPC_DATA_TYPE)));
1051 ifpart->statements->Add(new MethodCall(v, "writeToRpcData", 1, _obj));
1052 ifpart->statements->Add(new MethodCall(data, "putRpcData", 2, k, _obj));
1053
1054 addTo->Add(ifpart);
1055}
1056
1057void
1058FlattenableType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1059 Variable* data, Variable** cl)
1060{
1061 // RpcData _obj_XX = data.getRpcData(k);
1062 // if (_data_XX != null)
1063 // v = CLASS.RPC_CREATOR.createFromParcel(parcel)
1064 // } else {
1065 // v = null;
1066 // }
1067
1068 StatementBlock* block = new StatementBlock;
1069 addTo->Add(block);
1070
1071 Variable* _obj = new Variable(RPC_DATA_TYPE, "_obj");
1072 block->Add(new VariableDeclaration(_obj, new MethodCall(data, "getRpcData", 1, k)));
1073
1074 IfStatement* ifpart = new IfStatement();
1075 ifpart->expression = new Comparison(_obj, "!=", NULL_VALUE);
1076 ifpart->statements->Add(new Assignment(v,
1077 new MethodCall(v->type, "RPC_CREATOR.createFromRpcData", 1, data)));
1078
1079 IfStatement* elsepart = new IfStatement();
1080 ifpart->elseif = elsepart;
1081 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
1082
1083 block->Add(ifpart);
1084}
1085
1086bool
1087FlattenableType::CanBeArray() const
1088{
1089 return true;
1090}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001091
1092// ================================================================
1093
1094InterfaceType::InterfaceType(const string& package, const string& name,
1095 bool builtIn, bool oneway,
1096 const string& declFile, int declLine)
Joe Onorato7db766c2011-09-15 21:31:15 -07001097 :Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, false,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001098 declFile, declLine)
1099 ,m_oneway(oneway)
1100{
1101}
1102
1103bool
1104InterfaceType::OneWay() const
1105{
1106 return m_oneway;
1107}
1108
1109void
1110InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1111{
1112 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
1113 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1,
1114 new Ternary(
1115 new Comparison(v, "!=", NULL_VALUE),
1116 new MethodCall(v, "asBinder"),
1117 NULL_VALUE)));
1118}
1119
1120void
Elliott Hughesb9eba862011-07-13 12:10:30 -07001121InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001122{
1123 // v = Interface.asInterface(parcel.readStrongBinder());
1124 string type = v->type->QualifiedName();
1125 type += ".Stub";
1126 addTo->Add(new Assignment(v,
1127 new MethodCall( NAMES.Find(type), "asInterface", 1,
1128 new MethodCall(parcel, "readStrongBinder"))));
1129}
1130
1131
1132// ================================================================
1133
1134GenericType::GenericType(const string& package, const string& name,
1135 const vector<Type*>& args)
Joe Onorato7db766c2011-09-15 21:31:15 -07001136 :Type(package, name, BUILT_IN, true, true, true)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001137{
1138 m_args = args;
1139
1140 m_importName = package + '.' + name;
1141
1142 string gen = "<";
1143 int N = args.size();
1144 for (int i=0; i<N; i++) {
1145 Type* t = args[i];
1146 gen += t->QualifiedName();
1147 if (i != N-1) {
1148 gen += ',';
1149 }
1150 }
1151 gen += '>';
1152 m_genericArguments = gen;
1153 SetQualifiedName(m_importName + gen);
1154}
1155
Joe Onorato05ffbe72011-09-02 15:28:36 -07001156const vector<Type*>&
1157GenericType::GenericArgumentTypes() const
1158{
1159 return m_args;
1160}
1161
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001162string
1163GenericType::GenericArguments() const
1164{
1165 return m_genericArguments;
1166}
1167
1168string
1169GenericType::ImportType() const
1170{
1171 return m_importName;
1172}
1173
1174void
1175GenericType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1176{
1177 fprintf(stderr, "implement GenericType::WriteToParcel\n");
1178}
1179
1180void
Elliott Hughesb9eba862011-07-13 12:10:30 -07001181GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001182{
1183 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
1184}
1185
1186void
1187GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -07001188 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001189{
1190 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
1191}
1192
1193
1194// ================================================================
1195
1196GenericListType::GenericListType(const string& package, const string& name,
1197 const vector<Type*>& args)
1198 :GenericType(package, name, args),
1199 m_creator(args[0]->CreatorName())
1200{
1201}
1202
1203string
1204GenericListType::CreatorName() const
1205{
1206 return "android.os.Parcel.arrayListCreator";
1207}
1208
1209string
1210GenericListType::InstantiableName() const
1211{
1212 return "java.util.ArrayList" + GenericArguments();
1213}
1214
1215void
1216GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1217{
1218 if (m_creator == STRING_TYPE->CreatorName()) {
1219 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
1220 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
1221 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
1222 } else {
1223 // parcel.writeTypedListXX(arg);
1224 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
1225 }
1226}
1227
1228void
Elliott Hughesb9eba862011-07-13 12:10:30 -07001229GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001230{
1231 if (m_creator == STRING_TYPE->CreatorName()) {
1232 addTo->Add(new Assignment(v,
1233 new MethodCall(parcel, "createStringArrayList", 0)));
1234 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
1235 addTo->Add(new Assignment(v,
1236 new MethodCall(parcel, "createBinderArrayList", 0)));
1237 } else {
1238 // v = _data.readTypedArrayList(XXX.creator);
1239 addTo->Add(new Assignment(v,
1240 new MethodCall(parcel, "createTypedArrayList", 1,
1241 new LiteralExpression(m_creator))));
1242 }
1243}
1244
1245void
1246GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughesb9eba862011-07-13 12:10:30 -07001247 Variable* parcel, Variable**)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001248{
1249 if (m_creator == STRING_TYPE->CreatorName()) {
1250 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
1251 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
1252 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
1253 } else {
1254 // v = _data.readTypedList(v, XXX.creator);
1255 addTo->Add(new MethodCall(parcel, "readTypedList", 2,
1256 v,
1257 new LiteralExpression(m_creator)));
1258 }
1259}
1260
Joe Onorato05ffbe72011-09-02 15:28:36 -07001261void
1262GenericListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1263 Variable* data, int flags)
1264{
1265 addTo->Add(new MethodCall(data, "putList", 2, k, v));
1266}
1267
1268void
1269GenericListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1270 Variable* data, Variable** cl)
1271{
1272 string classArg = GenericArgumentTypes()[0]->QualifiedName();
1273 classArg += ".class";
1274 addTo->Add(new Assignment(v, new MethodCall(data, "getList", 2, k,
1275 new LiteralExpression(classArg))));
1276}
1277
Joe Onorato1eb72042011-09-06 11:01:17 -07001278
1279// ================================================================
1280
1281RpcDataType::RpcDataType()
Joe Onorato7db766c2011-09-15 21:31:15 -07001282 :Type("com.android.athome.rpc", "RpcData", Type::BUILT_IN, false, true, true)
Joe Onorato1eb72042011-09-06 11:01:17 -07001283{
1284}
1285
1286void
1287RpcDataType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1288 Variable* data, int flags)
1289{
1290 addTo->Add(new MethodCall(data, "putRpcData", 2, k, v));
1291}
1292
1293void
1294RpcDataType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
1295 Variable** cl)
1296{
1297 addTo->Add(new Assignment(v, new MethodCall(data, "getRpcData", 1, k)));
1298}
1299
1300
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001301// ================================================================
1302
1303ClassLoaderType::ClassLoaderType()
Joe Onorato7db766c2011-09-15 21:31:15 -07001304 :Type("java.lang", "ClassLoader", BUILT_IN, false, false, false)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001305{
1306}
1307
1308
1309// ================================================================
1310
1311Namespace::Namespace()
1312{
1313}
1314
1315Namespace::~Namespace()
1316{
1317 int N = m_types.size();
1318 for (int i=0; i<N; i++) {
1319 delete m_types[i];
1320 }
1321}
1322
1323void
1324Namespace::Add(Type* type)
1325{
1326 Type* t = Find(type->QualifiedName());
1327 if (t == NULL) {
1328 m_types.push_back(type);
1329 }
1330}
1331
1332void
1333Namespace::AddGenericType(const string& package, const string& name, int args)
1334{
1335 Generic g;
1336 g.package = package;
1337 g.name = name;
1338 g.qualified = package + '.' + name;
1339 g.args = args;
1340 m_generics.push_back(g);
1341}
1342
1343Type*
1344Namespace::Find(const string& name) const
1345{
1346 int N = m_types.size();
1347 for (int i=0; i<N; i++) {
1348 if (m_types[i]->QualifiedName() == name) {
1349 return m_types[i];
1350 }
1351 }
1352 return NULL;
1353}
1354
1355Type*
1356Namespace::Find(const char* package, const char* name) const
1357{
1358 string s;
1359 if (package != NULL) {
1360 s += package;
1361 s += '.';
1362 }
1363 s += name;
1364 return Find(s);
1365}
1366
1367static string
1368normalize_generic(const string& s)
1369{
1370 string r;
1371 int N = s.size();
1372 for (int i=0; i<N; i++) {
1373 char c = s[i];
1374 if (!isspace(c)) {
1375 r += c;
1376 }
1377 }
1378 return r;
1379}
1380
1381Type*
1382Namespace::Search(const string& name)
1383{
1384 // an exact match wins
1385 Type* result = Find(name);
1386 if (result != NULL) {
1387 return result;
1388 }
1389
1390 // try the class names
1391 // our language doesn't allow you to not specify outer classes
1392 // when referencing an inner class. that could be changed, and this
1393 // would be the place to do it, but I don't think the complexity in
1394 // scoping rules is worth it.
1395 int N = m_types.size();
1396 for (int i=0; i<N; i++) {
1397 if (m_types[i]->Name() == name) {
1398 return m_types[i];
1399 }
1400 }
1401
1402 // we got to here and it's not a generic, give up
1403 if (name.find('<') == name.npos) {
1404 return NULL;
1405 }
1406
1407 // remove any whitespace
1408 string normalized = normalize_generic(name);
1409
1410 // find the part before the '<', find a generic for it
1411 ssize_t baseIndex = normalized.find('<');
1412 string base(normalized.c_str(), baseIndex);
1413 const Generic* g = search_generic(base);
1414 if (g == NULL) {
1415 return NULL;
1416 }
1417
1418 // For each of the args, do a recursive search on it. We don't allow
1419 // generics within generics like Java does, because we're really limiting
1420 // them to just built-in container classes, at least for now. Our syntax
1421 // ensures this right now as well.
1422 vector<Type*> args;
1423 size_t start = baseIndex + 1;
1424 size_t end = start;
1425 while (normalized[start] != '\0') {
1426 end = normalized.find(',', start);
1427 if (end == normalized.npos) {
1428 end = normalized.find('>', start);
1429 }
1430 string s(normalized.c_str()+start, end-start);
1431 Type* t = this->Search(s);
1432 if (t == NULL) {
1433 // maybe we should print a warning here?
1434 return NULL;
1435 }
1436 args.push_back(t);
1437 start = end+1;
1438 }
1439
1440 // construct a GenericType, add it to our name set so they always get
1441 // the same object, and return it.
1442 result = make_generic_type(g->package, g->name, args);
1443 if (result == NULL) {
1444 return NULL;
1445 }
1446
1447 this->Add(result);
1448 return this->Find(result->QualifiedName());
1449}
1450
1451const Namespace::Generic*
1452Namespace::search_generic(const string& name) const
1453{
1454 int N = m_generics.size();
1455
1456 // first exact match
1457 for (int i=0; i<N; i++) {
1458 const Generic& g = m_generics[i];
1459 if (g.qualified == name) {
1460 return &g;
1461 }
1462 }
1463
1464 // then name match
1465 for (int i=0; i<N; i++) {
1466 const Generic& g = m_generics[i];
1467 if (g.name == name) {
1468 return &g;
1469 }
1470 }
1471
1472 return NULL;
1473}
1474
1475void
1476Namespace::Dump() const
1477{
1478 int n = m_types.size();
1479 for (int i=0; i<n; i++) {
1480 Type* t = m_types[i];
1481 printf("type: package=%s name=%s qualifiedName=%s\n",
1482 t->Package().c_str(), t->Name().c_str(),
1483 t->QualifiedName().c_str());
1484 }
1485}