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