// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ppapi/proxy/ppb_talk_private_proxy.h" #include "ipc/ipc_message_macros.h" #include "ppapi/c/pp_errors.h" #include "ppapi/proxy/plugin_dispatcher.h" #include "ppapi/proxy/plugin_globals.h" #include "ppapi/proxy/plugin_proxy_delegate.h" #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/shared_impl/resource.h" #include "ppapi/shared_impl/tracked_callback.h" #include "ppapi/thunk/enter.h" #include "ppapi/thunk/ppb_talk_private_api.h" namespace ppapi { namespace proxy { namespace { class Talk : public Resource, public thunk::PPB_Talk_Private_API { public: Talk(PP_Instance instance) : Resource(OBJECT_IS_PROXY, instance) { } // Resource overrides. thunk::PPB_Talk_Private_API* AsPPB_Talk_Private_API() { return this; } // PPB_Talk_API implementation. int32_t GetPermission(const PP_CompletionCallback& callback) { if (TrackedCallback::IsPending(callback_)) return PP_ERROR_INPROGRESS; PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance( pp_instance()); if (!dispatcher) return PP_ERROR_FAILED; callback_ = new TrackedCallback(this, callback); if (PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser( new PpapiHostMsg_PPBTalk_GetPermission( API_ID_PPB_TALK, dispatcher->plugin_dispatcher_id(), pp_resource()))) return PP_OK_COMPLETIONPENDING; return PP_ERROR_FAILED; } void GotCompletion(int32_t result) { TrackedCallback::ClearAndRun(&callback_, result); } private: scoped_refptr callback_; DISALLOW_COPY_AND_ASSIGN(Talk); }; } // namespace PPB_Talk_Private_Proxy::PPB_Talk_Private_Proxy(Dispatcher* dispatcher) : InterfaceProxy(dispatcher) { } // static PP_Resource PPB_Talk_Private_Proxy::CreateProxyResource(PP_Instance instance) { return (new Talk(instance))->GetReference(); } bool PPB_Talk_Private_Proxy::OnMessageReceived(const IPC::Message& msg) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(PPB_Talk_Private_Proxy, msg) IPC_MESSAGE_HANDLER(PpapiMsg_PPBTalk_GetPermissionACK, OnMsgGetPermissionACK) IPC_MESSAGE_UNHANDLED(handled = false); IPC_END_MESSAGE_MAP(); return handled; } void PPB_Talk_Private_Proxy::OnMsgGetPermissionACK(uint32 /* dispatcher_id */, PP_Resource resource, int32_t result) { thunk::EnterResourceNoLock enter( resource, false); if (enter.succeeded()) static_cast(enter.object())->GotCompletion(result); } } // namespace proxy } // namespace ppapi