From 89f30d32a2a82afa31327491976d1318895632b6 Mon Sep 17 00:00:00 2001 From: christian mueller Date: Tue, 11 Sep 2012 18:21:13 +0200 Subject: * [GAM-91] make CAmSerializer calls with references safer, no working Signed-off-by: christian mueller Signed-off-by: christian mueller --- include/shared/CAmSerializer.h | 303 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 293 insertions(+), 10 deletions(-) diff --git a/include/shared/CAmSerializer.h b/include/shared/CAmSerializer.h index 5c3b2eb..9bb2e4c 100644 --- a/include/shared/CAmSerializer.h +++ b/include/shared/CAmSerializer.h @@ -129,6 +129,58 @@ private: mFunction(function), // mArgument(argument), // mArgument1(argument1) + { }; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1); + return (true); + }; + }; + + /** + * delegate template for two arguments + */ + template class CAmTwoArgDelegateFirstRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ& argument, Targ1 argument1); + Targ mArgument; + Targ1 mArgument1; + + public: + CAmTwoArgDelegateFirstRef(TClass* instance, void (TClass::*function)(Targ& argument, Targ1 argument1), Targ& argument, Targ1 argument1) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1) + { }; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1); + return (true); + }; + }; + + + template class CAmTwoArgDelegateSecondRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ argument, Targ1& argument1); + Targ mArgument; + Targ1 mArgument1; + + public: + CAmTwoArgDelegateSecondRef(TClass* instance, void (TClass::*function)(Targ argument, Targ1& argument1), Targ argument, Targ1& argument1) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1) {}; bool call(int* pipe) @@ -139,6 +191,33 @@ private: }; }; + /** + * delegate template for two arguments + */ + template class CAmTwoArgDelegateAllRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ& argument, Targ1& argument1); + Targ mArgument; + Targ1 mArgument1; + + public: + CAmTwoArgDelegateAllRef(TClass* instance, void (TClass::*function)(Targ& argument, Targ1& argument1), Targ& argument, Targ1& argument1) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1) + { }; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1); + return (true); + }; + }; + /** * delegate template for three arguments @@ -172,6 +251,209 @@ private: ; }; + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateFirstRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ& argument, Targ1 argument1, Targ2 argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateFirstRef(TClass* instance, void (TClass::*function)(Targ& argument, Targ1 argument1, Targ2 argument2), Targ& argument, Targ1 argument1, Targ2 argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateSecondRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ argument, Targ1& argument1, Targ2 argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateSecondRef(TClass* instance, void (TClass::*function)(Targ argument, Targ1& argument1, Targ2 argument2), Targ argument, Targ1& argument1, Targ2 argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateThirdRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ argument, Targ1 argument1, Targ2& argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateThirdRef(TClass* instance, void (TClass::*function)(Targ argument, Targ1 argument1, Targ2& argument2), Targ argument, Targ1 argument1, Targ2& argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateFirstSecondRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ& argument, Targ1& argument1, Targ2 argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateFirstSecondRef(TClass* instance, void (TClass::*function)(Targ& argument, Targ1& argument1, Targ2 argument2), Targ& argument, Targ1& argument1, Targ2 argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateFirstThirdRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ& argument, Targ1 argument1, Targ2& argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateFirstThirdRef(TClass* instance, void (TClass::*function)(Targ& argument, Targ1 argument1, Targ2& argument2), Targ& argument, Targ1 argument1, Targ2& argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateSecondThirdRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ argument, Targ1& argument1, Targ2& argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateSecondThirdRef(TClass* instance, void (TClass::*function)(Targ argument, Targ1& argument1, Targ2& argument2), Targ argument, Targ1& argument1, Targ2& argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + + /** + * delegate template for three arguments + */ + template class CAmThreeArgDelegateAllRef: public CAmDelegate + { + private: + TClass* mInstance; + void (TClass::*mFunction)(Targ& argument, Targ1& argument1, Targ2& argument2); + Targ mArgument; + Targ1 mArgument1; + Targ2 mArgument2; + + public: + CAmThreeArgDelegateAllRef(TClass* instance, void (TClass::*function)(Targ& argument, Targ1& argument1, Targ2& argument2), Targ& argument, Targ1& argument1, Targ2& argument2) : + mInstance(instance), // + mFunction(function), // + mArgument(argument), // + mArgument1(argument1), // + mArgument2(argument2) + {}; + + bool call(int* pipe) + { + (void) pipe; + (*mInstance.*mFunction)(mArgument, mArgument1, mArgument2); + return (true); + }; + }; + /** * delegate template for four arguments */ @@ -589,6 +871,7 @@ private: throw std::runtime_error("could not write to pipe !"); } } + int mPipe[2]; //!< the pipe int mReturnPipe[2]; //!< pipe handling returns std::deque mListDelegatePoiters; //!< intermediate queue to store the pipe results @@ -704,7 +987,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ& argument, Targ1 argument1), Targ& argument, Targ1 argument1) { - CAmDelegagePtr p(new CAmTwoArgDelegate(instance, function, argument, argument1)); + CAmDelegagePtr p(new CAmTwoArgDelegateFirstRef(instance, function, argument, argument1)); send(p); } @@ -722,7 +1005,7 @@ public: void asyncCall(TClass1* instance, void (TClass1::*function)(Targ argument, Targ1& argument1), Targ argument, Targ1& argument1) { logInfo("took ref"); - CAmDelegagePtr p(new CAmTwoArgDelegate(instance, function, argument, argument1)); + CAmDelegagePtr p(new CAmTwoArgDelegateSecondRef(instance, function, argument, argument1)); send(p); } @@ -739,7 +1022,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ& argument, Targ1& argument1), Targ& argument, Targ1& argument1) { - CAmDelegagePtr p(new CAmTwoArgDelegate(instance, function, argument, argument1)); + CAmDelegagePtr p(new CAmTwoArgDelegateAllRef(instance, function, argument, argument1)); send(p); } @@ -759,7 +1042,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ& argument, Targ1 argument1, Targ2 argument2), Targ& argument, Targ1 argument1, Targ2 argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateFirstRef(instance, function, argument, argument1, argument2)); send(p); } @@ -770,7 +1053,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ argument, Targ1& argument1, Targ2 argument2), Targ argument, Targ1& argument1, Targ2 argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateSecondRef(instance, function, argument, argument1, argument2)); send(p); } @@ -780,7 +1063,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ argument, Targ1 argument1, Targ2& argument2), Targ argument, Targ1 argument1, Targ2& argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateThirdRef(instance, function, argument, argument1, argument2)); send(p); } @@ -790,7 +1073,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ argument, Targ1& argument1, Targ2& argument2), Targ argument, Targ1& argument1, Targ2& argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateSecondThirdRef(instance, function, argument, argument1, argument2)); send(p); } @@ -800,7 +1083,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ& argument, Targ1& argument1, Targ2& argument2), Targ& argument, Targ1& argument1, Targ2& argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateAllRef(instance, function, argument, argument1, argument2)); send(p); } @@ -810,7 +1093,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ& argument, Targ1& argument1, Targ2 argument2), Targ& argument, Targ1& argument1, Targ2 argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateFirstSecondRef(instance, function, argument, argument1, argument2)); send(p); } @@ -820,7 +1103,7 @@ public: template void asyncCall(TClass1* instance, void (TClass1::*function)(Targ& argument, Targ1 argument1, Targ2& argument2), Targ& argument, Targ1 argument1, Targ2& argument2) { - CAmDelegagePtr p(new CAmThreeArgDelegate(instance, function, argument, argument1, argument2)); + CAmDelegagePtr p(new CAmThreeArgDelegateFirstThirdRef(instance, function, argument, argument1, argument2)); send(p); } -- cgit v1.2.1