OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "ppapi/proxy/ppb_talk_private_proxy.h" | |
6 | |
7 #include "ipc/ipc_message_macros.h" | |
8 #include "ppapi/c/pp_errors.h" | |
9 #include "ppapi/proxy/plugin_dispatcher.h" | |
10 #include "ppapi/proxy/plugin_globals.h" | |
11 #include "ppapi/proxy/ppapi_messages.h" | |
12 #include "ppapi/shared_impl/resource.h" | |
13 #include "ppapi/shared_impl/tracked_callback.h" | |
14 #include "ppapi/thunk/enter.h" | |
15 #include "ppapi/thunk/ppb_talk_private_api.h" | |
16 | |
17 namespace ppapi { | |
18 namespace proxy { | |
19 | |
20 namespace { | |
21 | |
22 class Talk : public Resource, public thunk::PPB_Talk_Private_API { | |
23 public: | |
24 Talk(PP_Instance instance) : Resource(OBJECT_IS_PROXY, instance) { | |
25 } | |
26 | |
27 // Resource overrides. | |
28 thunk::PPB_Talk_Private_API* AsPPB_Talk_Private_API() { return this; } | |
29 | |
30 // PPB_Talk_API implementation. | |
31 int32_t GetPermission(scoped_refptr<TrackedCallback> callback) { | |
32 if (TrackedCallback::IsPending(callback_)) | |
33 return PP_ERROR_INPROGRESS; | |
34 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance( | |
35 pp_instance()); | |
36 if (!dispatcher) | |
37 return PP_ERROR_FAILED; | |
38 | |
39 callback_ = callback; | |
40 | |
41 if (PluginGlobals::Get()->GetBrowserSender()->Send( | |
42 new PpapiHostMsg_PPBTalk_GetPermission( | |
43 API_ID_PPB_TALK, | |
44 dispatcher->plugin_dispatcher_id(), | |
45 pp_resource()))) | |
46 return PP_OK_COMPLETIONPENDING; | |
47 return PP_ERROR_FAILED; | |
48 } | |
49 | |
50 void GotCompletion(int32_t result) { | |
51 callback_->Run(result); | |
52 } | |
53 | |
54 private: | |
55 scoped_refptr<TrackedCallback> callback_; | |
56 | |
57 DISALLOW_COPY_AND_ASSIGN(Talk); | |
58 }; | |
59 | |
60 } // namespace | |
61 | |
62 PPB_Talk_Private_Proxy::PPB_Talk_Private_Proxy(Dispatcher* dispatcher) | |
63 : InterfaceProxy(dispatcher) { | |
64 } | |
65 | |
66 // static | |
67 PP_Resource PPB_Talk_Private_Proxy::CreateProxyResource(PP_Instance instance) { | |
68 return (new Talk(instance))->GetReference(); | |
69 } | |
70 | |
71 bool PPB_Talk_Private_Proxy::OnMessageReceived(const IPC::Message& msg) { | |
72 bool handled = true; | |
73 IPC_BEGIN_MESSAGE_MAP(PPB_Talk_Private_Proxy, msg) | |
74 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTalk_GetPermissionACK, | |
75 OnMsgGetPermissionACK) | |
76 IPC_MESSAGE_UNHANDLED(handled = false); | |
77 IPC_END_MESSAGE_MAP(); | |
78 return handled; | |
79 } | |
80 | |
81 void PPB_Talk_Private_Proxy::OnMsgGetPermissionACK(uint32 /* dispatcher_id */, | |
82 PP_Resource resource, | |
83 int32_t result) { | |
84 thunk::EnterResourceNoLock<thunk::PPB_Talk_Private_API> enter( | |
85 resource, false); | |
86 if (enter.succeeded()) | |
87 static_cast<Talk*>(enter.object())->GotCompletion(result); | |
88 } | |
89 | |
90 } // namespace proxy | |
91 } // namespace ppapi | |
OLD | NEW |