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

Side by Side Diff: content/browser/renderer_host/pepper_tcp_server_socket.cc

Issue 9283022: Exposed Listen and Accept methods to plugin. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Added Destroy message for initialized but cancelled sockets. Created 8 years, 10 months 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
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 "content/browser/renderer_host/pepper_tcp_server_socket.h"
6
7 #include <cstddef>
8
9 #include "base/logging.h"
10 #include "content/browser/renderer_host/pepper_message_filter.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "net/base/ip_endpoint.h"
13 #include "net/base/net_errors.h"
14 #include "net/socket/tcp_client_socket.h"
15 #include "net/socket/tcp_server_socket.h"
16 #include "ppapi/proxy/ppapi_messages.h"
17 #include "ppapi/shared_impl/private/net_address_private_impl.h"
18
19 using content::BrowserThread;
20 using ppapi::NetAddressPrivateImpl;
21
22 PepperTCPServerSocket::PepperTCPServerSocket(
23 PepperMessageFilter* manager,
24 int32 routing_id,
25 uint32 plugin_dispatcher_id,
26 uint32 socket_id)
27 : manager_(manager),
28 routing_id_(routing_id),
29 plugin_dispatcher_id_(plugin_dispatcher_id),
30 socket_id_(socket_id),
31 state_(BEFORE_LISTENING) {
32 DCHECK(manager);
33 }
34
35 PepperTCPServerSocket::~PepperTCPServerSocket() {
36 }
37
38 void PepperTCPServerSocket::Listen(const PP_NetAddress_Private& addr,
39 int32 backlog) {
40 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
41
42 net::IPEndPoint ip_end_point;
43 if (state_ != BEFORE_LISTENING ||
44 !NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &ip_end_point)) {
45 SendListenACKError();
46 return;
47 }
48
49 state_ = LISTEN_IN_PROGRESS;
50
51 socket_.reset(new net::TCPServerSocket(NULL, net::NetLog::Source()));
52 int result = socket_->Listen(ip_end_point, backlog);
53 if (result != net::ERR_IO_PENDING)
54 OnListenCompleted(result);
55 }
56
57 void PepperTCPServerSocket::Accept() {
58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
59
60 if (state_ != LISTENING) {
61 SendAcceptACKError();
62 return;
63 }
64
65 state_ = ACCEPT_IN_PROGRESS;
66
67 int result = socket_->Accept(
68 &socket_buffer_,
69 base::Bind(&PepperTCPServerSocket::OnAcceptCompleted,
70 base::Unretained(this)));
71 if (result != net::ERR_IO_PENDING)
72 OnAcceptCompleted(result);
73 }
74
75 void PepperTCPServerSocket::SendListenACKError() {
76 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
77 routing_id_, plugin_dispatcher_id_, socket_id_, false));
78 }
79
80 void PepperTCPServerSocket::SendAcceptACKError() {
81 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
82 routing_id_,
83 plugin_dispatcher_id_,
84 socket_id_,
85 0,
86 NetAddressPrivateImpl::kInvalidNetAddress,
87 NetAddressPrivateImpl::kInvalidNetAddress));
88 }
89
90 void PepperTCPServerSocket::OnListenCompleted(int result) {
91 DCHECK(state_ == LISTEN_IN_PROGRESS && socket_.get());
92
93 if (result != net::OK) {
94 SendListenACKError();
95 state_ = BEFORE_LISTENING;
96 } else {
97 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
98 routing_id_, plugin_dispatcher_id_, socket_id_, true));
99 state_ = LISTENING;
100 }
101 }
102
103 void PepperTCPServerSocket::OnAcceptCompleted(int result) {
104 DCHECK(state_ == ACCEPT_IN_PROGRESS && socket_buffer_.get());
105
106 if (result != net::OK) {
107 SendAcceptACKError();
108 } else {
109 net::StreamSocket* socket = socket_buffer_.release();
yzshen1 2012/02/10 22:40:15 I would suggest to transfer socket_buffer_ to a te
ygorshenin1 2012/02/13 14:59:46 Done.
110
111 net::IPEndPoint ip_end_point;
112 net::AddressList address_list;
113 PP_NetAddress_Private local_addr =
114 NetAddressPrivateImpl::kInvalidNetAddress;
115 PP_NetAddress_Private remote_addr =
116 NetAddressPrivateImpl::kInvalidNetAddress;
117
118 if (socket->GetLocalAddress(&ip_end_point) != net::OK ||
119 !NetAddressPrivateImpl::IPEndPointToNetAddress(ip_end_point,
120 &local_addr) ||
121 socket->GetPeerAddress(&address_list) != net::OK ||
122 !NetAddressPrivateImpl::AddressListToNetAddress(address_list,
123 &remote_addr)) {
124 SendAcceptACKError();
yzshen1 2012/02/10 22:40:15 If you SendAcceptACKError(), you don't need to pro
ygorshenin1 2012/02/13 14:59:46 Done.
125 }
126 uint32 accepted_socket_id =
127 manager_->AddAcceptedTCPSocket(routing_id_,
128 plugin_dispatcher_id_,
129 socket);
130 if (accepted_socket_id != 0) {
yzshen1 2012/02/10 22:40:15 Please note that you still need to send an error r
ygorshenin1 2012/02/13 14:59:46 Done.
131 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
132 routing_id_,
133 plugin_dispatcher_id_,
134 socket_id_,
135 accepted_socket_id,
136 local_addr,
137 remote_addr));
138 }
139 }
140
141 state_ = LISTENING;
142 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698