Type.h revision 7db766c3fec2795b08d237f29b972f474983684b
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 359 virtual string CreatorName() const; 360 361 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 362 Variable* parcel, int flags); 363 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 364 Variable* parcel, Variable** cl); 365 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 366 Variable* parcel, Variable** cl); 367 368 virtual bool CanBeArray() const; 369 370 virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, 371 Variable* parcel, int flags); 372 virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, 373 Variable* parcel, Variable** cl); 374 virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, 375 Variable* parcel, Variable** cl); 376}; 377 378class FlattenableType : public Type 379{ 380public: 381 FlattenableType(const string& package, const string& name, 382 bool builtIn, const string& declFile, int declLine); 383 384 virtual string CreatorName() const; 385 386 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 387 Variable* data, int flags); 388 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 389 Variable* data, Variable** cl); 390 391 virtual bool CanBeArray() const; 392}; 393 394class InterfaceType : public Type 395{ 396public: 397 InterfaceType(const string& package, const string& name, 398 bool builtIn, bool oneway, 399 const string& declFile, int declLine); 400 401 bool OneWay() const; 402 403 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 404 Variable* parcel, int flags); 405 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 406 Variable* parcel, Variable** cl); 407 408private: 409 bool m_oneway; 410}; 411 412 413class GenericType : public Type 414{ 415public: 416 GenericType(const string& package, const string& name, 417 const vector<Type*>& args); 418 419 const vector<Type*>& GenericArgumentTypes() const; 420 string GenericArguments() const; 421 422 virtual string ImportType() const; 423 424 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 425 Variable* parcel, int flags); 426 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 427 Variable* parcel, Variable** cl); 428 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 429 Variable* parcel, Variable** cl); 430 431private: 432 string m_genericArguments; 433 string m_importName; 434 vector<Type*> m_args; 435}; 436 437 438class GenericListType : public GenericType 439{ 440public: 441 GenericListType(const string& package, const string& name, 442 const vector<Type*>& args); 443 444 virtual string CreatorName() const; 445 virtual string InstantiableName() const; 446 447 virtual void WriteToParcel(StatementBlock* addTo, Variable* v, 448 Variable* parcel, int flags); 449 virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, 450 Variable* parcel, Variable** cl); 451 virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, 452 Variable* parcel, Variable** cl); 453 454 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 455 Variable* data, int flags); 456 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 457 Variable* data, Variable** cl); 458 459private: 460 string m_creator; 461}; 462 463class RpcDataType : public Type 464{ 465public: 466 RpcDataType(); 467 468 virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, 469 Variable* data, int flags); 470 virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, 471 Variable* data, Variable** cl); 472}; 473 474class ClassLoaderType : public Type 475{ 476public: 477 ClassLoaderType(); 478}; 479 480class Namespace 481{ 482public: 483 Namespace(); 484 ~Namespace(); 485 void Add(Type* type); 486 487 // args is the number of template types (what is this called?) 488 void AddGenericType(const string& package, const string& name, int args); 489 490 // lookup a specific class name 491 Type* Find(const string& name) const; 492 Type* Find(const char* package, const char* name) const; 493 494 // try to search by either a full name or a partial name 495 Type* Search(const string& name); 496 497 void Dump() const; 498 499private: 500 struct Generic { 501 string package; 502 string name; 503 string qualified; 504 int args; 505 }; 506 507 const Generic* search_generic(const string& name) const; 508 509 vector<Type*> m_types; 510 vector<Generic> m_generics; 511}; 512 513extern Namespace NAMES; 514 515extern Type* VOID_TYPE; 516extern Type* BOOLEAN_TYPE; 517extern Type* BYTE_TYPE; 518extern Type* CHAR_TYPE; 519extern Type* INT_TYPE; 520extern Type* LONG_TYPE; 521extern Type* FLOAT_TYPE; 522extern Type* DOUBLE_TYPE; 523extern Type* OBJECT_TYPE; 524extern Type* STRING_TYPE; 525extern Type* CHAR_SEQUENCE_TYPE; 526extern Type* TEXT_UTILS_TYPE; 527extern Type* REMOTE_EXCEPTION_TYPE; 528extern Type* RUNTIME_EXCEPTION_TYPE; 529extern Type* IBINDER_TYPE; 530extern Type* IINTERFACE_TYPE; 531extern Type* BINDER_NATIVE_TYPE; 532extern Type* BINDER_PROXY_TYPE; 533extern Type* PARCEL_TYPE; 534extern Type* PARCELABLE_INTERFACE_TYPE; 535 536extern Type* CONTEXT_TYPE; 537 538extern Type* RPC_SERVICE_BASE_TYPE; 539extern Type* RPC_DATA_TYPE; 540extern Type* RPC_BROKER_TYPE; 541extern Type* RPC_ENDPOINT_INFO_TYPE; 542extern Type* RPC_RESULT_HANDLER_TYPE; 543extern Type* RPC_ERROR_TYPE; 544extern Type* RPC_ERROR_LISTENER_TYPE; 545 546extern Expression* NULL_VALUE; 547extern Expression* THIS_VALUE; 548extern Expression* SUPER_VALUE; 549extern Expression* TRUE_VALUE; 550extern Expression* FALSE_VALUE; 551 552void register_base_types(); 553 554#endif // AIDL_TYPE_H 555