OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/ppb_broker_proxy.h" | 5 #include "ppapi/proxy/ppb_broker_proxy.h" |
6 | 6 |
7 #include "ppapi/c/pp_errors.h" | 7 #include "ppapi/c/pp_errors.h" |
8 #include "ppapi/c/trusted/ppb_broker_trusted.h" | 8 #include "ppapi/c/trusted/ppb_broker_trusted.h" |
9 #include "ppapi/proxy/enter_proxy.h" | 9 #include "ppapi/proxy/enter_proxy.h" |
10 #include "ppapi/proxy/plugin_dispatcher.h" | 10 #include "ppapi/proxy/plugin_dispatcher.h" |
11 #include "ppapi/proxy/plugin_resource.h" | |
12 #include "ppapi/proxy/ppapi_messages.h" | 11 #include "ppapi/proxy/ppapi_messages.h" |
13 #include "ppapi/thunk/ppb_broker_api.h" | 12 #include "ppapi/thunk/ppb_broker_api.h" |
14 #include "ppapi/thunk/enter.h" | 13 #include "ppapi/thunk/enter.h" |
15 #include "ppapi/thunk/thunk.h" | 14 #include "ppapi/thunk/thunk.h" |
16 | 15 |
17 using ppapi::HostResource; | 16 using ppapi::HostResource; |
17 using ppapi::Resource; | |
18 using ppapi::thunk::PPB_Broker_API; | 18 using ppapi::thunk::PPB_Broker_API; |
19 | 19 |
20 namespace pp { | 20 namespace pp { |
21 namespace proxy { | 21 namespace proxy { |
22 | 22 |
23 namespace { | 23 namespace { |
24 | 24 |
25 base::PlatformFile IntToPlatformFile(int32_t handle) { | 25 base::PlatformFile IntToPlatformFile(int32_t handle) { |
26 #if defined(OS_WIN) | 26 #if defined(OS_WIN) |
27 return reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle)); | 27 return reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle)); |
(...skipping 14 matching lines...) Expand all Loading... | |
42 #endif | 42 #endif |
43 } | 43 } |
44 | 44 |
45 InterfaceProxy* CreateBrokerProxy(Dispatcher* dispatcher, | 45 InterfaceProxy* CreateBrokerProxy(Dispatcher* dispatcher, |
46 const void* target_interface) { | 46 const void* target_interface) { |
47 return new PPB_Broker_Proxy(dispatcher, target_interface); | 47 return new PPB_Broker_Proxy(dispatcher, target_interface); |
48 } | 48 } |
49 | 49 |
50 } // namespace | 50 } // namespace |
51 | 51 |
52 class Broker : public PPB_Broker_API, public PluginResource { | 52 class Broker : public PPB_Broker_API, public Resource { |
53 public: | 53 public: |
54 explicit Broker(const HostResource& resource); | 54 explicit Broker(const HostResource& resource); |
55 virtual ~Broker(); | 55 virtual ~Broker(); |
56 | 56 |
57 // ResourceObjectBase overries. | 57 // Resource overries. |
58 virtual PPB_Broker_API* AsPPB_Broker_API() OVERRIDE; | 58 virtual PPB_Broker_API* AsPPB_Broker_API() OVERRIDE; |
59 | 59 |
60 // PPB_Broker_API implementation. | 60 // PPB_Broker_API implementation. |
61 virtual int32_t Connect(PP_CompletionCallback connect_callback) OVERRIDE; | 61 virtual int32_t Connect(PP_CompletionCallback connect_callback) OVERRIDE; |
62 virtual int32_t GetHandle(int32_t* handle) OVERRIDE; | 62 virtual int32_t GetHandle(int32_t* handle) OVERRIDE; |
63 | 63 |
64 // Called by the proxy when the host side has completed the request. | 64 // Called by the proxy when the host side has completed the request. |
65 void ConnectComplete(IPC::PlatformFileForTransit socket_handle, | 65 void ConnectComplete(IPC::PlatformFileForTransit socket_handle, |
66 int32_t result); | 66 int32_t result); |
67 | 67 |
68 private: | 68 private: |
69 bool called_connect_; | 69 bool called_connect_; |
70 PP_CompletionCallback current_connect_callback_; | 70 PP_CompletionCallback current_connect_callback_; |
71 | 71 |
72 // The plugin module owns the handle. | 72 // The plugin module owns the handle. |
73 // The host side transfers ownership of the handle to the plugin side when it | 73 // The host side transfers ownership of the handle to the plugin side when it |
74 // sends the IPC. This member holds the handle value for the plugin module | 74 // sends the IPC. This member holds the handle value for the plugin module |
75 // to read, but the plugin side of the proxy never takes ownership. | 75 // to read, but the plugin side of the proxy never takes ownership. |
76 base::SyncSocket::Handle socket_handle_; | 76 base::SyncSocket::Handle socket_handle_; |
77 | 77 |
78 DISALLOW_COPY_AND_ASSIGN(Broker); | 78 DISALLOW_COPY_AND_ASSIGN(Broker); |
79 }; | 79 }; |
80 | 80 |
81 Broker::Broker(const HostResource& resource) | 81 Broker::Broker(const HostResource& resource) : Resource(resource), |
82 : PluginResource(resource), | |
83 called_connect_(false), | 82 called_connect_(false), |
84 current_connect_callback_(PP_MakeCompletionCallback(NULL, NULL)), | 83 current_connect_callback_(PP_MakeCompletionCallback(NULL, NULL)), |
85 socket_handle_(base::kInvalidPlatformFileValue) { | 84 socket_handle_(base::kInvalidPlatformFileValue) { |
86 } | 85 } |
87 | 86 |
88 Broker::~Broker() { | 87 Broker::~Broker() { |
89 // Ensure the callback is always fired. | 88 // Ensure the callback is always fired. |
90 if (current_connect_callback_.func) { | 89 if (current_connect_callback_.func) { |
91 // TODO(brettw) the callbacks at this level should be refactored with a | 90 // TODO(brettw) the callbacks at this level should be refactored with a |
92 // more automatic tracking system like we have in the renderer. | 91 // more automatic tracking system like we have in the renderer. |
(...skipping 16 matching lines...) Expand all Loading... | |
109 } | 108 } |
110 | 109 |
111 if (current_connect_callback_.func) | 110 if (current_connect_callback_.func) |
112 return PP_ERROR_INPROGRESS; | 111 return PP_ERROR_INPROGRESS; |
113 else if (called_connect_) | 112 else if (called_connect_) |
114 return PP_ERROR_FAILED; | 113 return PP_ERROR_FAILED; |
115 | 114 |
116 current_connect_callback_ = connect_callback; | 115 current_connect_callback_ = connect_callback; |
117 called_connect_ = true; | 116 called_connect_ = true; |
118 | 117 |
119 bool success = GetDispatcher()->Send(new PpapiHostMsg_PPBBroker_Connect( | 118 bool success = PluginDispatcher::GetForResource(this)->Send( |
dmichael (off chromium)
2011/08/17 16:28:07
optional nit: Most places I've seen so far, you're
| |
120 INTERFACE_ID_PPB_BROKER, host_resource())); | 119 new PpapiHostMsg_PPBBroker_Connect( |
120 INTERFACE_ID_PPB_BROKER, host_resource())); | |
121 return success ? PP_OK_COMPLETIONPENDING : PP_ERROR_FAILED; | 121 return success ? PP_OK_COMPLETIONPENDING : PP_ERROR_FAILED; |
122 } | 122 } |
123 | 123 |
124 int32_t Broker::GetHandle(int32_t* handle) { | 124 int32_t Broker::GetHandle(int32_t* handle) { |
125 if (socket_handle_ == base::kInvalidPlatformFileValue) | 125 if (socket_handle_ == base::kInvalidPlatformFileValue) |
126 return PP_ERROR_FAILED; | 126 return PP_ERROR_FAILED; |
127 *handle = PlatformFileToInt(socket_handle_); | 127 *handle = PlatformFileToInt(socket_handle_); |
128 return PP_OK; | 128 return PP_OK; |
129 } | 129 } |
130 | 130 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
174 PP_Resource PPB_Broker_Proxy::CreateProxyResource(PP_Instance instance) { | 174 PP_Resource PPB_Broker_Proxy::CreateProxyResource(PP_Instance instance) { |
175 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); | 175 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
176 if (!dispatcher) | 176 if (!dispatcher) |
177 return 0; | 177 return 0; |
178 | 178 |
179 HostResource result; | 179 HostResource result; |
180 dispatcher->Send(new PpapiHostMsg_PPBBroker_Create( | 180 dispatcher->Send(new PpapiHostMsg_PPBBroker_Create( |
181 INTERFACE_ID_PPB_BROKER, instance, &result)); | 181 INTERFACE_ID_PPB_BROKER, instance, &result)); |
182 if (result.is_null()) | 182 if (result.is_null()) |
183 return 0; | 183 return 0; |
184 | 184 return (new Broker(result))->GetReference(); |
185 return PluginResourceTracker::GetInstance()->AddResource(new Broker(result)); | |
186 } | 185 } |
187 | 186 |
188 bool PPB_Broker_Proxy::OnMessageReceived(const IPC::Message& msg) { | 187 bool PPB_Broker_Proxy::OnMessageReceived(const IPC::Message& msg) { |
189 bool handled = true; | 188 bool handled = true; |
190 IPC_BEGIN_MESSAGE_MAP(PPB_Broker_Proxy, msg) | 189 IPC_BEGIN_MESSAGE_MAP(PPB_Broker_Proxy, msg) |
191 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBBroker_Create, OnMsgCreate) | 190 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBBroker_Create, OnMsgCreate) |
192 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBBroker_Connect, OnMsgConnect) | 191 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBBroker_Connect, OnMsgConnect) |
193 IPC_MESSAGE_HANDLER(PpapiMsg_PPBBroker_ConnectComplete, | 192 IPC_MESSAGE_HANDLER(PpapiMsg_PPBBroker_ConnectComplete, |
194 OnMsgConnectComplete) | 193 OnMsgConnectComplete) |
195 IPC_MESSAGE_UNHANDLED(handled = false) | 194 IPC_MESSAGE_UNHANDLED(handled = false) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 // The easiest way to clean it up is to just put it in an object | 269 // The easiest way to clean it up is to just put it in an object |
271 // and then close it. This failure case is not performance critical. | 270 // and then close it. This failure case is not performance critical. |
272 // The handle could still leak if Send succeeded but the IPC later failed. | 271 // The handle could still leak if Send succeeded but the IPC later failed. |
273 base::SyncSocket temp_socket( | 272 base::SyncSocket temp_socket( |
274 IPC::PlatformFileForTransitToPlatformFile(foreign_socket_handle)); | 273 IPC::PlatformFileForTransitToPlatformFile(foreign_socket_handle)); |
275 } | 274 } |
276 } | 275 } |
277 | 276 |
278 } // namespace proxy | 277 } // namespace proxy |
279 } // namespace pp | 278 } // namespace pp |
OLD | NEW |