Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1133)

Side by Side Diff: ppapi/proxy/ppb_tcp_socket_proxy.cc

Issue 8506016: Remove 'Flash' from TCP/UDP Pepper interfaces. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_tcp_socket_proxy.h" 5 #include "ppapi/proxy/ppb_tcp_socket_proxy.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <map> 9 #include <map>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop.h" 13 #include "base/message_loop.h"
14 #include "base/task.h" 14 #include "base/task.h"
15 #include "ppapi/c/pp_errors.h" 15 #include "ppapi/c/pp_errors.h"
16 #include "ppapi/proxy/plugin_dispatcher.h" 16 #include "ppapi/proxy/plugin_dispatcher.h"
17 #include "ppapi/proxy/plugin_resource_tracker.h" 17 #include "ppapi/proxy/plugin_resource_tracker.h"
18 #include "ppapi/proxy/ppapi_messages.h" 18 #include "ppapi/proxy/ppapi_messages.h"
19 #include "ppapi/shared_impl/resource.h" 19 #include "ppapi/shared_impl/resource.h"
20 #include "ppapi/thunk/ppb_flash_tcp_socket_api.h" 20 #include "ppapi/thunk/ppb_tcp_socket_api.h"
21 #include "ppapi/thunk/thunk.h" 21 #include "ppapi/thunk/thunk.h"
22 22
23 using ppapi::thunk::PPB_Flash_TCPSocket_API; 23 using ppapi::thunk::PPB_TCPSocket_API;
24 24
25 namespace ppapi { 25 namespace ppapi {
26 namespace proxy { 26 namespace proxy {
27 27
28 const int32_t kFlashTCPSocketMaxReadSize = 1024 * 1024; 28 const int32_t kTCPSocketMaxReadSize = 1024 * 1024;
29 const int32_t kFlashTCPSocketMaxWriteSize = 1024 * 1024; 29 const int32_t kTCPSocketMaxWriteSize = 1024 * 1024;
30 30
31 class FlashTCPSocket; 31 class TCPSocket;
32 32
33 namespace { 33 namespace {
34 34
35 typedef std::map<uint32, FlashTCPSocket*> IDToSocketMap; 35 typedef std::map<uint32, TCPSocket*> IDToSocketMap;
36 IDToSocketMap* g_id_to_socket = NULL; 36 IDToSocketMap* g_id_to_socket = NULL;
37 37
38 class AbortCallbackTask : public Task { 38 class AbortCallbackTask : public Task {
39 public: 39 public:
40 explicit AbortCallbackTask(PP_CompletionCallback callback) 40 explicit AbortCallbackTask(PP_CompletionCallback callback)
41 : callback_(callback) {} 41 : callback_(callback) {}
42 virtual ~AbortCallbackTask() {} 42 virtual ~AbortCallbackTask() {}
43 virtual void Run() { 43 virtual void Run() {
44 if (callback_.func) 44 if (callback_.func)
45 PP_RunCompletionCallback(&callback_, PP_ERROR_ABORTED); 45 PP_RunCompletionCallback(&callback_, PP_ERROR_ABORTED);
46 } 46 }
47 47
48 private: 48 private:
49 PP_CompletionCallback callback_; 49 PP_CompletionCallback callback_;
50 }; 50 };
51 51
52 } // namespace 52 } // namespace
53 53
54 class FlashTCPSocket : public PPB_Flash_TCPSocket_API, 54 class TCPSocket : public PPB_TCPSocket_API,
55 public Resource { 55 public Resource {
56 public: 56 public:
57 FlashTCPSocket(const HostResource& resource, uint32 socket_id); 57 TCPSocket(const HostResource& resource, uint32 socket_id);
58 virtual ~FlashTCPSocket(); 58 virtual ~TCPSocket();
59 59
60 // Resource overrides. 60 // Resource overrides.
61 virtual PPB_Flash_TCPSocket_API* AsPPB_Flash_TCPSocket_API() OVERRIDE; 61 virtual PPB_TCPSocket_API* AsPPB_TCPSocket_API() OVERRIDE;
62 62
63 // PPB_Flash_TCPSocket_API implementation. 63 // PPB_TCPSocket_API implementation.
64 virtual int32_t Connect(const char* host, 64 virtual int32_t Connect(const char* host,
65 uint16_t port, 65 uint16_t port,
66 PP_CompletionCallback callback) OVERRIDE; 66 PP_CompletionCallback callback) OVERRIDE;
67 virtual int32_t ConnectWithNetAddress( 67 virtual int32_t ConnectWithNetAddress(
68 const PP_Flash_NetAddress* addr, 68 const PP_NetAddress* addr,
69 PP_CompletionCallback callback) OVERRIDE; 69 PP_CompletionCallback callback) OVERRIDE;
70 virtual PP_Bool GetLocalAddress(PP_Flash_NetAddress* local_addr) OVERRIDE; 70 virtual PP_Bool GetLocalAddress(PP_NetAddress* local_addr) OVERRIDE;
71 virtual PP_Bool GetRemoteAddress(PP_Flash_NetAddress* remote_addr) OVERRIDE; 71 virtual PP_Bool GetRemoteAddress(PP_NetAddress* remote_addr) OVERRIDE;
72 virtual int32_t SSLHandshake(const char* server_name, 72 virtual int32_t SSLHandshake(const char* server_name,
73 uint16_t server_port, 73 uint16_t server_port,
74 PP_CompletionCallback callback) OVERRIDE; 74 PP_CompletionCallback callback) OVERRIDE;
75 virtual int32_t Read(char* buffer, 75 virtual int32_t Read(char* buffer,
76 int32_t bytes_to_read, 76 int32_t bytes_to_read,
77 PP_CompletionCallback callback) OVERRIDE; 77 PP_CompletionCallback callback) OVERRIDE;
78 virtual int32_t Write(const char* buffer, 78 virtual int32_t Write(const char* buffer,
79 int32_t bytes_to_write, 79 int32_t bytes_to_write,
80 PP_CompletionCallback callback) OVERRIDE; 80 PP_CompletionCallback callback) OVERRIDE;
81 virtual void Disconnect() OVERRIDE; 81 virtual void Disconnect() OVERRIDE;
82 82
83 // Notifications from the proxy. 83 // Notifications from the proxy.
84 void OnConnectCompleted(bool succeeded, 84 void OnConnectCompleted(bool succeeded,
85 const PP_Flash_NetAddress& local_addr, 85 const PP_NetAddress& local_addr,
86 const PP_Flash_NetAddress& remote_addr); 86 const PP_NetAddress& remote_addr);
87 void OnSSLHandshakeCompleted(bool succeeded); 87 void OnSSLHandshakeCompleted(bool succeeded);
88 void OnReadCompleted(bool succeeded, const std::string& data); 88 void OnReadCompleted(bool succeeded, const std::string& data);
89 void OnWriteCompleted(bool succeeded, int32_t bytes_written); 89 void OnWriteCompleted(bool succeeded, int32_t bytes_written);
90 90
91 private: 91 private:
92 enum ConnectionState { 92 enum ConnectionState {
93 // Before a connection is successfully established (including a connect 93 // Before a connection is successfully established (including a connect
94 // request is pending or a previous connect request failed). 94 // request is pending or a previous connect request failed).
95 BEFORE_CONNECT, 95 BEFORE_CONNECT,
96 // A connection has been successfully established (including a request of 96 // A connection has been successfully established (including a request of
(...skipping 22 matching lines...) Expand all
119 ConnectionState connection_state_; 119 ConnectionState connection_state_;
120 120
121 PP_CompletionCallback connect_callback_; 121 PP_CompletionCallback connect_callback_;
122 PP_CompletionCallback ssl_handshake_callback_; 122 PP_CompletionCallback ssl_handshake_callback_;
123 PP_CompletionCallback read_callback_; 123 PP_CompletionCallback read_callback_;
124 PP_CompletionCallback write_callback_; 124 PP_CompletionCallback write_callback_;
125 125
126 char* read_buffer_; 126 char* read_buffer_;
127 int32_t bytes_to_read_; 127 int32_t bytes_to_read_;
128 128
129 PP_Flash_NetAddress local_addr_; 129 PP_NetAddress local_addr_;
130 PP_Flash_NetAddress remote_addr_; 130 PP_NetAddress remote_addr_;
131 131
132 DISALLOW_COPY_AND_ASSIGN(FlashTCPSocket); 132 DISALLOW_COPY_AND_ASSIGN(TCPSocket);
133 }; 133 };
134 134
135 FlashTCPSocket::FlashTCPSocket(const HostResource& resource, uint32 socket_id) 135 TCPSocket::TCPSocket(const HostResource& resource, uint32 socket_id)
136 : Resource(resource), 136 : Resource(resource),
137 socket_id_(socket_id), 137 socket_id_(socket_id),
138 connection_state_(BEFORE_CONNECT), 138 connection_state_(BEFORE_CONNECT),
139 connect_callback_(PP_BlockUntilComplete()), 139 connect_callback_(PP_BlockUntilComplete()),
140 ssl_handshake_callback_(PP_BlockUntilComplete()), 140 ssl_handshake_callback_(PP_BlockUntilComplete()),
141 read_callback_(PP_BlockUntilComplete()), 141 read_callback_(PP_BlockUntilComplete()),
142 write_callback_(PP_BlockUntilComplete()), 142 write_callback_(PP_BlockUntilComplete()),
143 read_buffer_(NULL), 143 read_buffer_(NULL),
144 bytes_to_read_(-1) { 144 bytes_to_read_(-1) {
145 DCHECK(socket_id != 0); 145 DCHECK(socket_id != 0);
146 146
147 local_addr_.size = 0; 147 local_addr_.size = 0;
148 memset(local_addr_.data, 0, sizeof(local_addr_.data)); 148 memset(local_addr_.data, 0, sizeof(local_addr_.data));
149 remote_addr_.size = 0; 149 remote_addr_.size = 0;
150 memset(remote_addr_.data, 0, sizeof(remote_addr_.data)); 150 memset(remote_addr_.data, 0, sizeof(remote_addr_.data));
151 151
152 if (!g_id_to_socket) 152 if (!g_id_to_socket)
153 g_id_to_socket = new IDToSocketMap(); 153 g_id_to_socket = new IDToSocketMap();
154 DCHECK(g_id_to_socket->find(socket_id) == g_id_to_socket->end()); 154 DCHECK(g_id_to_socket->find(socket_id) == g_id_to_socket->end());
155 (*g_id_to_socket)[socket_id] = this; 155 (*g_id_to_socket)[socket_id] = this;
156 } 156 }
157 157
158 FlashTCPSocket::~FlashTCPSocket() { 158 TCPSocket::~TCPSocket() {
159 Disconnect(); 159 Disconnect();
160 } 160 }
161 161
162 PPB_Flash_TCPSocket_API* FlashTCPSocket::AsPPB_Flash_TCPSocket_API() { 162 PPB_TCPSocket_API* TCPSocket::AsPPB_TCPSocket_API() {
163 return this; 163 return this;
164 } 164 }
165 165
166 int32_t FlashTCPSocket::Connect(const char* host, 166 int32_t TCPSocket::Connect(const char* host,
167 uint16_t port, 167 uint16_t port,
168 PP_CompletionCallback callback) { 168 PP_CompletionCallback callback) {
169 if (!host) 169 if (!host)
170 return PP_ERROR_BADARGUMENT; 170 return PP_ERROR_BADARGUMENT;
171 171
172 return ConnectWithMessage( 172 return ConnectWithMessage(
173 new PpapiHostMsg_PPBFlashTCPSocket_Connect(socket_id_, host, port), 173 new PpapiHostMsg_PPBTCPSocket_Connect(socket_id_, host, port),
174 callback); 174 callback);
175 } 175 }
176 176
177 int32_t FlashTCPSocket::ConnectWithNetAddress( 177 int32_t TCPSocket::ConnectWithNetAddress(const PP_NetAddress* addr,
178 const PP_Flash_NetAddress* addr, 178 PP_CompletionCallback callback) {
179 PP_CompletionCallback callback) {
180 if (!addr) 179 if (!addr)
181 return PP_ERROR_BADARGUMENT; 180 return PP_ERROR_BADARGUMENT;
182 181
183 return ConnectWithMessage( 182 return ConnectWithMessage(
184 new PpapiHostMsg_PPBFlashTCPSocket_ConnectWithNetAddress( 183 new PpapiHostMsg_PPBTCPSocket_ConnectWithNetAddress(
185 socket_id_, *addr), 184 socket_id_, *addr),
186 callback); 185 callback);
187 } 186 }
188 187
189 PP_Bool FlashTCPSocket::GetLocalAddress(PP_Flash_NetAddress* local_addr) { 188 PP_Bool TCPSocket::GetLocalAddress(PP_NetAddress* local_addr) {
190 if (!IsConnected() || !local_addr) 189 if (!IsConnected() || !local_addr)
191 return PP_FALSE; 190 return PP_FALSE;
192 191
193 *local_addr = local_addr_; 192 *local_addr = local_addr_;
194 return PP_TRUE; 193 return PP_TRUE;
195 } 194 }
196 195
197 PP_Bool FlashTCPSocket::GetRemoteAddress(PP_Flash_NetAddress* remote_addr) { 196 PP_Bool TCPSocket::GetRemoteAddress(PP_NetAddress* remote_addr) {
198 if (!IsConnected() || !remote_addr) 197 if (!IsConnected() || !remote_addr)
199 return PP_FALSE; 198 return PP_FALSE;
200 199
201 *remote_addr = remote_addr_; 200 *remote_addr = remote_addr_;
202 return PP_TRUE; 201 return PP_TRUE;
203 } 202 }
204 203
205 int32_t FlashTCPSocket::SSLHandshake(const char* server_name, 204 int32_t TCPSocket::SSLHandshake(const char* server_name,
206 uint16_t server_port, 205 uint16_t server_port,
207 PP_CompletionCallback callback) { 206 PP_CompletionCallback callback) {
208 if (!server_name) 207 if (!server_name)
209 return PP_ERROR_BADARGUMENT; 208 return PP_ERROR_BADARGUMENT;
210 if (!callback.func) 209 if (!callback.func)
211 return PP_ERROR_BLOCKS_MAIN_THREAD; 210 return PP_ERROR_BLOCKS_MAIN_THREAD;
212 211
213 if (connection_state_ != CONNECTED) 212 if (connection_state_ != CONNECTED)
214 return PP_ERROR_FAILED; 213 return PP_ERROR_FAILED;
215 if (ssl_handshake_callback_.func || read_callback_.func || 214 if (ssl_handshake_callback_.func || read_callback_.func ||
216 write_callback_.func) 215 write_callback_.func)
217 return PP_ERROR_INPROGRESS; 216 return PP_ERROR_INPROGRESS;
218 217
219 ssl_handshake_callback_ = callback; 218 ssl_handshake_callback_ = callback;
220 219
221 // Send the request, the browser will call us back via SSLHandshakeACK. 220 // Send the request, the browser will call us back via SSLHandshakeACK.
222 GetDispatcher()->SendToBrowser( 221 GetDispatcher()->SendToBrowser(
223 new PpapiHostMsg_PPBFlashTCPSocket_SSLHandshake( 222 new PpapiHostMsg_PPBTCPSocket_SSLHandshake(
224 socket_id_, std::string(server_name), server_port)); 223 socket_id_, std::string(server_name), server_port));
225 return PP_OK_COMPLETIONPENDING; 224 return PP_OK_COMPLETIONPENDING;
226 } 225 }
227 226
228 int32_t FlashTCPSocket::Read(char* buffer, 227 int32_t TCPSocket::Read(char* buffer,
229 int32_t bytes_to_read, 228 int32_t bytes_to_read,
230 PP_CompletionCallback callback) { 229 PP_CompletionCallback callback) {
231 if (!buffer || bytes_to_read <= 0) 230 if (!buffer || bytes_to_read <= 0)
232 return PP_ERROR_BADARGUMENT; 231 return PP_ERROR_BADARGUMENT;
233 if (!callback.func) 232 if (!callback.func)
234 return PP_ERROR_BLOCKS_MAIN_THREAD; 233 return PP_ERROR_BLOCKS_MAIN_THREAD;
235 234
236 if (!IsConnected()) 235 if (!IsConnected())
237 return PP_ERROR_FAILED; 236 return PP_ERROR_FAILED;
238 if (read_callback_.func || ssl_handshake_callback_.func) 237 if (read_callback_.func || ssl_handshake_callback_.func)
239 return PP_ERROR_INPROGRESS; 238 return PP_ERROR_INPROGRESS;
240 239
241 read_buffer_ = buffer; 240 read_buffer_ = buffer;
242 bytes_to_read_ = std::min(bytes_to_read, kFlashTCPSocketMaxReadSize); 241 bytes_to_read_ = std::min(bytes_to_read, kTCPSocketMaxReadSize);
243 read_callback_ = callback; 242 read_callback_ = callback;
244 243
245 // Send the request, the browser will call us back via ReadACK. 244 // Send the request, the browser will call us back via ReadACK.
246 GetDispatcher()->SendToBrowser( 245 GetDispatcher()->SendToBrowser(
247 new PpapiHostMsg_PPBFlashTCPSocket_Read(socket_id_, bytes_to_read_)); 246 new PpapiHostMsg_PPBTCPSocket_Read(socket_id_, bytes_to_read_));
248 return PP_OK_COMPLETIONPENDING; 247 return PP_OK_COMPLETIONPENDING;
249 } 248 }
250 249
251 int32_t FlashTCPSocket::Write(const char* buffer, 250 int32_t TCPSocket::Write(const char* buffer,
252 int32_t bytes_to_write, 251 int32_t bytes_to_write,
253 PP_CompletionCallback callback) { 252 PP_CompletionCallback callback) {
254 if (!buffer || bytes_to_write <= 0) 253 if (!buffer || bytes_to_write <= 0)
255 return PP_ERROR_BADARGUMENT; 254 return PP_ERROR_BADARGUMENT;
256 if (!callback.func) 255 if (!callback.func)
257 return PP_ERROR_BLOCKS_MAIN_THREAD; 256 return PP_ERROR_BLOCKS_MAIN_THREAD;
258 257
259 if (!IsConnected()) 258 if (!IsConnected())
260 return PP_ERROR_FAILED; 259 return PP_ERROR_FAILED;
261 if (write_callback_.func || ssl_handshake_callback_.func) 260 if (write_callback_.func || ssl_handshake_callback_.func)
262 return PP_ERROR_INPROGRESS; 261 return PP_ERROR_INPROGRESS;
263 262
264 if (bytes_to_write > kFlashTCPSocketMaxWriteSize) 263 if (bytes_to_write > kTCPSocketMaxWriteSize)
265 bytes_to_write = kFlashTCPSocketMaxWriteSize; 264 bytes_to_write = kTCPSocketMaxWriteSize;
266 265
267 write_callback_ = callback; 266 write_callback_ = callback;
268 267
269 // Send the request, the browser will call us back via WriteACK. 268 // Send the request, the browser will call us back via WriteACK.
270 GetDispatcher()->SendToBrowser( 269 GetDispatcher()->SendToBrowser(
271 new PpapiHostMsg_PPBFlashTCPSocket_Write( 270 new PpapiHostMsg_PPBTCPSocket_Write(
272 socket_id_, std::string(buffer, bytes_to_write))); 271 socket_id_, std::string(buffer, bytes_to_write)));
273 return PP_OK_COMPLETIONPENDING; 272 return PP_OK_COMPLETIONPENDING;
274 } 273 }
275 274
276 void FlashTCPSocket::Disconnect() { 275 void TCPSocket::Disconnect() {
277 if (connection_state_ == DISCONNECTED) 276 if (connection_state_ == DISCONNECTED)
278 return; 277 return;
279 278
280 connection_state_ = DISCONNECTED; 279 connection_state_ = DISCONNECTED;
281 // After removed from the mapping, this object won't receive any notifications 280 // After removed from the mapping, this object won't receive any notifications
282 // from the proxy. 281 // from the proxy.
283 DCHECK(g_id_to_socket->find(socket_id_) != g_id_to_socket->end()); 282 DCHECK(g_id_to_socket->find(socket_id_) != g_id_to_socket->end());
284 g_id_to_socket->erase(socket_id_); 283 g_id_to_socket->erase(socket_id_);
285 284
286 GetDispatcher()->SendToBrowser( 285 GetDispatcher()->SendToBrowser(
287 new PpapiHostMsg_PPBFlashTCPSocket_Disconnect(socket_id_)); 286 new PpapiHostMsg_PPBTCPSocket_Disconnect(socket_id_));
288 socket_id_ = 0; 287 socket_id_ = 0;
289 288
290 PostAbortAndClearIfNecessary(&connect_callback_); 289 PostAbortAndClearIfNecessary(&connect_callback_);
291 PostAbortAndClearIfNecessary(&ssl_handshake_callback_); 290 PostAbortAndClearIfNecessary(&ssl_handshake_callback_);
292 PostAbortAndClearIfNecessary(&read_callback_); 291 PostAbortAndClearIfNecessary(&read_callback_);
293 PostAbortAndClearIfNecessary(&write_callback_); 292 PostAbortAndClearIfNecessary(&write_callback_);
294 read_buffer_ = NULL; 293 read_buffer_ = NULL;
295 bytes_to_read_ = -1; 294 bytes_to_read_ = -1;
296 } 295 }
297 296
298 void FlashTCPSocket::OnConnectCompleted( 297 void TCPSocket::OnConnectCompleted(bool succeeded,
299 bool succeeded, 298 const PP_NetAddress& local_addr,
300 const PP_Flash_NetAddress& local_addr, 299 const PP_NetAddress& remote_addr) {
301 const PP_Flash_NetAddress& remote_addr) {
302 if (connection_state_ != BEFORE_CONNECT || !connect_callback_.func) { 300 if (connection_state_ != BEFORE_CONNECT || !connect_callback_.func) {
303 NOTREACHED(); 301 NOTREACHED();
304 return; 302 return;
305 } 303 }
306 304
307 if (succeeded) { 305 if (succeeded) {
308 local_addr_ = local_addr; 306 local_addr_ = local_addr;
309 remote_addr_ = remote_addr; 307 remote_addr_ = remote_addr;
310 connection_state_ = CONNECTED; 308 connection_state_ = CONNECTED;
311 } 309 }
312 PP_RunAndClearCompletionCallback(&connect_callback_, 310 PP_RunAndClearCompletionCallback(&connect_callback_,
313 succeeded ? PP_OK : PP_ERROR_FAILED); 311 succeeded ? PP_OK : PP_ERROR_FAILED);
314 } 312 }
315 313
316 void FlashTCPSocket::OnSSLHandshakeCompleted(bool succeeded) { 314 void TCPSocket::OnSSLHandshakeCompleted(bool succeeded) {
317 if (connection_state_ != CONNECTED || !ssl_handshake_callback_.func) { 315 if (connection_state_ != CONNECTED || !ssl_handshake_callback_.func) {
318 NOTREACHED(); 316 NOTREACHED();
319 return; 317 return;
320 } 318 }
321 319
322 if (succeeded) { 320 if (succeeded) {
323 connection_state_ = SSL_CONNECTED; 321 connection_state_ = SSL_CONNECTED;
324 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_OK); 322 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_OK);
325 } else { 323 } else {
326 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_ERROR_FAILED); 324 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_ERROR_FAILED);
327 Disconnect(); 325 Disconnect();
328 } 326 }
329 } 327 }
330 328
331 void FlashTCPSocket::OnReadCompleted(bool succeeded, const std::string& data) { 329 void TCPSocket::OnReadCompleted(bool succeeded, const std::string& data) {
332 if (!read_callback_.func || !read_buffer_) { 330 if (!read_callback_.func || !read_buffer_) {
333 NOTREACHED(); 331 NOTREACHED();
334 return; 332 return;
335 } 333 }
336 334
337 if (succeeded) { 335 if (succeeded) {
338 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_); 336 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_);
339 if (!data.empty()) 337 if (!data.empty())
340 memcpy(read_buffer_, data.c_str(), data.size()); 338 memcpy(read_buffer_, data.c_str(), data.size());
341 } 339 }
342 read_buffer_ = NULL; 340 read_buffer_ = NULL;
343 bytes_to_read_ = -1; 341 bytes_to_read_ = -1;
344 342
345 PP_RunAndClearCompletionCallback( 343 PP_RunAndClearCompletionCallback(
346 &read_callback_, 344 &read_callback_,
347 succeeded ? static_cast<int32_t>(data.size()) : 345 succeeded ? static_cast<int32_t>(data.size()) :
348 static_cast<int32_t>(PP_ERROR_FAILED)); 346 static_cast<int32_t>(PP_ERROR_FAILED));
349 } 347 }
350 348
351 void FlashTCPSocket::OnWriteCompleted(bool succeeded, int32_t bytes_written) { 349 void TCPSocket::OnWriteCompleted(bool succeeded, int32_t bytes_written) {
352 if (!write_callback_.func || (succeeded && bytes_written < 0)) { 350 if (!write_callback_.func || (succeeded && bytes_written < 0)) {
353 NOTREACHED(); 351 NOTREACHED();
354 return; 352 return;
355 } 353 }
356 354
357 PP_RunAndClearCompletionCallback( 355 PP_RunAndClearCompletionCallback(
358 &write_callback_, 356 &write_callback_,
359 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); 357 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED));
360 } 358 }
361 359
362 bool FlashTCPSocket::IsConnected() const { 360 bool TCPSocket::IsConnected() const {
363 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; 361 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
364 } 362 }
365 363
366 int32_t FlashTCPSocket::ConnectWithMessage(IPC::Message* msg, 364 int32_t TCPSocket::ConnectWithMessage(IPC::Message* msg,
367 PP_CompletionCallback callback) { 365 PP_CompletionCallback callback) {
368 scoped_ptr<IPC::Message> msg_deletor(msg); 366 scoped_ptr<IPC::Message> msg_deletor(msg);
369 if (!callback.func) 367 if (!callback.func)
370 return PP_ERROR_BLOCKS_MAIN_THREAD; 368 return PP_ERROR_BLOCKS_MAIN_THREAD;
371 if (connection_state_ != BEFORE_CONNECT) 369 if (connection_state_ != BEFORE_CONNECT)
372 return PP_ERROR_FAILED; 370 return PP_ERROR_FAILED;
373 if (connect_callback_.func) 371 if (connect_callback_.func)
374 return PP_ERROR_INPROGRESS; // Can only have one pending request. 372 return PP_ERROR_INPROGRESS; // Can only have one pending request.
375 373
376 connect_callback_ = callback; 374 connect_callback_ = callback;
377 // Send the request, the browser will call us back via ConnectACK. 375 // Send the request, the browser will call us back via ConnectACK.
378 GetDispatcher()->SendToBrowser(msg_deletor.release()); 376 GetDispatcher()->SendToBrowser(msg_deletor.release());
379 return PP_OK_COMPLETIONPENDING; 377 return PP_OK_COMPLETIONPENDING;
380 } 378 }
381 379
382 void FlashTCPSocket::PostAbortAndClearIfNecessary( 380 void TCPSocket::PostAbortAndClearIfNecessary(PP_CompletionCallback* callback) {
383 PP_CompletionCallback* callback) {
384 DCHECK(callback); 381 DCHECK(callback);
385 382
386 if (callback->func) { 383 if (callback->func) {
387 MessageLoop::current()->PostTask(FROM_HERE, 384 MessageLoop::current()->PostTask(FROM_HERE,
388 new AbortCallbackTask(*callback)); 385 new AbortCallbackTask(*callback));
389 *callback = PP_BlockUntilComplete(); 386 *callback = PP_BlockUntilComplete();
390 } 387 }
391 } 388 }
392 389
393 PPB_Flash_TCPSocket_Proxy::PPB_Flash_TCPSocket_Proxy(Dispatcher* dispatcher) 390 PPB_TCPSocket_Proxy::PPB_TCPSocket_Proxy(Dispatcher* dispatcher)
394 : InterfaceProxy(dispatcher) { 391 : InterfaceProxy(dispatcher) {
395 } 392 }
396 393
397 PPB_Flash_TCPSocket_Proxy::~PPB_Flash_TCPSocket_Proxy() { 394 PPB_TCPSocket_Proxy::~PPB_TCPSocket_Proxy() {
398 } 395 }
399 396
400 // static 397 // static
401 PP_Resource PPB_Flash_TCPSocket_Proxy::CreateProxyResource( 398 PP_Resource PPB_TCPSocket_Proxy::CreateProxyResource(PP_Instance instance) {
402 PP_Instance instance) {
403 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 399 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
404 if (!dispatcher) 400 if (!dispatcher)
405 return 0; 401 return 0;
406 402
407 uint32 socket_id = 0; 403 uint32 socket_id = 0;
408 dispatcher->SendToBrowser(new PpapiHostMsg_PPBFlashTCPSocket_Create( 404 dispatcher->SendToBrowser(new PpapiHostMsg_PPBTCPSocket_Create(
409 API_ID_PPB_FLASH_TCPSOCKET, dispatcher->plugin_dispatcher_id(), 405 API_ID_PPB_TCPSOCKET, dispatcher->plugin_dispatcher_id(),
410 &socket_id)); 406 &socket_id));
411 if (socket_id == 0) 407 if (socket_id == 0)
412 return 0; 408 return 0;
413 return (new FlashTCPSocket(HostResource::MakeInstanceOnly(instance), 409 return (new TCPSocket(HostResource::MakeInstanceOnly(instance),
414 socket_id))->GetReference(); 410 socket_id))->GetReference();
415 } 411 }
416 412
417 bool PPB_Flash_TCPSocket_Proxy::OnMessageReceived(const IPC::Message& msg) { 413 bool PPB_TCPSocket_Proxy::OnMessageReceived(const IPC::Message& msg) {
418 bool handled = true; 414 bool handled = true;
419 IPC_BEGIN_MESSAGE_MAP(PPB_Flash_TCPSocket_Proxy, msg) 415 IPC_BEGIN_MESSAGE_MAP(PPB_TCPSocket_Proxy, msg)
420 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_ConnectACK, OnMsgConnectACK) 416 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ConnectACK, OnMsgConnectACK)
421 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_SSLHandshakeACK, 417 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_SSLHandshakeACK,
422 OnMsgSSLHandshakeACK) 418 OnMsgSSLHandshakeACK)
423 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_ReadACK, OnMsgReadACK) 419 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ReadACK, OnMsgReadACK)
424 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_WriteACK, OnMsgWriteACK) 420 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_WriteACK, OnMsgWriteACK)
425 IPC_MESSAGE_UNHANDLED(handled = false) 421 IPC_MESSAGE_UNHANDLED(handled = false)
426 IPC_END_MESSAGE_MAP() 422 IPC_END_MESSAGE_MAP()
427 return handled; 423 return handled;
428 } 424 }
429 425
430 void PPB_Flash_TCPSocket_Proxy::OnMsgConnectACK( 426 void PPB_TCPSocket_Proxy::OnMsgConnectACK(uint32 /* plugin_dispatcher_id */,
431 uint32 /* plugin_dispatcher_id */, 427 uint32 socket_id,
432 uint32 socket_id, 428 bool succeeded,
433 bool succeeded, 429 const PP_NetAddress& local_addr,
434 const PP_Flash_NetAddress& local_addr, 430 const PP_NetAddress& remote_addr) {
435 const PP_Flash_NetAddress& remote_addr) {
436 if (!g_id_to_socket) { 431 if (!g_id_to_socket) {
437 NOTREACHED(); 432 NOTREACHED();
438 return; 433 return;
439 } 434 }
440 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); 435 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id);
441 if (iter == g_id_to_socket->end()) 436 if (iter == g_id_to_socket->end())
442 return; 437 return;
443 iter->second->OnConnectCompleted(succeeded, local_addr, remote_addr); 438 iter->second->OnConnectCompleted(succeeded, local_addr, remote_addr);
444 } 439 }
445 440
446 void PPB_Flash_TCPSocket_Proxy::OnMsgSSLHandshakeACK( 441 void PPB_TCPSocket_Proxy::OnMsgSSLHandshakeACK(uint32 /*plugin_dispatcher_id*/,
447 uint32 /* plugin_dispatcher_id */, 442 uint32 socket_id,
448 uint32 socket_id, 443 bool succeeded) {
449 bool succeeded) {
450 if (!g_id_to_socket) { 444 if (!g_id_to_socket) {
451 NOTREACHED(); 445 NOTREACHED();
452 return; 446 return;
453 } 447 }
454 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); 448 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id);
455 if (iter == g_id_to_socket->end()) 449 if (iter == g_id_to_socket->end())
456 return; 450 return;
457 iter->second->OnSSLHandshakeCompleted(succeeded); 451 iter->second->OnSSLHandshakeCompleted(succeeded);
458 } 452 }
459 453
460 void PPB_Flash_TCPSocket_Proxy::OnMsgReadACK(uint32 /* plugin_dispatcher_id */, 454 void PPB_TCPSocket_Proxy::OnMsgReadACK(uint32 /* plugin_dispatcher_id */,
461 uint32 socket_id, 455 uint32 socket_id,
462 bool succeeded, 456 bool succeeded,
463 const std::string& data) { 457 const std::string& data) {
464 if (!g_id_to_socket) { 458 if (!g_id_to_socket) {
465 NOTREACHED(); 459 NOTREACHED();
466 return; 460 return;
467 } 461 }
468 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); 462 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id);
469 if (iter == g_id_to_socket->end()) 463 if (iter == g_id_to_socket->end())
470 return; 464 return;
471 iter->second->OnReadCompleted(succeeded, data); 465 iter->second->OnReadCompleted(succeeded, data);
472 } 466 }
473 467
474 void PPB_Flash_TCPSocket_Proxy::OnMsgWriteACK(uint32 /* plugin_dispatcher_id */, 468 void PPB_TCPSocket_Proxy::OnMsgWriteACK(uint32 /* plugin_dispatcher_id */,
475 uint32 socket_id, 469 uint32 socket_id,
476 bool succeeded, 470 bool succeeded,
477 int32_t bytes_written) { 471 int32_t bytes_written) {
478 if (!g_id_to_socket) { 472 if (!g_id_to_socket) {
479 NOTREACHED(); 473 NOTREACHED();
480 return; 474 return;
481 } 475 }
482 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); 476 IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id);
483 if (iter == g_id_to_socket->end()) 477 if (iter == g_id_to_socket->end())
484 return; 478 return;
485 iter->second->OnWriteCompleted(succeeded, bytes_written); 479 iter->second->OnWriteCompleted(succeeded, bytes_written);
486 } 480 }
487 481
488 } // namespace proxy 482 } // namespace proxy
489 } // namespace ppapi 483 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698