Home | History | Annotate | Download | only in CoreIPC
      1 #ifndef HandleMessage_h
      2 #define HandleMessage_h
      3 
      4 #include "Arguments.h"
      5 
      6 namespace CoreIPC {
      7 
      8 // Dispatch functions with no reply arguments.
      9 
     10 template<typename C, typename MF>
     11 void callMemberFunction(const Arguments0&, C* object, MF function)
     12 {
     13     (object->*function)();
     14 }
     15 
     16 template<typename C, typename MF, typename P1>
     17 void callMemberFunction(const Arguments1<P1>& args, C* object, MF function)
     18 {
     19     (object->*function)(args.argument1);
     20 }
     21 
     22 template<typename C, typename MF, typename P1, typename P2>
     23 void callMemberFunction(const Arguments2<P1, P2>& args, C* object, MF function)
     24 {
     25     (object->*function)(args.argument1, args.argument2);
     26 }
     27 
     28 template<typename C, typename MF, typename P1, typename P2, typename P3>
     29 void callMemberFunction(const Arguments3<P1, P2, P3>& args, C* object, MF function)
     30 {
     31     (object->*function)(args.argument1, args.argument2, args.argument3);
     32 }
     33 
     34 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
     35 void callMemberFunction(const Arguments4<P1, P2, P3, P4>& args, C* object, MF function)
     36 {
     37     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4);
     38 }
     39 
     40 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
     41 void callMemberFunction(const Arguments5<P1, P2, P3, P4, P5>& args, C* object, MF function)
     42 {
     43     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5);
     44 }
     45 
     46 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
     47 void callMemberFunction(const Arguments6<P1, P2, P3, P4, P5, P6>& args, C* object, MF function)
     48 {
     49     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6);
     50 }
     51 
     52 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
     53 void callMemberFunction(const Arguments7<P1, P2, P3, P4, P5, P6, P7>& args, C* object, MF function)
     54 {
     55     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, args.argument7);
     56 }
     57 
     58 // Dispatch functions with reply arguments.
     59 
     60 template<typename C, typename MF>
     61 void callMemberFunction(const Arguments0&, Arguments0&, C* object, MF function)
     62 {
     63     (object->*function)();
     64 }
     65 
     66 template<typename C, typename MF, typename R1>
     67 void callMemberFunction(const Arguments0&, Arguments1<R1>& replyArgs, C* object, MF function)
     68 {
     69     (object->*function)(replyArgs.argument1);
     70 }
     71 
     72 template<typename C, typename MF, typename R1, typename R2>
     73 void callMemberFunction(const Arguments0&, Arguments2<R1, R2>& replyArgs, C* object, MF function)
     74 {
     75     (object->*function)(replyArgs.argument1, replyArgs.argument2);
     76 }
     77 
     78 template<typename C, typename MF, typename P1>
     79 void callMemberFunction(const Arguments1<P1>& args, Arguments0&, C* object, MF function)
     80 {
     81     (object->*function)(args.argument1);
     82 }
     83 
     84 template<typename C, typename MF, typename P1, typename R1>
     85 void callMemberFunction(const Arguments1<P1>& args, Arguments1<R1>& replyArgs, C* object, MF function)
     86 {
     87     (object->*function)(args.argument1, replyArgs.argument1);
     88 }
     89 
     90 template<typename C, typename MF, typename P1, typename R1, typename R2>
     91 void callMemberFunction(const Arguments1<P1>& args, Arguments2<R1, R2>& replyArgs, C* object, MF function)
     92 {
     93     (object->*function)(args.argument1, replyArgs.argument1, replyArgs.argument2);
     94 }
     95 
     96 template<typename C, typename MF, typename P1, typename R1, typename R2, typename R3>
     97 void callMemberFunction(const Arguments1<P1>& args, Arguments3<R1, R2, R3>& replyArgs, C* object, MF function)
     98 {
     99     (object->*function)(args.argument1, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3);
    100 }
    101 
    102 template<typename C, typename MF, typename P1, typename P2>
    103 void callMemberFunction(const Arguments2<P1, P2>& args, Arguments0&, C* object, MF function)
    104 {
    105     (object->*function)(args.argument1, args.argument2);
    106 }
    107 
    108 template<typename C, typename MF, typename P1, typename R1, typename R2, typename R3, typename R4>
    109 void callMemberFunction(const Arguments1<P1>& args, Arguments4<R1, R2, R3, R4>& replyArgs, C* object, MF function)
    110 {
    111     (object->*function)(args.argument1, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3, replyArgs.argument4);
    112 }
    113 
    114 template<typename C, typename MF, typename P1, typename P2, typename R1>
    115 void callMemberFunction(const Arguments2<P1, P2>& args, Arguments1<R1>& replyArgs, C* object, MF function)
    116 {
    117     (object->*function)(args.argument1, args.argument2, replyArgs.argument1);
    118 }
    119 
    120 template<typename C, typename MF, typename P1, typename P2, typename R1, typename R2>
    121 void callMemberFunction(const Arguments2<P1, P2>& args, Arguments2<R1, R2>& replyArgs, C* object, MF function)
    122 {
    123     (object->*function)(args.argument1, args.argument2, replyArgs.argument1, replyArgs.argument2);
    124 }
    125 
    126 template<typename C, typename MF, typename P1, typename P2, typename P3, typename R1>
    127 void callMemberFunction(const Arguments3<P1, P2, P3>& args, Arguments1<R1>& replyArgs, C* object, MF function)
    128 {
    129     (object->*function)(args.argument1, args.argument2, args.argument3, replyArgs.argument1);
    130 }
    131 
    132 template<typename C, typename MF, typename P1, typename P2, typename P3, typename R1, typename R2>
    133 void callMemberFunction(const Arguments3<P1, P2, P3>& args, Arguments2<R1, R2>& replyArgs, C* object, MF function)
    134 {
    135     (object->*function)(args.argument1, args.argument2, args.argument3, replyArgs.argument1, replyArgs.argument2);
    136 }
    137 
    138 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1>
    139 void callMemberFunction(const Arguments4<P1, P2, P3, P4>& args, Arguments1<R1>& replyArgs, C* object, MF function)
    140 {
    141     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, replyArgs.argument1);
    142 }
    143 
    144 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1>
    145 void callMemberFunction(const Arguments6<P1, P2, P3, P4, P5, P6>& args, Arguments1<R1>& replyArgs, C* object, MF function)
    146 {
    147     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, replyArgs.argument1);
    148 }
    149 
    150 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename R1>
    151 void callMemberFunction(const Arguments7<P1, P2, P3, P4, P5, P6, P7>& args, Arguments1<R1>& replyArgs, C* object, MF function)
    152 {
    153     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, args.argument7, replyArgs.argument1);
    154 }
    155 
    156 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2>
    157 void callMemberFunction(const Arguments4<P1, P2, P3, P4>& args, Arguments2<R1, R2>& replyArgs, C* object, MF function)
    158 {
    159     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, replyArgs.argument1, replyArgs.argument2);
    160 }
    161 
    162 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2>
    163 void callMemberFunction(const Arguments5<P1, P2, P3, P4, P5>& args, Arguments2<R1, R2>& replyArgs, C* object, MF function)
    164 {
    165     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, replyArgs.argument1, replyArgs.argument2);
    166 }
    167 
    168 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2>
    169 void callMemberFunction(const Arguments6<P1, P2, P3, P4, P5, P6>& args, Arguments2<R1, R2>& replyArgs, C* object, MF function)
    170 {
    171     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, replyArgs.argument1, replyArgs.argument2);
    172 }
    173 
    174 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2, typename R3>
    175 void callMemberFunction(const Arguments4<P1, P2, P3, P4>& args, Arguments3<R1, R2, R3>& replyArgs, C* object, MF function)
    176 {
    177     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3);
    178 }
    179 
    180 // Dispatch functions with delayed reply arguments.
    181 template<typename C, typename MF, typename P1, typename R>
    182 void callMemberFunction(const Arguments1<P1>& args, PassRefPtr<R> delayedReply, C* object, MF function)
    183 {
    184     (object->*function)(args.argument1, delayedReply);
    185 }
    186 
    187 // Variadic dispatch functions.
    188 
    189 template<typename C, typename MF>
    190 void callMemberFunction(const Arguments0&, ArgumentDecoder* argumentDecoder, C* object, MF function)
    191 {
    192     (object->*function)(argumentDecoder);
    193 }
    194 
    195 template<typename C, typename MF, typename P1>
    196 void callMemberFunction(const Arguments1<P1>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    197 {
    198     (object->*function)(args.argument1, argumentDecoder);
    199 }
    200 
    201 template<typename C, typename MF, typename P1, typename P2>
    202 void callMemberFunction(const Arguments2<P1, P2>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    203 {
    204     (object->*function)(args.argument1, args.argument2, argumentDecoder);
    205 }
    206 
    207 template<typename C, typename MF, typename P1, typename P2, typename P3>
    208 void callMemberFunction(const Arguments3<P1, P2, P3>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    209 {
    210     (object->*function)(args.argument1, args.argument2, args.argument3, argumentDecoder);
    211 }
    212 
    213 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
    214 void callMemberFunction(const Arguments4<P1, P2, P3, P4>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    215 {
    216     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, argumentDecoder);
    217 }
    218 
    219 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
    220 void callMemberFunction(const Arguments5<P1, P2, P3, P4, P5>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    221 {
    222     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, argumentDecoder);
    223 }
    224 
    225 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
    226 void callMemberFunction(const Arguments6<P1, P2, P3, P4, P5, P6>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    227 {
    228     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, argumentDecoder);
    229 }
    230 
    231 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
    232 void callMemberFunction(const Arguments7<P1, P2, P3, P4, P5, P6, P7>& args, ArgumentDecoder* argumentDecoder, C* object, MF function)
    233 {
    234     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, args.argument7, argumentDecoder);
    235 }
    236 
    237 // Variadic dispatch functions with non-variadic reply arguments.
    238 
    239 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2, typename R3>
    240 void callMemberFunction(const Arguments4<P1, P2, P3, P4>& args, ArgumentDecoder* argumentDecoder, Arguments3<R1, R2, R3>& replyArgs, C* object, MF function)
    241 {
    242     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, argumentDecoder, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3);
    243 }
    244 
    245 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2>
    246 void callMemberFunction(const Arguments6<P1, P2, P3, P4, P5, P6>& args, ArgumentDecoder* argumentDecoder, Arguments2<R1, R2>& replyArgs, C* object, MF function)
    247 {
    248     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, argumentDecoder, replyArgs.argument1, replyArgs.argument2);
    249 }
    250 
    251 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2, typename R3>
    252 void callMemberFunction(const Arguments6<P1, P2, P3, P4, P5, P6>& args, ArgumentDecoder* argumentDecoder, Arguments3<R1, R2, R3>& replyArgs, C* object, MF function)
    253 {
    254     (object->*function)(args.argument1, args.argument2, args.argument3, args.argument4, args.argument5, args.argument6, argumentDecoder, replyArgs.argument1, replyArgs.argument2, replyArgs.argument3);
    255 }
    256 
    257 // Main dispatch functions
    258 
    259 template<typename T, typename C, typename MF>
    260 void handleMessage(ArgumentDecoder* argumentDecoder, C* object, MF function)
    261 {
    262     typename T::DecodeType::ValueType arguments;
    263     if (!argumentDecoder->decode(arguments))
    264         return;
    265     callMemberFunction(arguments, object, function);
    266 }
    267 
    268 template<typename T, typename C, typename MF>
    269 void handleMessage(ArgumentDecoder* argumentDecoder, ArgumentEncoder* replyEncoder, C* object, MF function)
    270 {
    271     typename T::DecodeType::ValueType arguments;
    272     if (!argumentDecoder->decode(arguments))
    273         return;
    274 
    275     typename T::Reply::ValueType replyArguments;
    276     callMemberFunction(arguments, replyArguments, object, function);
    277     replyEncoder->encode(replyArguments);
    278 }
    279 
    280 template<typename T, typename C, typename MF>
    281 void handleMessageVariadic(ArgumentDecoder* argumentDecoder, C* object, MF function)
    282 {
    283     typename T::DecodeType::ValueType arguments;
    284     if (!argumentDecoder->decode(arguments))
    285         return;
    286     callMemberFunction(arguments, argumentDecoder, object, function);
    287 }
    288 
    289 
    290 template<typename T, typename C, typename MF>
    291 void handleMessageVariadic(ArgumentDecoder* argumentDecoder, ArgumentEncoder* replyEncoder, C* object, MF function)
    292 {
    293     typename T::DecodeType::ValueType arguments;
    294     if (!argumentDecoder->decode(arguments))
    295         return;
    296 
    297     typename T::Reply::ValueType replyArguments;
    298     callMemberFunction(arguments, argumentDecoder, replyArguments, object, function);
    299     replyEncoder->encode(replyArguments);
    300 }
    301 
    302 template<typename T, typename C, typename MF>
    303 void handleMessageDelayed(Connection* connection, ArgumentDecoder* argumentDecoder, ArgumentEncoder* replyEncoder, C* object, MF function)
    304 {
    305     typename T::DecodeType::ValueType arguments;
    306     if (!argumentDecoder->decode(arguments))
    307         return;
    308 
    309     RefPtr<typename T::DelayedReply> delayedReply = adoptRef(new typename T::DelayedReply(connection, replyEncoder));
    310     callMemberFunction(arguments, delayedReply.release(), object, function);
    311 }
    312 
    313 } // namespace CoreIPC
    314 
    315 #endif // HandleMessage_h
    316