Type.h revision fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20
1#ifndef AIDL_TYPE_H
2#define AIDL_TYPE_H
3
4#include "AST.h"
5#include <string>
6#include <vector>
7
8using namespace std;
9
10class Type
11{
12public:
13    // kinds
14    enum {
15        BUILT_IN,
16        PARCELABLE,
17        INTERFACE,
18        GENERATED
19    };
20
21    // WriteToParcel flags
22    enum {
23        PARCELABLE_WRITE_RETURN_VALUE = 0x0001
24    };
25
26                    Type(const string& name, int kind, bool canWriteToParcel,
27                            bool canBeOut);
28                    Type(const string& package, const string& name,
29                            int kind, bool canWriteToParcel, bool canBeOut,
30                            const string& declFile = "", int declLine = -1);
31    virtual         ~Type();
32
33    inline string   Package() const             { return m_package; }
34    inline string   Name() const                { return m_name; }
35    inline string   QualifiedName() const       { return m_qualifiedName; }
36    inline int      Kind() const                { return m_kind; }
37    inline string   DeclFile() const            { return m_declFile; }
38    inline int      DeclLine() const            { return m_declLine; }
39    inline bool     CanBeMarshalled() const     { return m_canWriteToParcel; }
40    inline bool     CanBeOutParameter() const   { return m_canBeOut; }
41
42    virtual string  ImportType() const;
43    virtual string  CreatorName() const;
44    virtual string  InstantiableName() const;
45
46    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
47                                    Variable* parcel, int flags);
48    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
49                                    Variable* parcel, Variable** cl);
50    virtual void    ReadFromParcel(StatementBlock* addTo, Variable* v,
51                                    Variable* parcel, Variable** cl);
52
53    virtual bool    CanBeArray() const;
54
55    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
56                                    Variable* parcel, int flags);
57    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
58                                    Variable* parcel, Variable** cl);
59    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
60                                    Variable* parcel, Variable** cl);
61
62    virtual void    WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
63                                    Variable* data, int flags);
64    virtual void    CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
65                                    Variable* data, Variable** cl);
66    virtual void    ReadFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
67                                    Variable* data, Variable** cl);
68
69
70protected:
71    void SetQualifiedName(const string& qualified);
72    Expression* BuildWriteToParcelFlags(int flags);
73
74private:
75    Type();
76    Type(const Type&);
77
78    string m_package;
79    string m_name;
80    string m_qualifiedName;
81    string m_declFile;
82    int m_declLine;
83    int m_kind;
84    bool m_canWriteToParcel;
85    bool m_canBeOut;
86};
87
88class BasicType : public Type
89{
90public:
91                    BasicType(const string& name, const string& marshallMethod,
92                              const string& unmarshallMethod,
93                              const string& writeArray,
94                              const string& createArray,
95                              const string& readArray);
96
97    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
98                                    Variable* parcel, int flags);
99    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
100                                    Variable* parcel, Variable** cl);
101
102    virtual bool    CanBeArray() const;
103
104    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
105                                    Variable* parcel, int flags);
106    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
107                                    Variable* parcel, Variable** cl);
108    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
109                                    Variable* parcel, Variable** cl);
110
111private:
112    string m_marshallMethod;
113    string m_unmarshallMethod;
114    string m_writeArrayMethod;
115    string m_createArrayMethod;
116    string m_readArrayMethod;
117};
118
119class BooleanType : public Type
120{
121public:
122                    BooleanType();
123
124    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
125                                    Variable* parcel, int flags);
126    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
127                                    Variable* parcel, Variable** cl);
128
129    virtual bool    CanBeArray() const;
130
131    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
132                                    Variable* parcel, int flags);
133    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
134                                    Variable* parcel, Variable** cl);
135    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
136                                    Variable* parcel, Variable** cl);
137};
138
139class CharType : public Type
140{
141public:
142                    CharType();
143
144    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
145                                    Variable* parcel, int flags);
146    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
147                                    Variable* parcel, Variable** cl);
148
149    virtual bool    CanBeArray() const;
150
151    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
152                                    Variable* parcel, int flags);
153    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
154                                    Variable* parcel, Variable** cl);
155    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
156                                    Variable* parcel, Variable** cl);
157};
158
159
160class StringType : public Type
161{
162public:
163                    StringType();
164
165    virtual string  CreatorName() const;
166
167    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
168                                    Variable* parcel, int flags);
169    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
170                                    Variable* parcel, Variable** cl);
171
172    virtual bool    CanBeArray() const;
173
174    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
175                                    Variable* parcel, int flags);
176    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
177                                    Variable* parcel, Variable** cl);
178    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
179                                    Variable* parcel, Variable** cl);
180
181    virtual void    WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
182                                    Variable* data, int flags);
183    virtual void    CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
184                                    Variable* data, Variable** cl);
185};
186
187class CharSequenceType : public Type
188{
189public:
190                    CharSequenceType();
191
192    virtual string  CreatorName() const;
193
194    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
195                                    Variable* parcel, int flags);
196    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
197                                    Variable* parcel, Variable** cl);
198};
199
200class RemoteExceptionType : public Type
201{
202public:
203                    RemoteExceptionType();
204
205    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
206                                    Variable* parcel, int flags);
207    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
208                                    Variable* parcel, Variable** cl);
209};
210
211class RuntimeExceptionType : public Type
212{
213public:
214                    RuntimeExceptionType();
215
216    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
217                                    Variable* parcel, int flags);
218    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
219                                    Variable* parcel, Variable** cl);
220};
221
222class IBinderType : public Type
223{
224public:
225                    IBinderType();
226
227    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
228                                    Variable* parcel, int flags);
229    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
230                                    Variable* parcel, Variable** cl);
231
232    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
233                                    Variable* parcel, int flags);
234    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
235                                    Variable* parcel, Variable** cl);
236    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
237                                    Variable* parcel, Variable** cl);
238};
239
240class IInterfaceType : public Type
241{
242public:
243                    IInterfaceType();
244
245    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
246                                    Variable* parcel, int flags);
247    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
248                                    Variable* parcel, Variable** cl);
249};
250
251class BinderType : public Type
252{
253public:
254                    BinderType();
255
256    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
257                                    Variable* parcel, int flags);
258    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
259                                    Variable* parcel, Variable** cl);
260};
261
262class BinderProxyType : public Type
263{
264public:
265                    BinderProxyType();
266
267    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
268                                    Variable* parcel, int flags);
269    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
270                                    Variable* parcel, Variable** cl);
271};
272
273class ParcelType : public Type
274{
275public:
276                    ParcelType();
277
278    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
279                                    Variable* parcel, int flags);
280    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
281                                    Variable* parcel, Variable** cl);
282};
283
284class ParcelableInterfaceType : public Type
285{
286public:
287                    ParcelableInterfaceType();
288
289    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
290                                    Variable* parcel, int flags);
291    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
292                                    Variable* parcel, Variable** cl);
293};
294
295class MapType : public Type
296{
297public:
298                    MapType();
299
300    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
301                                    Variable* parcel, int flags);
302    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
303                                    Variable* parcel, Variable** cl);
304    virtual void    ReadFromParcel(StatementBlock* addTo, Variable* v,
305                                    Variable* parcel, Variable** cl);
306};
307
308class ListType : public Type
309{
310public:
311                    ListType();
312
313    virtual string  InstantiableName() const;
314
315    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
316                                    Variable* parcel, int flags);
317    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
318                                    Variable* parcel, Variable** cl);
319    virtual void    ReadFromParcel(StatementBlock* addTo, Variable* v,
320                                    Variable* parcel, Variable** cl);
321};
322
323class ParcelableType : public Type
324{
325public:
326                    ParcelableType(const string& package, const string& name,
327                            bool builtIn, const string& declFile, int declLine);
328
329    virtual string  CreatorName() const;
330
331    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
332                                    Variable* parcel, int flags);
333    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
334                                    Variable* parcel, Variable** cl);
335    virtual void    ReadFromParcel(StatementBlock* addTo, Variable* v,
336                                    Variable* parcel, Variable** cl);
337
338    virtual bool    CanBeArray() const;
339
340    virtual void    WriteArrayToParcel(StatementBlock* addTo, Variable* v,
341                                    Variable* parcel, int flags);
342    virtual void    CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
343                                    Variable* parcel, Variable** cl);
344    virtual void    ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
345                                    Variable* parcel, Variable** cl);
346};
347
348class InterfaceType : public Type
349{
350public:
351                    InterfaceType(const string& package, const string& name,
352                            bool builtIn, bool oneway,
353                            const string& declFile, int declLine);
354
355    bool            OneWay() const;
356
357    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
358                                    Variable* parcel, int flags);
359    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
360                                    Variable* parcel, Variable** cl);
361
362private:
363    bool m_oneway;
364};
365
366
367class GenericType : public Type
368{
369public:
370                    GenericType(const string& package, const string& name,
371                                 const vector<Type*>& args);
372
373    string          GenericArguments() const;
374
375    virtual string  ImportType() const;
376
377    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
378                                    Variable* parcel, int flags);
379    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
380                                    Variable* parcel, Variable** cl);
381    virtual void    ReadFromParcel(StatementBlock* addTo, Variable* v,
382                                    Variable* parcel, Variable** cl);
383
384private:
385    string m_genericArguments;
386    string m_importName;
387    vector<Type*> m_args;
388};
389
390
391class GenericListType : public GenericType
392{
393public:
394                    GenericListType(const string& package, const string& name,
395                                 const vector<Type*>& args);
396
397    virtual string  CreatorName() const;
398    virtual string  InstantiableName() const;
399
400    virtual void    WriteToParcel(StatementBlock* addTo, Variable* v,
401                                    Variable* parcel, int flags);
402    virtual void    CreateFromParcel(StatementBlock* addTo, Variable* v,
403                                    Variable* parcel, Variable** cl);
404    virtual void    ReadFromParcel(StatementBlock* addTo, Variable* v,
405                                    Variable* parcel, Variable** cl);
406
407private:
408    string m_creator;
409};
410
411class ClassLoaderType : public Type
412{
413public:
414                    ClassLoaderType();
415};
416
417class Namespace
418{
419public:
420            Namespace();
421            ~Namespace();
422    void    Add(Type* type);
423
424    // args is the number of template types (what is this called?)
425    void    AddGenericType(const string& package, const string& name, int args);
426
427    // lookup a specific class name
428    Type*   Find(const string& name) const;
429    Type*   Find(const char* package, const char* name) const;
430
431    // try to search by either a full name or a partial name
432    Type*   Search(const string& name);
433
434    void    Dump() const;
435
436private:
437    struct Generic {
438        string package;
439        string name;
440        string qualified;
441        int args;
442    };
443
444    const Generic* search_generic(const string& name) const;
445
446    vector<Type*> m_types;
447    vector<Generic> m_generics;
448};
449
450extern Namespace NAMES;
451
452extern Type* VOID_TYPE;
453extern Type* BOOLEAN_TYPE;
454extern Type* BYTE_TYPE;
455extern Type* CHAR_TYPE;
456extern Type* INT_TYPE;
457extern Type* LONG_TYPE;
458extern Type* FLOAT_TYPE;
459extern Type* DOUBLE_TYPE;
460extern Type* OBJECT_TYPE;
461extern Type* STRING_TYPE;
462extern Type* CHAR_SEQUENCE_TYPE;
463extern Type* TEXT_UTILS_TYPE;
464extern Type* REMOTE_EXCEPTION_TYPE;
465extern Type* RUNTIME_EXCEPTION_TYPE;
466extern Type* IBINDER_TYPE;
467extern Type* IINTERFACE_TYPE;
468extern Type* BINDER_NATIVE_TYPE;
469extern Type* BINDER_PROXY_TYPE;
470extern Type* PARCEL_TYPE;
471extern Type* PARCELABLE_INTERFACE_TYPE;
472
473extern Type* CONTEXT_TYPE;
474
475extern Type* RPC_SERVICE_BASE_TYPE;
476extern Type* RPC_DATA_TYPE;
477extern Type* RPC_BROKER_TYPE;
478extern Type* RPC_ENDPOINT_INFO_TYPE;
479extern Type* RPC_RESULT_HANDLER_TYPE;
480extern Type* RPC_ERROR_TYPE;
481extern Type* RPC_ERROR_LISTENER_TYPE;
482
483extern Expression* NULL_VALUE;
484extern Expression* THIS_VALUE;
485extern Expression* SUPER_VALUE;
486extern Expression* TRUE_VALUE;
487extern Expression* FALSE_VALUE;
488
489void register_base_types();
490
491#endif // AIDL_TYPE_H
492