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

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

Issue 19005006: Switched proxy for TCPServerSocketPrivate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed content_unittests. Created 7 years, 5 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 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/tcp_server_socket_private_resource.h"
6
7 #include "ppapi/proxy/plugin_dispatcher.h"
8 #include "ppapi/proxy/ppapi_messages.h"
9 #include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
10
11 namespace ppapi {
12 namespace proxy {
13
14 TCPServerSocketPrivateResource::TCPServerSocketPrivateResource(
15 Connection connection,
16 PP_Instance instance)
17 : PluginResource(connection, instance),
18 state_(STATE_BEFORE_LISTENING),
19 local_addr_(),
20 plugin_dispatcher_id_(0) {
21 SendCreate(BROWSER, PpapiHostMsg_TCPServerSocket_CreatePrivate());
22
23 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
24 if (dispatcher)
25 plugin_dispatcher_id_ = dispatcher->plugin_dispatcher_id();
26 else
27 NOTREACHED();
28 }
29
30 TCPServerSocketPrivateResource::~TCPServerSocketPrivateResource() {
31 }
32
33 thunk::PPB_TCPServerSocket_Private_API*
34 TCPServerSocketPrivateResource::AsPPB_TCPServerSocket_Private_API() {
35 return this;
36 }
37
38 int32_t TCPServerSocketPrivateResource::Listen(
39 const PP_NetAddress_Private* addr,
40 int32_t backlog,
41 scoped_refptr<TrackedCallback> callback) {
42 if (!addr)
43 return PP_ERROR_BADARGUMENT;
44 if (state_ == STATE_LISTEN_IN_PROGRESS)
45 return PP_ERROR_INPROGRESS;
46 if (state_ != STATE_BEFORE_LISTENING)
47 return PP_ERROR_FAILED;
48 state_ = STATE_LISTEN_IN_PROGRESS;
49
50 // Send the request, the browser will call us back via ListenACK
51 Call<PpapiPluginMsg_TCPServerSocket_ListenReply>(
52 BROWSER,
53 PpapiHostMsg_TCPServerSocket_Listen(*addr, backlog),
54 base::Bind(&TCPServerSocketPrivateResource::OnPluginMsgListenReply,
55 base::Unretained(this),
56 callback));
57 return PP_OK_COMPLETIONPENDING;
58 }
59
60 int32_t TCPServerSocketPrivateResource::Accept(
61 PP_Resource* tcp_socket,
62 scoped_refptr<TrackedCallback> callback) {
63 if (!tcp_socket)
64 return PP_ERROR_BADARGUMENT;
65 if (state_ == STATE_ACCEPT_IN_PROGRESS)
66 return PP_ERROR_INPROGRESS;
67 if (state_ != STATE_LISTENING)
68 return PP_ERROR_FAILED;
69
70 state_ = STATE_ACCEPT_IN_PROGRESS;
71
72 Call<PpapiPluginMsg_TCPServerSocket_AcceptReply>(
73 BROWSER,
74 PpapiHostMsg_TCPServerSocket_Accept(plugin_dispatcher_id_),
75 base::Bind(&TCPServerSocketPrivateResource::OnPluginMsgAcceptReply,
76 base::Unretained(this),
77 tcp_socket, callback));
78 return PP_OK_COMPLETIONPENDING;
79 }
80
81 int32_t TCPServerSocketPrivateResource::GetLocalAddress(
82 PP_NetAddress_Private* addr) {
83 if (!addr)
84 return PP_ERROR_BADARGUMENT;
85 if (state_ != STATE_LISTENING)
yzshen1 2013/07/19 23:51:58 The previous behavior is that if there is a pendin
ygorshenin1 2013/07/29 14:03:57 Done.
86 return PP_ERROR_FAILED;
87 *addr = local_addr_;
88 return PP_OK;
89 }
90
91 void TCPServerSocketPrivateResource::StopListening() {
92 if (state_ == STATE_CLOSED)
93 return;
94 state_ = STATE_CLOSED;
95 Post(BROWSER, PpapiHostMsg_TCPServerSocket_StopListening());
yzshen1 2013/07/19 23:51:58 It is nice to abort listen/accept callbacks here,
ygorshenin1 2013/07/29 14:03:57 Done.
96 }
97
98 void TCPServerSocketPrivateResource::OnPluginMsgListenReply(
99 scoped_refptr<TrackedCallback> callback,
100 const ResourceMessageReplyParams& params,
101 const PP_NetAddress_Private& local_addr) {
102 if (state_ != STATE_LISTEN_IN_PROGRESS ||
103 !TrackedCallback::IsPending(callback)) {
104 return;
105 }
106 if (params.result() == PP_OK) {
107 local_addr_ = local_addr;
108 state_ = STATE_LISTENING;
yzshen1 2013/07/19 23:51:58 We should properly set |state_| on failure. The p
ygorshenin1 2013/07/29 14:03:57 Done.
109 }
110 callback->Run(params.result());
111 }
112
113 void TCPServerSocketPrivateResource::OnPluginMsgAcceptReply(
114 PP_Resource* tcp_socket,
115 scoped_refptr<TrackedCallback> callback,
116 const ResourceMessageReplyParams& params,
117 uint32 accepted_socket_id,
118 const PP_NetAddress_Private& local_addr,
119 const PP_NetAddress_Private& remote_addr) {
120 DCHECK(tcp_socket);
121 if (state_ != STATE_ACCEPT_IN_PROGRESS ||
122 !TrackedCallback::IsPending(callback)) {
123 return;
yzshen1 2013/07/19 23:51:58 Please also reset |state_| here.
ygorshenin1 2013/07/29 14:03:57 Done.
124 }
125 if (params.result() == PP_OK) {
126 *tcp_socket =
127 PPB_TCPSocket_Private_Proxy::CreateProxyResourceForConnectedSocket(
128 pp_instance(),
129 accepted_socket_id,
130 local_addr,
131 remote_addr);
132 }
133 state_ = STATE_LISTENING;
134 callback->Run(params.result());
135 }
136
137 } // namespace proxy
138 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698