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

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: 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 (connect_callback_.get())
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 (connect_callback_.get())
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 (ssl_handshake_callback_.get() || read_callback_.get() ||
116 write_callback_.func) 108 write_callback_.get())
117 return PP_ERROR_INPROGRESS; 109 return PP_ERROR_INPROGRESS;
118 110
119 ssl_handshake_callback_ = callback; 111 ssl_handshake_callback_ = new TrackedCallback(this, callback);
120 112
121 // Send the request, the browser will call us back via SSLHandshakeACK. 113 // Send the request, the browser will call us back via SSLHandshakeACK.
122 SendSSLHandshake(server_name, server_port); 114 SendSSLHandshake(server_name, server_port);
123 return PP_OK_COMPLETIONPENDING; 115 return PP_OK_COMPLETIONPENDING;
124 } 116 }
125 117
126 int32_t TCPSocketPrivateImpl::Read(char* buffer, 118 int32_t TCPSocketPrivateImpl::Read(char* buffer,
127 int32_t bytes_to_read, 119 int32_t bytes_to_read,
128 PP_CompletionCallback callback) { 120 PP_CompletionCallback callback) {
129 if (!buffer || bytes_to_read <= 0) 121 if (!buffer || bytes_to_read <= 0)
130 return PP_ERROR_BADARGUMENT; 122 return PP_ERROR_BADARGUMENT;
131 if (!callback.func) 123 if (!callback.func)
132 return PP_ERROR_BLOCKS_MAIN_THREAD; 124 return PP_ERROR_BLOCKS_MAIN_THREAD;
133 125
134 if (!IsConnected()) 126 if (!IsConnected())
135 return PP_ERROR_FAILED; 127 return PP_ERROR_FAILED;
136 if (read_callback_.func || ssl_handshake_callback_.func) 128 if (read_callback_.get() || ssl_handshake_callback_.get())
137 return PP_ERROR_INPROGRESS; 129 return PP_ERROR_INPROGRESS;
138 // TODO(dmichael): use some other strategy for determining if an 130 // TODO(dmichael): use some other strategy for determining if an
139 // operation is in progress 131 // operation is in progress
140 read_buffer_ = buffer; 132 read_buffer_ = buffer;
141 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); 133 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize);
142 read_callback_ = callback; 134 read_callback_ = new TrackedCallback(this, callback);
143 135
144 // Send the request, the browser will call us back via ReadACK. 136 // Send the request, the browser will call us back via ReadACK.
145 SendRead(bytes_to_read_); 137 SendRead(bytes_to_read_);
146 return PP_OK_COMPLETIONPENDING; 138 return PP_OK_COMPLETIONPENDING;
147 } 139 }
148 140
149 int32_t TCPSocketPrivateImpl::Write(const char* buffer, 141 int32_t TCPSocketPrivateImpl::Write(const char* buffer,
150 int32_t bytes_to_write, 142 int32_t bytes_to_write,
151 PP_CompletionCallback callback) { 143 PP_CompletionCallback callback) {
152 if (!buffer || bytes_to_write <= 0) 144 if (!buffer || bytes_to_write <= 0)
153 return PP_ERROR_BADARGUMENT; 145 return PP_ERROR_BADARGUMENT;
154 if (!callback.func) 146 if (!callback.func)
155 return PP_ERROR_BLOCKS_MAIN_THREAD; 147 return PP_ERROR_BLOCKS_MAIN_THREAD;
156 148
157 if (!IsConnected()) 149 if (!IsConnected())
158 return PP_ERROR_FAILED; 150 return PP_ERROR_FAILED;
159 if (write_callback_.func || ssl_handshake_callback_.func) 151 if (write_callback_.get() || ssl_handshake_callback_.get())
160 return PP_ERROR_INPROGRESS; 152 return PP_ERROR_INPROGRESS;
161 153
162 if (bytes_to_write > kMaxWriteSize) 154 if (bytes_to_write > kMaxWriteSize)
163 bytes_to_write = kMaxWriteSize; 155 bytes_to_write = kMaxWriteSize;
164 156
165 write_callback_ = callback; 157 write_callback_ = new TrackedCallback(this, callback);
166 158
167 // Send the request, the browser will call us back via WriteACK. 159 // Send the request, the browser will call us back via WriteACK.
168 SendWrite(std::string(buffer, bytes_to_write)); 160 SendWrite(std::string(buffer, bytes_to_write));
169 return PP_OK_COMPLETIONPENDING; 161 return PP_OK_COMPLETIONPENDING;
170 } 162 }
171 163
172 void TCPSocketPrivateImpl::Disconnect() { 164 void TCPSocketPrivateImpl::Disconnect() {
173 if (connection_state_ == DISCONNECTED) 165 if (connection_state_ == DISCONNECTED)
174 return; 166 return;
175 167
176 connection_state_ = DISCONNECTED; 168 connection_state_ = DISCONNECTED;
177 169
178 SendDisconnect(); 170 SendDisconnect();
179 socket_id_ = 0; 171 socket_id_ = 0;
180 172
181 PostAbortAndClearIfNecessary(&connect_callback_); 173 PostAbortAndClearIfNecessary(&connect_callback_);
viettrungluu 2012/01/03 22:43:46 This actually violates the standard semantics that
182 PostAbortAndClearIfNecessary(&ssl_handshake_callback_); 174 PostAbortAndClearIfNecessary(&ssl_handshake_callback_);
183 PostAbortAndClearIfNecessary(&read_callback_); 175 PostAbortAndClearIfNecessary(&read_callback_);
184 PostAbortAndClearIfNecessary(&write_callback_); 176 PostAbortAndClearIfNecessary(&write_callback_);
185 read_buffer_ = NULL; 177 read_buffer_ = NULL;
186 bytes_to_read_ = -1; 178 bytes_to_read_ = -1;
187 } 179 }
188 180
189 void TCPSocketPrivateImpl::OnConnectCompleted( 181 void TCPSocketPrivateImpl::OnConnectCompleted(
190 bool succeeded, 182 bool succeeded,
191 const PP_NetAddress_Private& local_addr, 183 const PP_NetAddress_Private& local_addr,
192 const PP_NetAddress_Private& remote_addr) { 184 const PP_NetAddress_Private& remote_addr) {
193 if (connection_state_ != BEFORE_CONNECT || !connect_callback_.func) { 185 if (connection_state_ != BEFORE_CONNECT || !connect_callback_.get()) {
194 NOTREACHED(); 186 NOTREACHED();
195 return; 187 return;
196 } 188 }
197 189
198 if (succeeded) { 190 if (succeeded) {
199 local_addr_ = local_addr; 191 local_addr_ = local_addr;
200 remote_addr_ = remote_addr; 192 remote_addr_ = remote_addr;
201 connection_state_ = CONNECTED; 193 connection_state_ = CONNECTED;
202 } 194 }
203 PP_RunAndClearCompletionCallback(&connect_callback_, 195 TrackedCallback::ClearAndRun(&connect_callback_,
204 succeeded ? PP_OK : PP_ERROR_FAILED); 196 succeeded ? PP_OK : PP_ERROR_FAILED);
205 } 197 }
206 198
207 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) { 199 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) {
208 if (connection_state_ != CONNECTED || !ssl_handshake_callback_.func) { 200 if (connection_state_ != CONNECTED || !ssl_handshake_callback_.get()) {
209 NOTREACHED(); 201 NOTREACHED();
210 return; 202 return;
211 } 203 }
212 204
213 if (succeeded) { 205 if (succeeded) {
214 connection_state_ = SSL_CONNECTED; 206 connection_state_ = SSL_CONNECTED;
215 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_OK); 207 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK);
216 } else { 208 } else {
217 PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_ERROR_FAILED); 209 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED);
218 Disconnect(); 210 Disconnect();
219 } 211 }
220 } 212 }
221 213
222 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, 214 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded,
223 const std::string& data) { 215 const std::string& data) {
224 if (!read_callback_.func || !read_buffer_) { 216 if (!read_callback_.get() || !read_buffer_) {
225 NOTREACHED(); 217 NOTREACHED();
226 return; 218 return;
227 } 219 }
228 220
229 if (succeeded) { 221 if (succeeded) {
230 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_); 222 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_);
231 if (!data.empty()) 223 if (!data.empty())
232 memcpy(read_buffer_, data.c_str(), data.size()); 224 memcpy(read_buffer_, data.c_str(), data.size());
233 } 225 }
234 read_buffer_ = NULL; 226 read_buffer_ = NULL;
235 bytes_to_read_ = -1; 227 bytes_to_read_ = -1;
236 228
237 PP_RunAndClearCompletionCallback( 229 TrackedCallback::ClearAndRun(
238 &read_callback_, 230 &read_callback_,
239 succeeded ? static_cast<int32_t>(data.size()) : 231 succeeded ? static_cast<int32_t>(data.size()) :
240 static_cast<int32_t>(PP_ERROR_FAILED)); 232 static_cast<int32_t>(PP_ERROR_FAILED));
241 } 233 }
242 234
243 void TCPSocketPrivateImpl::OnWriteCompleted(bool succeeded, 235 void TCPSocketPrivateImpl::OnWriteCompleted(bool succeeded,
244 int32_t bytes_written) { 236 int32_t bytes_written) {
245 if (!write_callback_.func || (succeeded && bytes_written < 0)) { 237 if (!write_callback_.get() || (succeeded && bytes_written < 0)) {
246 NOTREACHED(); 238 NOTREACHED();
247 return; 239 return;
248 } 240 }
249 241
250 PP_RunAndClearCompletionCallback( 242 TrackedCallback::ClearAndRun(
251 &write_callback_, 243 &write_callback_,
252 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); 244 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED));
253 } 245 }
254 246
255 void TCPSocketPrivateImpl::Init(uint32 socket_id) { 247 void TCPSocketPrivateImpl::Init(uint32 socket_id) {
256 DCHECK(socket_id != 0); 248 DCHECK(socket_id != 0);
257 socket_id_ = socket_id; 249 socket_id_ = socket_id;
258 connection_state_ = BEFORE_CONNECT; 250 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; 251 read_buffer_ = NULL;
264 bytes_to_read_ = -1; 252 bytes_to_read_ = -1;
265 253
266 local_addr_.size = 0; 254 local_addr_.size = 0;
267 memset(local_addr_.data, 0, 255 memset(local_addr_.data, 0,
268 arraysize(local_addr_.data) * sizeof(*local_addr_.data)); 256 arraysize(local_addr_.data) * sizeof(*local_addr_.data));
269 remote_addr_.size = 0; 257 remote_addr_.size = 0;
270 memset(remote_addr_.data, 0, 258 memset(remote_addr_.data, 0,
271 arraysize(remote_addr_.data) * sizeof(*remote_addr_.data)); 259 arraysize(remote_addr_.data) * sizeof(*remote_addr_.data));
272 } 260 }
273 261
274 bool TCPSocketPrivateImpl::IsConnected() const { 262 bool TCPSocketPrivateImpl::IsConnected() const {
275 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; 263 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
276 } 264 }
277 265
278 void TCPSocketPrivateImpl::PostAbortAndClearIfNecessary( 266 void TCPSocketPrivateImpl::PostAbortAndClearIfNecessary(
279 PP_CompletionCallback* callback) { 267 scoped_refptr<TrackedCallback>* callback) {
280 DCHECK(callback); 268 if (callback->get()) {
281 269 (*callback)->PostAbort();
282 if (callback->func) { 270 *callback = NULL;
283 MessageLoop::current()->PostTask(FROM_HERE,
284 base::Bind(&AbortCallback, *callback));
285 *callback = PP_BlockUntilComplete();
286 } 271 }
287 } 272 }
288 273
289 } // namespace ppapi 274 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698