15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file provides infrastructure for dispatching host resource call
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// messages. Normal IPC message handlers can't take extra parameters or
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return values. We want to take a HostMessageContext as a parameter and
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// also return the int32_t return value to the caller.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_HOST_DISPATCH_HOST_MESSAGE_H_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_HOST_DISPATCH_HOST_MESSAGE_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/profiler/scoped_profile.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace host {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HostMessageContext;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ObjT, class Method>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DispatchResourceCall(ObjT* obj, Method method,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HostMessageContext* context,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    Tuple0& arg) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (obj->*method)(context);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ObjT, class Method, class A>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DispatchResourceCall(ObjT* obj, Method method,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HostMessageContext* context,
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    Tuple1<A>& arg) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (obj->*method)(context, arg.a);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class ObjT, class Method, class A, class B>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DispatchResourceCall(ObjT* obj, Method method,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HostMessageContext* context,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    Tuple2<A, B>& arg) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (obj->*method)(context, arg.a, arg.b);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class ObjT, class Method, class A, class B, class C>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DispatchResourceCall(ObjT* obj, Method method,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HostMessageContext* context,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    Tuple3<A, B, C>& arg) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (obj->*method)(context, arg.a, arg.b, arg.c);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class ObjT, class Method, class A, class B, class C, class D>
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DispatchResourceCall(ObjT* obj, Method method,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HostMessageContext* context,
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    Tuple4<A, B, C, D>& arg) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (obj->*method)(context, arg.a, arg.b, arg.c, arg.d);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class ObjT, class Method, class A, class B, class C, class D, class E>
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32_t DispatchResourceCall(ObjT* obj, Method method,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HostMessageContext* context,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    Tuple5<A, B, C, D, E>& arg) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (obj->*method)(context, arg.a, arg.b, arg.c, arg.d, arg.e);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this only works for message with 1 or more parameters. For
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0-parameter messages you need to use the _0 version below (since there are
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no params in the message).
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_DISPATCH_HOST_RESOURCE_CALL(msg_class, member_func) \
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case msg_class::ID: { \
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      TRACK_RUN_IN_THIS_SCOPED_REGION(member_func); \
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      msg_class::Schema::Param p; \
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (msg_class::Read(&ipc_message__, &p)) { \
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return ppapi::host::DispatchResourceCall( \
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this, \
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &_IpcMessageHandlerClass::member_func, \
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            context, p); \
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } \
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_ERROR_FAILED; \
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(msg_class, member_func) \
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case msg_class::ID: { \
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TRACK_RUN_IN_THIS_SCOPED_REGION(member_func); \
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return member_func(context); \
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace host
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_HOST_DISPATCH_HOST_MESSAGE_H_
90