diff options
-rw-r--r-- | tools/aidl/Android.mk | 1 | ||||
-rw-r--r-- | tools/aidl/Type.cpp | 273 | ||||
-rw-r--r-- | tools/aidl/Type.h | 78 | ||||
-rw-r--r-- | tools/aidl/aidl.cpp | 105 | ||||
-rw-r--r-- | tools/aidl/aidl_language.h | 11 | ||||
-rw-r--r-- | tools/aidl/aidl_language_l.l | 2 | ||||
-rw-r--r-- | tools/aidl/aidl_language_y.y | 45 | ||||
-rw-r--r-- | tools/aidl/generate_java.cpp | 3 | ||||
-rw-r--r-- | tools/aidl/generate_java.h | 1 | ||||
-rw-r--r-- | tools/aidl/generate_java_rpc.cpp | 1001 |
10 files changed, 66 insertions, 1454 deletions
diff --git a/tools/aidl/Android.mk b/tools/aidl/Android.mk index 542f272d8af7..b7bcae64e1f7 100644 --- a/tools/aidl/Android.mk +++ b/tools/aidl/Android.mk @@ -31,7 +31,6 @@ LOCAL_SRC_FILES := \ aidl_language_y.y \ generate_java.cpp \ generate_java_binder.cpp \ - generate_java_rpc.cpp \ options.cpp \ search_path.cpp \ diff --git a/tools/aidl/Type.cpp b/tools/aidl/Type.cpp index 2267750623ad..d9b8b88bdace 100644 --- a/tools/aidl/Type.cpp +++ b/tools/aidl/Type.cpp @@ -28,9 +28,6 @@ Type* CONTEXT_TYPE; Type* MAP_TYPE; Type* LIST_TYPE; Type* CLASSLOADER_TYPE; -Type* RPC_DATA_TYPE; -Type* RPC_ERROR_TYPE; -Type* EVENT_FAKE_TYPE; Expression* NULL_VALUE; Expression* THIS_VALUE; @@ -42,7 +39,6 @@ void register_base_types() { VOID_TYPE = new BasicType("void", - "XXX", "XXX", "XXX", "XXX", "XXX", "XXX", "XXX", "XXX", "XXX", "XXX"); NAMES.Add(VOID_TYPE); @@ -50,37 +46,37 @@ register_base_types() NAMES.Add(BOOLEAN_TYPE); BYTE_TYPE = new BasicType("byte", - "writeByte", "readByte", "writeByteArray", "createByteArray", "readByteArray", - "putByte", "getByte", "putByteArray", "createByteArray", "getByteArray"); + "writeByte", "readByte", "writeByteArray", "createByteArray", + "readByteArray"); NAMES.Add(BYTE_TYPE); CHAR_TYPE = new CharType(); NAMES.Add(CHAR_TYPE); INT_TYPE = new BasicType("int", - "writeInt", "readInt", "writeIntArray", "createIntArray", "readIntArray", - "putInteger", "getInteger", "putIntegerArray", "createIntegerArray", "getIntegerArray"); + "writeInt", "readInt", "writeIntArray", "createIntArray", + "readIntArray"); NAMES.Add(INT_TYPE); LONG_TYPE = new BasicType("long", - "writeLong", "readLong", "writeLongArray", "createLongArray", "readLongArray", - "putLong", "getLong", "putLongArray", "createLongArray", "getLongArray"); + "writeLong", "readLong", "writeLongArray", "createLongArray", + "readLongArray"); NAMES.Add(LONG_TYPE); FLOAT_TYPE = new BasicType("float", - "writeFloat", "readFloat", "writeFloatArray", "createFloatArray", "readFloatArray", - "putFloat", "getFloat", "putFloatArray", "createFloatArray", "getFloatArray"); + "writeFloat", "readFloat", "writeFloatArray", "createFloatArray", + "readFloatArray"); NAMES.Add(FLOAT_TYPE); DOUBLE_TYPE = new BasicType("double", - "writeDouble", "readDouble", "writeDoubleArray", "createDoubleArray", "readDoubleArray", - "putDouble", "getDouble", "putDoubleArray", "createDoubleArray", "getDoubleArray"); + "writeDouble", "readDouble", "writeDoubleArray", + "createDoubleArray", "readDoubleArray"); NAMES.Add(DOUBLE_TYPE); STRING_TYPE = new StringType(); NAMES.Add(STRING_TYPE); - OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false, false); + OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false); NAMES.Add(OBJECT_TYPE); CHAR_SEQUENCE_TYPE = new CharSequenceType(); @@ -92,7 +88,7 @@ register_base_types() LIST_TYPE = new ListType(); NAMES.Add(LIST_TYPE); - TEXT_UTILS_TYPE = new Type("android.text", "TextUtils", Type::BUILT_IN, false, false, false); + TEXT_UTILS_TYPE = new Type("android.text", "TextUtils", Type::BUILT_IN, false, false); NAMES.Add(TEXT_UTILS_TYPE); REMOTE_EXCEPTION_TYPE = new RemoteExceptionType(); @@ -119,19 +115,9 @@ register_base_types() PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType(); NAMES.Add(PARCELABLE_INTERFACE_TYPE); - CONTEXT_TYPE = new Type("android.content", "Context", Type::BUILT_IN, false, false, false); + CONTEXT_TYPE = new Type("android.content", "Context", Type::BUILT_IN, false, false); NAMES.Add(CONTEXT_TYPE); - RPC_DATA_TYPE = new RpcDataType(); - NAMES.Add(RPC_DATA_TYPE); - - RPC_ERROR_TYPE = new UserDataType("android.support.place.rpc", "RpcError", - true, __FILE__, __LINE__); - NAMES.Add(RPC_ERROR_TYPE); - - EVENT_FAKE_TYPE = new Type("event", Type::BUILT_IN, false, false, false); - NAMES.Add(EVENT_FAKE_TYPE); - CLASSLOADER_TYPE = new ClassLoaderType(); NAMES.Add(CLASSLOADER_TYPE); @@ -158,30 +144,27 @@ make_generic_type(const string& package, const string& name, // ================================================================ -Type::Type(const string& name, int kind, bool canWriteToParcel, bool canWriteToRpcData, - bool canBeOut) +Type::Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut) :m_package(), m_name(name), m_declFile(""), m_declLine(-1), m_kind(kind), m_canWriteToParcel(canWriteToParcel), - m_canWriteToRpcData(canWriteToRpcData), m_canBeOut(canBeOut) { m_qualifiedName = name; } Type::Type(const string& package, const string& name, - int kind, bool canWriteToParcel, bool canWriteToRpcData, - bool canBeOut, const string& declFile, int declLine) + int kind, bool canWriteToParcel, bool canBeOut, + const string& declFile, int declLine) :m_package(package), m_name(name), m_declFile(declFile), m_declLine(declLine), m_kind(kind), m_canWriteToParcel(canWriteToParcel), - m_canWriteToRpcData(canWriteToRpcData), m_canBeOut(canBeOut) { if (package.length() > 0) { @@ -214,12 +197,6 @@ Type::CreatorName() const } string -Type::RpcCreatorName() const -{ - return ""; -} - -string Type::InstantiableName() const { return QualifiedName(); @@ -282,26 +259,6 @@ Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, } void -Type::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", - __FILE__, __LINE__, m_qualifiedName.c_str()); - addTo->Add(new LiteralExpression("/* WriteToRpcData error " - + m_qualifiedName + " */")); -} - -void -Type::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data, - Variable** cl) -{ - fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n", - __FILE__, __LINE__, m_qualifiedName.c_str()); - addTo->Add(new LiteralExpression("/* ReadFromRpcData error " - + m_qualifiedName + " */")); -} - -void Type::SetQualifiedName(const string& qualified) { m_qualifiedName = qualified; @@ -324,20 +281,13 @@ Type::BuildWriteToParcelFlags(int flags) BasicType::BasicType(const string& name, const string& marshallParcel, const string& unmarshallParcel, const string& writeArrayParcel, - const string& createArrayParcel, const string& readArrayParcel, - const string& marshallRpc, const string& unmarshallRpc, - const string& writeArrayRpc, const string& createArrayRpc, const string& readArrayRpc) - :Type(name, BUILT_IN, true, true, false), + const string& createArrayParcel, const string& readArrayParcel) + :Type(name, BUILT_IN, true, false), m_marshallParcel(marshallParcel), m_unmarshallParcel(unmarshallParcel), m_writeArrayParcel(writeArrayParcel), m_createArrayParcel(createArrayParcel), - m_readArrayParcel(readArrayParcel), - m_marshallRpc(marshallRpc), - m_unmarshallRpc(unmarshallRpc), - m_writeArrayRpc(writeArrayRpc), - m_createArrayRpc(createArrayRpc), - m_readArrayRpc(readArrayRpc) + m_readArrayParcel(readArrayParcel) { } @@ -378,24 +328,10 @@ BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* par addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v)); } -void -BasicType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - addTo->Add(new MethodCall(data, m_marshallRpc, 2, k, v)); -} - -void -BasicType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data, - Variable** cl) -{ - addTo->Add(new Assignment(v, new MethodCall(data, m_unmarshallRpc, 1, k))); -} - // ================================================================ BooleanType::BooleanType() - :Type("boolean", BUILT_IN, true, true, false) + :Type("boolean", BUILT_IN, true, false) { } @@ -439,24 +375,10 @@ BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* p addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v)); } -void -BooleanType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - addTo->Add(new MethodCall(data, "putBoolean", 2, k, v)); -} - -void -BooleanType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data, - Variable** cl) -{ - addTo->Add(new Assignment(v, new MethodCall(data, "getBoolean", 1, k))); -} - // ================================================================ CharType::CharType() - :Type("char", BUILT_IN, true, true, false) + :Type("char", BUILT_IN, true, false) { } @@ -498,24 +420,10 @@ CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parc addTo->Add(new MethodCall(parcel, "readCharArray", 1, v)); } -void -CharType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - addTo->Add(new MethodCall(data, "putChar", 2, k, v)); -} - -void -CharType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data, - Variable** cl) -{ - addTo->Add(new Assignment(v, new MethodCall(data, "getChar", 1, k))); -} - // ================================================================ StringType::StringType() - :Type("java.lang", "String", BUILT_IN, true, true, false) + :Type("java.lang", "String", BUILT_IN, true, false) { } @@ -562,24 +470,10 @@ StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* pa addTo->Add(new MethodCall(parcel, "readStringArray", 1, v)); } -void -StringType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - addTo->Add(new MethodCall(data, "putString", 2, k, v)); -} - -void -StringType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable**) -{ - addTo->Add(new Assignment(v, new MethodCall(data, "getString", 1, k))); -} - // ================================================================ CharSequenceType::CharSequenceType() - :Type("java.lang", "CharSequence", BUILT_IN, true, true, false) + :Type("java.lang", "CharSequence", BUILT_IN, true, false) { } @@ -639,7 +533,7 @@ CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v, // ================================================================ RemoteExceptionType::RemoteExceptionType() - :Type("android.os", "RemoteException", BUILT_IN, false, false, false) + :Type("android.os", "RemoteException", BUILT_IN, false, false) { } @@ -658,7 +552,7 @@ RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variab // ================================================================ RuntimeExceptionType::RuntimeExceptionType() - :Type("java.lang", "RuntimeException", BUILT_IN, false, false, false) + :Type("java.lang", "RuntimeException", BUILT_IN, false, false) { } @@ -678,7 +572,7 @@ RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Varia // ================================================================ IBinderType::IBinderType() - :Type("android.os", "IBinder", BUILT_IN, true, false, false) + :Type("android.os", "IBinder", BUILT_IN, true, false) { } @@ -717,7 +611,7 @@ IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* p // ================================================================ IInterfaceType::IInterfaceType() - :Type("android.os", "IInterface", BUILT_IN, false, false, false) + :Type("android.os", "IInterface", BUILT_IN, false, false) { } @@ -737,7 +631,7 @@ IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* p // ================================================================ BinderType::BinderType() - :Type("android.os", "Binder", BUILT_IN, false, false, false) + :Type("android.os", "Binder", BUILT_IN, false, false) { } @@ -758,7 +652,7 @@ BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, // ================================================================ BinderProxyType::BinderProxyType() - :Type("android.os", "BinderProxy", BUILT_IN, false, false, false) + :Type("android.os", "BinderProxy", BUILT_IN, false, false) { } @@ -779,7 +673,7 @@ BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v, // ================================================================ ParcelType::ParcelType() - :Type("android.os", "Parcel", BUILT_IN, false, false, false) + :Type("android.os", "Parcel", BUILT_IN, false, false) { } @@ -798,7 +692,7 @@ ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parce // ================================================================ ParcelableInterfaceType::ParcelableInterfaceType() - :Type("android.os", "Parcelable", BUILT_IN, false, false, false) + :Type("android.os", "Parcelable", BUILT_IN, false, false) { } @@ -817,7 +711,7 @@ ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Va // ================================================================ MapType::MapType() - :Type("java.util", "Map", BUILT_IN, true, false, true) + :Type("java.util", "Map", BUILT_IN, true, true) { } @@ -857,7 +751,7 @@ MapType::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Va // ================================================================ ListType::ListType() - :Type("java.util", "List", BUILT_IN, true, true, true) + :Type("java.util", "List", BUILT_IN, true, true) { } @@ -888,26 +782,12 @@ ListType::ReadFromParcel(StatementBlock* addTo, Variable* v, addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl)); } -void -ListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - addTo->Add(new MethodCall(data, "putList", 2, k, v)); -} - -void -ListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data, - Variable** cl) -{ - addTo->Add(new Assignment(v, new MethodCall(data, "getList", 1, k))); -} - // ================================================================ UserDataType::UserDataType(const string& package, const string& name, - bool builtIn, bool canWriteToParcel, bool canWriteToRpcData, + bool builtIn, bool canWriteToParcel, const string& declFile, int declLine) - :Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, canWriteToRpcData, + :Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, true, declFile, declLine) { } @@ -918,12 +798,6 @@ UserDataType::CreatorName() const return QualifiedName() + ".CREATOR"; } -string -UserDataType::RpcCreatorName() const -{ - return QualifiedName() + ".RPC_CREATOR"; -} - void UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags) { @@ -1014,29 +888,12 @@ UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* v, new LiteralExpression(creator))); } -void -UserDataType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - // data.putFlattenable(k, v); - addTo->Add(new MethodCall(data, "putFlattenable", 2, k, v)); -} - -void -UserDataType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl) -{ - // data.getFlattenable(k, CLASS.RPC_CREATOR); - addTo->Add(new Assignment(v, new MethodCall(data, "getFlattenable", 2, k, - new FieldVariable(v->type, "RPC_CREATOR")))); -} - // ================================================================ InterfaceType::InterfaceType(const string& package, const string& name, bool builtIn, bool oneway, const string& declFile, int declLine) - :Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, false, + :Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, declFile, declLine) ,m_oneway(oneway) { @@ -1075,7 +932,7 @@ InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* pa GenericType::GenericType(const string& package, const string& name, const vector<Type*>& args) - :Type(package, name, BUILT_IN, true, true, true) + :Type(package, name, BUILT_IN, true, true) { m_args = args; @@ -1200,65 +1057,11 @@ GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v, } } -void -GenericListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - Type* generic = GenericArgumentTypes()[0]; - if (generic == RPC_DATA_TYPE) { - addTo->Add(new MethodCall(data, "putRpcDataList", 2, k, v)); - } else if (generic->RpcCreatorName() != "") { - addTo->Add(new MethodCall(data, "putFlattenableList", 2, k, v)); - } else { - addTo->Add(new MethodCall(data, "putList", 2, k, v)); - } -} - -void -GenericListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl) -{ - Type* generic = GenericArgumentTypes()[0]; - if (generic == RPC_DATA_TYPE) { - addTo->Add(new Assignment(v, new MethodCall(data, "getRpcDataList", 2, k))); - } else if (generic->RpcCreatorName() != "") { - addTo->Add(new Assignment(v, new MethodCall(data, "getFlattenableList", 2, k, - new LiteralExpression(generic->RpcCreatorName())))); - } else { - string classArg = GenericArgumentTypes()[0]->QualifiedName(); - classArg += ".class"; - addTo->Add(new Assignment(v, new MethodCall(data, "getList", 2, k, - new LiteralExpression(classArg)))); - } -} - - -// ================================================================ - -RpcDataType::RpcDataType() - :UserDataType("android.support.place.rpc", "RpcData", true, true, true) -{ -} - -void -RpcDataType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags) -{ - addTo->Add(new MethodCall(data, "putRpcData", 2, k, v)); -} - -void -RpcDataType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data, - Variable** cl) -{ - addTo->Add(new Assignment(v, new MethodCall(data, "getRpcData", 1, k))); -} - // ================================================================ ClassLoaderType::ClassLoaderType() - :Type("java.lang", "ClassLoader", BUILT_IN, false, false, false) + :Type("java.lang", "ClassLoader", BUILT_IN, false, false) { } diff --git a/tools/aidl/Type.h b/tools/aidl/Type.h index cf6eaff556c4..2a5d7856075e 100644 --- a/tools/aidl/Type.h +++ b/tools/aidl/Type.h @@ -25,9 +25,9 @@ public: }; Type(const string& name, int kind, bool canWriteToParcel, - bool canWriteToRpcData, bool canBeOut); + bool canBeOut); Type(const string& package, const string& name, - int kind, bool canWriteToParcel, bool canWriteToRpcData, bool canBeOut, + int kind, bool canWriteToParcel, bool canBeOut, const string& declFile = "", int declLine = -1); virtual ~Type(); @@ -38,12 +38,10 @@ public: inline string DeclFile() const { return m_declFile; } inline int DeclLine() const { return m_declLine; } inline bool CanWriteToParcel() const { return m_canWriteToParcel; } - inline bool CanWriteToRpcData() const { return m_canWriteToRpcData; } inline bool CanBeOutParameter() const { return m_canBeOut; } virtual string ImportType() const; virtual string CreatorName() const; - virtual string RpcCreatorName() const; virtual string InstantiableName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, @@ -62,11 +60,6 @@ public: virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); - protected: void SetQualifiedName(const string& qualified); Expression* BuildWriteToParcelFlags(int flags); @@ -82,7 +75,6 @@ private: int m_declLine; int m_kind; bool m_canWriteToParcel; - bool m_canWriteToRpcData; bool m_canBeOut; }; @@ -94,12 +86,7 @@ public: const string& unmarshallParcel, const string& writeArrayParcel, const string& createArrayParcel, - const string& readArrayParcel, - const string& marshallRpc, - const string& unmarshallRpc, - const string& writeArrayRpc, - const string& createArrayRpc, - const string& readArrayRpc); + const string& readArrayParcel); virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); @@ -115,22 +102,12 @@ public: virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); - private: string m_marshallParcel; string m_unmarshallParcel; string m_writeArrayParcel; string m_createArrayParcel; string m_readArrayParcel; - string m_marshallRpc; - string m_unmarshallRpc; - string m_writeArrayRpc; - string m_createArrayRpc; - string m_readArrayRpc; }; class BooleanType : public Type @@ -151,11 +128,6 @@ public: Variable* parcel, Variable** cl); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); }; class CharType : public Type @@ -176,11 +148,6 @@ public: Variable* parcel, Variable** cl); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); }; @@ -204,11 +171,6 @@ public: Variable* parcel, Variable** cl); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); }; class CharSequenceType : public Type @@ -345,22 +307,16 @@ public: Variable* parcel, Variable** cl); virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); }; class UserDataType : public Type { public: UserDataType(const string& package, const string& name, - bool builtIn, bool canWriteToParcel, bool canWriteToRpcData, + bool builtIn, bool canWriteToParcel, const string& declFile = "", int declLine = -1); virtual string CreatorName() const; - virtual string RpcCreatorName() const; virtual void WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags); @@ -377,11 +333,6 @@ public: Variable* parcel, Variable** cl); virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); }; class InterfaceType : public Type @@ -427,17 +378,6 @@ private: vector<Type*> m_args; }; -class RpcDataType : public UserDataType -{ -public: - RpcDataType(); - - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); -}; - class ClassLoaderType : public Type { public: @@ -460,11 +400,6 @@ public: virtual void ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl); - virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, int flags); - virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, - Variable* data, Variable** cl); - private: string m_creator; }; @@ -527,11 +462,6 @@ extern Type* PARCELABLE_INTERFACE_TYPE; extern Type* CONTEXT_TYPE; -extern Type* RPC_DATA_TYPE; -extern Type* RPC_ERROR_TYPE; -extern Type* RPC_CONTEXT_TYPE; -extern Type* EVENT_FAKE_TYPE; - extern Expression* NULL_VALUE; extern Expression* THIS_VALUE; extern Expression* SUPER_VALUE; diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp index d77f2b13dd97..46c689970dc4 100644 --- a/tools/aidl/aidl.cpp +++ b/tools/aidl/aidl.cpp @@ -63,12 +63,9 @@ test_document(document_item_type* d) } else if (d->item_type == USER_DATA_TYPE) { user_data_type* b = (user_data_type*)d; - if ((b->flattening_methods & PARCELABLE_DATA) != 0) { + if (b->parcelable) { printf("parcelable %s %s;\n", b->package, b->name.data); } - if ((b->flattening_methods & RPC_DATA) != 0) { - printf("flattenable %s %s;\n", b->package, b->name.data); - } } else { printf("UNKNOWN d=0x%08lx d->item_type=%d\n", (long)d, d->item_type); @@ -254,8 +251,7 @@ check_filenames(const char* filename, document_item_type* items) user_data_type* p = (user_data_type*)items; err |= check_filename(filename, p->package, &p->name); } - else if (items->item_type == INTERFACE_TYPE_BINDER - || items->item_type == INTERFACE_TYPE_RPC) { + else if (items->item_type == INTERFACE_TYPE_BINDER) { interface_type* c = (interface_type*)items; err |= check_filename(filename, c->package, &c->name); } @@ -306,11 +302,9 @@ gather_types(const char* filename, document_item_type* items) if (items->item_type == USER_DATA_TYPE) { user_data_type* p = (user_data_type*)items; type = new UserDataType(p->package ? p->package : "", p->name.data, - false, ((p->flattening_methods & PARCELABLE_DATA) != 0), - ((p->flattening_methods & RPC_DATA) != 0), filename, p->name.lineno); + false, p->parcelable, filename, p->name.lineno); } - else if (items->item_type == INTERFACE_TYPE_BINDER - || items->item_type == INTERFACE_TYPE_RPC) { + else if (items->item_type == INTERFACE_TYPE_BINDER) { interface_type* c = (interface_type*)items; type = new InterfaceType(c->package ? c->package : "", c->name.data, false, c->oneway, @@ -334,30 +328,17 @@ gather_types(const char* filename, document_item_type* items) string name = c->name.data; name += ".Stub"; Type* stub = new Type(c->package ? c->package : "", - name, Type::GENERATED, false, false, false, + name, Type::GENERATED, false, false, filename, c->name.lineno); NAMES.Add(stub); name = c->name.data; name += ".Stub.Proxy"; Type* proxy = new Type(c->package ? c->package : "", - name, Type::GENERATED, false, false, false, + name, Type::GENERATED, false, false, filename, c->name.lineno); NAMES.Add(proxy); } - else if (items->item_type == INTERFACE_TYPE_RPC) { - // for interfaces, also add the service base type, we don't - // bother checking these for duplicates, because the parser - // won't let us do it. - interface_type* c = (interface_type*)items; - - string name = c->name.data; - name += ".ServiceBase"; - Type* base = new Type(c->package ? c->package : "", - name, Type::GENERATED, false, false, false, - filename, c->name.lineno); - NAMES.Add(base); - } } else { if (old->Kind() == Type::BUILT_IN) { fprintf(stderr, "%s:%d attempt to redefine built in class %s\n", @@ -409,7 +390,7 @@ matches_keyword(const char* str) } static int -check_method(const char* filename, int kind, method_type* m) +check_method(const char* filename, method_type* m) { int err = 0; @@ -422,19 +403,10 @@ check_method(const char* filename, int kind, method_type* m) return err; } - if (returnType == EVENT_FAKE_TYPE) { - if (kind != INTERFACE_TYPE_RPC) { - fprintf(stderr, "%s:%d event methods only supported for rpc interfaces\n", - filename, m->type.type.lineno); - err = 1; - } - } else { - if (!(kind == INTERFACE_TYPE_BINDER ? returnType->CanWriteToParcel() - : returnType->CanWriteToRpcData())) { - fprintf(stderr, "%s:%d return type %s can't be marshalled.\n", filename, + if (!returnType->CanWriteToParcel()) { + fprintf(stderr, "%s:%d return type %s can't be marshalled.\n", filename, m->type.type.lineno, m->type.type.data); - err = 1; - } + err = 1; } if (m->type.dimension > 0 && !returnType->CanBeArray()) { @@ -467,30 +439,13 @@ check_method(const char* filename, int kind, method_type* m) goto next; } - if (t == EVENT_FAKE_TYPE) { - fprintf(stderr, "%s:%d parameter %s (%d) event can not be used as a parameter %s\n", - filename, m->type.type.lineno, arg->name.data, index, - arg->type.type.data); - err = 1; - goto next; - } - - if (!(kind == INTERFACE_TYPE_BINDER ? t->CanWriteToParcel() : t->CanWriteToRpcData())) { + if (!t->CanWriteToParcel()) { fprintf(stderr, "%s:%d parameter %d: '%s %s' can't be marshalled.\n", filename, m->type.type.lineno, index, arg->type.type.data, arg->name.data); err = 1; } - if (returnType == EVENT_FAKE_TYPE - && convert_direction(arg->direction.data) != IN_PARAMETER) { - fprintf(stderr, "%s:%d parameter %d: '%s %s' All paremeters on events must be 'in'.\n", - filename, m->type.type.lineno, index, - arg->type.type.data, arg->name.data); - err = 1; - goto next; - } - if (arg->direction.data == NULL && (arg->type.dimension != 0 || t->CanBeOutParameter())) { fprintf(stderr, "%s:%d parameter %d: '%s %s' can be an out" @@ -552,8 +507,7 @@ check_types(const char* filename, document_item_type* items) int err = 0; while (items) { // (nothing to check for USER_DATA_TYPE) - if (items->item_type == INTERFACE_TYPE_BINDER - || items->item_type == INTERFACE_TYPE_RPC) { + if (items->item_type == INTERFACE_TYPE_BINDER) { map<string,method_type*> methodNames; interface_type* c = (interface_type*)items; @@ -562,7 +516,7 @@ check_types(const char* filename, document_item_type* items) if (member->item_type == METHOD_TYPE) { method_type* m = (method_type*)member; - err |= check_method(filename, items->item_type, m); + err |= check_method(filename, m); // prevent duplicate methods if (methodNames.find(m->name.data) == methodNames.end()) { @@ -603,9 +557,6 @@ exactly_one_interface(const char* filename, const document_item_type* items, con if (next->item_type == INTERFACE_TYPE_BINDER) { lineno = ((interface_type*)next)->interface_token.lineno; } - else if (next->item_type == INTERFACE_TYPE_RPC) { - lineno = ((interface_type*)next)->interface_token.lineno; - } fprintf(stderr, "%s:%d aidl can only handle one interface per file\n", filename, lineno); return 1; @@ -615,9 +566,9 @@ exactly_one_interface(const char* filename, const document_item_type* items, con *onlyParcelable = true; if (options.failOnParcelable) { fprintf(stderr, "%s:%d aidl can only generate code for interfaces, not" - " parcelables or flattenables,\n", filename, + " parcelables,\n", filename, ((user_data_type*)items)->keyword_token.lineno); - fprintf(stderr, "%s:%d .aidl files that only declare parcelables or flattenables" + fprintf(stderr, "%s:%d .aidl files that only declare parcelables" "may not go in the Makefile.\n", filename, ((user_data_type*)items)->keyword_token.lineno); return 1; @@ -654,7 +605,7 @@ generate_dep_file(const Options& options, const document_item_type* items) slash = ""; } - if (items->item_type == INTERFACE_TYPE_BINDER || items->item_type == INTERFACE_TYPE_RPC) { + if (items->item_type == INTERFACE_TYPE_BINDER) { fprintf(to, "%s: \\\n", options.outputFileName.c_str()); } else { // parcelable: there's no output file. @@ -728,7 +679,7 @@ static string generate_outputFileName(const Options& options, const document_item_type* items) { // items has already been checked to have only one interface. - if (items->item_type == INTERFACE_TYPE_BINDER || items->item_type == INTERFACE_TYPE_RPC) { + if (items->item_type == INTERFACE_TYPE_BINDER) { interface_type* type = (interface_type*)items; return generate_outputFileName2(options, type->name, type->package); @@ -815,22 +766,7 @@ parse_preprocessed_file(const string& filename) parcl->name.data = strdup(classname); parcl->semicolon_token.lineno = lineno; parcl->semicolon_token.data = strdup(";"); - parcl->flattening_methods = PARCELABLE_DATA; - doc = (document_item_type*)parcl; - } - else if (0 == strcmp("flattenable", type)) { - user_data_type* parcl = (user_data_type*)malloc( - sizeof(user_data_type)); - memset(parcl, 0, sizeof(user_data_type)); - parcl->document_item.item_type = USER_DATA_TYPE; - parcl->keyword_token.lineno = lineno; - parcl->keyword_token.data = strdup(type); - parcl->package = packagename ? strdup(packagename) : NULL; - parcl->name.lineno = lineno; - parcl->name.data = strdup(classname); - parcl->semicolon_token.lineno = lineno; - parcl->semicolon_token.data = strdup(";"); - parcl->flattening_methods = RPC_DATA; + parcl->parcelable = true; doc = (document_item_type*)parcl; } else if (0 == strcmp("interface", type)) { @@ -1084,12 +1020,9 @@ preprocess_aidl(const Options& options) string line; if (doc->item_type == USER_DATA_TYPE) { user_data_type* parcelable = (user_data_type*)doc; - if ((parcelable->flattening_methods & PARCELABLE_DATA) != 0) { + if (parcelable->parcelable) { line = "parcelable "; } - if ((parcelable->flattening_methods & RPC_DATA) != 0) { - line = "flattenable "; - } if (parcelable->package) { line += parcelable->package; line += '.'; diff --git a/tools/aidl/aidl_language.h b/tools/aidl/aidl_language.h index 1be5a9bbeb6d..a3b1efcbaf40 100644 --- a/tools/aidl/aidl_language.h +++ b/tools/aidl/aidl_language.h @@ -68,8 +68,7 @@ typedef struct method_type { enum { USER_DATA_TYPE = 12, - INTERFACE_TYPE_BINDER, - INTERFACE_TYPE_RPC + INTERFACE_TYPE_BINDER }; typedef struct document_item_type { @@ -78,19 +77,13 @@ typedef struct document_item_type { } document_item_type; -// for user_data_type.flattening_methods -enum { - PARCELABLE_DATA = 0x1, - RPC_DATA = 0x2 -}; - typedef struct user_data_type { document_item_type document_item; buffer_type keyword_token; // only the first one char* package; buffer_type name; buffer_type semicolon_token; - int flattening_methods; + bool parcelable; } user_data_type; typedef struct interface_type { diff --git a/tools/aidl/aidl_language_l.l b/tools/aidl/aidl_language_l.l index 3d33e7a14913..aa42f2e9a9fd 100644 --- a/tools/aidl/aidl_language_l.l +++ b/tools/aidl/aidl_language_l.l @@ -83,8 +83,6 @@ idvalue (0|[1-9][0-9]*) /* keywords */ parcelable { SET_BUFFER(PARCELABLE); return PARCELABLE; } interface { SET_BUFFER(INTERFACE); return INTERFACE; } -flattenable { SET_BUFFER(FLATTENABLE); return FLATTENABLE; } -rpc { SET_BUFFER(INTERFACE); return RPC; } in { SET_BUFFER(IN); return IN; } out { SET_BUFFER(OUT); return OUT; } inout { SET_BUFFER(INOUT); return INOUT; } diff --git a/tools/aidl/aidl_language_y.y b/tools/aidl/aidl_language_y.y index 9b40d28ad598..9c5d10e6892a 100644 --- a/tools/aidl/aidl_language_y.y +++ b/tools/aidl/aidl_language_y.y @@ -20,8 +20,6 @@ static int count_brackets(const char*); %token ARRAY %token PARCELABLE %token INTERFACE -%token FLATTENABLE -%token RPC %token IN %token OUT %token INOUT @@ -88,7 +86,7 @@ parcelable_decl: b->name = $2.buffer; b->package = g_currentPackage ? strdup(g_currentPackage) : NULL; b->semicolon_token = $3.buffer; - b->flattening_methods = PARCELABLE_DATA; + b->parcelable = true; $$.user_data = b; } | PARCELABLE ';' { @@ -101,28 +99,6 @@ parcelable_decl: g_currentFilename, $2.buffer.lineno, $2.buffer.data); $$.user_data = NULL; } - | FLATTENABLE IDENTIFIER ';' { - user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type)); - b->document_item.item_type = USER_DATA_TYPE; - b->document_item.next = NULL; - b->keyword_token = $1.buffer; - b->name = $2.buffer; - b->package = g_currentPackage ? strdup(g_currentPackage) : NULL; - b->semicolon_token = $3.buffer; - b->flattening_methods = PARCELABLE_DATA | RPC_DATA; - $$.user_data = b; - } - | FLATTENABLE ';' { - fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name.\n", - g_currentFilename, $1.buffer.lineno); - $$.user_data = NULL; - } - | FLATTENABLE error ';' { - fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name, saw \"%s\".\n", - g_currentFilename, $2.buffer.lineno, $2.buffer.data); - $$.user_data = NULL; - } - ; interface_header: @@ -146,21 +122,6 @@ interface_header: c->comments_token = &c->oneway_token; $$.interface_obj = c; } - | RPC { - interface_type* c = (interface_type*)malloc(sizeof(interface_type)); - c->document_item.item_type = INTERFACE_TYPE_RPC; - c->document_item.next = NULL; - c->interface_token = $1.buffer; - c->oneway = false; - memset(&c->oneway_token, 0, sizeof(buffer_type)); - c->comments_token = &c->interface_token; - $$.interface_obj = c; - } - ; - -interface_keywords: - INTERFACE - | RPC ; interface_decl: @@ -173,12 +134,12 @@ interface_decl: c->close_brace_token = $5.buffer; $$.interface_obj = c; } - | interface_keywords error '{' interface_items '}' { + | INTERFACE error '{' interface_items '}' { fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n", g_currentFilename, $2.buffer.lineno, $2.buffer.data); $$.document_item = NULL; } - | interface_keywords error '}' { + | INTERFACE error '}' { fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n", g_currentFilename, $2.buffer.lineno, $2.buffer.data); $$.document_item = NULL; diff --git a/tools/aidl/generate_java.cpp b/tools/aidl/generate_java.cpp index 9e57407e772f..15093406da6c 100644 --- a/tools/aidl/generate_java.cpp +++ b/tools/aidl/generate_java.cpp @@ -66,9 +66,6 @@ generate_java(const string& filename, const string& originalSrc, if (iface->document_item.item_type == INTERFACE_TYPE_BINDER) { cl = generate_binder_interface_class(iface); } - else if (iface->document_item.item_type == INTERFACE_TYPE_RPC) { - cl = generate_rpc_interface_class(iface); - } Document* document = new Document; document->comment = ""; diff --git a/tools/aidl/generate_java.h b/tools/aidl/generate_java.h index 413a5b379c6d..c66592282942 100644 --- a/tools/aidl/generate_java.h +++ b/tools/aidl/generate_java.h @@ -13,7 +13,6 @@ int generate_java(const string& filename, const string& originalSrc, interface_type* iface); Class* generate_binder_interface_class(const interface_type* iface); -Class* generate_rpc_interface_class(const interface_type* iface); string gather_comments(extra_text_type* extra); string append(const char* a, const char* b); diff --git a/tools/aidl/generate_java_rpc.cpp b/tools/aidl/generate_java_rpc.cpp deleted file mode 100644 index 5e4daccf6334..000000000000 --- a/tools/aidl/generate_java_rpc.cpp +++ /dev/null @@ -1,1001 +0,0 @@ -#include "generate_java.h" -#include "Type.h" -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -Type* SERVICE_CONTEXT_TYPE = new Type("android.content", - "Context", Type::BUILT_IN, false, false, false); -Type* PRESENTER_BASE_TYPE = new Type("android.support.place.connector", - "EventListener", Type::BUILT_IN, false, false, false); -Type* PRESENTER_LISTENER_BASE_TYPE = new Type("android.support.place.connector", - "EventListener.Listener", Type::BUILT_IN, false, false, false); -Type* RPC_BROKER_TYPE = new Type("android.support.place.connector", "Broker", - Type::BUILT_IN, false, false, false); -Type* RPC_CONTAINER_TYPE = new Type("com.android.athome.connector", "ConnectorContainer", - Type::BUILT_IN, false, false, false); -Type* PLACE_INFO_TYPE = new Type("android.support.place.connector", "PlaceInfo", - Type::BUILT_IN, false, false, false); -// TODO: Just use Endpoint, so this works for all endpoints. -Type* RPC_CONNECTOR_TYPE = new Type("android.support.place.connector", "Connector", - Type::BUILT_IN, false, false, false); -Type* RPC_ENDPOINT_INFO_TYPE = new UserDataType("android.support.place.rpc", - "EndpointInfo", true, __FILE__, __LINE__); -Type* RPC_RESULT_HANDLER_TYPE = new UserDataType("android.support.place.rpc", "RpcResultHandler", - true, __FILE__, __LINE__); -Type* RPC_ERROR_LISTENER_TYPE = new Type("android.support.place.rpc", "RpcErrorHandler", - Type::BUILT_IN, false, false, false); -Type* RPC_CONTEXT_TYPE = new UserDataType("android.support.place.rpc", "RpcContext", true, - __FILE__, __LINE__); - -static void generate_create_from_data(Type* t, StatementBlock* addTo, const string& key, - Variable* v, Variable* data, Variable** cl); -static void generate_new_array(Type* t, StatementBlock* addTo, Variable* v, Variable* from); -static void generate_write_to_data(Type* t, StatementBlock* addTo, Expression* k, Variable* v, - Variable* data); - -static string -format_int(int n) -{ - char str[20]; - sprintf(str, "%d", n); - return string(str); -} - -static string -class_name_leaf(const string& str) -{ - string::size_type pos = str.rfind('.'); - if (pos == string::npos) { - return str; - } else { - return string(str, pos+1); - } -} - -static string -results_class_name(const string& n) -{ - string str = n; - str[0] = toupper(str[0]); - str.insert(0, "On"); - return str; -} - -static string -results_method_name(const string& n) -{ - string str = n; - str[0] = toupper(str[0]); - str.insert(0, "on"); - return str; -} - -static string -push_method_name(const string& n) -{ - string str = n; - str[0] = toupper(str[0]); - str.insert(0, "push"); - return str; -} - -// ================================================= -class DispatcherClass : public Class -{ -public: - DispatcherClass(const interface_type* iface, Expression* target); - virtual ~DispatcherClass(); - - void AddMethod(const method_type* method); - void DoneWithMethods(); - - Method* processMethod; - Variable* actionParam; - Variable* requestParam; - Variable* rpcContextParam; - Variable* errorParam; - Variable* requestData; - Variable* resultData; - IfStatement* dispatchIfStatement; - Expression* targetExpression; - -private: - void generate_process(); -}; - -DispatcherClass::DispatcherClass(const interface_type* iface, Expression* target) - :Class(), - dispatchIfStatement(NULL), - targetExpression(target) -{ - generate_process(); -} - -DispatcherClass::~DispatcherClass() -{ -} - -void -DispatcherClass::generate_process() -{ - // byte[] process(String action, byte[] params, RpcContext context, RpcError status) - this->processMethod = new Method; - this->processMethod->modifiers = PUBLIC; - this->processMethod->returnType = BYTE_TYPE; - this->processMethod->returnTypeDimension = 1; - this->processMethod->name = "process"; - this->processMethod->statements = new StatementBlock; - - this->actionParam = new Variable(STRING_TYPE, "action"); - this->processMethod->parameters.push_back(this->actionParam); - - this->requestParam = new Variable(BYTE_TYPE, "requestParam", 1); - this->processMethod->parameters.push_back(this->requestParam); - - this->rpcContextParam = new Variable(RPC_CONTEXT_TYPE, "context", 0); - this->processMethod->parameters.push_back(this->rpcContextParam); - - this->errorParam = new Variable(RPC_ERROR_TYPE, "errorParam", 0); - this->processMethod->parameters.push_back(this->errorParam); - - this->requestData = new Variable(RPC_DATA_TYPE, "request"); - this->processMethod->statements->Add(new VariableDeclaration(requestData, - new NewExpression(RPC_DATA_TYPE, 1, this->requestParam))); - - this->resultData = new Variable(RPC_DATA_TYPE, "resultData"); - this->processMethod->statements->Add(new VariableDeclaration(this->resultData, - NULL_VALUE)); -} - -void -DispatcherClass::AddMethod(const method_type* method) -{ - arg_type* arg; - - // The if/switch statement - IfStatement* ifs = new IfStatement(); - ifs->expression = new MethodCall(new StringLiteralExpression(method->name.data), "equals", - 1, this->actionParam); - StatementBlock* block = ifs->statements = new StatementBlock; - if (this->dispatchIfStatement == NULL) { - this->dispatchIfStatement = ifs; - this->processMethod->statements->Add(dispatchIfStatement); - } else { - this->dispatchIfStatement->elseif = ifs; - this->dispatchIfStatement = ifs; - } - - // The call to decl (from above) - MethodCall* realCall = new MethodCall(this->targetExpression, method->name.data); - - // args - Variable* classLoader = NULL; - VariableFactory stubArgs("_arg"); - arg = method->args; - while (arg != NULL) { - Type* t = NAMES.Search(arg->type.type.data); - Variable* v = stubArgs.Get(t); - v->dimension = arg->type.dimension; - - // Unmarshall the parameter - block->Add(new VariableDeclaration(v)); - if (convert_direction(arg->direction.data) & IN_PARAMETER) { - generate_create_from_data(t, block, arg->name.data, v, - this->requestData, &classLoader); - } else { - if (arg->type.dimension == 0) { - block->Add(new Assignment(v, new NewExpression(v->type))); - } - else if (arg->type.dimension == 1) { - generate_new_array(v->type, block, v, this->requestData); - } - else { - fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, - __LINE__); - } - } - - // Add that parameter to the method call - realCall->arguments.push_back(v); - - arg = arg->next; - } - - // Add a final parameter: RpcContext. Contains data about - // incoming request (e.g., certificate) - realCall->arguments.push_back(new Variable(RPC_CONTEXT_TYPE, "context", 0)); - - Type* returnType = NAMES.Search(method->type.type.data); - if (returnType == EVENT_FAKE_TYPE) { - returnType = VOID_TYPE; - } - - // the real call - bool first = true; - Variable* _result = NULL; - if (returnType == VOID_TYPE) { - block->Add(realCall); - } else { - _result = new Variable(returnType, "_result", - method->type.dimension); - block->Add(new VariableDeclaration(_result, realCall)); - - // need the result RpcData - if (first) { - block->Add(new Assignment(this->resultData, - new NewExpression(RPC_DATA_TYPE))); - first = false; - } - - // marshall the return value - generate_write_to_data(returnType, block, - new StringLiteralExpression("_result"), _result, this->resultData); - } - - // out parameters - int i = 0; - arg = method->args; - while (arg != NULL) { - Type* t = NAMES.Search(arg->type.type.data); - Variable* v = stubArgs.Get(i++); - - if (convert_direction(arg->direction.data) & OUT_PARAMETER) { - // need the result RpcData - if (first) { - block->Add(new Assignment(this->resultData, new NewExpression(RPC_DATA_TYPE))); - first = false; - } - - generate_write_to_data(t, block, new StringLiteralExpression(arg->name.data), - v, this->resultData); - } - - arg = arg->next; - } -} - -void -DispatcherClass::DoneWithMethods() -{ - if (this->dispatchIfStatement == NULL) { - return; - } - - this->elements.push_back(this->processMethod); - - IfStatement* fallthrough = new IfStatement(); - fallthrough->statements = new StatementBlock; - fallthrough->statements->Add(new ReturnStatement( - new MethodCall(SUPER_VALUE, "process", 4, - this->actionParam, this->requestParam, - this->rpcContextParam, - this->errorParam))); - this->dispatchIfStatement->elseif = fallthrough; - IfStatement* s = new IfStatement; - s->statements = new StatementBlock; - this->processMethod->statements->Add(s); - s->expression = new Comparison(this->resultData, "!=", NULL_VALUE); - s->statements->Add(new ReturnStatement(new MethodCall(this->resultData, "serialize"))); - s->elseif = new IfStatement; - s = s->elseif; - s->statements->Add(new ReturnStatement(NULL_VALUE)); -} - -// ================================================= -class RpcProxyClass : public Class -{ -public: - RpcProxyClass(const interface_type* iface, InterfaceType* interfaceType); - virtual ~RpcProxyClass(); - - Variable* endpoint; - Variable* broker; - -private: - void generate_ctor(); - void generate_get_endpoint_info(); -}; - -RpcProxyClass::RpcProxyClass(const interface_type* iface, InterfaceType* interfaceType) - :Class() -{ - this->comment = gather_comments(iface->comments_token->extra); - this->modifiers = PUBLIC; - this->what = Class::CLASS; - this->type = interfaceType; - - // broker - this->broker = new Variable(RPC_BROKER_TYPE, "_broker"); - this->elements.push_back(new Field(PRIVATE, this->broker)); - // endpoint - this->endpoint = new Variable(RPC_ENDPOINT_INFO_TYPE, "_endpoint"); - this->elements.push_back(new Field(PRIVATE, this->endpoint)); - - // methods - generate_ctor(); - generate_get_endpoint_info(); -} - -RpcProxyClass::~RpcProxyClass() -{ -} - -void -RpcProxyClass::generate_ctor() -{ - Variable* broker = new Variable(RPC_BROKER_TYPE, "broker"); - Variable* endpoint = new Variable(RPC_ENDPOINT_INFO_TYPE, "endpoint"); - Method* ctor = new Method; - ctor->modifiers = PUBLIC; - ctor->name = class_name_leaf(this->type->Name()); - ctor->statements = new StatementBlock; - ctor->parameters.push_back(broker); - ctor->parameters.push_back(endpoint); - this->elements.push_back(ctor); - - ctor->statements->Add(new Assignment(this->broker, broker)); - ctor->statements->Add(new Assignment(this->endpoint, endpoint)); -} - -void -RpcProxyClass::generate_get_endpoint_info() -{ - Method* get = new Method; - get->modifiers = PUBLIC; - get->returnType = RPC_ENDPOINT_INFO_TYPE; - get->name = "getEndpointInfo"; - get->statements = new StatementBlock; - this->elements.push_back(get); - - get->statements->Add(new ReturnStatement(this->endpoint)); -} - -// ================================================= -class EventListenerClass : public DispatcherClass -{ -public: - EventListenerClass(const interface_type* iface, Type* listenerType); - virtual ~EventListenerClass(); - - Variable* _listener; - -private: - void generate_ctor(); -}; - -Expression* -generate_get_listener_expression(Type* cast) -{ - return new Cast(cast, new MethodCall(THIS_VALUE, "getView")); -} - -EventListenerClass::EventListenerClass(const interface_type* iface, Type* listenerType) - :DispatcherClass(iface, new FieldVariable(THIS_VALUE, "_listener")) -{ - this->modifiers = PRIVATE; - this->what = Class::CLASS; - this->type = new Type(iface->package ? iface->package : "", - append(iface->name.data, ".Presenter"), - Type::GENERATED, false, false, false); - this->extends = PRESENTER_BASE_TYPE; - - this->_listener = new Variable(listenerType, "_listener"); - this->elements.push_back(new Field(PRIVATE, this->_listener)); - - // methods - generate_ctor(); -} - -EventListenerClass::~EventListenerClass() -{ -} - -void -EventListenerClass::generate_ctor() -{ - Variable* broker = new Variable(RPC_BROKER_TYPE, "broker"); - Variable* listener = new Variable(this->_listener->type, "listener"); - Method* ctor = new Method; - ctor->modifiers = PUBLIC; - ctor->name = class_name_leaf(this->type->Name()); - ctor->statements = new StatementBlock; - ctor->parameters.push_back(broker); - ctor->parameters.push_back(listener); - this->elements.push_back(ctor); - - ctor->statements->Add(new MethodCall("super", 2, broker, listener)); - ctor->statements->Add(new Assignment(this->_listener, listener)); -} - -// ================================================= -class ListenerClass : public Class -{ -public: - ListenerClass(const interface_type* iface); - virtual ~ListenerClass(); - - bool needed; - -private: - void generate_ctor(); -}; - -ListenerClass::ListenerClass(const interface_type* iface) - :Class(), - needed(false) -{ - this->comment = "/** Extend this to listen to the events from this class. */"; - this->modifiers = STATIC | PUBLIC ; - this->what = Class::CLASS; - this->type = new Type(iface->package ? iface->package : "", - append(iface->name.data, ".Listener"), - Type::GENERATED, false, false, false); - this->extends = PRESENTER_LISTENER_BASE_TYPE; -} - -ListenerClass::~ListenerClass() -{ -} - -// ================================================= -class EndpointBaseClass : public DispatcherClass -{ -public: - EndpointBaseClass(const interface_type* iface); - virtual ~EndpointBaseClass(); - - bool needed; - -private: - void generate_ctor(); -}; - -EndpointBaseClass::EndpointBaseClass(const interface_type* iface) - :DispatcherClass(iface, THIS_VALUE), - needed(false) -{ - this->comment = "/** Extend this to implement a link service. */"; - this->modifiers = STATIC | PUBLIC | ABSTRACT; - this->what = Class::CLASS; - this->type = new Type(iface->package ? iface->package : "", - append(iface->name.data, ".EndpointBase"), - Type::GENERATED, false, false, false); - this->extends = RPC_CONNECTOR_TYPE; - - // methods - generate_ctor(); -} - -EndpointBaseClass::~EndpointBaseClass() -{ -} - -void -EndpointBaseClass::generate_ctor() -{ - Variable* container = new Variable(RPC_CONTAINER_TYPE, "container"); - Variable* broker = new Variable(RPC_BROKER_TYPE, "broker"); - Variable* place = new Variable(PLACE_INFO_TYPE, "placeInfo"); - Method* ctor = new Method; - ctor->modifiers = PUBLIC; - ctor->name = class_name_leaf(this->type->Name()); - ctor->statements = new StatementBlock; - ctor->parameters.push_back(container); - ctor->parameters.push_back(broker); - ctor->parameters.push_back(place); - this->elements.push_back(ctor); - - ctor->statements->Add(new MethodCall("super", 3, container, broker, place)); -} - -// ================================================= -class ResultDispatcherClass : public Class -{ -public: - ResultDispatcherClass(); - virtual ~ResultDispatcherClass(); - - void AddMethod(int index, const string& name, Method** method, Variable** param); - - bool needed; - Variable* methodId; - Variable* callback; - Method* onResultMethod; - Variable* resultParam; - SwitchStatement* methodSwitch; - -private: - void generate_ctor(); - void generate_onResult(); -}; - -ResultDispatcherClass::ResultDispatcherClass() - :Class(), - needed(false) -{ - this->modifiers = PRIVATE | FINAL; - this->what = Class::CLASS; - this->type = new Type("_ResultDispatcher", Type::GENERATED, false, false, false); - this->interfaces.push_back(RPC_RESULT_HANDLER_TYPE); - - // methodId - this->methodId = new Variable(INT_TYPE, "methodId"); - this->elements.push_back(new Field(PRIVATE, this->methodId)); - this->callback = new Variable(OBJECT_TYPE, "callback"); - this->elements.push_back(new Field(PRIVATE, this->callback)); - - // methods - generate_ctor(); - generate_onResult(); -} - -ResultDispatcherClass::~ResultDispatcherClass() -{ -} - -void -ResultDispatcherClass::generate_ctor() -{ - Variable* methodIdParam = new Variable(INT_TYPE, "methId"); - Variable* callbackParam = new Variable(OBJECT_TYPE, "cbObj"); - Method* ctor = new Method; - ctor->modifiers = PUBLIC; - ctor->name = class_name_leaf(this->type->Name()); - ctor->statements = new StatementBlock; - ctor->parameters.push_back(methodIdParam); - ctor->parameters.push_back(callbackParam); - this->elements.push_back(ctor); - - ctor->statements->Add(new Assignment(this->methodId, methodIdParam)); - ctor->statements->Add(new Assignment(this->callback, callbackParam)); -} - -void -ResultDispatcherClass::generate_onResult() -{ - this->onResultMethod = new Method; - this->onResultMethod->modifiers = PUBLIC; - this->onResultMethod->returnType = VOID_TYPE; - this->onResultMethod->returnTypeDimension = 0; - this->onResultMethod->name = "onResult"; - this->onResultMethod->statements = new StatementBlock; - this->elements.push_back(this->onResultMethod); - - this->resultParam = new Variable(BYTE_TYPE, "result", 1); - this->onResultMethod->parameters.push_back(this->resultParam); - - this->methodSwitch = new SwitchStatement(this->methodId); - this->onResultMethod->statements->Add(this->methodSwitch); -} - -void -ResultDispatcherClass::AddMethod(int index, const string& name, Method** method, Variable** param) -{ - Method* m = new Method; - m->modifiers = PUBLIC; - m->returnType = VOID_TYPE; - m->returnTypeDimension = 0; - m->name = name; - m->statements = new StatementBlock; - *param = new Variable(BYTE_TYPE, "result", 1); - m->parameters.push_back(*param); - this->elements.push_back(m); - *method = m; - - Case* c = new Case(format_int(index)); - c->statements->Add(new MethodCall(new LiteralExpression("this"), name, 1, this->resultParam)); - c->statements->Add(new Break()); - - this->methodSwitch->cases.push_back(c); -} - -// ================================================= -static void -generate_new_array(Type* t, StatementBlock* addTo, Variable* v, Variable* from) -{ - fprintf(stderr, "aidl: implement generate_new_array %s:%d\n", __FILE__, __LINE__); - exit(1); -} - -static void -generate_create_from_data(Type* t, StatementBlock* addTo, const string& key, Variable* v, - Variable* data, Variable** cl) -{ - Expression* k = new StringLiteralExpression(key); - if (v->dimension == 0) { - t->CreateFromRpcData(addTo, k, v, data, cl); - } - if (v->dimension == 1) { - //t->ReadArrayFromRpcData(addTo, v, data, cl); - fprintf(stderr, "aidl: implement generate_create_from_data for arrays%s:%d\n", - __FILE__, __LINE__); - } -} - -static void -generate_write_to_data(Type* t, StatementBlock* addTo, Expression* k, Variable* v, Variable* data) -{ - if (v->dimension == 0) { - t->WriteToRpcData(addTo, k, v, data, 0); - } - if (v->dimension == 1) { - //t->WriteArrayToParcel(addTo, v, data); - fprintf(stderr, "aidl: implement generate_write_to_data for arrays%s:%d\n", - __FILE__, __LINE__); - } -} - -// ================================================= -static Type* -generate_results_method(const method_type* method, RpcProxyClass* proxyClass) -{ - arg_type* arg; - - string resultsMethodName = results_method_name(method->name.data); - Type* resultsInterfaceType = new Type(results_class_name(method->name.data), - Type::GENERATED, false, false, false); - - if (!method->oneway) { - Class* resultsClass = new Class; - resultsClass->modifiers = STATIC | PUBLIC; - resultsClass->what = Class::INTERFACE; - resultsClass->type = resultsInterfaceType; - - Method* resultMethod = new Method; - resultMethod->comment = gather_comments(method->comments_token->extra); - resultMethod->modifiers = PUBLIC; - resultMethod->returnType = VOID_TYPE; - resultMethod->returnTypeDimension = 0; - resultMethod->name = resultsMethodName; - if (0 != strcmp("void", method->type.type.data)) { - resultMethod->parameters.push_back(new Variable(NAMES.Search(method->type.type.data), - "_result", method->type.dimension)); - } - arg = method->args; - while (arg != NULL) { - if (convert_direction(arg->direction.data) & OUT_PARAMETER) { - resultMethod->parameters.push_back(new Variable( - NAMES.Search(arg->type.type.data), arg->name.data, - arg->type.dimension)); - } - arg = arg->next; - } - resultsClass->elements.push_back(resultMethod); - - if (resultMethod->parameters.size() > 0) { - proxyClass->elements.push_back(resultsClass); - return resultsInterfaceType; - } - } - //delete resultsInterfaceType; - return NULL; -} - -static void -generate_proxy_method(const method_type* method, RpcProxyClass* proxyClass, - ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index) -{ - arg_type* arg; - Method* proxyMethod = new Method; - proxyMethod->comment = gather_comments(method->comments_token->extra); - proxyMethod->modifiers = PUBLIC; - proxyMethod->returnType = VOID_TYPE; - proxyMethod->returnTypeDimension = 0; - proxyMethod->name = method->name.data; - proxyMethod->statements = new StatementBlock; - proxyClass->elements.push_back(proxyMethod); - - // The local variables - Variable* _data = new Variable(RPC_DATA_TYPE, "_data"); - proxyMethod->statements->Add(new VariableDeclaration(_data, new NewExpression(RPC_DATA_TYPE))); - - // Add the arguments - arg = method->args; - while (arg != NULL) { - if (convert_direction(arg->direction.data) & IN_PARAMETER) { - // Function signature - Type* t = NAMES.Search(arg->type.type.data); - Variable* v = new Variable(t, arg->name.data, arg->type.dimension); - proxyMethod->parameters.push_back(v); - - // Input parameter marshalling - generate_write_to_data(t, proxyMethod->statements, - new StringLiteralExpression(arg->name.data), v, _data); - } - arg = arg->next; - } - - // If there is a results interface for this class - Expression* resultParameter; - if (resultsInterfaceType != NULL) { - // Result interface parameter - Variable* resultListener = new Variable(resultsInterfaceType, "_result"); - proxyMethod->parameters.push_back(resultListener); - - // Add the results dispatcher callback - resultsDispatcherClass->needed = true; - resultParameter = new NewExpression(resultsDispatcherClass->type, 2, - new LiteralExpression(format_int(index)), resultListener); - } else { - resultParameter = NULL_VALUE; - } - - // All proxy methods take an error parameter - Variable* errorListener = new Variable(RPC_ERROR_LISTENER_TYPE, "_errors"); - proxyMethod->parameters.push_back(errorListener); - - // Call the broker - proxyMethod->statements->Add(new MethodCall(new FieldVariable(THIS_VALUE, "_broker"), - "sendRpc", 5, - proxyClass->endpoint, - new StringLiteralExpression(method->name.data), - new MethodCall(_data, "serialize"), - resultParameter, - errorListener)); -} - -static void -generate_result_dispatcher_method(const method_type* method, - ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index) -{ - arg_type* arg; - Method* dispatchMethod; - Variable* dispatchParam; - resultsDispatcherClass->AddMethod(index, method->name.data, &dispatchMethod, &dispatchParam); - - Variable* classLoader = NULL; - Variable* resultData = new Variable(RPC_DATA_TYPE, "resultData"); - dispatchMethod->statements->Add(new VariableDeclaration(resultData, - new NewExpression(RPC_DATA_TYPE, 1, dispatchParam))); - - // The callback method itself - MethodCall* realCall = new MethodCall( - new Cast(resultsInterfaceType, new FieldVariable(THIS_VALUE, "callback")), - results_method_name(method->name.data)); - - // The return value - { - Type* t = NAMES.Search(method->type.type.data); - if (t != VOID_TYPE) { - Variable* rv = new Variable(t, "rv"); - dispatchMethod->statements->Add(new VariableDeclaration(rv)); - generate_create_from_data(t, dispatchMethod->statements, "_result", rv, - resultData, &classLoader); - realCall->arguments.push_back(rv); - } - } - - VariableFactory stubArgs("arg"); - arg = method->args; - while (arg != NULL) { - if (convert_direction(arg->direction.data) & OUT_PARAMETER) { - // Unmarshall the results - Type* t = NAMES.Search(arg->type.type.data); - Variable* v = stubArgs.Get(t); - dispatchMethod->statements->Add(new VariableDeclaration(v)); - - generate_create_from_data(t, dispatchMethod->statements, arg->name.data, v, - resultData, &classLoader); - - // Add the argument to the callback - realCall->arguments.push_back(v); - } - arg = arg->next; - } - - // Call the callback method - IfStatement* ifst = new IfStatement; - ifst->expression = new Comparison(new FieldVariable(THIS_VALUE, "callback"), "!=", NULL_VALUE); - dispatchMethod->statements->Add(ifst); - ifst->statements->Add(realCall); -} - -static void -generate_regular_method(const method_type* method, RpcProxyClass* proxyClass, - EndpointBaseClass* serviceBaseClass, ResultDispatcherClass* resultsDispatcherClass, - int index) -{ - arg_type* arg; - - // == the callback interface for results ================================ - // the service base class - Type* resultsInterfaceType = generate_results_method(method, proxyClass); - - // == the method in the proxy class ===================================== - generate_proxy_method(method, proxyClass, resultsDispatcherClass, resultsInterfaceType, index); - - // == the method in the result dispatcher class ========================= - if (resultsInterfaceType != NULL) { - generate_result_dispatcher_method(method, resultsDispatcherClass, resultsInterfaceType, - index); - } - - // == The abstract method that the service developers implement ========== - Method* decl = new Method; - decl->comment = gather_comments(method->comments_token->extra); - decl->modifiers = PUBLIC | ABSTRACT; - decl->returnType = NAMES.Search(method->type.type.data); - decl->returnTypeDimension = method->type.dimension; - decl->name = method->name.data; - arg = method->args; - while (arg != NULL) { - decl->parameters.push_back(new Variable( - NAMES.Search(arg->type.type.data), arg->name.data, - arg->type.dimension)); - arg = arg->next; - } - - // Add the default RpcContext param to all methods - decl->parameters.push_back(new Variable(RPC_CONTEXT_TYPE, "context", 0)); - - serviceBaseClass->elements.push_back(decl); - - - // == the dispatch method in the service base class ====================== - serviceBaseClass->AddMethod(method); -} - -static void -generate_event_method(const method_type* method, RpcProxyClass* proxyClass, - EndpointBaseClass* serviceBaseClass, ListenerClass* listenerClass, - EventListenerClass* presenterClass, int index) -{ - arg_type* arg; - listenerClass->needed = true; - - // == the push method in the service base class ========================= - Method* push = new Method; - push->modifiers = PUBLIC; - push->name = push_method_name(method->name.data); - push->statements = new StatementBlock; - push->returnType = VOID_TYPE; - serviceBaseClass->elements.push_back(push); - - // The local variables - Variable* _data = new Variable(RPC_DATA_TYPE, "_data"); - push->statements->Add(new VariableDeclaration(_data, new NewExpression(RPC_DATA_TYPE))); - - // Add the arguments - arg = method->args; - while (arg != NULL) { - // Function signature - Type* t = NAMES.Search(arg->type.type.data); - Variable* v = new Variable(t, arg->name.data, arg->type.dimension); - push->parameters.push_back(v); - - // Input parameter marshalling - generate_write_to_data(t, push->statements, - new StringLiteralExpression(arg->name.data), v, _data); - - arg = arg->next; - } - - // Send the notifications - push->statements->Add(new MethodCall("pushEvent", 2, - new StringLiteralExpression(method->name.data), - new MethodCall(_data, "serialize"))); - - // == the event callback dispatcher method ==================================== - presenterClass->AddMethod(method); - - // == the event method in the listener base class ===================== - Method* event = new Method; - event->modifiers = PUBLIC; - event->name = method->name.data; - event->statements = new StatementBlock; - event->returnType = VOID_TYPE; - listenerClass->elements.push_back(event); - arg = method->args; - while (arg != NULL) { - event->parameters.push_back(new Variable( - NAMES.Search(arg->type.type.data), arg->name.data, - arg->type.dimension)); - arg = arg->next; - } - - // Add a final parameter: RpcContext. Contains data about - // incoming request (e.g., certificate) - event->parameters.push_back(new Variable(RPC_CONTEXT_TYPE, "context", 0)); -} - -static void -generate_listener_methods(RpcProxyClass* proxyClass, Type* presenterType, Type* listenerType) -{ - // AndroidAtHomePresenter _presenter; - // void startListening(Listener listener) { - // stopListening(); - // _presenter = new Presenter(_broker, listener); - // _presenter.startListening(_endpoint); - // } - // void stopListening() { - // if (_presenter != null) { - // _presenter.stopListening(); - // } - // } - - Variable* _presenter = new Variable(presenterType, "_presenter"); - proxyClass->elements.push_back(new Field(PRIVATE, _presenter)); - - Variable* listener = new Variable(listenerType, "listener"); - - Method* startListeningMethod = new Method; - startListeningMethod->modifiers = PUBLIC; - startListeningMethod->returnType = VOID_TYPE; - startListeningMethod->name = "startListening"; - startListeningMethod->statements = new StatementBlock; - startListeningMethod->parameters.push_back(listener); - proxyClass->elements.push_back(startListeningMethod); - - startListeningMethod->statements->Add(new MethodCall(THIS_VALUE, "stopListening")); - startListeningMethod->statements->Add(new Assignment(_presenter, - new NewExpression(presenterType, 2, proxyClass->broker, listener))); - startListeningMethod->statements->Add(new MethodCall(_presenter, - "startListening", 1, proxyClass->endpoint)); - - Method* stopListeningMethod = new Method; - stopListeningMethod->modifiers = PUBLIC; - stopListeningMethod->returnType = VOID_TYPE; - stopListeningMethod->name = "stopListening"; - stopListeningMethod->statements = new StatementBlock; - proxyClass->elements.push_back(stopListeningMethod); - - IfStatement* ifst = new IfStatement; - ifst->expression = new Comparison(_presenter, "!=", NULL_VALUE); - stopListeningMethod->statements->Add(ifst); - - ifst->statements->Add(new MethodCall(_presenter, "stopListening")); - ifst->statements->Add(new Assignment(_presenter, NULL_VALUE)); -} - -Class* -generate_rpc_interface_class(const interface_type* iface) -{ - // the proxy class - InterfaceType* interfaceType = static_cast<InterfaceType*>( - NAMES.Find(iface->package, iface->name.data)); - RpcProxyClass* proxy = new RpcProxyClass(iface, interfaceType); - - // the listener class - ListenerClass* listener = new ListenerClass(iface); - - // the presenter class - EventListenerClass* presenter = new EventListenerClass(iface, listener->type); - - // the service base class - EndpointBaseClass* base = new EndpointBaseClass(iface); - proxy->elements.push_back(base); - - // the result dispatcher - ResultDispatcherClass* results = new ResultDispatcherClass(); - - // all the declared methods of the proxy - int index = 0; - interface_item_type* item = iface->interface_items; - while (item != NULL) { - if (item->item_type == METHOD_TYPE) { - if (NAMES.Search(((method_type*)item)->type.type.data) == EVENT_FAKE_TYPE) { - generate_event_method((method_type*)item, proxy, base, listener, presenter, index); - } else { - generate_regular_method((method_type*)item, proxy, base, results, index); - } - } - item = item->next; - index++; - } - presenter->DoneWithMethods(); - base->DoneWithMethods(); - - // only add this if there are methods with results / out parameters - if (results->needed) { - proxy->elements.push_back(results); - } - if (listener->needed) { - proxy->elements.push_back(listener); - proxy->elements.push_back(presenter); - generate_listener_methods(proxy, presenter->type, listener->type); - } - - return proxy; -} |