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

Side by Side Diff: ppapi/shared_impl/private/tcp_socket_private_impl.cc

Issue 9053003: Convert ppapi/shared to use TrackedCallback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review comments Created 8 years, 11 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
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/shared_impl/private/tcp_socket_private_impl.h" 5 #include "ppapi/shared_impl/private/tcp_socket_private_impl.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/message_loop.h" 14 #include "base/message_loop.h"
15 #include "ppapi/c/pp_completion_callback.h" 15 #include "ppapi/c/pp_completion_callback.h"
16 #include "ppapi/c/pp_errors.h" 16 #include "ppapi/c/pp_errors.h"
17 17
18 namespace ppapi { 18 namespace ppapi {
19 19
20 namespace {
21
22 void AbortCallback(PP_CompletionCallback callback) {
23 PP_RunCompletionCallback(&callback, PP_ERROR_ABORTED);
24 }
25
26 } // namespace
27
28 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; 20 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024;
29 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; 21 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024;
30 22
31 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance, 23 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance,
32 uint32 socket_id) 24 uint32 socket_id)
33 : Resource(instance) { 25 : Resource(instance) {
34 Init(socket_id); 26 Init(socket_id);
35 } 27 }
36 28
37 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource, 29 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource,
(...skipping 12 matching lines...) Expand all
50 42
51 int32_t TCPSocketPrivateImpl::Connect(const char* host, 43 int32_t TCPSocketPrivateImpl::Connect(const char* host,
52 uint16_t port, 44 uint16_t port,
53 PP_CompletionCallback callback) { 45 PP_CompletionCallback callback) {
54 if (!host) 46 if (!host)
55 return PP_ERROR_BADARGUMENT; 47 return PP_ERROR_BADARGUMENT;
56 if (!callback.func) 48 if (!callback.func)
57 return PP_ERROR_BLOCKS_MAIN_THREAD; 49 return PP_ERROR_BLOCKS_MAIN_THREAD;
58 if (connection_state_ != BEFORE_CONNECT) 50 if (connection_state_ != BEFORE_CONNECT)
59 return PP_ERROR_FAILED; 51 return PP_ERROR_FAILED;
60 if (connect_callback_.func) 52 if (TrackedCallback::IsPending(connect_callback_))
61 return PP_ERROR_INPROGRESS; // Can only have one pending request. 53 return PP_ERROR_INPROGRESS; // Can only have one pending request.
62 54
63 connect_callback_ = callback; 55 connect_callback_ = new TrackedCallback(this, callback);
64 // Send the request, the browser will call us back via ConnectACK. 56 // Send the request, the browser will call us back via ConnectACK.
65 SendConnect(host, port); 57 SendConnect(host, port);
66 return PP_OK_COMPLETIONPENDING; 58 return PP_OK_COMPLETIONPENDING;
67 } 59 }
68 60
69 int32_t TCPSocketPrivateImpl::ConnectWithNetAddress( 61 int32_t TCPSocketPrivateImpl::ConnectWithNetAddress(
70 const PP_NetAddress_Private* addr, 62 const PP_NetAddress_Private* addr,
71 PP_CompletionCallback callback) { 63 PP_CompletionCallback callback) {
72 if (!addr) 64 if (!addr)
73 return PP_ERROR_BADARGUMENT; 65 return PP_ERROR_BADARGUMENT;
74 if (!callback.func) 66 if (!callback.func)
75 return PP_ERROR_BLOCKS_MAIN_THREAD; 67 return PP_ERROR_BLOCKS_MAIN_THREAD;
76 if (connection_state_ != BEFORE_CONNECT) 68 if (connection_state_ != BEFORE_CONNECT)
77 return PP_ERROR_FAILED; 69 return PP_ERROR_FAILED;
78 if (connect_callback_.func) 70 if (TrackedCallback::IsPending(connect_callback_))
79 return PP_ERROR_INPROGRESS; // Can only have one pending request. 71 return PP_ERROR_INPROGRESS; // Can only have one pending request.
80 72
81 connect_callback_ = callback; 73 connect_callback_ = new TrackedCallback(this, callback);
82 // Send the request, the browser will call us back via ConnectACK. 74 // Send the request, the browser will call us back via ConnectACK.
83 SendConnectWithNetAddress(*addr); 75 SendConnectWithNetAddress(*addr);
84 return PP_OK_COMPLETIONPENDING; 76 return PP_OK_COMPLETIONPENDING;
85 } 77 }
86 78
87 PP_Bool TCPSocketPrivateImpl::GetLocalAddress( 79 PP_Bool TCPSocketPrivateImpl::GetLocalAddress(
88 PP_NetAddress_Private* local_addr) { 80 PP_NetAddress_Private* local_addr) {
89 if (!IsConnected() || !local_addr) 81 if (!IsConnected() || !local_addr)
90 return PP_FALSE; 82 return PP_FALSE;
91 83
(...skipping 13 matching lines...) Expand all
105 int32_t TCPSocketPrivateImpl::SSLHandshake(const char* server_name, 97 int32_t TCPSocketPrivateImpl::SSLHandshake(const char* server_name,
106 uint16_t server_port, 98 uint16_t server_port,
107 PP_CompletionCallback callback) { 99 PP_CompletionCallback callback) {
108 if (!server_name) 100 if (!server_name)
109 return PP_ERROR_BADARGUMENT; 101 return PP_ERROR_BADARGUMENT;
110 if (!callback.func) 102 if (!callback.func)
111 return PP_ERROR_BLOCKS_MAIN_THREAD; 103 return PP_ERROR_BLOCKS_MAIN_THREAD;
112 104
113 if (connection_state_ != CONNECTED) 105 if (connection_state_ != CONNECTED)
114 return PP_ERROR_FAILED; 106 return PP_ERROR_FAILED;
115 if (ssl_handshake_callback_.func || read_callback_.func || 107 if (TrackedCallback::IsPending(ssl_handshake_callback_) ||
116 write_callback_.func) 108 TrackedCallback::IsPending(read_callback_) ||
109 TrackedCallback::IsPending(write_callback_))
117 return PP_ERROR_INPROGRESS; 110 return PP_ERROR_INPROGRESS;
118 111
119 ssl_handshake_callback_ = callback; 112 ssl_handshake_callback_ = new TrackedCallback(this, callback);
120 113
121 // Send the request, the browser will call us back via SSLHandshakeACK. 114 // Send the request, the browser will call us back via SSLHandshakeACK.
122 SendSSLHandshake(server_name, server_port); 115 SendSSLHandshake(server_name, server_port);
123 return PP_OK_COMPLETIONPENDING; 116 return PP_OK_COMPLETIONPENDING;
124 } 117 }
125 118
126 int32_t TCPSocketPrivateImpl::Read(char* buffer, 119 int32_t TCPSocketPrivateImpl::Read(char* buffer,
127 int32_t bytes_to_read, 120 int32_t bytes_to_read,
128 PP_CompletionCallback callback) { 121 PP_CompletionCallback callback) {
129 if (!buffer || bytes_to_read <= 0) 122 if (!buffer || bytes_to_read <= 0)
130 return PP_ERROR_BADARGUMENT; 123 return PP_ERROR_BADARGUMENT;
131 if (!callback.func) 124 if (!callback.func)
132 return PP_ERROR_BLOCKS_MAIN_THREAD; 125 return PP_ERROR_BLOCKS_MAIN_THREAD;
133 126
134 if (!IsConnected()) 127 if (!IsConnected())
135 return PP_ERROR_FAILED; 128 return PP_ERROR_FAILED;
136 if (read_callback_.func || ssl_handshake_callback_.func) 129 if (TrackedCallback::IsPending(read_callback_) ||
130 TrackedCallback::IsPending(ssl_handshake_callback_))
137 return PP_ERROR_INPROGRESS; 131 return PP_ERROR_INPROGRESS;
138 // TODO(dmichael): use some other strategy for determining if an 132 // TODO(dmichael): use some other strategy for determining if an
139 // operation is in progress 133 // operation is in progress
140 read_buffer_ = buffer; 134 read_buffer_ = buffer;
141 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); 135 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize);
142 read_callback_ = callback; 136 read_callback_ = new TrackedCallback(this, callback);
143 137
144 // Send the request, the browser will call us back via ReadACK. 138 // Send the request, the browser will call us back via ReadACK.
145 SendRead(bytes_to_read_); 139 SendRead(bytes_to_read_);
146 return PP_OK_COMPLETIONPENDING; 140 return PP_OK_COMPLETIONPENDING;
147 } 141 }
148 142
149 int32_t TCPSocketPrivateImpl::Write(const char* buffer, 143 int32_t TCPSocketPrivateImpl::Write(const char* buffer,
150 int32_t bytes_to_write, 144 int32_t bytes_to_write,
151 PP_CompletionCallback callback) { 145 PP_CompletionCallback callback) {
152 if (!buffer || bytes_to_write <= 0) 146 if (!buffer || bytes_to_write <= 0)
153 return PP_ERROR_BADARGUMENT; 147 return PP_ERROR_BADARGUMENT;
154 if (!callback.func) 148 if (!callback.func)
155 return PP_ERROR_BLOCKS_MAIN_THREAD; 149 return PP_ERROR_BLOCKS_MAIN_THREAD;
156 150
157 if (!IsConnected()) 151 if (!IsConnected())
158 return PP_ERROR_FAILED; 152 return PP_ERROR_FAILED;
159 if (write_callback_.func || ssl_handshake_callback_.func) 153 if (TrackedCallback::IsPending(write_callback_) ||
154 TrackedCallback::IsPending(ssl_handshake_callback_))
160 return PP_ERROR_INPROGRESS; 155 return PP_ERROR_INPROGRESS;
161 156
162 if (bytes_to_write > kMaxWriteSize) 157 if (bytes_to_write > kMaxWriteSize)
163 bytes_to_write = kMaxWriteSize; 158 bytes_to_write = kMaxWriteSize;
164 159
165 write_callback_ = callback; 160 write_callback_ = new TrackedCallback(this, callback);
166 161
167 // Send the request, the browser will call us back via WriteACK. 162 // Send the request, the browser will call us back via WriteACK.
168 SendWrite(std::string(buffer, bytes_to_write)); 163 SendWrite(std::string(buffer, bytes_to_write));
169 return PP_OK_COMPLETIONPENDING; 164 return PP_OK_COMPLETIONPENDING;
170 } 165 }
171 166
172 void TCPSocketPrivateImpl::Disconnect() { 167 void TCPSocketPrivateImpl::Disconnect() {
173 if (connection_state_ == DISCONNECTED) 168 if (connection_state_ == DISCONNECTED)
174 return; 169 return;
175 170
176 connection_state_ = DISCONNECTED; 171 connection_state_ = DISCONNECTED;
177 172
178 SendDisconnect(); 173 SendDisconnect();
179 socket_id_ = 0; 174 socket_id_ = 0;
180 175
181 PostAbortAndClearIfNecessary(&connect_callback_); 176 PostAbortIfNecessary(&connect_callback_);
182 PostAbortAndClearIfNecessary(&ssl_handshake_callback_); 177 PostAbortIfNecessary(&ssl_handshake_callback_);
183 PostAbortAndClearIfNecessary(&read_callback_); 178 PostAbortIfNecessary(&read_callback_);
184 PostAbortAndClearIfNecessary(&write_callback_); 179 PostAbortIfNecessary(&write_callback_);
185 read_buffer_ = NULL; 180 read_buffer_ = NULL;
186 bytes_to_read_ = -1; 181 bytes_to_read_ = -1;
187 } 182 }
188 183
189 void TCPSocketPrivateImpl::OnConnectCompleted( 184 void TCPSocketPrivateImpl::OnConnectCompleted(
190 bool succeeded, 185 bool succeeded,
191 const PP_NetAddress_Private& local_addr, 186 const PP_NetAddress_Private& local_addr,
192 const PP_NetAddress_Private& remote_addr) { 187 const PP_NetAddress_Private& remote_addr) {
193 if (connection_state_ != BEFORE_CONNECT || !connect_callback_.func) { 188 if (connection_state_ != BEFORE_CONNECT ||
189 !TrackedCallback::IsPending(connect_callback_)) {
194 NOTREACHED(); 190 NOTREACHED();
195 return; 191 return;
196 } 192 }
197 193
198 if (succeeded) { 194 if (succeeded) {
199 local_addr_ = local_addr; 195 local_addr_ = local_addr;
200 remote_addr_ = remote_addr; 196 remote_addr_ = remote_addr;
201 connection_state_ = CONNECTED; 197 connection_state_ = CONNECTED;
202 } 198 }
203 PP_RunAndClearCompletionCallback(&connect_callback_, 199 TrackedCallback::ClearAndRun(&connect_callback_,
204 succeeded ? PP_OK : PP_ERROR_FAILED); 200 succeeded ? PP_OK : PP_ERROR_FAILED);
205 } 201 }
206 202
207 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) { 203 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) {
208 if (connection_state_ != CONNECTED || !ssl_handshake_callback_.func) { 204 if (connection_state_ != CONNECTED ||
205 !TrackedCallback::IsPending(ssl_handshake_callback_)) {
209 NOTREACHED(); 206 NOTREACHED();
210 return; 207 return;
211 } 208 }
212 209
213 if (succeeded) { 210 if (succeeded) {
214 connection_state_ = SSL_CONNECTED; 211 connection_state_ = SSL_CONNECTED;
215 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_OK); 212 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK);
216 } else { 213 } else {
217 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_ERROR_FAILED); 214 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED);
218 Disconnect(); 215 Disconnect();
219 } 216 }
220 } 217 }
221 218
222 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, 219 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded,
223 const std::string& data) { 220 const std::string& data) {
224 if (!read_callback_.func || !read_buffer_) { 221 if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) {
225 NOTREACHED(); 222 NOTREACHED();
226 return; 223 return;
227 } 224 }
228 225
229 if (succeeded) { 226 if (succeeded) {
230 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_); 227 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_);
231 if (!data.empty()) 228 if (!data.empty())
232 memcpy(read_buffer_, data.c_str(), data.size()); 229 memcpy(read_buffer_, data.c_str(), data.size());
233 } 230 }
234 read_buffer_ = NULL; 231 read_buffer_ = NULL;
235 bytes_to_read_ = -1; 232 bytes_to_read_ = -1;
236 233
237 PP_RunAndClearCompletionCallback( 234 TrackedCallback::ClearAndRun(
238 &read_callback_, 235 &read_callback_,
239 succeeded ? static_cast<int32_t>(data.size()) : 236 succeeded ? static_cast<int32_t>(data.size()) :
240 static_cast<int32_t>(PP_ERROR_FAILED)); 237 static_cast<int32_t>(PP_ERROR_FAILED));
241 } 238 }
242 239
243 void TCPSocketPrivateImpl::OnWriteCompleted(bool succeeded, 240 void TCPSocketPrivateImpl::OnWriteCompleted(bool succeeded,
244 int32_t bytes_written) { 241 int32_t bytes_written) {
245 if (!write_callback_.func || (succeeded && bytes_written < 0)) { 242 if (!TrackedCallback::IsPending(write_callback_) ||
243 (succeeded && bytes_written < 0)) {
246 NOTREACHED(); 244 NOTREACHED();
247 return; 245 return;
248 } 246 }
249 247
250 PP_RunAndClearCompletionCallback( 248 TrackedCallback::ClearAndRun(
251 &write_callback_, 249 &write_callback_,
252 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); 250 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED));
253 } 251 }
254 252
255 void TCPSocketPrivateImpl::Init(uint32 socket_id) { 253 void TCPSocketPrivateImpl::Init(uint32 socket_id) {
256 DCHECK(socket_id != 0); 254 DCHECK(socket_id != 0);
257 socket_id_ = socket_id; 255 socket_id_ = socket_id;
258 connection_state_ = BEFORE_CONNECT; 256 connection_state_ = BEFORE_CONNECT;
259 connect_callback_ = PP_BlockUntilComplete();
260 ssl_handshake_callback_ = PP_BlockUntilComplete();
261 read_callback_ = PP_BlockUntilComplete();
262 write_callback_ = PP_BlockUntilComplete();
263 read_buffer_ = NULL; 257 read_buffer_ = NULL;
264 bytes_to_read_ = -1; 258 bytes_to_read_ = -1;
265 259
266 local_addr_.size = 0; 260 local_addr_.size = 0;
267 memset(local_addr_.data, 0, 261 memset(local_addr_.data, 0,
268 arraysize(local_addr_.data) * sizeof(*local_addr_.data)); 262 arraysize(local_addr_.data) * sizeof(*local_addr_.data));
269 remote_addr_.size = 0; 263 remote_addr_.size = 0;
270 memset(remote_addr_.data, 0, 264 memset(remote_addr_.data, 0,
271 arraysize(remote_addr_.data) * sizeof(*remote_addr_.data)); 265 arraysize(remote_addr_.data) * sizeof(*remote_addr_.data));
272 } 266 }
273 267
274 bool TCPSocketPrivateImpl::IsConnected() const { 268 bool TCPSocketPrivateImpl::IsConnected() const {
275 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; 269 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
276 } 270 }
277 271
278 void TCPSocketPrivateImpl::PostAbortAndClearIfNecessary( 272 void TCPSocketPrivateImpl::PostAbortIfNecessary(
279 PP_CompletionCallback* callback) { 273 scoped_refptr<TrackedCallback>* callback) {
viettrungluu 2012/01/04 01:15:14 Hmmm, this could now just take a scoped_refptr --
280 DCHECK(callback); 274 if (callback->get())
281 275 (*callback)->PostAbort();
282 if (callback->func) {
283 MessageLoop::current()->PostTask(FROM_HERE,
284 base::Bind(&AbortCallback, *callback));
285 *callback = PP_BlockUntilComplete();
286 }
287 } 276 }
288 277
289 } // namespace ppapi 278 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698