summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy/callback_tracker.h
blob: 5f8233c1df5bf4ac78c7e153a1a01446569a585b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_PROXY_CALLBACK_TRACKER_H_
#define PPAPI_PROXY_CALLBACK_TRACKER_H_

#include <map>

#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_stdint.h"

namespace pp {
namespace proxy {

class Dispatcher;

// This object tracks cross-process callbacks. When the plugin sends a callback
// object to the renderer, we save the information and pass an identifier
// instead.
//
// On the renderer side, this identifier is converted to a new callback in that
// process. When executed, this new callback sends an IPC message containing the
// previous identifier back to the plugin.
//
// When we receive that message, ExecuteSerializedCallback converts the
// identifier back to the original callback information and runs the callback.
class CallbackTracker {
 public:
  CallbackTracker(Dispatcher* dispatcher);
  ~CallbackTracker();

  // Converts the given callback in the context of the plugin to a serialized
  // ID. This will be passed to ReceiveCallback on the renderer side.
  uint32_t SendCallback(PP_CompletionCallback callback);

  // Converts the given serialized callback ID to a new completion callback in
  // the context of the current process. This callback actually will represent
  // a proxy that will execute the callback in the plugin process.
  PP_CompletionCallback ReceiveCallback(uint32_t serialized_callback);

  // Sends a request to the remote process to execute the given callback.
  void SendExecuteSerializedCallback(uint32_t serialized_callback,
                                     int32_t param);

  // Executes the given callback ID with the given result in the current
  // process. This will also destroy the information associated with the
  // callback and the serialized ID won't be valid any more.
  void ReceiveExecuteSerializedCallback(uint32_t serialized_callback,
                                        int32_t param);

 private:
  // Pointer to the dispatcher that owns us.
  Dispatcher* dispatcher_;

  int32_t next_callback_id_;

  // Maps callback IDs to the actual callback objects in the plugin process.
  typedef std::map<int32_t, PP_CompletionCallback> CallbackMap;
  CallbackMap callback_map_;
};

}  // namespace proxy
}  // namespace pp

#endif  // PPAPI_PROXY_CALLBACK_TRACKER_H_