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_flash_net_connector_proxy.h" | 5 #include "ppapi/proxy/ppb_flash_net_connector_proxy.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ppapi/c/pp_errors.h" | 9 #include "ppapi/c/pp_errors.h" |
10 #include "ppapi/c/private/ppb_flash_net_connector.h" | 10 #include "ppapi/c/private/ppb_flash_net_connector.h" |
| 11 #include "ppapi/proxy/enter_proxy.h" |
11 #include "ppapi/proxy/plugin_dispatcher.h" | 12 #include "ppapi/proxy/plugin_dispatcher.h" |
12 #include "ppapi/proxy/plugin_resource.h" | 13 #include "ppapi/proxy/plugin_resource.h" |
13 #include "ppapi/proxy/ppapi_messages.h" | 14 #include "ppapi/proxy/ppapi_messages.h" |
14 #include "ppapi/proxy/serialized_var.h" | 15 #include "ppapi/proxy/serialized_var.h" |
| 16 #include "ppapi/thunk/enter.h" |
| 17 #include "ppapi/thunk/ppb_flash_net_connector_api.h" |
| 18 #include "ppapi/thunk/resource_creation_api.h" |
| 19 #include "ppapi/thunk/thunk.h" |
| 20 |
| 21 using ppapi::thunk::EnterFunctionNoLock; |
| 22 using ppapi::thunk::PPB_Flash_NetConnector_API; |
| 23 using ppapi::thunk::ResourceCreationAPI; |
15 | 24 |
16 namespace pp { | 25 namespace pp { |
17 namespace proxy { | 26 namespace proxy { |
18 | 27 |
19 std::string NetAddressToString(const PP_Flash_NetAddress& addr) { | 28 std::string NetAddressToString(const PP_Flash_NetAddress& addr) { |
20 return std::string(addr.data, std::min(static_cast<size_t>(addr.size), | 29 return std::string(addr.data, std::min(static_cast<size_t>(addr.size), |
21 sizeof(addr.data))); | 30 sizeof(addr.data))); |
22 } | 31 } |
23 | 32 |
24 void StringToNetAddress(const std::string& str, PP_Flash_NetAddress* addr) { | 33 void StringToNetAddress(const std::string& str, PP_Flash_NetAddress* addr) { |
25 addr->size = std::min(str.size(), sizeof(addr->data)); | 34 addr->size = std::min(str.size(), sizeof(addr->data)); |
26 memcpy(addr->data, str.data(), addr->size); | 35 memcpy(addr->data, str.data(), addr->size); |
27 } | 36 } |
28 | 37 |
29 class AbortCallbackTask : public Task { | 38 class AbortCallbackTask : public Task { |
30 public: | 39 public: |
31 AbortCallbackTask(PP_CompletionCallback callback) | 40 AbortCallbackTask(PP_CompletionCallback callback) |
32 : callback_(callback) {} | 41 : callback_(callback) {} |
33 | 42 |
34 virtual void Run() { | 43 virtual void Run() { |
35 PP_RunCompletionCallback(&callback_, PP_ERROR_ABORTED); | 44 PP_RunCompletionCallback(&callback_, PP_ERROR_ABORTED); |
36 } | 45 } |
37 | 46 |
38 private: | 47 private: |
39 PP_CompletionCallback callback_; | 48 PP_CompletionCallback callback_; |
40 }; | 49 }; |
41 | 50 |
42 class FlashNetConnector : public PluginResource { | 51 class FlashNetConnector : public PPB_Flash_NetConnector_API, |
| 52 public PluginResource { |
43 public: | 53 public: |
44 FlashNetConnector(const HostResource& resource) | 54 explicit FlashNetConnector(const HostResource& resource); |
45 : PluginResource(resource), | 55 virtual ~FlashNetConnector(); |
46 callback_(PP_BlockUntilComplete()), | |
47 local_addr_out_(NULL), | |
48 remote_addr_out_(NULL) { | |
49 } | |
50 ~FlashNetConnector() { | |
51 if (callback_.func) { | |
52 MessageLoop::current()->PostTask(FROM_HERE, | |
53 new AbortCallbackTask(callback_)); | |
54 } | |
55 } | |
56 | 56 |
57 // Resource overrides. | 57 // ResourceObjectBase overrides. |
58 virtual FlashNetConnector* AsFlashNetConnector() { | 58 virtual PPB_Flash_NetConnector_API* AsPPB_Flash_NetConnector_API() OVERRIDE; |
59 return this; | |
60 } | |
61 | 59 |
62 bool HasCallback() const { | 60 // PPB_Flash_NetConnector_API implementation. |
63 return callback_.func != NULL; | 61 virtual int32_t ConnectTcp(const char* host, |
64 } | 62 uint16_t port, |
65 | 63 PP_FileHandle* socket_out, |
66 void SetCallback(const PP_CompletionCallback& callback, | 64 PP_Flash_NetAddress* local_addr_out, |
67 PP_FileHandle* socket_out, | 65 PP_Flash_NetAddress* remote_addr_out, |
68 PP_Flash_NetAddress* local_addr_out, | 66 PP_CompletionCallback callback) OVERRIDE; |
69 PP_Flash_NetAddress* remote_addr_out) { | 67 virtual int32_t ConnectTcpAddress(const PP_Flash_NetAddress* addr, |
70 callback_ = callback; | 68 PP_FileHandle* socket_out, |
71 socket_out_ = socket_out; | 69 PP_Flash_NetAddress* local_addr_out, |
72 local_addr_out_ = local_addr_out; | 70 PP_Flash_NetAddress* remote_addr_out, |
73 remote_addr_out_ = remote_addr_out; | 71 PP_CompletionCallback callback) OVERRIDE; |
74 } | |
75 | 72 |
76 void ConnectComplete(int32_t result, | 73 void ConnectComplete(int32_t result, |
77 base::PlatformFile file, | 74 base::PlatformFile file, |
78 const std::string& local_addr_as_string, | 75 const std::string& local_addr_as_string, |
79 const std::string& remote_addr_as_string) { | 76 const std::string& remote_addr_as_string); |
80 if (!callback_.func) { | |
81 base::ClosePlatformFile(file); | |
82 return; | |
83 } | |
84 | |
85 *socket_out_ = static_cast<PP_FileHandle>(file); | |
86 StringToNetAddress(local_addr_as_string, local_addr_out_); | |
87 StringToNetAddress(remote_addr_as_string, remote_addr_out_); | |
88 | |
89 PP_RunAndClearCompletionCallback(&callback_, result); | |
90 } | |
91 | 77 |
92 private: | 78 private: |
| 79 // Backend for both ConnectTcp and ConnectTcpAddress. To keep things generic, |
| 80 // the message is passed in (on error, it's deleted). |
| 81 int32_t ConnectWithMessage(IPC::Message* msg, |
| 82 PP_FileHandle* socket_out, |
| 83 PP_Flash_NetAddress* local_addr_out, |
| 84 PP_Flash_NetAddress* remote_addr_out, |
| 85 PP_CompletionCallback callback); |
| 86 |
93 PP_CompletionCallback callback_; | 87 PP_CompletionCallback callback_; |
94 PP_FileHandle* socket_out_; | 88 PP_FileHandle* socket_out_; |
95 PP_Flash_NetAddress* local_addr_out_; | 89 PP_Flash_NetAddress* local_addr_out_; |
96 PP_Flash_NetAddress* remote_addr_out_; | 90 PP_Flash_NetAddress* remote_addr_out_; |
97 }; | 91 }; |
98 | 92 |
| 93 FlashNetConnector::FlashNetConnector(const HostResource& resource) |
| 94 : PluginResource(resource), |
| 95 callback_(PP_BlockUntilComplete()), |
| 96 local_addr_out_(NULL), |
| 97 remote_addr_out_(NULL) { |
| 98 } |
| 99 |
| 100 FlashNetConnector::~FlashNetConnector() { |
| 101 if (callback_.func) { |
| 102 MessageLoop::current()->PostTask(FROM_HERE, |
| 103 new AbortCallbackTask(callback_)); |
| 104 } |
| 105 } |
| 106 |
| 107 PPB_Flash_NetConnector_API* FlashNetConnector::AsPPB_Flash_NetConnector_API() { |
| 108 return this; |
| 109 } |
| 110 |
| 111 int32_t FlashNetConnector::ConnectTcp( |
| 112 const char* host, |
| 113 uint16_t port, |
| 114 PP_FileHandle* socket_out, |
| 115 PP_Flash_NetAddress* local_addr_out, |
| 116 PP_Flash_NetAddress* remote_addr_out, |
| 117 PP_CompletionCallback callback) { |
| 118 return ConnectWithMessage( |
| 119 new PpapiHostMsg_PPBFlashNetConnector_ConnectTcp( |
| 120 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, host_resource(), host, port), |
| 121 socket_out, local_addr_out, remote_addr_out, callback); |
| 122 } |
| 123 |
| 124 int32_t FlashNetConnector::ConnectTcpAddress( |
| 125 const PP_Flash_NetAddress* addr, |
| 126 PP_FileHandle* socket_out, |
| 127 PP_Flash_NetAddress* local_addr_out, |
| 128 PP_Flash_NetAddress* remote_addr_out, |
| 129 PP_CompletionCallback callback) { |
| 130 return ConnectWithMessage( |
| 131 new PpapiHostMsg_PPBFlashNetConnector_ConnectTcpAddress( |
| 132 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
| 133 host_resource(), NetAddressToString(*addr)), |
| 134 socket_out, local_addr_out, remote_addr_out, callback); |
| 135 } |
| 136 |
| 137 void FlashNetConnector::ConnectComplete( |
| 138 int32_t result, |
| 139 base::PlatformFile file, |
| 140 const std::string& local_addr_as_string, |
| 141 const std::string& remote_addr_as_string) { |
| 142 if (!callback_.func) { |
| 143 base::ClosePlatformFile(file); |
| 144 return; |
| 145 } |
| 146 |
| 147 *socket_out_ = static_cast<PP_FileHandle>(file); |
| 148 StringToNetAddress(local_addr_as_string, local_addr_out_); |
| 149 StringToNetAddress(remote_addr_as_string, remote_addr_out_); |
| 150 |
| 151 PP_RunAndClearCompletionCallback(&callback_, result); |
| 152 } |
| 153 |
| 154 int32_t FlashNetConnector::ConnectWithMessage( |
| 155 IPC::Message* msg, |
| 156 PP_FileHandle* socket_out, |
| 157 PP_Flash_NetAddress* local_addr_out, |
| 158 PP_Flash_NetAddress* remote_addr_out, |
| 159 PP_CompletionCallback callback) { |
| 160 scoped_ptr<IPC::Message> msg_deletor(msg); |
| 161 if (callback_.func != NULL) |
| 162 return PP_ERROR_INPROGRESS; // Can only have one pending request. |
| 163 |
| 164 // Send the request, it will call us back via ConnectACK. |
| 165 GetDispatcher()->Send(msg_deletor.release()); |
| 166 |
| 167 callback_ = callback; |
| 168 socket_out_ = socket_out; |
| 169 local_addr_out_ = local_addr_out; |
| 170 remote_addr_out_ = remote_addr_out; |
| 171 return PP_OK_COMPLETIONPENDING; |
| 172 } |
| 173 |
99 // Contains the data that the host interface will write to so we can send it | 174 // Contains the data that the host interface will write to so we can send it |
100 // to the plugin. This is created when a request is initiated, and deleted in | 175 // to the plugin. This is created when a request is initiated, and deleted in |
101 // the callback handler. | 176 // the callback handler. |
102 struct PPB_Flash_NetConnector_Proxy::ConnectCallbackInfo { | 177 struct PPB_Flash_NetConnector_Proxy::ConnectCallbackInfo { |
103 ConnectCallbackInfo(const HostResource& r) : resource(r), handle(0) { | 178 ConnectCallbackInfo(const HostResource& r) : resource(r), handle(0) { |
104 local_addr.size = 0; | 179 local_addr.size = 0; |
105 remote_addr.size = 0; | 180 remote_addr.size = 0; |
106 } | 181 } |
107 | 182 |
108 HostResource resource; | 183 HostResource resource; |
109 | 184 |
110 PP_FileHandle handle; | 185 PP_FileHandle handle; |
111 PP_Flash_NetAddress local_addr; | 186 PP_Flash_NetAddress local_addr; |
112 PP_Flash_NetAddress remote_addr; | 187 PP_Flash_NetAddress remote_addr; |
113 }; | 188 }; |
114 | 189 |
115 namespace { | 190 namespace { |
116 | 191 |
117 PP_Resource Create(PP_Instance instance_id) { | |
118 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id); | |
119 if (!dispatcher) | |
120 return 0; | |
121 | |
122 HostResource result; | |
123 dispatcher->Send(new PpapiHostMsg_PPBFlashNetConnector_Create( | |
124 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, instance_id, &result)); | |
125 if (result.is_null()) | |
126 return 0; | |
127 | |
128 linked_ptr<FlashNetConnector> object(new FlashNetConnector(result)); | |
129 return PluginResourceTracker::GetInstance()->AddResource(object); | |
130 } | |
131 | |
132 PP_Bool IsFlashNetConnector(PP_Resource resource_id) { | |
133 FlashNetConnector* object = | |
134 PluginResource::GetAs<FlashNetConnector>(resource_id); | |
135 return BoolToPPBool(!!object); | |
136 } | |
137 | |
138 // Backend for both ConnectTcp and ConnectTcpAddress. To keep things generic, | |
139 // the message is passed in (on error, it's deleted). | |
140 int32_t ConnectWithMessage(FlashNetConnector* object, | |
141 IPC::Message* msg, | |
142 PP_FileHandle* socket_out, | |
143 struct PP_Flash_NetAddress* local_addr_out, | |
144 struct PP_Flash_NetAddress* remote_addr_out, | |
145 struct PP_CompletionCallback callback) { | |
146 scoped_ptr<IPC::Message> msg_deletor(msg); | |
147 if (object->HasCallback()) | |
148 return PP_ERROR_INPROGRESS; // Can only have one pending request. | |
149 | |
150 // Send the request, it will call us back via ConnectACK. | |
151 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance( | |
152 object->instance()); | |
153 if (!dispatcher) | |
154 return PP_ERROR_BADARGUMENT; | |
155 dispatcher->Send(msg_deletor.release()); | |
156 | |
157 object->SetCallback(callback, socket_out, local_addr_out, remote_addr_out); | |
158 return PP_OK_COMPLETIONPENDING; | |
159 } | |
160 | |
161 int32_t ConnectTcp(PP_Resource connector_id, | |
162 const char* host, | |
163 uint16_t port, | |
164 PP_FileHandle* socket_out, | |
165 struct PP_Flash_NetAddress* local_addr_out, | |
166 struct PP_Flash_NetAddress* remote_addr_out, | |
167 struct PP_CompletionCallback callback) { | |
168 FlashNetConnector* object = | |
169 PluginResource::GetAs<FlashNetConnector>(connector_id); | |
170 if (!object) | |
171 return PP_ERROR_BADARGUMENT; | |
172 return ConnectWithMessage( | |
173 object, | |
174 new PpapiHostMsg_PPBFlashNetConnector_ConnectTcp( | |
175 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, | |
176 object->host_resource(), host, port), | |
177 socket_out, local_addr_out, remote_addr_out, callback); | |
178 } | |
179 | |
180 int32_t ConnectTcpAddress(PP_Resource connector_id, | |
181 const struct PP_Flash_NetAddress* addr, | |
182 PP_FileHandle* socket_out, | |
183 struct PP_Flash_NetAddress* local_addr_out, | |
184 struct PP_Flash_NetAddress* remote_addr_out, | |
185 struct PP_CompletionCallback callback) { | |
186 FlashNetConnector* object = | |
187 PluginResource::GetAs<FlashNetConnector>(connector_id); | |
188 if (!object) | |
189 return PP_ERROR_BADARGUMENT; | |
190 return ConnectWithMessage( | |
191 object, | |
192 new PpapiHostMsg_PPBFlashNetConnector_ConnectTcpAddress( | |
193 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, | |
194 object->host_resource(), NetAddressToString(*addr)), | |
195 socket_out, local_addr_out, remote_addr_out, callback); | |
196 } | |
197 | |
198 const PPB_Flash_NetConnector flash_netconnector_interface = { | |
199 &Create, | |
200 &IsFlashNetConnector, | |
201 &ConnectTcp, | |
202 &ConnectTcpAddress | |
203 }; | |
204 | |
205 InterfaceProxy* CreateFlashNetConnectorProxy(Dispatcher* dispatcher, | 192 InterfaceProxy* CreateFlashNetConnectorProxy(Dispatcher* dispatcher, |
206 const void* target_interface) { | 193 const void* target_interface) { |
207 return new PPB_Flash_NetConnector_Proxy(dispatcher, target_interface); | 194 return new PPB_Flash_NetConnector_Proxy(dispatcher, target_interface); |
208 } | 195 } |
209 | 196 |
210 } // namespace | 197 } // namespace |
211 | 198 |
212 PPB_Flash_NetConnector_Proxy::PPB_Flash_NetConnector_Proxy( | 199 PPB_Flash_NetConnector_Proxy::PPB_Flash_NetConnector_Proxy( |
213 Dispatcher* dispatcher, const void* target_interface) | 200 Dispatcher* dispatcher, const void* target_interface) |
214 : InterfaceProxy(dispatcher, target_interface), | 201 : InterfaceProxy(dispatcher, target_interface), |
215 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 202 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
216 } | 203 } |
217 | 204 |
218 PPB_Flash_NetConnector_Proxy::~PPB_Flash_NetConnector_Proxy() { | 205 PPB_Flash_NetConnector_Proxy::~PPB_Flash_NetConnector_Proxy() { |
219 } | 206 } |
220 | 207 |
221 // static | 208 // static |
222 const InterfaceProxy::Info* PPB_Flash_NetConnector_Proxy::GetInfo() { | 209 const InterfaceProxy::Info* PPB_Flash_NetConnector_Proxy::GetInfo() { |
223 static const Info info = { | 210 static const Info info = { |
224 &flash_netconnector_interface, | 211 ppapi::thunk::GetPPB_Flash_NetConnector_Thunk(), |
225 PPB_FLASH_NETCONNECTOR_INTERFACE, | 212 PPB_FLASH_NETCONNECTOR_INTERFACE, |
226 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, | 213 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
227 false, | 214 false, |
228 &CreateFlashNetConnectorProxy | 215 &CreateFlashNetConnectorProxy |
229 }; | 216 }; |
230 return &info; | 217 return &info; |
231 } | 218 } |
232 | 219 |
| 220 // static |
| 221 PP_Resource PPB_Flash_NetConnector_Proxy::CreateProxyResource( |
| 222 PP_Instance instance) { |
| 223 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| 224 if (!dispatcher) |
| 225 return 0; |
| 226 |
| 227 HostResource result; |
| 228 dispatcher->Send(new PpapiHostMsg_PPBFlashNetConnector_Create( |
| 229 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, instance, &result)); |
| 230 if (result.is_null()) |
| 231 return 0; |
| 232 |
| 233 linked_ptr<FlashNetConnector> object(new FlashNetConnector(result)); |
| 234 return PluginResourceTracker::GetInstance()->AddResource(object); |
| 235 } |
| 236 |
233 bool PPB_Flash_NetConnector_Proxy::OnMessageReceived(const IPC::Message& msg) { | 237 bool PPB_Flash_NetConnector_Proxy::OnMessageReceived(const IPC::Message& msg) { |
234 bool handled = true; | 238 bool handled = true; |
235 IPC_BEGIN_MESSAGE_MAP(PPB_Flash_NetConnector_Proxy, msg) | 239 IPC_BEGIN_MESSAGE_MAP(PPB_Flash_NetConnector_Proxy, msg) |
236 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashNetConnector_Create, | 240 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashNetConnector_Create, |
237 OnMsgCreate) | 241 OnMsgCreate) |
238 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashNetConnector_ConnectTcp, | 242 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashNetConnector_ConnectTcp, |
239 OnMsgConnectTcp) | 243 OnMsgConnectTcp) |
240 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashNetConnector_ConnectTcpAddress, | 244 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashNetConnector_ConnectTcpAddress, |
241 OnMsgConnectTcpAddress) | 245 OnMsgConnectTcpAddress) |
242 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashNetConnector_ConnectACK, | 246 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashNetConnector_ConnectACK, |
243 OnMsgConnectACK) | 247 OnMsgConnectACK) |
244 IPC_MESSAGE_UNHANDLED(handled = false) | 248 IPC_MESSAGE_UNHANDLED(handled = false) |
245 IPC_END_MESSAGE_MAP() | 249 IPC_END_MESSAGE_MAP() |
246 return handled; | 250 return handled; |
247 } | 251 } |
248 | 252 |
249 void PPB_Flash_NetConnector_Proxy::OnMsgCreate(PP_Instance instance_id, | 253 void PPB_Flash_NetConnector_Proxy::OnMsgCreate(PP_Instance instance, |
250 HostResource* result) { | 254 HostResource* result) { |
251 result->SetHostResource( | 255 EnterFunctionNoLock<ResourceCreationAPI> enter(instance, true); |
252 instance_id, | 256 if (enter.succeeded()) { |
253 ppb_flash_net_connector_target()->Create(instance_id)); | 257 result->SetHostResource( |
| 258 instance, |
| 259 enter.functions()->CreateFlashNetConnector(instance)); |
| 260 } |
254 } | 261 } |
255 | 262 |
256 void PPB_Flash_NetConnector_Proxy::OnMsgConnectTcp( | 263 void PPB_Flash_NetConnector_Proxy::OnMsgConnectTcp( |
257 const HostResource& resource, | 264 const HostResource& resource, |
258 const std::string& host, | 265 const std::string& host, |
259 uint16_t port) { | 266 uint16_t port) { |
260 ConnectCallbackInfo* info = new ConnectCallbackInfo(resource); | 267 ConnectCallbackInfo* info = new ConnectCallbackInfo(resource); |
261 CompletionCallback callback = callback_factory_.NewCallback( | 268 CompletionCallback callback = callback_factory_.NewCallback( |
262 &PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost, info); | 269 &PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost, info); |
263 | 270 |
264 int32_t result = ppb_flash_net_connector_target()->ConnectTcp( | 271 EnterHostFromHostResource<PPB_Flash_NetConnector_API> enter(resource); |
265 resource.host_resource(), host.c_str(), port, | 272 int32_t result = PP_ERROR_BADRESOURCE; |
266 &info->handle, &info->local_addr, &info->remote_addr, | 273 if (enter.succeeded()) { |
267 callback.pp_completion_callback()); | 274 result = enter.object()->ConnectTcp( |
| 275 host.c_str(), port, &info->handle, &info->local_addr, |
| 276 &info->remote_addr, callback.pp_completion_callback()); |
| 277 } |
268 if (result != PP_OK_COMPLETIONPENDING) | 278 if (result != PP_OK_COMPLETIONPENDING) |
269 OnCompleteCallbackInHost(result, info); | 279 OnCompleteCallbackInHost(result, info); |
270 } | 280 } |
271 | 281 |
272 void PPB_Flash_NetConnector_Proxy::OnMsgConnectTcpAddress( | 282 void PPB_Flash_NetConnector_Proxy::OnMsgConnectTcpAddress( |
273 const HostResource& resource, | 283 const HostResource& resource, |
274 const std::string& net_address_as_string) { | 284 const std::string& net_address_as_string) { |
275 ConnectCallbackInfo* info = new ConnectCallbackInfo(resource); | 285 ConnectCallbackInfo* info = new ConnectCallbackInfo(resource); |
276 CompletionCallback callback = callback_factory_.NewCallback( | 286 CompletionCallback callback = callback_factory_.NewCallback( |
277 &PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost, info); | 287 &PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost, info); |
278 | 288 |
279 PP_Flash_NetAddress net_address; | 289 PP_Flash_NetAddress net_address; |
280 StringToNetAddress(net_address_as_string, &net_address); | 290 StringToNetAddress(net_address_as_string, &net_address); |
281 | 291 |
282 int32_t result = ppb_flash_net_connector_target()->ConnectTcpAddress( | 292 EnterHostFromHostResource<PPB_Flash_NetConnector_API> enter(resource); |
283 resource.host_resource(), &net_address, | 293 int32_t result = PP_ERROR_BADRESOURCE; |
284 &info->handle, &info->local_addr, &info->remote_addr, | 294 if (enter.succeeded()) { |
285 callback.pp_completion_callback()); | 295 result = enter.object()->ConnectTcpAddress( |
| 296 &net_address, &info->handle, &info->local_addr, &info->remote_addr, |
| 297 callback.pp_completion_callback()); |
| 298 } |
286 if (result != PP_OK_COMPLETIONPENDING) | 299 if (result != PP_OK_COMPLETIONPENDING) |
287 OnCompleteCallbackInHost(result, info); | 300 OnCompleteCallbackInHost(result, info); |
288 } | 301 } |
289 | 302 |
290 void PPB_Flash_NetConnector_Proxy::OnMsgConnectACK( | 303 void PPB_Flash_NetConnector_Proxy::OnMsgConnectACK( |
291 const HostResource& host_resource, | 304 const HostResource& host_resource, |
292 int32_t result, | 305 int32_t result, |
293 IPC::PlatformFileForTransit handle, | 306 IPC::PlatformFileForTransit handle, |
294 const std::string& load_addr_as_string, | 307 const std::string& load_addr_as_string, |
295 const std::string& remote_addr_as_string) { | 308 const std::string& remote_addr_as_string) { |
296 base::PlatformFile platform_file = | 309 base::PlatformFile platform_file = |
297 IPC::PlatformFileForTransitToPlatformFile(handle); | 310 IPC::PlatformFileForTransitToPlatformFile(handle); |
298 | 311 |
299 PP_Resource plugin_resource = | 312 EnterPluginFromHostResource<PPB_Flash_NetConnector_API> enter(host_resource); |
300 PluginResourceTracker::GetInstance()->PluginResourceForHostResource( | 313 if (enter.failed()) { |
301 host_resource); | |
302 if (!plugin_resource) { | |
303 base::ClosePlatformFile(platform_file); | 314 base::ClosePlatformFile(platform_file); |
304 return; | 315 return; |
305 } | 316 } |
306 FlashNetConnector* object = | 317 FlashNetConnector* object = static_cast<FlashNetConnector*>(enter.object()); |
307 PluginResource::GetAs<FlashNetConnector>(plugin_resource); | |
308 if (!object) { | |
309 base::ClosePlatformFile(platform_file); | |
310 return; | |
311 } | |
312 | |
313 object->ConnectComplete(result, platform_file, | 318 object->ConnectComplete(result, platform_file, |
314 load_addr_as_string, remote_addr_as_string); | 319 load_addr_as_string, remote_addr_as_string); |
315 } | 320 } |
316 | 321 |
317 void PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost( | 322 void PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost( |
318 int32_t result, | 323 int32_t result, |
319 ConnectCallbackInfo* info) { | 324 ConnectCallbackInfo* info) { |
320 // Callback must always delete the info. | 325 // Callback must always delete the info. |
321 scoped_ptr<ConnectCallbackInfo> info_deletor(info); | 326 scoped_ptr<ConnectCallbackInfo> info_deletor(info); |
322 | 327 |
323 if (result == PP_OK) { | 328 if (result == PP_OK) { |
324 dispatcher()->Send(new PpapiMsg_PPBFlashNetConnector_ConnectACK( | 329 dispatcher()->Send(new PpapiMsg_PPBFlashNetConnector_ConnectACK( |
325 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, | 330 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
326 info->resource, result, | 331 info->resource, result, |
327 dispatcher()->ShareHandleWithRemote( | 332 dispatcher()->ShareHandleWithRemote( |
328 static_cast<base::PlatformFile>(info->handle), true), | 333 static_cast<base::PlatformFile>(info->handle), true), |
329 NetAddressToString(info->local_addr), | 334 NetAddressToString(info->local_addr), |
330 NetAddressToString(info->remote_addr))); | 335 NetAddressToString(info->remote_addr))); |
331 } else { | 336 } else { |
332 dispatcher()->Send(new PpapiMsg_PPBFlashNetConnector_ConnectACK( | 337 dispatcher()->Send(new PpapiMsg_PPBFlashNetConnector_ConnectACK( |
333 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, | 338 INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
334 info->resource, result, | 339 info->resource, result, |
335 IPC::InvalidPlatformFileForTransit(), std::string(), std::string())); | 340 IPC::InvalidPlatformFileForTransit(), std::string(), std::string())); |
336 } | 341 } |
337 } | 342 } |
338 | 343 |
339 } // namespace proxy | 344 } // namespace proxy |
340 } // namespace pp | 345 } // namespace pp |
OLD | NEW |