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

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

Issue 9669038: Added out-of-process support for server sockets. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: PPB_TCPServerSocket_Private_Proxy constructor from Dispatcher* marked as explicit. Created 8 years, 9 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 "ppapi/proxy/ppb_tcp_server_socket_private_proxy.h"
6
7 #include <cstddef>
8 #include <map>
9
10 #include "base/logging.h"
11 #include "ppapi/c/pp_errors.h"
12 #include "ppapi/proxy/plugin_dispatcher.h"
13 #include "ppapi/proxy/plugin_globals.h"
14 #include "ppapi/proxy/plugin_proxy_delegate.h"
15 #include "ppapi/proxy/plugin_resource_tracker.h"
16 #include "ppapi/proxy/ppapi_messages.h"
17 #include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
18 #include "ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h"
19 #include "ppapi/shared_impl/resource.h"
20 #include "ppapi/thunk/thunk.h"
21
22 namespace ppapi {
23 namespace proxy {
24
25 namespace {
26
27 typedef std::map<uint32, PPB_TCPServerSocket_Shared*> IDToServerSocketMap;
28 IDToServerSocketMap* g_id_to_uninitialized_server_socket = NULL;
brettw 2012/03/12 06:27:21 You shouldn't need this uninitialized socket ID ma
ygorshenin1 2012/03/12 12:59:38 In the PROXY case, host_resource().host_resource()
brettw 2012/03/12 15:22:49 Oh, sorry. You should just do plain EnterResource<
ygorshenin1 2012/03/13 11:33:17 Done.
29 IDToServerSocketMap* g_id_to_initialized_server_socket = NULL;
30
31 class TCPServerSocket : public PPB_TCPServerSocket_Shared {
32 public:
33 TCPServerSocket(const HostResource& resource, uint32 plugin_dispatcher_id);
34 virtual ~TCPServerSocket();
35
36 virtual void OnAcceptCompleted(
37 bool succeeded,
38 uint32 tcp_socket_id,
39 const PP_NetAddress_Private& local_addr,
40 const PP_NetAddress_Private& remote_addr) OVERRIDE;
41
42 virtual void SendListen(uint32 temp_socket_id,
43 const PP_NetAddress_Private& addr,
44 int32_t backlog) OVERRIDE;
45 virtual void SendAccept() OVERRIDE;
46 virtual void SendStopListening() OVERRIDE;
47
48 private:
49 void SendToBrowser(IPC::Message* msg);
50
51 uint32 plugin_dispatcher_id_;
52
53 DISALLOW_COPY_AND_ASSIGN(TCPServerSocket);
54 };
55
56 TCPServerSocket::TCPServerSocket(const HostResource& resource,
57 uint32 plugin_dispatcher_id)
58 : PPB_TCPServerSocket_Shared(resource),
59 plugin_dispatcher_id_(plugin_dispatcher_id) {
60 if (!g_id_to_uninitialized_server_socket)
61 g_id_to_uninitialized_server_socket = new IDToServerSocketMap();
62 if (!g_id_to_initialized_server_socket)
63 g_id_to_initialized_server_socket = new IDToServerSocketMap();
64 }
65
66 TCPServerSocket::~TCPServerSocket() {
67 StopListening();
68 }
69
70 void TCPServerSocket::OnAcceptCompleted(
71 bool succeeded,
72 uint32 tcp_socket_id,
73 const PP_NetAddress_Private& local_addr,
74 const PP_NetAddress_Private& remote_addr) {
75 if (!::ppapi::TrackedCallback::IsPending(accept_callback_) ||
76 !tcp_socket_buffer_) {
77 NOTREACHED();
78 return;
79 }
80
81 if (succeeded) {
82 *tcp_socket_buffer_ =
83 PPB_TCPSocket_Private_Proxy::CreateProxyResourceForConnectedSocket(
84 pp_instance(),
85 tcp_socket_id,
86 local_addr,
87 remote_addr);
88 }
89 tcp_socket_buffer_ = NULL;
90
91 ::ppapi::TrackedCallback::ClearAndRun(&accept_callback_,
brettw 2012/03/12 06:27:21 You shouldn't need the ::ppapi:: anywhere in this
ygorshenin1 2012/03/13 11:33:17 Done.
92 succeeded ? PP_OK : PP_ERROR_FAILED);
93 }
94
95 void TCPServerSocket::SendListen(uint32 temp_socket_id,
96 const PP_NetAddress_Private& addr,
97 int32_t backlog) {
98 if (!g_id_to_uninitialized_server_socket ||
99 !g_id_to_initialized_server_socket) {
100 NOTREACHED();
101 return;
102 }
103
104 (*g_id_to_uninitialized_server_socket)[temp_socket_id] = this;
105 SendToBrowser(new PpapiHostMsg_PPBTCPServerSocket_Listen(
106 API_ID_PPB_TCPSERVERSOCKET_PRIVATE,
107 plugin_dispatcher_id_,
108 temp_socket_id,
109 addr,
110 backlog));
111 }
112
113 void TCPServerSocket::SendAccept() {
114 SendToBrowser(new PpapiHostMsg_PPBTCPServerSocket_Accept(
115 API_ID_PPB_TCPSOCKET_PRIVATE,
116 real_socket_id_));
117 }
118
119 void TCPServerSocket::SendStopListening() {
120 if (!g_id_to_uninitialized_server_socket ||
121 !g_id_to_initialized_server_socket) {
122 NOTREACHED();
123 return;
124 }
125
126 if (real_socket_id_ == 0) {
127 g_id_to_uninitialized_server_socket->erase(temp_socket_id_);
128 } else {
129 g_id_to_initialized_server_socket->erase(real_socket_id_);
130 SendToBrowser(new PpapiHostMsg_PPBTCPServerSocket_Destroy(real_socket_id_));
131 }
132 }
133
134 void TCPServerSocket::SendToBrowser(IPC::Message* msg) {
135 PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(msg);
136 }
137
138 } // namespace
139
140 //------------------------------------------------------------------------------
141
142 PPB_TCPServerSocket_Private_Proxy::PPB_TCPServerSocket_Private_Proxy(
143 Dispatcher* dispatcher)
144 : InterfaceProxy(dispatcher) {
145 }
146
147 PPB_TCPServerSocket_Private_Proxy::~PPB_TCPServerSocket_Private_Proxy() {
148 }
149
150 PP_Resource PPB_TCPServerSocket_Private_Proxy::CreateProxyResource(
151 PP_Instance instance) {
152 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
153 if (!dispatcher)
154 return 0;
155
156 TCPServerSocket* server_socket =
157 new TCPServerSocket(HostResource::MakeInstanceOnly(instance),
158 dispatcher->plugin_dispatcher_id());
159 return server_socket->GetReference();
160 }
161
162 bool PPB_TCPServerSocket_Private_Proxy::OnMessageReceived(
163 const IPC::Message& msg) {
164 bool handled = true;
165 IPC_BEGIN_MESSAGE_MAP(PPB_TCPServerSocket_Private_Proxy, msg)
166 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPServerSocket_ListenACK, OnMsgListenACK)
167 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPServerSocket_AcceptACK, OnMsgAcceptACK)
168 IPC_MESSAGE_UNHANDLED(handled = false)
169 IPC_END_MESSAGE_MAP()
170 return handled;
171 }
172
173 void PPB_TCPServerSocket_Private_Proxy::OnMsgListenACK(
174 uint32 plugin_dispatcher_id,
175 uint32 real_socket_id,
176 uint32 temp_socket_id,
177 int32_t status) {
brettw 2012/03/12 06:27:21 I think you only need g_id_to_initialized_server_s
ygorshenin1 2012/03/13 11:33:17 Done.
178 if (!g_id_to_uninitialized_server_socket ||
179 !g_id_to_initialized_server_socket) {
180 NOTREACHED();
181 return;
182 }
183 IDToServerSocketMap::iterator it =
184 g_id_to_uninitialized_server_socket->find(temp_socket_id);
185 if (it == g_id_to_uninitialized_server_socket->end()) {
186 IPC::Message* msg =
187 new PpapiHostMsg_PPBTCPServerSocket_Destroy(real_socket_id);
188 PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(msg);
189 } else {
190 PPB_TCPServerSocket_Shared* server_socket = it->second;
191 g_id_to_uninitialized_server_socket->erase(it);
192
193 if (status == PP_OK)
194 (*g_id_to_initialized_server_socket)[real_socket_id] = server_socket;
195 server_socket->OnListenCompleted(real_socket_id, status);
196 }
197 }
198
199 void PPB_TCPServerSocket_Private_Proxy::OnMsgAcceptACK(
200 uint32 plugin_dispatcher_id,
201 uint32 real_socket_id,
202 uint32 accepted_socket_id,
203 const PP_NetAddress_Private& local_addr,
204 const PP_NetAddress_Private& remote_addr) {
205 if (!g_id_to_uninitialized_server_socket ||
206 !g_id_to_initialized_server_socket) {
207 NOTREACHED();
208 return;
209 }
210 IDToServerSocketMap::iterator it =
211 g_id_to_initialized_server_socket->find(real_socket_id);
212 if (it != g_id_to_initialized_server_socket->end()) {
213 bool succeeded = accepted_socket_id != 0;
214 it->second->OnAcceptCompleted(succeeded,
215 accepted_socket_id,
216 local_addr,
217 remote_addr);
218 }
219 }
220
221 } // namespace proxy
222 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/ppb_tcp_server_socket_private_proxy.h ('k') | ppapi/proxy/ppb_tcp_socket_private_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698