1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef PPAPI_PROXY_MESSAGE_HANDLER_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define PPAPI_PROXY_MESSAGE_HANDLER_H_ 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/ref_counted.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/c/dev/ppb_messaging_deprecated.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ppapi/c/ppp_message_handler.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace IPC { 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class Message; 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace ppapi { 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ScopedPPVar; 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace proxy { 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MessageLoopResource; 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// MessageHandler wraps a PPP_MessageHandler to encapsulate calling methods 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// on the right thread and calling the Destroy function when this 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// MessageHandler is destroyed. 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PPAPI_PROXY_EXPORT MessageHandler { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Create a MessageHandler. If any parameters are invalid, it will return a 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // null scoped_ptr and set |*error| appropriately. 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |handler_if| is the struct of function pointers we will invoke. All of 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the function pointers within must be valid, or we fail 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // with PP_ERROR_BADARGUMENT. 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |user_data| is a pointer provided by the plugin that we pass back when we 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // call functions in |handler_if|. 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |message_loop| is the message loop where we will invoke functions in 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |handler_if|. Must not be the main thread message loop, 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // to try to force the plugin to not over-subscribe the main 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // thread. If it's the main thread loop, |error| will be set 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // to PP_ERROR_WRONGTHREAD. 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |error| is an out-param that will be set on failure. 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static scoped_ptr<MessageHandler> Create( 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Instance instance, 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PPP_MessageHandler_0_2* handler_if, 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void* user_data, 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Resource message_loop, 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int32_t* error); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Provide temporary backwards compatibility. TODO(dmichael): Remove all 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // references to PPB_Messaging_1_1 and PPP_MessageHandler_0_1. 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // crbug.com/414398 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static scoped_ptr<MessageHandler> CreateDeprecated( 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Instance instance, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PPP_MessageHandler_0_1_Deprecated* handler_if, 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* user_data, 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Resource message_loop, 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int32_t* error); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ~MessageHandler(); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool LoopIsValid() const; 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void HandleMessage(ScopedPPVar var); 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void HandleBlockingMessage(ScopedPPVar var, 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<IPC::Message> reply_msg); 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MessageHandler(PP_Instance instance, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PPP_MessageHandler_0_2* handler_if, 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* user_data, 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MessageLoopResource> message_loop); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MessageHandler(PP_Instance instance, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PPP_MessageHandler_0_1_Deprecated* handler_if, 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void* user_data, 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<MessageLoopResource> message_loop); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Instance instance_; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PPP_MessageHandler_0_2* handler_if_; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PPP_MessageHandler_0_1_Deprecated* handler_if_0_1_; 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* user_data_; 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MessageLoopResource> message_loop_; 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MessageHandler); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace proxy 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace ppapi 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // PPAPI_PROXY_MESSAGE_HANDLER_H_ 92