OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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 #include "ppapi/proxy/callback_tracker.h" | |
6 | |
7 #include "ppapi/proxy/dispatcher.h" | |
8 #include "ppapi/proxy/ppapi_messages.h" | |
9 | |
10 namespace ppapi { | |
11 namespace proxy { | |
12 | |
13 namespace { | |
14 | |
15 struct CallbackData { | |
16 CallbackTracker* tracker; | |
17 uint32_t callback_id; | |
18 }; | |
19 | |
20 void CallbackProxy(void* user_data, int32_t result) { | |
21 CallbackData* data = static_cast<CallbackData*>(user_data); | |
22 data->tracker->SendExecuteSerializedCallback(data->callback_id, result); | |
23 delete data; | |
24 } | |
25 | |
26 } // namespace | |
27 | |
28 CallbackTracker::CallbackTracker(Dispatcher* dispatcher) | |
29 : dispatcher_(dispatcher), | |
30 next_callback_id_(1) { | |
31 } | |
32 | |
33 CallbackTracker::~CallbackTracker() { | |
34 } | |
35 | |
36 uint32_t CallbackTracker::SendCallback(PP_CompletionCallback callback) { | |
37 // Find the next callback ID we can use (being careful about wraparound). | |
38 while (callback_map_.find(next_callback_id_) != callback_map_.end()) | |
39 next_callback_id_++; | |
40 callback_map_[next_callback_id_] = callback; | |
41 return next_callback_id_++; | |
42 } | |
43 | |
44 PP_CompletionCallback CallbackTracker::ReceiveCallback( | |
45 uint32_t serialized_callback) { | |
46 CallbackData* data = new CallbackData; | |
47 data->tracker = this; | |
48 data->callback_id = serialized_callback; | |
49 return PP_MakeCompletionCallback(&CallbackProxy, data); | |
50 } | |
51 | |
52 void CallbackTracker::SendExecuteSerializedCallback( | |
53 uint32_t serialized_callback, | |
54 int32_t param) { | |
55 dispatcher_->Send(new PpapiMsg_ExecuteCallback(serialized_callback, param)); | |
56 } | |
57 | |
58 void CallbackTracker::ReceiveExecuteSerializedCallback( | |
59 uint32_t serialized_callback, | |
60 int32_t param) { | |
61 CallbackMap::iterator found = callback_map_.find(serialized_callback); | |
62 if (found == callback_map_.end()) { | |
63 NOTREACHED(); | |
64 return; | |
65 } | |
66 | |
67 PP_RunCompletionCallback(&found->second, param); | |
68 callback_map_.erase(found); | |
69 } | |
70 | |
71 } // namespace proxy | |
72 } // namespace ppapi | |
OLD | NEW |