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

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

Issue 10081020: PPAPI: Make blocking completion callbacks work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated TestURLLoader to test blocking callbacks. Created 8 years, 8 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) 2012 The Chromium Authors. All rights reserved. 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 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
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() { 43 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() {
44 } 44 }
45 45
46 thunk::PPB_TCPSocket_Private_API* 46 thunk::PPB_TCPSocket_Private_API*
47 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() { 47 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() {
48 return this; 48 return this;
49 } 49 }
50 50
51 int32_t TCPSocketPrivateImpl::Connect(const char* host, 51 int32_t TCPSocketPrivateImpl::Connect(const char* host,
52 uint16_t port, 52 uint16_t port,
53 PP_CompletionCallback callback) { 53 ApiCallbackType callback) {
54 if (!host) 54 if (!host)
55 return PP_ERROR_BADARGUMENT; 55 return PP_ERROR_BADARGUMENT;
56 if (!callback.func)
57 return PP_ERROR_BLOCKS_MAIN_THREAD;
58 if (connection_state_ != BEFORE_CONNECT) 56 if (connection_state_ != BEFORE_CONNECT)
59 return PP_ERROR_FAILED; 57 return PP_ERROR_FAILED;
60 if (TrackedCallback::IsPending(connect_callback_)) 58 if (TrackedCallback::IsPending(connect_callback_))
61 return PP_ERROR_INPROGRESS; // Can only have one pending request. 59 return PP_ERROR_INPROGRESS; // Can only have one pending request.
62 60
63 connect_callback_ = new TrackedCallback(this, callback); 61 connect_callback_ = callback;
64 // Send the request, the browser will call us back via ConnectACK. 62 // Send the request, the browser will call us back via ConnectACK.
65 SendConnect(host, port); 63 SendConnect(host, port);
66 return PP_OK_COMPLETIONPENDING; 64 return PP_OK_COMPLETIONPENDING;
67 } 65 }
68 66
69 int32_t TCPSocketPrivateImpl::ConnectWithNetAddress( 67 int32_t TCPSocketPrivateImpl::ConnectWithNetAddress(
70 const PP_NetAddress_Private* addr, 68 const PP_NetAddress_Private* addr,
71 PP_CompletionCallback callback) { 69 ApiCallbackType callback) {
72 if (!addr) 70 if (!addr)
73 return PP_ERROR_BADARGUMENT; 71 return PP_ERROR_BADARGUMENT;
74 if (!callback.func)
75 return PP_ERROR_BLOCKS_MAIN_THREAD;
76 if (connection_state_ != BEFORE_CONNECT) 72 if (connection_state_ != BEFORE_CONNECT)
77 return PP_ERROR_FAILED; 73 return PP_ERROR_FAILED;
78 if (TrackedCallback::IsPending(connect_callback_)) 74 if (TrackedCallback::IsPending(connect_callback_))
79 return PP_ERROR_INPROGRESS; // Can only have one pending request. 75 return PP_ERROR_INPROGRESS; // Can only have one pending request.
80 76
81 connect_callback_ = new TrackedCallback(this, callback); 77 connect_callback_ = callback;
82 // Send the request, the browser will call us back via ConnectACK. 78 // Send the request, the browser will call us back via ConnectACK.
83 SendConnectWithNetAddress(*addr); 79 SendConnectWithNetAddress(*addr);
84 return PP_OK_COMPLETIONPENDING; 80 return PP_OK_COMPLETIONPENDING;
85 } 81 }
86 82
87 PP_Bool TCPSocketPrivateImpl::GetLocalAddress( 83 PP_Bool TCPSocketPrivateImpl::GetLocalAddress(
88 PP_NetAddress_Private* local_addr) { 84 PP_NetAddress_Private* local_addr) {
89 if (!IsConnected() || !local_addr) 85 if (!IsConnected() || !local_addr)
90 return PP_FALSE; 86 return PP_FALSE;
91 87
92 *local_addr = local_addr_; 88 *local_addr = local_addr_;
93 return PP_TRUE; 89 return PP_TRUE;
94 } 90 }
95 91
96 PP_Bool TCPSocketPrivateImpl::GetRemoteAddress( 92 PP_Bool TCPSocketPrivateImpl::GetRemoteAddress(
97 PP_NetAddress_Private* remote_addr) { 93 PP_NetAddress_Private* remote_addr) {
98 if (!IsConnected() || !remote_addr) 94 if (!IsConnected() || !remote_addr)
99 return PP_FALSE; 95 return PP_FALSE;
100 96
101 *remote_addr = remote_addr_; 97 *remote_addr = remote_addr_;
102 return PP_TRUE; 98 return PP_TRUE;
103 } 99 }
104 100
105 int32_t TCPSocketPrivateImpl::SSLHandshake(const char* server_name, 101 int32_t TCPSocketPrivateImpl::SSLHandshake(const char* server_name,
106 uint16_t server_port, 102 uint16_t server_port,
107 PP_CompletionCallback callback) { 103 ApiCallbackType callback) {
108 if (!server_name) 104 if (!server_name)
109 return PP_ERROR_BADARGUMENT; 105 return PP_ERROR_BADARGUMENT;
110 if (!callback.func)
111 return PP_ERROR_BLOCKS_MAIN_THREAD;
112 106
113 if (connection_state_ != CONNECTED) 107 if (connection_state_ != CONNECTED)
114 return PP_ERROR_FAILED; 108 return PP_ERROR_FAILED;
115 if (TrackedCallback::IsPending(ssl_handshake_callback_) || 109 if (TrackedCallback::IsPending(ssl_handshake_callback_) ||
116 TrackedCallback::IsPending(read_callback_) || 110 TrackedCallback::IsPending(read_callback_) ||
117 TrackedCallback::IsPending(write_callback_)) 111 TrackedCallback::IsPending(write_callback_))
118 return PP_ERROR_INPROGRESS; 112 return PP_ERROR_INPROGRESS;
119 113
120 ssl_handshake_callback_ = new TrackedCallback(this, callback); 114 ssl_handshake_callback_ = callback;
121 115
122 // Send the request, the browser will call us back via SSLHandshakeACK. 116 // Send the request, the browser will call us back via SSLHandshakeACK.
123 SendSSLHandshake(server_name, server_port, trusted_certificates_, 117 SendSSLHandshake(server_name, server_port, trusted_certificates_,
124 untrusted_certificates_); 118 untrusted_certificates_);
125 return PP_OK_COMPLETIONPENDING; 119 return PP_OK_COMPLETIONPENDING;
126 } 120 }
127 121
128 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() { 122 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() {
129 if (!server_certificate_.get()) 123 if (!server_certificate_.get())
130 return 0; 124 return 0;
(...skipping 26 matching lines...) Expand all
157 else 151 else
158 untrusted_certificates_.push_back(der); 152 untrusted_certificates_.push_back(der);
159 success = PP_TRUE; 153 success = PP_TRUE;
160 } 154 }
161 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(der_var); 155 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(der_var);
162 return success; 156 return success;
163 } 157 }
164 158
165 int32_t TCPSocketPrivateImpl::Read(char* buffer, 159 int32_t TCPSocketPrivateImpl::Read(char* buffer,
166 int32_t bytes_to_read, 160 int32_t bytes_to_read,
167 PP_CompletionCallback callback) { 161 ApiCallbackType callback) {
168 if (!buffer || bytes_to_read <= 0) 162 if (!buffer || bytes_to_read <= 0)
169 return PP_ERROR_BADARGUMENT; 163 return PP_ERROR_BADARGUMENT;
170 if (!callback.func)
171 return PP_ERROR_BLOCKS_MAIN_THREAD;
172 164
173 if (!IsConnected()) 165 if (!IsConnected())
174 return PP_ERROR_FAILED; 166 return PP_ERROR_FAILED;
175 if (TrackedCallback::IsPending(read_callback_) || 167 if (TrackedCallback::IsPending(read_callback_) ||
176 TrackedCallback::IsPending(ssl_handshake_callback_)) 168 TrackedCallback::IsPending(ssl_handshake_callback_))
177 return PP_ERROR_INPROGRESS; 169 return PP_ERROR_INPROGRESS;
178 // TODO(dmichael): use some other strategy for determining if an
179 // operation is in progress
180 read_buffer_ = buffer; 170 read_buffer_ = buffer;
181 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); 171 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize);
182 read_callback_ = new TrackedCallback(this, callback); 172 read_callback_ = callback;
183 173
184 // Send the request, the browser will call us back via ReadACK. 174 // Send the request, the browser will call us back via ReadACK.
185 SendRead(bytes_to_read_); 175 SendRead(bytes_to_read_);
186 return PP_OK_COMPLETIONPENDING; 176 return PP_OK_COMPLETIONPENDING;
187 } 177 }
188 178
189 int32_t TCPSocketPrivateImpl::Write(const char* buffer, 179 int32_t TCPSocketPrivateImpl::Write(const char* buffer,
190 int32_t bytes_to_write, 180 int32_t bytes_to_write,
191 PP_CompletionCallback callback) { 181 ApiCallbackType callback) {
192 if (!buffer || bytes_to_write <= 0) 182 if (!buffer || bytes_to_write <= 0)
193 return PP_ERROR_BADARGUMENT; 183 return PP_ERROR_BADARGUMENT;
194 if (!callback.func)
195 return PP_ERROR_BLOCKS_MAIN_THREAD;
196 184
197 if (!IsConnected()) 185 if (!IsConnected())
198 return PP_ERROR_FAILED; 186 return PP_ERROR_FAILED;
199 if (TrackedCallback::IsPending(write_callback_) || 187 if (TrackedCallback::IsPending(write_callback_) ||
200 TrackedCallback::IsPending(ssl_handshake_callback_)) 188 TrackedCallback::IsPending(ssl_handshake_callback_))
201 return PP_ERROR_INPROGRESS; 189 return PP_ERROR_INPROGRESS;
202 190
203 if (bytes_to_write > kMaxWriteSize) 191 if (bytes_to_write > kMaxWriteSize)
204 bytes_to_write = kMaxWriteSize; 192 bytes_to_write = kMaxWriteSize;
205 193
206 write_callback_ = new TrackedCallback(this, callback); 194 write_callback_ = callback;
207 195
208 // Send the request, the browser will call us back via WriteACK. 196 // Send the request, the browser will call us back via WriteACK.
209 SendWrite(std::string(buffer, bytes_to_write)); 197 SendWrite(std::string(buffer, bytes_to_write));
210 return PP_OK_COMPLETIONPENDING; 198 return PP_OK_COMPLETIONPENDING;
211 } 199 }
212 200
213 void TCPSocketPrivateImpl::Disconnect() { 201 void TCPSocketPrivateImpl::Disconnect() {
214 if (connection_state_ == DISCONNECTED) 202 if (connection_state_ == DISCONNECTED)
215 return; 203 return;
216 204
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; 314 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
327 } 315 }
328 316
329 void TCPSocketPrivateImpl::PostAbortIfNecessary( 317 void TCPSocketPrivateImpl::PostAbortIfNecessary(
330 scoped_refptr<TrackedCallback>* callback) { 318 scoped_refptr<TrackedCallback>* callback) {
331 if (callback->get()) 319 if (callback->get())
332 (*callback)->PostAbort(); 320 (*callback)->PostAbort();
333 } 321 }
334 322
335 } // namespace ppapi 323 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698