[Cocoa] Navigation action information for policy decisions is missing the original...
[WebKit-https.git] / Source / WebKit2 / Platform / CoreIPC / HandleMessage.h
1 #ifndef HandleMessage_h
2 #define HandleMessage_h
3
4 #include "Arguments.h"
5 #include "MessageDecoder.h"
6 #include "MessageEncoder.h"
7
8 namespace CoreIPC {
9
10 // Dispatch functions with no reply arguments.
11 template<typename C, typename MF>
12 void callMemberFunction(std::tuple<>&&, C* object, MF function)
13 {
14     (object->*function)();
15 }
16
17 template<typename C, typename MF, typename P1>
18 void callMemberFunction(std::tuple<P1>&& args, C* object, MF function)
19 {
20     (object->*function)(std::get<0>(args));
21 }
22
23 template<typename C, typename MF, typename P1, typename P2>
24 void callMemberFunction(std::tuple<P1, P2>&& args, C* object, MF function)
25 {
26     (object->*function)(std::get<0>(args), std::get<1>(args));
27 }
28
29 template<typename C, typename MF, typename P1, typename P2, typename P3>
30 void callMemberFunction(std::tuple<P1, P2, P3>&& args, C* object, MF function)
31 {
32     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args));
33 }
34
35 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
36 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, C* object, MF function)
37 {
38     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args));
39 }
40
41 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
42 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, C* object, MF function)
43 {
44     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args));
45 }
46     
47 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
48 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, C* object, MF function)
49 {
50     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args));
51 }
52
53 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
54 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, C* object, MF function)
55 {
56     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args));
57 }
58
59 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
60 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, C* object, MF function)
61 {
62     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args));
63 }
64
65 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10>
66 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>&& args, C* object, MF function)
67 {
68     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), std::get<8>(args), std::get<9>(args));
69 }
70
71 // Dispatch functions with reply arguments.
72
73 template<typename C, typename MF>
74 void callMemberFunction(std::tuple<>&&, std::tuple<>&, C* object, MF function)
75 {
76     (object->*function)();
77 }
78
79 template<typename C, typename MF, typename R1>
80 void callMemberFunction(std::tuple<>&&, std::tuple<R1>& replyArgs, C* object, MF function)
81 {
82     (object->*function)(std::get<0>(replyArgs));
83 }
84
85 template<typename C, typename MF, typename R1, typename R2>
86 void callMemberFunction(std::tuple<>&&, std::tuple<R1, R2>& replyArgs, C* object, MF function)
87 {
88     (object->*function)(std::get<0>(replyArgs), std::get<1>(replyArgs));
89 }
90
91 template<typename C, typename MF, typename P1>
92 void callMemberFunction(std::tuple<P1>&& args, std::tuple<>&, C* object, MF function)
93 {
94     (object->*function)(std::get<0>(args));
95 }
96
97 template<typename C, typename MF, typename P1, typename R1>
98 void callMemberFunction(std::tuple<P1>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
99 {
100     (object->*function)(std::get<0>(args), std::get<0>(replyArgs));
101 }
102
103 template<typename C, typename MF, typename P1, typename R1, typename R2>
104 void callMemberFunction(std::tuple<P1>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
105 {
106     (object->*function)(std::get<0>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
107 }
108
109 template<typename C, typename MF, typename P1, typename R1, typename R2, typename R3>
110 void callMemberFunction(std::tuple<P1>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
111 {
112     (object->*function)(std::get<0>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
113 }
114
115 template<typename C, typename MF, typename P1, typename P2>
116 void callMemberFunction(std::tuple<P1, P2>&& args, std::tuple<>&, C* object, MF function)
117 {
118     (object->*function)(std::get<0>(args), std::get<1>(args));
119 }
120
121 template<typename C, typename MF, typename P1, typename R1, typename R2, typename R3, typename R4>
122 void callMemberFunction(std::tuple<P1>&& args, Arguments4<R1, R2, R3, R4>& replyArgs, C* object, MF function)
123 {
124     (object->*function)(std::get<0>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs), std::get<3>(replyArgs));
125 }
126
127 template<typename C, typename MF, typename P1, typename P2, typename R1>
128 void callMemberFunction(std::tuple<P1, P2>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
129 {
130     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<0>(replyArgs));
131 }
132
133 template<typename C, typename MF, typename P1, typename P2, typename R1, typename R2>
134 void callMemberFunction(std::tuple<P1, P2>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
135 {
136     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
137 }
138
139 template<typename C, typename MF, typename P1, typename P2, typename P3, typename R1>
140 void callMemberFunction(std::tuple<P1, P2, P3>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
141 {
142     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<0>(replyArgs));
143 }
144
145 template<typename C, typename MF, typename P1, typename P2, typename P3, typename R1, typename R2>
146 void callMemberFunction(std::tuple<P1, P2, P3>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
147 {
148     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
149 }
150
151 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1>
152 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
153 {
154     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<0>(replyArgs));
155 }
156
157 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1>
158 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
159 {
160     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs));
161 }
162
163 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename R1>
164 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
165 {
166     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<0>(replyArgs));
167 }
168
169 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R1>
170 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
171 {
172     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), std::get<0>(replyArgs));
173 }
174
175 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2>
176 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
177 {
178     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
179 }
180
181 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2>
182 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
183 {
184     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
185 }
186
187 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename R1, typename R2, typename R3>
188 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
189 {
190     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
191 }
192
193 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2, typename R3>
194 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
195 {
196     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
197 }
198
199 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2>
200 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1, R2>& replyArgs, C* object, MF function)
201 {
202     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs), std::get<1>(replyArgs));
203 }
204
205 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2, typename R3>
206 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
207 {
208     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
209 }
210
211 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2, typename R3, typename R4>
212 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, std::tuple<R1, R2, R3, R4>& replyArgs, C* object, MF function)
213 {
214     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs), std::get<3>(replyArgs));
215 }
216
217 // Dispatch functions with delayed reply arguments.
218 template<typename C, typename MF, typename R>
219 void callMemberFunction(std::tuple<>&&, PassRefPtr<R> delayedReply, C* object, MF function)
220 {
221     (object->*function)(delayedReply);
222 }
223
224 template<typename C, typename MF, typename P1, typename R>
225 void callMemberFunction(std::tuple<P1>&& args, PassRefPtr<R> delayedReply, C* object, MF function)
226 {
227     (object->*function)(std::get<0>(args), delayedReply);
228 }
229
230 template<typename C, typename MF, typename P1, typename P2, typename R>
231 void callMemberFunction(std::tuple<P1, P2>&& args, PassRefPtr<R> delayedReply, C* object, MF function)
232 {
233     (object->*function)(std::get<0>(args), std::get<1>(args), delayedReply);
234 }
235
236 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R>
237 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, PassRefPtr<R> delayedReply, C* object, MF function)
238 {
239     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), delayedReply);
240 }
241
242 // Dispatch functions with connection parameter.
243 template<typename C, typename MF>
244 void callMemberFunction(Connection* connection, std::tuple<>&&, C* object, MF function)
245 {
246     (object->*function)(connection);
247 }
248
249 template<typename C, typename MF, typename P1>
250 void callMemberFunction(Connection* connection, std::tuple<P1>&& args, C* object, MF function)
251 {
252     (object->*function)(connection, std::get<0>(args));
253 }
254
255 template<typename C, typename MF, typename P1, typename P2>
256 void callMemberFunction(Connection* connection, std::tuple<P1, P2>&& args, C* object, MF function)
257 {
258     (object->*function)(connection, std::get<0>(args), std::get<1>(args));
259 }
260
261 template<typename C, typename MF, typename P1, typename P2, typename P3>
262 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3>&& args, C* object, MF function)
263 {
264     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args));
265 }
266
267 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
268 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3, P4>&& args, C* object, MF function)
269 {
270     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args));
271 }
272
273 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
274 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3, P4, P5>&& args, C* object, MF function)
275 {
276     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args));
277 }
278
279 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
280 void callMemberFunction(Connection* connection, std::tuple<P1, P2, P3, P4, P5, P6>&& args, C* object, MF function)
281 {
282     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args));
283 }
284
285 template<typename C, typename MF, typename P1, typename P2, typename R1>
286 void callMemberFunction(Connection* connection, std::tuple<P1, P2>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
287 {
288     (object->*function)(connection, std::get<0>(args), std::get<1>(args), std::get<0>(replyArgs));
289 }
290
291 template<typename C, typename MF, typename P1, typename R1>
292 void callMemberFunction(Connection* connection, std::tuple<P1>&& args, std::tuple<R1>& replyArgs, C* object, MF function)
293 {
294     (object->*function)(connection, std::get<0>(args), std::get<0>(replyArgs));
295 }
296
297 // Variadic dispatch functions.
298
299 template<typename C, typename MF>
300 void callMemberFunction(std::tuple<>&&, MessageDecoder& decoder, C* object, MF function)
301 {
302     (object->*function)(decoder);
303 }
304
305 template<typename C, typename MF, typename P1>
306 void callMemberFunction(std::tuple<P1>&& args, MessageDecoder& decoder, C* object, MF function)
307 {
308     (object->*function)(std::get<0>(args), decoder);
309 }
310
311 template<typename C, typename MF, typename P1, typename P2>
312 void callMemberFunction(std::tuple<P1, P2>&& args, MessageDecoder& decoder, C* object, MF function)
313 {
314     (object->*function)(std::get<0>(args), std::get<1>(args), decoder);
315 }
316
317 template<typename C, typename MF, typename P1, typename P2, typename P3>
318 void callMemberFunction(std::tuple<P1, P2, P3>&& args, MessageDecoder& decoder, C* object, MF function)
319 {
320     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), decoder);
321 }
322
323 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4>
324 void callMemberFunction(std::tuple<P1, P2, P3, P4>&& args, MessageDecoder& decoder, C* object, MF function)
325 {
326     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), decoder);
327 }
328
329 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5>
330 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, MessageDecoder& decoder, C* object, MF function)
331 {
332     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), decoder);
333 }
334     
335 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
336 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, MessageDecoder& decoder, C* object, MF function)
337 {
338     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), decoder);
339 }
340
341 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
342 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, MessageDecoder& decoder, C* object, MF function)
343 {
344     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), decoder);
345 }
346
347 // Variadic dispatch functions with non-variadic reply arguments.
348
349 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename R1, typename R2, typename R3>
350 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
351 {
352     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
353 }
354
355 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2>
356 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, MessageDecoder& decoder, std::tuple<R1, R2>& replyArgs, C* object, MF function)
357 {
358     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs));
359 }
360
361 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename R1, typename R2, typename R3>
362 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
363 {
364     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
365 }
366
367 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R1, typename R2, typename R3>
368 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
369 {
370     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), std::get<7>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
371 }
372
373 // Main dispatch functions
374 template<typename T, typename C, typename MF>
375 void handleMessage(MessageDecoder& decoder, C* object, MF function)
376 {
377     typename T::DecodeType arguments;
378     if (!decoder.decode(arguments))
379         return;
380     callMemberFunction(std::move(arguments), object, function);
381 }
382
383 template<typename T, typename C, typename MF>
384 void handleMessage(MessageDecoder& decoder, MessageEncoder& replyEncoder, C* object, MF function)
385 {
386     typename T::DecodeType arguments;
387     if (!decoder.decode(arguments))
388         return;
389
390     typename T::Reply::ValueType replyArguments;
391     callMemberFunction(std::move(arguments), replyArguments, object, function);
392     replyEncoder << replyArguments;
393 }
394
395 template<typename T, typename C, typename MF>
396 void handleMessage(Connection* connection, MessageDecoder& decoder, MessageEncoder& replyEncoder, C* object, MF function)
397 {
398     typename T::DecodeType arguments;
399     if (!decoder.decode(arguments))
400         return;
401
402     typename T::Reply::ValueType replyArguments;
403     callMemberFunction(connection, std::move(arguments), replyArguments, object, function);
404     replyEncoder << replyArguments;
405 }
406
407 template<typename T, typename C, typename MF>
408 void handleMessage(Connection* connection, MessageDecoder& decoder, C* object, MF function)
409 {
410     typename T::DecodeType arguments;
411     if (!decoder.decode(arguments))
412         return;
413     callMemberFunction(connection, std::move(arguments), object, function);
414 }
415
416 template<typename T, typename C, typename MF>
417 void handleMessageVariadic(MessageDecoder& decoder, C* object, MF function)
418 {
419     typename T::DecodeType arguments;
420     if (!decoder.decode(arguments))
421         return;
422     callMemberFunction(std::move(arguments), decoder, object, function);
423 }
424
425 template<typename T, typename C, typename MF>
426 void handleMessageVariadic(MessageDecoder& decoder, MessageEncoder& replyEncoder, C* object, MF function)
427 {
428     typename T::DecodeType arguments;
429     if (!decoder.decode(arguments))
430         return;
431
432     typename T::Reply::ValueType replyArguments;
433     callMemberFunction(std::move(arguments), decoder, replyArguments, object, function);
434     replyEncoder << replyArguments;
435 }
436
437 template<typename T, typename C, typename MF>
438 void handleMessageDelayed(Connection* connection, MessageDecoder& decoder, std::unique_ptr<MessageEncoder>& replyEncoder, C* object, MF function)
439 {
440     typename T::DecodeType arguments;
441     if (!decoder.decode(arguments))
442         return;
443
444     RefPtr<typename T::DelayedReply> delayedReply = adoptRef(new typename T::DelayedReply(connection, std::move(replyEncoder)));
445     callMemberFunction(std::move(arguments), delayedReply.release(), object, function);
446 }
447
448 } // namespace CoreIPC
449
450 #endif // HandleMessage_h