1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ppapi/proxy/ppp_input_event_proxy.h"
7 #include "ppapi/c/ppp_input_event.h"
8 #include "ppapi/proxy/host_dispatcher.h"
9 #include "ppapi/proxy/plugin_dispatcher.h"
10 #include "ppapi/proxy/ppapi_messages.h"
11 #include "ppapi/shared_impl/ppb_input_event_shared.h"
12 #include "ppapi/thunk/enter.h"
13 #include "ppapi/thunk/ppb_input_event_api.h"
15 using ppapi::thunk::EnterResourceNoLock
;
16 using ppapi::thunk::PPB_InputEvent_API
;
24 PP_Bool
HandleInputEvent(PP_Instance instance
, PP_Resource input_event
) {
25 EnterResourceNoLock
<PPB_InputEvent_API
> enter(input_event
, false);
30 const InputEventData
& data
= enter
.object()->GetInputEventData();
31 HostDispatcher
* dispatcher
= HostDispatcher::GetForInstance(instance
);
37 // Need to send different messages depending on whether filtering is needed.
38 PP_Bool result
= PP_FALSE
;
39 if (data
.is_filtered
) {
40 dispatcher
->Send(new PpapiMsg_PPPInputEvent_HandleFilteredInputEvent(
41 API_ID_PPP_INPUT_EVENT
, instance
, data
, &result
));
43 dispatcher
->Send(new PpapiMsg_PPPInputEvent_HandleInputEvent(
44 API_ID_PPP_INPUT_EVENT
, instance
, data
));
49 static const PPP_InputEvent input_event_interface
= {
53 // The NaCl plugin doesn't need the host side interface - stub it out.
54 static const PPP_InputEvent input_event_interface
= {};
55 #endif // !defined(OS_NACL)
59 PPP_InputEvent_Proxy::PPP_InputEvent_Proxy(Dispatcher
* dispatcher
)
60 : InterfaceProxy(dispatcher
),
61 ppp_input_event_impl_(NULL
) {
62 if (dispatcher
->IsPlugin()) {
63 ppp_input_event_impl_
= static_cast<const PPP_InputEvent
*>(
64 dispatcher
->local_get_interface()(PPP_INPUT_EVENT_INTERFACE
));
68 PPP_InputEvent_Proxy::~PPP_InputEvent_Proxy() {
72 const PPP_InputEvent
* PPP_InputEvent_Proxy::GetProxyInterface() {
73 return &input_event_interface
;
76 bool PPP_InputEvent_Proxy::OnMessageReceived(const IPC::Message
& msg
) {
77 if (!dispatcher()->IsPlugin())
81 IPC_BEGIN_MESSAGE_MAP(PPP_InputEvent_Proxy
, msg
)
82 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInputEvent_HandleInputEvent
,
83 OnMsgHandleInputEvent
)
84 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInputEvent_HandleFilteredInputEvent
,
85 OnMsgHandleFilteredInputEvent
)
86 IPC_MESSAGE_UNHANDLED(handled
= false)
91 void PPP_InputEvent_Proxy::OnMsgHandleInputEvent(PP_Instance instance
,
92 const InputEventData
& data
) {
93 scoped_refptr
<PPB_InputEvent_Shared
> resource(new PPB_InputEvent_Shared(
94 OBJECT_IS_PROXY
, instance
, data
));
95 CallWhileUnlocked(ppp_input_event_impl_
->HandleInputEvent
,
97 resource
->pp_resource());
100 void PPP_InputEvent_Proxy::OnMsgHandleFilteredInputEvent(
101 PP_Instance instance
,
102 const InputEventData
& data
,
104 scoped_refptr
<PPB_InputEvent_Shared
> resource(new PPB_InputEvent_Shared(
105 OBJECT_IS_PROXY
, instance
, data
));
106 *result
= CallWhileUnlocked(ppp_input_event_impl_
->HandleInputEvent
,
108 resource
->pp_resource());