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