1 // Copyright 2014 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 #ifndef PPAPI_PROXY_MESSAGE_HANDLER_H_ 6 #define PPAPI_PROXY_MESSAGE_HANDLER_H_ 7 8 #include "base/memory/ref_counted.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "ppapi/c/dev/ppb_messaging_deprecated.h" 11 #include "ppapi/c/pp_resource.h" 12 #include "ppapi/c/ppp_message_handler.h" 13 #include "ppapi/proxy/ppapi_proxy_export.h" 14 15 namespace IPC { 16 class Message; 17 } 18 19 namespace ppapi { 20 21 class ScopedPPVar; 22 23 namespace proxy { 24 25 class MessageLoopResource; 26 27 // MessageHandler wraps a PPP_MessageHandler to encapsulate calling methods 28 // on the right thread and calling the Destroy function when this 29 // MessageHandler is destroyed. 30 class PPAPI_PROXY_EXPORT MessageHandler { 31 public: 32 // Create a MessageHandler. If any parameters are invalid, it will return a 33 // null scoped_ptr and set |*error| appropriately. 34 // |handler_if| is the struct of function pointers we will invoke. All of 35 // the function pointers within must be valid, or we fail 36 // with PP_ERROR_BADARGUMENT. 37 // |user_data| is a pointer provided by the plugin that we pass back when we 38 // call functions in |handler_if|. 39 // |message_loop| is the message loop where we will invoke functions in 40 // |handler_if|. Must not be the main thread message loop, 41 // to try to force the plugin to not over-subscribe the main 42 // thread. If it's the main thread loop, |error| will be set 43 // to PP_ERROR_WRONGTHREAD. 44 // |error| is an out-param that will be set on failure. 45 static scoped_ptr<MessageHandler> Create( 46 PP_Instance instance, 47 const PPP_MessageHandler_0_2* handler_if, 48 void* user_data, 49 PP_Resource message_loop, 50 int32_t* error); 51 // Provide temporary backwards compatibility. TODO(dmichael): Remove all 52 // references to PPB_Messaging_1_1 and PPP_MessageHandler_0_1. 53 // crbug.com/414398 54 static scoped_ptr<MessageHandler> CreateDeprecated( 55 PP_Instance instance, 56 const PPP_MessageHandler_0_1_Deprecated* handler_if, 57 void* user_data, 58 PP_Resource message_loop, 59 int32_t* error); 60 ~MessageHandler(); 61 62 bool LoopIsValid() const; 63 64 void HandleMessage(ScopedPPVar var); 65 void HandleBlockingMessage(ScopedPPVar var, 66 scoped_ptr<IPC::Message> reply_msg); 67 68 private: 69 MessageHandler(PP_Instance instance, 70 const PPP_MessageHandler_0_2* handler_if, 71 void* user_data, 72 scoped_refptr<MessageLoopResource> message_loop); 73 MessageHandler(PP_Instance instance, 74 const PPP_MessageHandler_0_1_Deprecated* handler_if, 75 void* user_data, 76 scoped_refptr<MessageLoopResource> message_loop); 77 78 79 PP_Instance instance_; 80 const PPP_MessageHandler_0_2* handler_if_; 81 const PPP_MessageHandler_0_1_Deprecated* handler_if_0_1_; 82 void* user_data_; 83 scoped_refptr<MessageLoopResource> message_loop_; 84 85 DISALLOW_COPY_AND_ASSIGN(MessageHandler); 86 }; 87 88 } // namespace proxy 89 } // namespace ppapi 90 91 #endif // PPAPI_PROXY_MESSAGE_HANDLER_H_ 92