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

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: Sync. 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/c/pp_errors.h"
17 #include "ppapi/proxy/ppapi_messages.h"
18 #include "ppapi/shared_impl/private/net_address_private_impl.h"
19
20 using content::BrowserThread;
21 using ppapi::NetAddressPrivateImpl;
22
23 PepperTCPServerSocket::PepperTCPServerSocket(
24 PepperMessageFilter* manager,
25 int32 routing_id,
26 uint32 plugin_dispatcher_id,
27 uint32 real_socket_id,
28 uint32 temp_socket_id)
29 : manager_(manager),
30 routing_id_(routing_id),
31 plugin_dispatcher_id_(plugin_dispatcher_id),
32 real_socket_id_(real_socket_id),
33 temp_socket_id_(temp_socket_id),
34 state_(BEFORE_LISTENING) {
35 DCHECK(manager);
36 }
37
38 PepperTCPServerSocket::~PepperTCPServerSocket() {
39 }
40
41 void PepperTCPServerSocket::Listen(const PP_NetAddress_Private& addr,
42 int32 backlog) {
43 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
44
45 net::IPEndPoint ip_end_point;
46 if (state_ != BEFORE_LISTENING ||
47 !NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &ip_end_point)) {
48 CancelListenRequest();
49 return;
50 }
51
52 state_ = LISTEN_IN_PROGRESS;
53
54 socket_.reset(new net::TCPServerSocket(NULL, net::NetLog::Source()));
55 int result = socket_->Listen(ip_end_point, backlog);
56 if (result != net::ERR_IO_PENDING)
57 OnListenCompleted(result);
58 }
59
60 void PepperTCPServerSocket::Accept() {
61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
62
63 if (state_ != LISTENING) {
64 SendAcceptACKError();
65 return;
66 }
67
68 state_ = ACCEPT_IN_PROGRESS;
69
70 int result = socket_->Accept(
71 &socket_buffer_,
72 base::Bind(&PepperTCPServerSocket::OnAcceptCompleted,
73 base::Unretained(this)));
74 if (result != net::ERR_IO_PENDING)
75 OnAcceptCompleted(result);
76 }
77
78 void PepperTCPServerSocket::CancelListenRequest() {
79 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
80 routing_id_,
81 plugin_dispatcher_id_,
82 0,
83 temp_socket_id_,
84 PP_ERROR_FAILED));
85 BrowserThread::PostTask(
86 BrowserThread::IO,
87 FROM_HERE,
88 base::Bind(&PepperMessageFilter::RemoveTCPServerSocket, manager_,
89 real_socket_id_));
90 }
91
92 void PepperTCPServerSocket::SendAcceptACKError() {
93 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
94 routing_id_,
95 plugin_dispatcher_id_,
96 real_socket_id_,
97 0,
98 NetAddressPrivateImpl::kInvalidNetAddress,
99 NetAddressPrivateImpl::kInvalidNetAddress));
100 }
101
102 void PepperTCPServerSocket::OnListenCompleted(int result) {
103 DCHECK(state_ == LISTEN_IN_PROGRESS && socket_.get());
104
105 if (result != net::OK) {
106 CancelListenRequest();
107 } else {
108 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
109 routing_id_,
110 plugin_dispatcher_id_,
111 real_socket_id_,
112 temp_socket_id_,
113 PP_OK));
114 state_ = LISTENING;
115 }
116 }
117
118 void PepperTCPServerSocket::OnAcceptCompleted(int result) {
119 DCHECK(state_ == ACCEPT_IN_PROGRESS && socket_buffer_.get());
120
121 if (result != net::OK) {
122 SendAcceptACKError();
123 } else {
124 scoped_ptr<net::StreamSocket> socket(socket_buffer_.release());
125
126 net::IPEndPoint ip_end_point;
127 net::AddressList address_list;
128 PP_NetAddress_Private local_addr =
129 NetAddressPrivateImpl::kInvalidNetAddress;
130 PP_NetAddress_Private remote_addr =
131 NetAddressPrivateImpl::kInvalidNetAddress;
132
133 if (socket->GetLocalAddress(&ip_end_point) != net::OK ||
134 !NetAddressPrivateImpl::IPEndPointToNetAddress(ip_end_point,
135 &local_addr) ||
136 socket->GetPeerAddress(&address_list) != net::OK ||
137 !NetAddressPrivateImpl::AddressListToNetAddress(address_list,
138 &remote_addr)) {
139 SendAcceptACKError();
140 } else {
141 uint32 accepted_socket_id =
142 manager_->AddAcceptedTCPSocket(routing_id_,
143 plugin_dispatcher_id_,
144 socket.release());
145 if (accepted_socket_id != 0) {
146 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
147 routing_id_,
148 plugin_dispatcher_id_,
149 real_socket_id_,
150 accepted_socket_id,
151 local_addr,
152 remote_addr));
153 } else {
154 SendAcceptACKError();
155 }
156 }
157 }
158
159 state_ = LISTENING;
160 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/pepper_tcp_server_socket.h ('k') | content/browser/renderer_host/pepper_tcp_socket.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698