blob: 9a58af00c4022251b72f2737ff06bb90f5fa905d [file] [log] [blame]
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001#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 Onoratoc596cfe2011-08-30 17:24:17 -070014Type* OBJECT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070015Type* 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 Onoratoc596cfe2011-08-30 17:24:17 -070025Type* CONTEXT_TYPE;
The Android Open Source Project46c012c2008-10-21 07:00:00 -070026Type* MAP_TYPE;
27Type* LIST_TYPE;
28Type* CLASSLOADER_TYPE;
Joe Onoratoc596cfe2011-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 Project46c012c2008-10-21 07:00:00 -070036
37Expression* NULL_VALUE;
38Expression* THIS_VALUE;
39Expression* SUPER_VALUE;
40Expression* TRUE_VALUE;
41Expression* FALSE_VALUE;
42
43void
44register_base_types()
45{
Joe Onorato3d0e06f2011-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 Project46c012c2008-10-21 07:00:00 -070049 NAMES.Add(VOID_TYPE);
50
51 BOOLEAN_TYPE = new BooleanType();
52 NAMES.Add(BOOLEAN_TYPE);
53
Joe Onorato3d0e06f2011-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 Project46c012c2008-10-21 07:00:00 -070057 NAMES.Add(BYTE_TYPE);
58
59 CHAR_TYPE = new CharType();
60 NAMES.Add(CHAR_TYPE);
61
Joe Onorato3d0e06f2011-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 Project46c012c2008-10-21 07:00:00 -070065 NAMES.Add(INT_TYPE);
66
Joe Onorato3d0e06f2011-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 Project46c012c2008-10-21 07:00:00 -070070 NAMES.Add(LONG_TYPE);
71
Joe Onorato3d0e06f2011-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 Project46c012c2008-10-21 07:00:00 -070075 NAMES.Add(FLOAT_TYPE);
76
Joe Onorato3d0e06f2011-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 Project46c012c2008-10-21 07:00:00 -070080 NAMES.Add(DOUBLE_TYPE);
81
82 STRING_TYPE = new StringType();
83 NAMES.Add(STRING_TYPE);
84
Joe Onoratoc596cfe2011-08-30 17:24:17 -070085 OBJECT_TYPE = new Type("java.lang", "Object",
86 Type::BUILT_IN, false, false);
87 NAMES.Add(OBJECT_TYPE);
88
The Android Open Source Project46c012c2008-10-21 07:00:00 -070089 CHAR_SEQUENCE_TYPE = new CharSequenceType();
90 NAMES.Add(CHAR_SEQUENCE_TYPE);
91
92 MAP_TYPE = new MapType();
93 NAMES.Add(MAP_TYPE);
94
95 LIST_TYPE = new ListType();
96 NAMES.Add(LIST_TYPE);
97
Joe Onorato3d0e06f2011-09-02 15:28:36 -070098 TEXT_UTILS_TYPE = new Type("android.text", "TextUtils", Type::BUILT_IN, false, false);
The Android Open Source Project46c012c2008-10-21 07:00:00 -070099 NAMES.Add(TEXT_UTILS_TYPE);
100
101 REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
102 NAMES.Add(REMOTE_EXCEPTION_TYPE);
103
104 RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
105 NAMES.Add(RUNTIME_EXCEPTION_TYPE);
106
107 IBINDER_TYPE = new IBinderType();
108 NAMES.Add(IBINDER_TYPE);
109
110 IINTERFACE_TYPE = new IInterfaceType();
111 NAMES.Add(IINTERFACE_TYPE);
112
113 BINDER_NATIVE_TYPE = new BinderType();
114 NAMES.Add(BINDER_NATIVE_TYPE);
115
116 BINDER_PROXY_TYPE = new BinderProxyType();
117 NAMES.Add(BINDER_PROXY_TYPE);
118
119 PARCEL_TYPE = new ParcelType();
120 NAMES.Add(PARCEL_TYPE);
121
122 PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
123 NAMES.Add(PARCELABLE_INTERFACE_TYPE);
124
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700125 CONTEXT_TYPE = new Type("android.content", "Context",
126 Type::BUILT_IN, false, false);
127 NAMES.Add(CONTEXT_TYPE);
128
129 RPC_SERVICE_BASE_TYPE = new Type("com.android.athome.service", "AndroidAtHomeService",
130 Type::BUILT_IN, false, false);
131 NAMES.Add(RPC_SERVICE_BASE_TYPE);
132
Joe Onorato1c5b7922011-09-06 11:01:17 -0700133 RPC_DATA_TYPE = new RpcDataType();
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700134 NAMES.Add(RPC_DATA_TYPE);
135
136 RPC_BROKER_TYPE = new Type("com.android.athome.utils", "AndroidAtHomeBroker",
137 Type::BUILT_IN, false, false);
138 NAMES.Add(RPC_BROKER_TYPE);
139
140 RPC_ENDPOINT_INFO_TYPE = new ParcelableType("com.android.athome.rpc", "EndpointInfo",
141 true, __FILE__, __LINE__);
142 NAMES.Add(RPC_ENDPOINT_INFO_TYPE);
143
144 RPC_RESULT_HANDLER_TYPE = new ParcelableType("com.android.athome.rpc", "RpcResultHandler",
145 true, __FILE__, __LINE__);
146 NAMES.Add(RPC_RESULT_HANDLER_TYPE);
147
148 RPC_ERROR_TYPE = new ParcelableType("com.android.athome.rpc", "RpcError",
149 true, __FILE__, __LINE__);
150 NAMES.Add(RPC_ERROR_TYPE);
151
152 RPC_ERROR_LISTENER_TYPE = new Type("com.android.athome.rpc", "RpcErrorHandler",
153 Type::BUILT_IN, false, false);
154 NAMES.Add(RPC_ERROR_LISTENER_TYPE);
155
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700156 CLASSLOADER_TYPE = new ClassLoaderType();
157 NAMES.Add(CLASSLOADER_TYPE);
158
159 NULL_VALUE = new LiteralExpression("null");
160 THIS_VALUE = new LiteralExpression("this");
161 SUPER_VALUE = new LiteralExpression("super");
162 TRUE_VALUE = new LiteralExpression("true");
163 FALSE_VALUE = new LiteralExpression("false");
164
165 NAMES.AddGenericType("java.util", "List", 1);
166 NAMES.AddGenericType("java.util", "Map", 2);
167}
168
169static Type*
170make_generic_type(const string& package, const string& name,
171 const vector<Type*>& args)
172{
173 if (package == "java.util" && name == "List") {
174 return new GenericListType("java.util", "List", args);
175 }
176 return NULL;
177 //return new GenericType(package, name, args);
178}
179
180// ================================================================
181
182Type::Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut)
183 :m_package(),
184 m_name(name),
185 m_declFile(""),
186 m_declLine(-1),
187 m_kind(kind),
188 m_canWriteToParcel(canWriteToParcel),
189 m_canBeOut(canBeOut)
190{
191 m_qualifiedName = name;
192}
193
194Type::Type(const string& package, const string& name,
195 int kind, bool canWriteToParcel, bool canBeOut,
196 const string& declFile, int declLine)
197 :m_package(package),
198 m_name(name),
199 m_declFile(declFile),
200 m_declLine(declLine),
201 m_kind(kind),
202 m_canWriteToParcel(canWriteToParcel),
203 m_canBeOut(canBeOut)
204{
205 if (package.length() > 0) {
206 m_qualifiedName = package;
207 m_qualifiedName += '.';
208 }
209 m_qualifiedName += name;
210}
211
212Type::~Type()
213{
214}
215
216bool
217Type::CanBeArray() const
218{
219 return false;
220}
221
222string
223Type::ImportType() const
224{
225 return m_qualifiedName;
226}
227
228string
229Type::CreatorName() const
230{
231 return "";
232}
233
234string
235Type::InstantiableName() const
236{
237 return QualifiedName();
238}
239
240
241void
242Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
243{
244 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn",
245 __FILE__, __LINE__, m_qualifiedName.c_str());
246 addTo->Add(new LiteralExpression("/* WriteToParcel error "
247 + m_qualifiedName + " */"));
248}
249
250void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700251Type::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700252{
253 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
254 __FILE__, __LINE__, m_qualifiedName.c_str());
255 addTo->Add(new LiteralExpression("/* CreateFromParcel error "
256 + m_qualifiedName + " */"));
257}
258
259void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700260Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700261{
262 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
263 __FILE__, __LINE__, m_qualifiedName.c_str());
264 addTo->Add(new LiteralExpression("/* ReadFromParcel error "
265 + m_qualifiedName + " */"));
266}
267
268void
269Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
270{
271 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
272 __FILE__, __LINE__, m_qualifiedName.c_str());
273 addTo->Add(new LiteralExpression("/* WriteArrayToParcel error "
274 + m_qualifiedName + " */"));
275}
276
277void
278Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700279 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700280{
281 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
282 __FILE__, __LINE__, m_qualifiedName.c_str());
283 addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error "
284 + m_qualifiedName + " */"));
285}
286
287void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700288Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700289{
290 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
291 __FILE__, __LINE__, m_qualifiedName.c_str());
292 addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error "
293 + m_qualifiedName + " */"));
294}
295
296void
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700297Type::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
298 Variable* data, int flags)
299{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700300 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700301 __FILE__, __LINE__, m_qualifiedName.c_str());
302 addTo->Add(new LiteralExpression("/* WriteToRpcData error "
303 + m_qualifiedName + " */"));
304}
305
306void
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700307Type::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
308 Variable** cl)
309{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700310 fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700311 __FILE__, __LINE__, m_qualifiedName.c_str());
312 addTo->Add(new LiteralExpression("/* ReadFromRpcData error "
313 + m_qualifiedName + " */"));
314}
315
316void
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700317Type::SetQualifiedName(const string& qualified)
318{
319 m_qualifiedName = qualified;
320}
321
322Expression*
323Type::BuildWriteToParcelFlags(int flags)
324{
325 if (flags == 0) {
326 return new LiteralExpression("0");
327 }
328 if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0) {
329 return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
330 "PARCELABLE_WRITE_RETURN_VALUE");
331 }
332 return new LiteralExpression("0");
333}
334
335// ================================================================
336
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700337BasicType::BasicType(const string& name, const string& marshallParcel,
338 const string& unmarshallParcel, const string& writeArrayParcel,
339 const string& createArrayParcel, const string& readArrayParcel,
340 const string& marshallRpc, const string& unmarshallRpc,
341 const string& writeArrayRpc, const string& createArrayRpc, const string& readArrayRpc)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700342 :Type(name, BUILT_IN, true, false),
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700343 m_marshallParcel(marshallParcel),
344 m_unmarshallParcel(unmarshallParcel),
345 m_writeArrayParcel(writeArrayParcel),
346 m_createArrayParcel(createArrayParcel),
347 m_readArrayParcel(readArrayParcel),
348 m_marshallRpc(marshallRpc),
349 m_unmarshallRpc(unmarshallRpc),
350 m_writeArrayRpc(writeArrayRpc),
351 m_createArrayRpc(createArrayRpc),
352 m_readArrayRpc(readArrayRpc)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700353{
354}
355
356void
357BasicType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
358{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700359 addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700360}
361
362void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700363BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700364{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700365 addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700366}
367
368bool
369BasicType::CanBeArray() const
370{
371 return true;
372}
373
374void
375BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
376{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700377 addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700378}
379
380void
381BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700382 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700383{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700384 addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700385}
386
387void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700388BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700389{
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700390 addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700391}
392
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700393void
394BasicType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
395 Variable* data, int flags)
396{
397 addTo->Add(new MethodCall(data, m_marshallRpc, 2, k, v));
398}
399
400void
401BasicType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
402 Variable** cl)
403{
404 addTo->Add(new Assignment(v, new MethodCall(data, m_unmarshallRpc, 1, k)));
405}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700406
407// ================================================================
408
409BooleanType::BooleanType()
410 :Type("boolean", BUILT_IN, true, false)
411{
412}
413
414void
415BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
416{
417 addTo->Add(new MethodCall(parcel, "writeInt", 1,
418 new Ternary(v, new LiteralExpression("1"),
419 new LiteralExpression("0"))));
420}
421
422void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700423BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700424{
425 addTo->Add(new Assignment(v, new Comparison(new LiteralExpression("0"),
426 "!=", new MethodCall(parcel, "readInt"))));
427}
428
429bool
430BooleanType::CanBeArray() const
431{
432 return true;
433}
434
435void
436BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
437{
438 addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
439}
440
441void
442BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700443 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700444{
445 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
446}
447
448void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700449BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700450{
451 addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
452}
453
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700454void
455BooleanType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
456 Variable* data, int flags)
457{
458 addTo->Add(new MethodCall(data, "putBoolean", 2, k, v));
459}
460
461void
462BooleanType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
463 Variable** cl)
464{
465 addTo->Add(new Assignment(v, new MethodCall(data, "getBoolean", 1, k)));
466}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700467
468// ================================================================
469
470CharType::CharType()
471 :Type("char", BUILT_IN, true, false)
472{
473}
474
475void
476CharType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
477{
478 addTo->Add(new MethodCall(parcel, "writeInt", 1,
479 new Cast(INT_TYPE, v)));
480}
481
482void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700483CharType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700484{
485 addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
486}
487
488bool
489CharType::CanBeArray() const
490{
491 return true;
492}
493
494void
495CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
496{
497 addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
498}
499
500void
501CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700502 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700503{
504 addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
505}
506
507void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700508CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700509{
510 addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
511}
512
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700513void
514CharType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
515 Variable* data, int flags)
516{
517 addTo->Add(new MethodCall(data, "putChar", 2, k, v));
518}
519
520void
521CharType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
522 Variable** cl)
523{
524 addTo->Add(new Assignment(v, new MethodCall(data, "getChar", 1, k)));
525}
526
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700527// ================================================================
528
529StringType::StringType()
530 :Type("java.lang", "String", BUILT_IN, true, false)
531{
532}
533
534string
535StringType::CreatorName() const
536{
537 return "android.os.Parcel.STRING_CREATOR";
538}
539
540void
541StringType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
542{
543 addTo->Add(new MethodCall(parcel, "writeString", 1, v));
544}
545
546void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700547StringType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700548{
549 addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
550}
551
552bool
553StringType::CanBeArray() const
554{
555 return true;
556}
557
558void
559StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
560{
561 addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
562}
563
564void
565StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700566 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700567{
568 addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
569}
570
571void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700572StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700573{
574 addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
575}
576
Joe Onoratoc596cfe2011-08-30 17:24:17 -0700577void
578StringType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
579 Variable* data, int flags)
580{
581 addTo->Add(new MethodCall(data, "putString", 2, k, v));
582}
583
584void
585StringType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
586 Variable* data, Variable**)
587{
588 addTo->Add(new Assignment(v, new MethodCall(data, "getString", 1, k)));
589}
590
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700591// ================================================================
592
593CharSequenceType::CharSequenceType()
594 :Type("java.lang", "CharSequence", BUILT_IN, true, false)
595{
596}
597
598string
599CharSequenceType::CreatorName() const
600{
601 return "android.os.Parcel.STRING_CREATOR";
602}
603
604void
605CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
606{
607 // if (v != null) {
608 // parcel.writeInt(1);
609 // v.writeToParcel(parcel);
610 // } else {
611 // parcel.writeInt(0);
612 // }
613 IfStatement* elsepart = new IfStatement();
614 elsepart->statements->Add(new MethodCall(parcel, "writeInt", 1,
615 new LiteralExpression("0")));
616 IfStatement* ifpart = new IfStatement;
617 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
618 ifpart->elseif = elsepart;
619 ifpart->statements->Add(new MethodCall(parcel, "writeInt", 1,
620 new LiteralExpression("1")));
621 ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel",
622 3, v, parcel, BuildWriteToParcelFlags(flags)));
623
624 addTo->Add(ifpart);
625}
626
627void
628CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700629 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700630{
631 // if (0 != parcel.readInt()) {
632 // v = TextUtils.createFromParcel(parcel)
633 // } else {
634 // v = null;
635 // }
636 IfStatement* elsepart = new IfStatement();
637 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
638
639 IfStatement* ifpart = new IfStatement();
640 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
641 new MethodCall(parcel, "readInt"));
642 ifpart->elseif = elsepart;
643 ifpart->statements->Add(new Assignment(v,
644 new MethodCall(TEXT_UTILS_TYPE,
645 "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
646
647 addTo->Add(ifpart);
648}
649
650
651// ================================================================
652
653RemoteExceptionType::RemoteExceptionType()
654 :Type("android.os", "RemoteException", BUILT_IN, false, false)
655{
656}
657
658void
659RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
660{
661 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
662}
663
664void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700665RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700666{
667 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
668}
669
670// ================================================================
671
672RuntimeExceptionType::RuntimeExceptionType()
673 :Type("java.lang", "RuntimeException", BUILT_IN, false, false)
674{
675}
676
677void
678RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
679{
680 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
681}
682
683void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700684RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700685{
686 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
687}
688
689
690// ================================================================
691
692IBinderType::IBinderType()
693 :Type("android.os", "IBinder", BUILT_IN, true, false)
694{
695}
696
697void
698IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
699{
700 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
701}
702
703void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700704IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700705{
706 addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
707}
708
709void
710IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
711{
712 addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
713}
714
715void
716IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700717 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700718{
719 addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
720}
721
722void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700723IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700724{
725 addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
726}
727
728
729// ================================================================
730
731IInterfaceType::IInterfaceType()
732 :Type("android.os", "IInterface", BUILT_IN, false, false)
733{
734}
735
736void
737IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
738{
739 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
740}
741
742void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700743IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700744{
745 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
746}
747
748
749// ================================================================
750
751BinderType::BinderType()
752 :Type("android.os", "Binder", BUILT_IN, false, false)
753{
754}
755
756void
757BinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
758{
759 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
760}
761
762void
763BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700764 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700765{
766 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
767}
768
769
770// ================================================================
771
772BinderProxyType::BinderProxyType()
773 :Type("android.os", "BinderProxy", BUILT_IN, false, false)
774{
775}
776
777void
778BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
779{
780 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
781}
782
783void
784BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700785 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700786{
787 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
788}
789
790
791// ================================================================
792
793ParcelType::ParcelType()
794 :Type("android.os", "Parcel", BUILT_IN, false, false)
795{
796}
797
798void
799ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
800{
801 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
802}
803
804void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700805ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700806{
807 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
808}
809
810// ================================================================
811
812ParcelableInterfaceType::ParcelableInterfaceType()
813 :Type("android.os", "Parcelable", BUILT_IN, false, false)
814{
815}
816
817void
818ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
819{
820 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
821}
822
823void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700824ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700825{
826 fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
827}
828
829// ================================================================
830
831MapType::MapType()
832 :Type("java.util", "Map", BUILT_IN, true, true)
833{
834}
835
836void
837MapType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
838{
839 addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
840}
841
Elliott Hughes15f8da22011-07-13 12:10:30 -0700842static void EnsureClassLoader(StatementBlock* addTo, Variable** cl)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700843{
Elliott Hughes15f8da22011-07-13 12:10:30 -0700844 // We don't want to look up the class loader once for every
845 // collection argument, so ensure we do it at most once per method.
846 if (*cl == NULL) {
847 *cl = new Variable(CLASSLOADER_TYPE, "cl");
848 addTo->Add(new VariableDeclaration(*cl,
849 new LiteralExpression("this.getClass().getClassLoader()"),
850 CLASSLOADER_TYPE));
851 }
852}
853
854void
855MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
856{
857 EnsureClassLoader(addTo, cl);
858 addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700859}
860
861void
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700862MapType::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700863{
Elliott Hughes15f8da22011-07-13 12:10:30 -0700864 EnsureClassLoader(addTo, cl);
865 addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700866}
867
868
869// ================================================================
870
871ListType::ListType()
872 :Type("java.util", "List", BUILT_IN, true, true)
873{
874}
875
876string
877ListType::InstantiableName() const
878{
879 return "java.util.ArrayList";
880}
881
882void
883ListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
884{
885 addTo->Add(new MethodCall(parcel, "writeList", 1, v));
886}
887
888void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700889ListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700890{
Elliott Hughes15f8da22011-07-13 12:10:30 -0700891 EnsureClassLoader(addTo, cl);
892 addTo->Add(new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700893}
894
895void
896ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700897 Variable* parcel, Variable** cl)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700898{
Elliott Hughes15f8da22011-07-13 12:10:30 -0700899 EnsureClassLoader(addTo, cl);
900 addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700901}
902
Joe Onorato3d0e06f2011-09-02 15:28:36 -0700903void
904ListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
905 Variable* data, int flags)
906{
907 addTo->Add(new MethodCall(data, "putList", 2, k, v));
908}
909
910void
911ListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
912 Variable** cl)
913{
914 addTo->Add(new Assignment(v, new MethodCall(data, "getList", 1, k)));
915}
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700916
917// ================================================================
918
919ParcelableType::ParcelableType(const string& package, const string& name,
920 bool builtIn, const string& declFile, int declLine)
921 :Type(package, name, builtIn ? BUILT_IN : PARCELABLE, true, true,
922 declFile, declLine)
923{
924}
925
926string
927ParcelableType::CreatorName() const
928{
929 return QualifiedName() + ".CREATOR";
930}
931
932void
933ParcelableType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
934{
935 // if (v != null) {
936 // parcel.writeInt(1);
937 // v.writeToParcel(parcel);
938 // } else {
939 // parcel.writeInt(0);
940 // }
941 IfStatement* elsepart = new IfStatement();
942 elsepart->statements->Add(new MethodCall(parcel, "writeInt", 1,
943 new LiteralExpression("0")));
944 IfStatement* ifpart = new IfStatement;
945 ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
946 ifpart->elseif = elsepart;
947 ifpart->statements->Add(new MethodCall(parcel, "writeInt", 1,
948 new LiteralExpression("1")));
949 ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2,
950 parcel, BuildWriteToParcelFlags(flags)));
951
952 addTo->Add(ifpart);
953}
954
955void
Elliott Hughes15f8da22011-07-13 12:10:30 -0700956ParcelableType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700957{
958 // if (0 != parcel.readInt()) {
959 // v = CLASS.CREATOR.createFromParcel(parcel)
960 // } else {
961 // v = null;
962 // }
963 IfStatement* elsepart = new IfStatement();
964 elsepart->statements->Add(new Assignment(v, NULL_VALUE));
965
966 IfStatement* ifpart = new IfStatement();
967 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
968 new MethodCall(parcel, "readInt"));
969 ifpart->elseif = elsepart;
970 ifpart->statements->Add(new Assignment(v,
971 new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
972
973 addTo->Add(ifpart);
974}
975
976void
977ParcelableType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -0700978 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -0700979{
980 // TODO: really, we don't need to have this extra check, but we
981 // don't have two separate marshalling code paths
982 // if (0 != parcel.readInt()) {
983 // v.readFromParcel(parcel)
984 // }
985 IfStatement* ifpart = new IfStatement();
986 ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
987 new MethodCall(parcel, "readInt"));
988 ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
989 addTo->Add(ifpart);
990}
991
992bool
993ParcelableType::CanBeArray() const
994{
995 return true;
996}
997
998void
999ParcelableType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1000{
1001 addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
1002 BuildWriteToParcelFlags(flags)));
1003}
1004
1005void
1006ParcelableType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -07001007 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001008{
1009 string creator = v->type->QualifiedName() + ".CREATOR";
1010 addTo->Add(new Assignment(v, new MethodCall(parcel,
1011 "createTypedArray", 1, new LiteralExpression(creator))));
1012}
1013
1014void
Elliott Hughes15f8da22011-07-13 12:10:30 -07001015ParcelableType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001016{
1017 string creator = v->type->QualifiedName() + ".CREATOR";
1018 addTo->Add(new MethodCall(parcel, "readTypedArray", 2,
1019 v, new LiteralExpression(creator)));
1020}
1021
1022
1023// ================================================================
1024
1025InterfaceType::InterfaceType(const string& package, const string& name,
1026 bool builtIn, bool oneway,
1027 const string& declFile, int declLine)
1028 :Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false,
1029 declFile, declLine)
1030 ,m_oneway(oneway)
1031{
1032}
1033
1034bool
1035InterfaceType::OneWay() const
1036{
1037 return m_oneway;
1038}
1039
1040void
1041InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1042{
1043 // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
1044 addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1,
1045 new Ternary(
1046 new Comparison(v, "!=", NULL_VALUE),
1047 new MethodCall(v, "asBinder"),
1048 NULL_VALUE)));
1049}
1050
1051void
Elliott Hughes15f8da22011-07-13 12:10:30 -07001052InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001053{
1054 // v = Interface.asInterface(parcel.readStrongBinder());
1055 string type = v->type->QualifiedName();
1056 type += ".Stub";
1057 addTo->Add(new Assignment(v,
1058 new MethodCall( NAMES.Find(type), "asInterface", 1,
1059 new MethodCall(parcel, "readStrongBinder"))));
1060}
1061
1062
1063// ================================================================
1064
1065GenericType::GenericType(const string& package, const string& name,
1066 const vector<Type*>& args)
1067 :Type(package, name, BUILT_IN, true, true)
1068{
1069 m_args = args;
1070
1071 m_importName = package + '.' + name;
1072
1073 string gen = "<";
1074 int N = args.size();
1075 for (int i=0; i<N; i++) {
1076 Type* t = args[i];
1077 gen += t->QualifiedName();
1078 if (i != N-1) {
1079 gen += ',';
1080 }
1081 }
1082 gen += '>';
1083 m_genericArguments = gen;
1084 SetQualifiedName(m_importName + gen);
1085}
1086
Joe Onorato3d0e06f2011-09-02 15:28:36 -07001087const vector<Type*>&
1088GenericType::GenericArgumentTypes() const
1089{
1090 return m_args;
1091}
1092
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001093string
1094GenericType::GenericArguments() const
1095{
1096 return m_genericArguments;
1097}
1098
1099string
1100GenericType::ImportType() const
1101{
1102 return m_importName;
1103}
1104
1105void
1106GenericType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1107{
1108 fprintf(stderr, "implement GenericType::WriteToParcel\n");
1109}
1110
1111void
Elliott Hughes15f8da22011-07-13 12:10:30 -07001112GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001113{
1114 fprintf(stderr, "implement GenericType::CreateFromParcel\n");
1115}
1116
1117void
1118GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -07001119 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001120{
1121 fprintf(stderr, "implement GenericType::ReadFromParcel\n");
1122}
1123
1124
1125// ================================================================
1126
1127GenericListType::GenericListType(const string& package, const string& name,
1128 const vector<Type*>& args)
1129 :GenericType(package, name, args),
1130 m_creator(args[0]->CreatorName())
1131{
1132}
1133
1134string
1135GenericListType::CreatorName() const
1136{
1137 return "android.os.Parcel.arrayListCreator";
1138}
1139
1140string
1141GenericListType::InstantiableName() const
1142{
1143 return "java.util.ArrayList" + GenericArguments();
1144}
1145
1146void
1147GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
1148{
1149 if (m_creator == STRING_TYPE->CreatorName()) {
1150 addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
1151 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
1152 addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
1153 } else {
1154 // parcel.writeTypedListXX(arg);
1155 addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
1156 }
1157}
1158
1159void
Elliott Hughes15f8da22011-07-13 12:10:30 -07001160GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001161{
1162 if (m_creator == STRING_TYPE->CreatorName()) {
1163 addTo->Add(new Assignment(v,
1164 new MethodCall(parcel, "createStringArrayList", 0)));
1165 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
1166 addTo->Add(new Assignment(v,
1167 new MethodCall(parcel, "createBinderArrayList", 0)));
1168 } else {
1169 // v = _data.readTypedArrayList(XXX.creator);
1170 addTo->Add(new Assignment(v,
1171 new MethodCall(parcel, "createTypedArrayList", 1,
1172 new LiteralExpression(m_creator))));
1173 }
1174}
1175
1176void
1177GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
Elliott Hughes15f8da22011-07-13 12:10:30 -07001178 Variable* parcel, Variable**)
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001179{
1180 if (m_creator == STRING_TYPE->CreatorName()) {
1181 addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
1182 } else if (m_creator == IBINDER_TYPE->CreatorName()) {
1183 addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
1184 } else {
1185 // v = _data.readTypedList(v, XXX.creator);
1186 addTo->Add(new MethodCall(parcel, "readTypedList", 2,
1187 v,
1188 new LiteralExpression(m_creator)));
1189 }
1190}
1191
Joe Onorato3d0e06f2011-09-02 15:28:36 -07001192void
1193GenericListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1194 Variable* data, int flags)
1195{
1196 addTo->Add(new MethodCall(data, "putList", 2, k, v));
1197}
1198
1199void
1200GenericListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1201 Variable* data, Variable** cl)
1202{
1203 string classArg = GenericArgumentTypes()[0]->QualifiedName();
1204 classArg += ".class";
1205 addTo->Add(new Assignment(v, new MethodCall(data, "getList", 2, k,
1206 new LiteralExpression(classArg))));
1207}
1208
Joe Onorato1c5b7922011-09-06 11:01:17 -07001209
1210// ================================================================
1211
1212RpcDataType::RpcDataType()
1213 :Type("com.android.athome.rpc", "RpcData", Type::BUILT_IN, false, false)
1214{
1215}
1216
1217void
1218RpcDataType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
1219 Variable* data, int flags)
1220{
1221 addTo->Add(new MethodCall(data, "putRpcData", 2, k, v));
1222}
1223
1224void
1225RpcDataType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
1226 Variable** cl)
1227{
1228 addTo->Add(new Assignment(v, new MethodCall(data, "getRpcData", 1, k)));
1229}
1230
1231
The Android Open Source Project46c012c2008-10-21 07:00:00 -07001232// ================================================================
1233
1234ClassLoaderType::ClassLoaderType()
1235 :Type("java.lang", "ClassLoader", BUILT_IN, false, false)
1236{
1237}
1238
1239
1240// ================================================================
1241
1242Namespace::Namespace()
1243{
1244}
1245
1246Namespace::~Namespace()
1247{
1248 int N = m_types.size();
1249 for (int i=0; i<N; i++) {
1250 delete m_types[i];
1251 }
1252}
1253
1254void
1255Namespace::Add(Type* type)
1256{
1257 Type* t = Find(type->QualifiedName());
1258 if (t == NULL) {
1259 m_types.push_back(type);
1260 }
1261}
1262
1263void
1264Namespace::AddGenericType(const string& package, const string& name, int args)
1265{
1266 Generic g;
1267 g.package = package;
1268 g.name = name;
1269 g.qualified = package + '.' + name;
1270 g.args = args;
1271 m_generics.push_back(g);
1272}
1273
1274Type*
1275Namespace::Find(const string& name) const
1276{
1277 int N = m_types.size();
1278 for (int i=0; i<N; i++) {
1279 if (m_types[i]->QualifiedName() == name) {
1280 return m_types[i];
1281 }
1282 }
1283 return NULL;
1284}
1285
1286Type*
1287Namespace::Find(const char* package, const char* name) const
1288{
1289 string s;
1290 if (package != NULL) {
1291 s += package;
1292 s += '.';
1293 }
1294 s += name;
1295 return Find(s);
1296}
1297
1298static string
1299normalize_generic(const string& s)
1300{
1301 string r;
1302 int N = s.size();
1303 for (int i=0; i<N; i++) {
1304 char c = s[i];
1305 if (!isspace(c)) {
1306 r += c;
1307 }
1308 }
1309 return r;
1310}
1311
1312Type*
1313Namespace::Search(const string& name)
1314{
1315 // an exact match wins
1316 Type* result = Find(name);
1317 if (result != NULL) {
1318 return result;
1319 }
1320
1321 // try the class names
1322 // our language doesn't allow you to not specify outer classes
1323 // when referencing an inner class. that could be changed, and this
1324 // would be the place to do it, but I don't think the complexity in
1325 // scoping rules is worth it.
1326 int N = m_types.size();
1327 for (int i=0; i<N; i++) {
1328 if (m_types[i]->Name() == name) {
1329 return m_types[i];
1330 }
1331 }
1332
1333 // we got to here and it's not a generic, give up
1334 if (name.find('<') == name.npos) {
1335 return NULL;
1336 }
1337
1338 // remove any whitespace
1339 string normalized = normalize_generic(name);
1340
1341 // find the part before the '<', find a generic for it
1342 ssize_t baseIndex = normalized.find('<');
1343 string base(normalized.c_str(), baseIndex);
1344 const Generic* g = search_generic(base);
1345 if (g == NULL) {
1346 return NULL;
1347 }
1348
1349 // For each of the args, do a recursive search on it. We don't allow
1350 // generics within generics like Java does, because we're really limiting
1351 // them to just built-in container classes, at least for now. Our syntax
1352 // ensures this right now as well.
1353 vector<Type*> args;
1354 size_t start = baseIndex + 1;
1355 size_t end = start;
1356 while (normalized[start] != '\0') {
1357 end = normalized.find(',', start);
1358 if (end == normalized.npos) {
1359 end = normalized.find('>', start);
1360 }
1361 string s(normalized.c_str()+start, end-start);
1362 Type* t = this->Search(s);
1363 if (t == NULL) {
1364 // maybe we should print a warning here?
1365 return NULL;
1366 }
1367 args.push_back(t);
1368 start = end+1;
1369 }
1370
1371 // construct a GenericType, add it to our name set so they always get
1372 // the same object, and return it.
1373 result = make_generic_type(g->package, g->name, args);
1374 if (result == NULL) {
1375 return NULL;
1376 }
1377
1378 this->Add(result);
1379 return this->Find(result->QualifiedName());
1380}
1381
1382const Namespace::Generic*
1383Namespace::search_generic(const string& name) const
1384{
1385 int N = m_generics.size();
1386
1387 // first exact match
1388 for (int i=0; i<N; i++) {
1389 const Generic& g = m_generics[i];
1390 if (g.qualified == name) {
1391 return &g;
1392 }
1393 }
1394
1395 // then name match
1396 for (int i=0; i<N; i++) {
1397 const Generic& g = m_generics[i];
1398 if (g.name == name) {
1399 return &g;
1400 }
1401 }
1402
1403 return NULL;
1404}
1405
1406void
1407Namespace::Dump() const
1408{
1409 int n = m_types.size();
1410 for (int i=0; i<n; i++) {
1411 Type* t = m_types[i];
1412 printf("type: package=%s name=%s qualifiedName=%s\n",
1413 t->Package().c_str(), t->Name().c_str(),
1414 t->QualifiedName().c_str());
1415 }
1416}