Type.h revision 6c0236c53a30ea9fef28ee7c95a4dce2fa5ce2e1
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 canWriteToRpcData, bool canBeOut); 28 Type(const string& package, const string& name, 29 int kind, bool canWriteToParcel, bool canWriteToRpcData, 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 CanWriteToParcel() const { return m_canWriteToParcel; } 40 inline bool CanWriteToRpcData() const { return m_canWriteToRpcData; } 41 inline bool CanBeOutParameter() const { return m_canBeOut; } 42 43 virtual string ImportType() const; 44 virtual string CreatorName() const; 45 virtual string InstantiableName() const; 46 47 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 48 Variable* parcel, int flags); 49 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 50 Variable* parcel, Variable** cl); 51 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 52 Variable* parcel, Variable** cl); 53 54 virtual bool CanBeArray() const; 55 56 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 57 Variable* parcel, int flags); 58 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 59 Variable* parcel, Variable** cl); 60 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 61 Variable* parcel, Variable** cl); 62 63 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 64 Variable* data, int flags); 65 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 66 Variable* data, Variable** cl); 67 68protected: 69 void SetQualifiedName(const string& qualified); 70 Expression* BuildWriteToParcelFlags(int flags); 71 72private: 73 Type(); 74 Type(const Type&); 75 76 string m_package; 77 string m_name; 78 string m_qualifiedName; 79 string m_declFile; 80 int m_declLine; 81 int m_kind; 82 bool m_canWriteToParcel; 83 bool m_canWriteToRpcData; 84 bool m_canBeOut; 85}; 86 87class BasicType : public Type 88{ 89public: 90 BasicType(const string& name, 91 const string& marshallParcel, 92 const string& unmarshallParcel, 93 const string& writeArrayParcel, 94 const string& createArrayParcel, 95 const string& readArrayParcel, 96 const string& marshallRpc, 97 const string& unmarshallRpc, 98 const string& writeArrayRpc, 99 const string& createArrayRpc, 100 const string& readArrayRpc); 101 102 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 103 Variable* parcel, int flags); 104 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 105 Variable* parcel, Variable** cl); 106 107 virtual bool CanBeArray() const; 108 109 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 110 Variable* parcel, int flags); 111 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 112 Variable* parcel, Variable** cl); 113 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 114 Variable* parcel, Variable** cl); 115 116 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 117 Variable* data, int flags); 118 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 119 Variable* data, Variable** cl); 120 121private: 122 string m_marshallParcel; 123 string m_unmarshallParcel; 124 string m_writeArrayParcel; 125 string m_createArrayParcel; 126 string m_readArrayParcel; 127 string m_marshallRpc; 128 string m_unmarshallRpc; 129 string m_writeArrayRpc; 130 string m_createArrayRpc; 131 string m_readArrayRpc; 132}; 133 134class BooleanType : public Type 135{ 136public: 137 BooleanType(); 138 139 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 140 Variable* parcel, int flags); 141 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 142 Variable* parcel, Variable** cl); 143 144 virtual bool CanBeArray() const; 145 146 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 147 Variable* parcel, int flags); 148 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 149 Variable* parcel, Variable** cl); 150 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 151 Variable* parcel, Variable** cl); 152 153 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 154 Variable* data, int flags); 155 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 156 Variable* data, Variable** cl); 157}; 158 159class CharType : public Type 160{ 161public: 162 CharType(); 163 164 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 165 Variable* parcel, int flags); 166 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 167 Variable* parcel, Variable** cl); 168 169 virtual bool CanBeArray() const; 170 171 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 172 Variable* parcel, int flags); 173 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 174 Variable* parcel, Variable** cl); 175 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 176 Variable* parcel, Variable** cl); 177 178 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 179 Variable* data, int flags); 180 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 181 Variable* data, Variable** cl); 182}; 183 184 185class StringType : public Type 186{ 187public: 188 StringType(); 189 190 virtual string CreatorName() const; 191 192 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 193 Variable* parcel, int flags); 194 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 195 Variable* parcel, Variable** cl); 196 197 virtual bool CanBeArray() const; 198 199 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 200 Variable* parcel, int flags); 201 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 202 Variable* parcel, Variable** cl); 203 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 204 Variable* parcel, Variable** cl); 205 206 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 207 Variable* data, int flags); 208 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 209 Variable* data, Variable** cl); 210}; 211 212class CharSequenceType : public Type 213{ 214public: 215 CharSequenceType(); 216 217 virtual string CreatorName() const; 218 219 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 220 Variable* parcel, int flags); 221 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 222 Variable* parcel, Variable** cl); 223}; 224 225class RemoteExceptionType : public Type 226{ 227public: 228 RemoteExceptionType(); 229 230 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 231 Variable* parcel, int flags); 232 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 233 Variable* parcel, Variable** cl); 234}; 235 236class RuntimeExceptionType : public Type 237{ 238public: 239 RuntimeExceptionType(); 240 241 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 242 Variable* parcel, int flags); 243 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 244 Variable* parcel, Variable** cl); 245}; 246 247class IBinderType : public Type 248{ 249public: 250 IBinderType(); 251 252 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 253 Variable* parcel, int flags); 254 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 255 Variable* parcel, Variable** cl); 256 257 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 258 Variable* parcel, int flags); 259 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 260 Variable* parcel, Variable** cl); 261 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 262 Variable* parcel, Variable** cl); 263}; 264 265class IInterfaceType : public Type 266{ 267public: 268 IInterfaceType(); 269 270 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 271 Variable* parcel, int flags); 272 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 273 Variable* parcel, Variable** cl); 274}; 275 276class BinderType : public Type 277{ 278public: 279 BinderType(); 280 281 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 282 Variable* parcel, int flags); 283 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 284 Variable* parcel, Variable** cl); 285}; 286 287class BinderProxyType : public Type 288{ 289public: 290 BinderProxyType(); 291 292 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 293 Variable* parcel, int flags); 294 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 295 Variable* parcel, Variable** cl); 296}; 297 298class ParcelType : public Type 299{ 300public: 301 ParcelType(); 302 303 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 304 Variable* parcel, int flags); 305 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 306 Variable* parcel, Variable** cl); 307}; 308 309class ParcelableInterfaceType : public Type 310{ 311public: 312 ParcelableInterfaceType(); 313 314 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 315 Variable* parcel, int flags); 316 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 317 Variable* parcel, Variable** cl); 318}; 319 320class MapType : public Type 321{ 322public: 323 MapType(); 324 325 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 326 Variable* parcel, int flags); 327 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 328 Variable* parcel, Variable** cl); 329 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 330 Variable* parcel, Variable** cl); 331}; 332 333class ListType : public Type 334{ 335public: 336 ListType(); 337 338 virtual string InstantiableName() const; 339 340 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 341 Variable* parcel, int flags); 342 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 343 Variable* parcel, Variable** cl); 344 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 345 Variable* parcel, Variable** cl); 346 347 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 348 Variable* data, int flags); 349 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 350 Variable* data, Variable** cl); 351}; 352 353class ParcelableType : public Type 354{ 355public: 356 ParcelableType(const string& package, const string& name, 357 bool builtIn, const string& declFile, int declLine); 358 ParcelableType(const string& package, const string& name, 359 bool builtIn, bool canWriteToRpcData, 360 const string& declFile = "", int declLine = -1); 361 362 virtual string CreatorName() const; 363 364 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 365 Variable* parcel, int flags); 366 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 367 Variable* parcel, Variable** cl); 368 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 369 Variable* parcel, Variable** cl); 370 371 virtual bool CanBeArray() const; 372 373 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 374 Variable* parcel, int flags); 375 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 376 Variable* parcel, Variable** cl); 377 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 378 Variable* parcel, Variable** cl); 379}; 380 381class FlattenableType : public Type 382{ 383public: 384 FlattenableType(const string& package, const string& name, 385 bool builtIn, const string& declFile, int declLine); 386 387 virtual string CreatorName() const; 388 389 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 390 Variable* data, int flags); 391 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 392 Variable* data, Variable** cl); 393 394 virtual bool CanBeArray() const; 395}; 396 397class InterfaceType : public Type 398{ 399public: 400 InterfaceType(const string& package, const string& name, 401 bool builtIn, bool oneway, 402 const string& declFile, int declLine); 403 404 bool OneWay() const; 405 406 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 407 Variable* parcel, int flags); 408 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 409 Variable* parcel, Variable** cl); 410 411private: 412 bool m_oneway; 413}; 414 415 416class GenericType : public Type 417{ 418public: 419 GenericType(const string& package, const string& name, 420 const vector<Type*>& args); 421 422 const vector<Type*>& GenericArgumentTypes() const; 423 string GenericArguments() const; 424 425 virtual string ImportType() const; 426 427 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 428 Variable* parcel, int flags); 429 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 430 Variable* parcel, Variable** cl); 431 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 432 Variable* parcel, Variable** cl); 433 434private: 435 string m_genericArguments; 436 string m_importName; 437 vector<Type*> m_args; 438}; 439 440class RpcDataType : public ParcelableType 441{ 442public: 443 RpcDataType(); 444 445 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 446 Variable* data, int flags); 447 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 448 Variable* data, Variable** cl); 449}; 450 451class ClassLoaderType : public Type 452{ 453public: 454 ClassLoaderType(); 455}; 456 457class GenericListType : public GenericType 458{ 459public: 460 GenericListType(const string& package, const string& name, 461 const vector<Type*>& args); 462 463 virtual string CreatorName() const; 464 virtual string InstantiableName() const; 465 466 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 467 Variable* parcel, int flags); 468 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 469 Variable* parcel, Variable** cl); 470 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 471 Variable* parcel, Variable** cl); 472 473 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 474 Variable* data, int flags); 475 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 476 Variable* data, Variable** cl); 477 478private: 479 string m_creator; 480}; 481 482class Namespace 483{ 484public: 485 Namespace(); 486 ~Namespace(); 487 void Add(Type* type); 488 489 // args is the number of template types (what is this called?) 490 void AddGenericType(const string& package, const string& name, int args); 491 492 // lookup a specific class name 493 Type* Find(const string& name) const; 494 Type* Find(const char* package, const char* name) const; 495 496 // try to search by either a full name or a partial name 497 Type* Search(const string& name); 498 499 void Dump() const; 500 501private: 502 struct Generic { 503 string package; 504 string name; 505 string qualified; 506 int args; 507 }; 508 509 const Generic* search_generic(const string& name) const; 510 511 vector<Type*> m_types; 512 vector<Generic> m_generics; 513}; 514 515extern Namespace NAMES; 516 517extern Type* VOID_TYPE; 518extern Type* BOOLEAN_TYPE; 519extern Type* BYTE_TYPE; 520extern Type* CHAR_TYPE; 521extern Type* INT_TYPE; 522extern Type* LONG_TYPE; 523extern Type* FLOAT_TYPE; 524extern Type* DOUBLE_TYPE; 525extern Type* OBJECT_TYPE; 526extern Type* STRING_TYPE; 527extern Type* CHAR_SEQUENCE_TYPE; 528extern Type* TEXT_UTILS_TYPE; 529extern Type* REMOTE_EXCEPTION_TYPE; 530extern Type* RUNTIME_EXCEPTION_TYPE; 531extern Type* IBINDER_TYPE; 532extern Type* IINTERFACE_TYPE; 533extern Type* BINDER_NATIVE_TYPE; 534extern Type* BINDER_PROXY_TYPE; 535extern Type* PARCEL_TYPE; 536extern Type* PARCELABLE_INTERFACE_TYPE; 537 538extern Type* CONTEXT_TYPE; 539 540extern Type* RPC_DATA_TYPE; 541extern Type* RPC_ERROR_TYPE; 542extern Type* RPC_CONTEXT_TYPE; 543extern Type* EVENT_FAKE_TYPE; 544 545extern Expression* NULL_VALUE; 546extern Expression* THIS_VALUE; 547extern Expression* SUPER_VALUE; 548extern Expression* TRUE_VALUE; 549extern Expression* FALSE_VALUE; 550 551void register_base_types(); 552 553#endif // AIDL_TYPE_H 554