• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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