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

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: export AssertLockHeld Created 8 years, 6 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 scoped_refptr<TrackedCallback> 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 scoped_refptr<TrackedCallback> 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(
106 uint16_t server_port, 102 const char* server_name,
107 PP_CompletionCallback callback) { 103 uint16_t server_port,
104 scoped_refptr<TrackedCallback> callback) {
108 if (!server_name) 105 if (!server_name)
109 return PP_ERROR_BADARGUMENT; 106 return PP_ERROR_BADARGUMENT;
110 if (!callback.func)
111 return PP_ERROR_BLOCKS_MAIN_THREAD;
112 107
113 if (connection_state_ != CONNECTED) 108 if (connection_state_ != CONNECTED)
114 return PP_ERROR_FAILED; 109 return PP_ERROR_FAILED;
115 if (TrackedCallback::IsPending(ssl_handshake_callback_) || 110 if (TrackedCallback::IsPending(ssl_handshake_callback_) ||
116 TrackedCallback::IsPending(read_callback_) || 111 TrackedCallback::IsPending(read_callback_) ||
117 TrackedCallback::IsPending(write_callback_)) 112 TrackedCallback::IsPending(write_callback_))
118 return PP_ERROR_INPROGRESS; 113 return PP_ERROR_INPROGRESS;
119 114
120 ssl_handshake_callback_ = new TrackedCallback(this, callback); 115 ssl_handshake_callback_ = callback;
121 116
122 // Send the request, the browser will call us back via SSLHandshakeACK. 117 // Send the request, the browser will call us back via SSLHandshakeACK.
123 SendSSLHandshake(server_name, server_port, trusted_certificates_, 118 SendSSLHandshake(server_name, server_port, trusted_certificates_,
124 untrusted_certificates_); 119 untrusted_certificates_);
125 return PP_OK_COMPLETIONPENDING; 120 return PP_OK_COMPLETIONPENDING;
126 } 121 }
127 122
128 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() { 123 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() {
129 if (!server_certificate_.get()) 124 if (!server_certificate_.get())
130 return 0; 125 return 0;
(...skipping 26 matching lines...) Expand all
157 else 152 else
158 untrusted_certificates_.push_back(der); 153 untrusted_certificates_.push_back(der);
159 success = PP_TRUE; 154 success = PP_TRUE;
160 } 155 }
161 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(der_var); 156 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(der_var);
162 return success; 157 return success;
163 } 158 }
164 159
165 int32_t TCPSocketPrivateImpl::Read(char* buffer, 160 int32_t TCPSocketPrivateImpl::Read(char* buffer,
166 int32_t bytes_to_read, 161 int32_t bytes_to_read,
167 PP_CompletionCallback callback) { 162 scoped_refptr<TrackedCallback> callback) {
168 if (!buffer || bytes_to_read <= 0) 163 if (!buffer || bytes_to_read <= 0)
169 return PP_ERROR_BADARGUMENT; 164 return PP_ERROR_BADARGUMENT;
170 if (!callback.func)
171 return PP_ERROR_BLOCKS_MAIN_THREAD;
172 165
173 if (!IsConnected()) 166 if (!IsConnected())
174 return PP_ERROR_FAILED; 167 return PP_ERROR_FAILED;
175 if (TrackedCallback::IsPending(read_callback_) || 168 if (TrackedCallback::IsPending(read_callback_) ||
176 TrackedCallback::IsPending(ssl_handshake_callback_)) 169 TrackedCallback::IsPending(ssl_handshake_callback_))
177 return PP_ERROR_INPROGRESS; 170 return PP_ERROR_INPROGRESS;
178 // TODO(dmichael): use some other strategy for determining if an
179 // operation is in progress
180 read_buffer_ = buffer; 171 read_buffer_ = buffer;
181 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); 172 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize);
182 read_callback_ = new TrackedCallback(this, callback); 173 read_callback_ = callback;
183 174
184 // Send the request, the browser will call us back via ReadACK. 175 // Send the request, the browser will call us back via ReadACK.
185 SendRead(bytes_to_read_); 176 SendRead(bytes_to_read_);
186 return PP_OK_COMPLETIONPENDING; 177 return PP_OK_COMPLETIONPENDING;
187 } 178 }
188 179
189 int32_t TCPSocketPrivateImpl::Write(const char* buffer, 180 int32_t TCPSocketPrivateImpl::Write(const char* buffer,
190 int32_t bytes_to_write, 181 int32_t bytes_to_write,
191 PP_CompletionCallback callback) { 182 scoped_refptr<TrackedCallback> callback) {
192 if (!buffer || bytes_to_write <= 0) 183 if (!buffer || bytes_to_write <= 0)
193 return PP_ERROR_BADARGUMENT; 184 return PP_ERROR_BADARGUMENT;
194 if (!callback.func)
195 return PP_ERROR_BLOCKS_MAIN_THREAD;
196 185
197 if (!IsConnected()) 186 if (!IsConnected())
198 return PP_ERROR_FAILED; 187 return PP_ERROR_FAILED;
199 if (TrackedCallback::IsPending(write_callback_) || 188 if (TrackedCallback::IsPending(write_callback_) ||
200 TrackedCallback::IsPending(ssl_handshake_callback_)) 189 TrackedCallback::IsPending(ssl_handshake_callback_))
201 return PP_ERROR_INPROGRESS; 190 return PP_ERROR_INPROGRESS;
202 191
203 if (bytes_to_write > kMaxWriteSize) 192 if (bytes_to_write > kMaxWriteSize)
204 bytes_to_write = kMaxWriteSize; 193 bytes_to_write = kMaxWriteSize;
205 194
206 write_callback_ = new TrackedCallback(this, callback); 195 write_callback_ = callback;
207 196
208 // Send the request, the browser will call us back via WriteACK. 197 // Send the request, the browser will call us back via WriteACK.
209 SendWrite(std::string(buffer, bytes_to_write)); 198 SendWrite(std::string(buffer, bytes_to_write));
210 return PP_OK_COMPLETIONPENDING; 199 return PP_OK_COMPLETIONPENDING;
211 } 200 }
212 201
213 void TCPSocketPrivateImpl::Disconnect() { 202 void TCPSocketPrivateImpl::Disconnect() {
214 if (connection_state_ == DISCONNECTED) 203 if (connection_state_ == DISCONNECTED)
215 return; 204 return;
216 205
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; 315 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
327 } 316 }
328 317
329 void TCPSocketPrivateImpl::PostAbortIfNecessary( 318 void TCPSocketPrivateImpl::PostAbortIfNecessary(
330 scoped_refptr<TrackedCallback>* callback) { 319 scoped_refptr<TrackedCallback>* callback) {
331 if (callback->get()) 320 if (callback->get())
332 (*callback)->PostAbort(); 321 (*callback)->PostAbort();
333 } 322 }
334 323
335 } // namespace ppapi 324 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/shared_impl/private/tcp_socket_private_impl.h ('k') | ppapi/shared_impl/private/udp_socket_private_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698