#ifndef AIDL_TYPE_H #define AIDL_TYPE_H #include "AST.h" #include #include using namespace std; class Type { public: // kinds enum { BUILT_IN, PARCELABLE, INTERFACE, GENERATED }; // WriteToParcel flags enum { PARCELABLE_WRITE_RETURN_VALUE = 0x0001 }; Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut); Type(const string& package, const string& name, int kind, bool canWriteToParcel, bool canBeOut, const string& declFile = "", int declLine = -1); virtual ~Type(); inline string Package() const { return m_package; } inline string Name() const { return m_name; } inline string QualifiedName() const { return m_qualifiedName; } inline int Kind() const { return m_kind; } inline string DeclFile() const { return m_declFile; } inline int DeclLine() const { return m_declLine; } inline bool CanBeMarshalled() const { return m_canWriteToParcel; } inline bool CanBeOutParameter() const { return m_canBeOut; } virtual string ImportType() const; virtual string CreatorName() const; virtual string InstantiableName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual bool CanBeArray() const; virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); protected: void SetQualifiedName(const string& qualified); Expression* BuildWriteToParcelFlags(int flags); private: Type(); Type(const Type&); string m_package; string m_name; string m_qualifiedName; string m_declFile; int m_declLine; int m_kind; bool m_canWriteToParcel; bool m_canBeOut; }; class BasicType : public Type { public: BasicType(const string& name, const string& marshallMethod, const string& unmarshallMethod, const string& writeArray, const string& createArray, const string& readArray); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual bool CanBeArray() const; virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); private: string m_marshallMethod; string m_unmarshallMethod; string m_writeArrayMethod; string m_createArrayMethod; string m_readArrayMethod; }; class BooleanType : public Type { public: BooleanType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual bool CanBeArray() const; virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class CharType : public Type { public: CharType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual bool CanBeArray() const; virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class StringType : public Type { public: StringType(); virtual string CreatorName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual bool CanBeArray() const; virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class CharSequenceType : public Type { public: CharSequenceType(); virtual string CreatorName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class RemoteExceptionType : public Type { public: RemoteExceptionType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class RuntimeExceptionType : public Type { public: RuntimeExceptionType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class IBinderType : public Type { public: IBinderType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class IInterfaceType : public Type { public: IInterfaceType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class BinderType : public Type { public: BinderType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class BinderProxyType : public Type { public: BinderProxyType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class ParcelType : public Type { public: ParcelType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class ParcelableInterfaceType : public Type { public: ParcelableInterfaceType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class MapType : public Type { public: MapType(); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class ListType : public Type { public: ListType(); virtual string InstantiableName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class ParcelableType : public Type { public: ParcelableType(const string& package, const string& name, bool builtIn, const string& declFile, int declLine); virtual string CreatorName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual bool CanBeArray() const; virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); }; class InterfaceType : public Type { public: InterfaceType(const string& package, const string& name, bool builtIn, bool oneway, const string& declFile, int declLine); bool OneWay() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); private: bool m_oneway; }; class GenericType : public Type { public: GenericType(const string& package, const string& name, const vector& args); string GenericArguments() const; virtual string ImportType() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); private: string m_genericArguments; string m_importName; vector m_args; }; class GenericListType : public GenericType { public: GenericListType(const string& package, const string& name, const vector& args); virtual string CreatorName() const; virtual string InstantiableName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); virtual void CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel); private: string m_creator; }; class ClassLoaderType : public Type { public: ClassLoaderType(); }; class Namespace { public: Namespace(); ~Namespace(); void Add(Type* type); // args is the number of template types (what is this called?) void AddGenericType(const string& package, const string& name, int args); // lookup a specific class name Type* Find(const string& name) const; Type* Find(const char* package, const char* name) const; // try to search by either a full name or a partial name Type* Search(const string& name); void Dump() const; private: struct Generic { string package; string name; string qualified; int args; }; const Generic* search_generic(const string& name) const; vector m_types; vector m_generics; }; extern Namespace NAMES; extern Type* VOID_TYPE; extern Type* BOOLEAN_TYPE; extern Type* CHAR_TYPE; extern Type* INT_TYPE; extern Type* LONG_TYPE; extern Type* FLOAT_TYPE; extern Type* DOUBLE_TYPE; extern Type* STRING_TYPE; extern Type* CHAR_SEQUENCE_TYPE; extern Type* TEXT_UTILS_TYPE; extern Type* REMOTE_EXCEPTION_TYPE; extern Type* RUNTIME_EXCEPTION_TYPE; extern Type* IBINDER_TYPE; extern Type* IINTERFACE_TYPE; extern Type* BINDER_NATIVE_TYPE; extern Type* BINDER_PROXY_TYPE; extern Type* PARCEL_TYPE; extern Type* PARCELABLE_INTERFACE_TYPE; extern Expression* NULL_VALUE; extern Expression* THIS_VALUE; extern Expression* SUPER_VALUE; extern Expression* TRUE_VALUE; extern Expression* FALSE_VALUE; void register_base_types(); #endif // AIDL_TYPE_H