| OLD | NEW |
| 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 |
| 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 #include "ppapi/shared_impl/ppapi_globals.h" |
| 18 #include "ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h" |
| 19 #include "ppapi/shared_impl/var_tracker.h" |
| 20 #include "ppapi/shared_impl/var.h" |
| 21 #include "ppapi/thunk/enter.h" |
| 22 #include "ppapi/thunk/ppb_x509_certificate_private_api.h" |
| 17 | 23 |
| 18 namespace ppapi { | 24 namespace ppapi { |
| 19 | 25 |
| 20 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; | 26 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; |
| 21 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; | 27 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; |
| 22 | 28 |
| 23 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance, | 29 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance, |
| 24 uint32 socket_id) | 30 uint32 socket_id) |
| 25 : Resource(OBJECT_IS_IMPL, instance) { | 31 : Resource(OBJECT_IS_IMPL, instance), |
| 32 resource_type_(OBJECT_IS_IMPL) { |
| 26 Init(socket_id); | 33 Init(socket_id); |
| 27 } | 34 } |
| 28 | 35 |
| 29 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource, | 36 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource, |
| 30 uint32 socket_id) | 37 uint32 socket_id) |
| 31 : Resource(OBJECT_IS_PROXY, resource) { | 38 : Resource(OBJECT_IS_PROXY, resource), |
| 39 resource_type_(OBJECT_IS_PROXY) { |
| 32 Init(socket_id); | 40 Init(socket_id); |
| 33 } | 41 } |
| 34 | 42 |
| 35 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() { | 43 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() { |
| 36 } | 44 } |
| 37 | 45 |
| 38 thunk::PPB_TCPSocket_Private_API* | 46 thunk::PPB_TCPSocket_Private_API* |
| 39 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() { | 47 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() { |
| 40 return this; | 48 return this; |
| 41 } | 49 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 if (connection_state_ != CONNECTED) | 113 if (connection_state_ != CONNECTED) |
| 106 return PP_ERROR_FAILED; | 114 return PP_ERROR_FAILED; |
| 107 if (TrackedCallback::IsPending(ssl_handshake_callback_) || | 115 if (TrackedCallback::IsPending(ssl_handshake_callback_) || |
| 108 TrackedCallback::IsPending(read_callback_) || | 116 TrackedCallback::IsPending(read_callback_) || |
| 109 TrackedCallback::IsPending(write_callback_)) | 117 TrackedCallback::IsPending(write_callback_)) |
| 110 return PP_ERROR_INPROGRESS; | 118 return PP_ERROR_INPROGRESS; |
| 111 | 119 |
| 112 ssl_handshake_callback_ = new TrackedCallback(this, callback); | 120 ssl_handshake_callback_ = new TrackedCallback(this, callback); |
| 113 | 121 |
| 114 // Send the request, the browser will call us back via SSLHandshakeACK. | 122 // Send the request, the browser will call us back via SSLHandshakeACK. |
| 115 SendSSLHandshake(server_name, server_port); | 123 SendSSLHandshake(server_name, server_port, trusted_certificates_, |
| 124 untrusted_certificates_); |
| 116 return PP_OK_COMPLETIONPENDING; | 125 return PP_OK_COMPLETIONPENDING; |
| 117 } | 126 } |
| 118 | 127 |
| 128 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() { |
| 129 if (!server_certificate_.get()) |
| 130 return 0; |
| 131 return server_certificate_->GetReference(); |
| 132 } |
| 133 |
| 134 PP_Bool TCPSocketPrivateImpl::AddChainBuildingCertificate( |
| 135 PP_Resource certificate, |
| 136 PP_Bool trusted) { |
| 137 // TODO(raymes): The plumbing for this functionality is implemented but the |
| 138 // certificates aren't yet used for the connection, so just return false for |
| 139 // now. |
| 140 return PP_FALSE; |
| 141 |
| 142 thunk::EnterResourceNoLock<thunk::PPB_X509Certificate_Private_API> |
| 143 enter_cert(certificate, true); |
| 144 if (enter_cert.failed()) |
| 145 return PP_FALSE; |
| 146 |
| 147 PP_Var der_var = enter_cert.object()->GetField( |
| 148 PP_X509CERTIFICATE_PRIVATE_RAW); |
| 149 ArrayBufferVar* der_array_buffer = ArrayBufferVar::FromPPVar(der_var); |
| 150 PP_Bool success = PP_FALSE; |
| 151 if (der_array_buffer) { |
| 152 const char* der_bytes = static_cast<const char*>(der_array_buffer->Map()); |
| 153 uint32_t der_length = der_array_buffer->ByteLength(); |
| 154 std::vector<char> der(der_bytes, der_bytes + der_length); |
| 155 if (PP_ToBool(trusted)) |
| 156 trusted_certificates_.push_back(der); |
| 157 else |
| 158 untrusted_certificates_.push_back(der); |
| 159 success = PP_TRUE; |
| 160 } |
| 161 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(der_var); |
| 162 return success; |
| 163 } |
| 164 |
| 119 int32_t TCPSocketPrivateImpl::Read(char* buffer, | 165 int32_t TCPSocketPrivateImpl::Read(char* buffer, |
| 120 int32_t bytes_to_read, | 166 int32_t bytes_to_read, |
| 121 PP_CompletionCallback callback) { | 167 PP_CompletionCallback callback) { |
| 122 if (!buffer || bytes_to_read <= 0) | 168 if (!buffer || bytes_to_read <= 0) |
| 123 return PP_ERROR_BADARGUMENT; | 169 return PP_ERROR_BADARGUMENT; |
| 124 if (!callback.func) | 170 if (!callback.func) |
| 125 return PP_ERROR_BLOCKS_MAIN_THREAD; | 171 return PP_ERROR_BLOCKS_MAIN_THREAD; |
| 126 | 172 |
| 127 if (!IsConnected()) | 173 if (!IsConnected()) |
| 128 return PP_ERROR_FAILED; | 174 return PP_ERROR_FAILED; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 | 218 |
| 173 SendDisconnect(); | 219 SendDisconnect(); |
| 174 socket_id_ = 0; | 220 socket_id_ = 0; |
| 175 | 221 |
| 176 PostAbortIfNecessary(&connect_callback_); | 222 PostAbortIfNecessary(&connect_callback_); |
| 177 PostAbortIfNecessary(&ssl_handshake_callback_); | 223 PostAbortIfNecessary(&ssl_handshake_callback_); |
| 178 PostAbortIfNecessary(&read_callback_); | 224 PostAbortIfNecessary(&read_callback_); |
| 179 PostAbortIfNecessary(&write_callback_); | 225 PostAbortIfNecessary(&write_callback_); |
| 180 read_buffer_ = NULL; | 226 read_buffer_ = NULL; |
| 181 bytes_to_read_ = -1; | 227 bytes_to_read_ = -1; |
| 228 server_certificate_ = NULL; |
| 182 } | 229 } |
| 183 | 230 |
| 184 void TCPSocketPrivateImpl::OnConnectCompleted( | 231 void TCPSocketPrivateImpl::OnConnectCompleted( |
| 185 bool succeeded, | 232 bool succeeded, |
| 186 const PP_NetAddress_Private& local_addr, | 233 const PP_NetAddress_Private& local_addr, |
| 187 const PP_NetAddress_Private& remote_addr) { | 234 const PP_NetAddress_Private& remote_addr) { |
| 188 if (connection_state_ != BEFORE_CONNECT || | 235 if (connection_state_ != BEFORE_CONNECT || |
| 189 !TrackedCallback::IsPending(connect_callback_)) { | 236 !TrackedCallback::IsPending(connect_callback_)) { |
| 190 NOTREACHED(); | 237 NOTREACHED(); |
| 191 return; | 238 return; |
| 192 } | 239 } |
| 193 | 240 |
| 194 if (succeeded) { | 241 if (succeeded) { |
| 195 local_addr_ = local_addr; | 242 local_addr_ = local_addr; |
| 196 remote_addr_ = remote_addr; | 243 remote_addr_ = remote_addr; |
| 197 connection_state_ = CONNECTED; | 244 connection_state_ = CONNECTED; |
| 198 } | 245 } |
| 199 TrackedCallback::ClearAndRun(&connect_callback_, | 246 TrackedCallback::ClearAndRun(&connect_callback_, |
| 200 succeeded ? PP_OK : PP_ERROR_FAILED); | 247 succeeded ? PP_OK : PP_ERROR_FAILED); |
| 201 } | 248 } |
| 202 | 249 |
| 203 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) { | 250 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted( |
| 251 bool succeeded, |
| 252 const PPB_X509Certificate_Fields& certificate_fields) { |
| 204 if (connection_state_ != CONNECTED || | 253 if (connection_state_ != CONNECTED || |
| 205 !TrackedCallback::IsPending(ssl_handshake_callback_)) { | 254 !TrackedCallback::IsPending(ssl_handshake_callback_)) { |
| 206 NOTREACHED(); | 255 NOTREACHED(); |
| 207 return; | 256 return; |
| 208 } | 257 } |
| 209 | 258 |
| 210 if (succeeded) { | 259 if (succeeded) { |
| 211 connection_state_ = SSL_CONNECTED; | 260 connection_state_ = SSL_CONNECTED; |
| 261 server_certificate_ = new PPB_X509Certificate_Private_Shared( |
| 262 resource_type_, |
| 263 pp_instance(), |
| 264 certificate_fields); |
| 212 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK); | 265 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK); |
| 213 } else { | 266 } else { |
| 214 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED); | 267 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED); |
| 215 Disconnect(); | 268 Disconnect(); |
| 216 } | 269 } |
| 217 } | 270 } |
| 218 | 271 |
| 219 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, | 272 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, |
| 220 const std::string& data) { | 273 const std::string& data) { |
| 221 if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) { | 274 if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; | 322 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; |
| 270 } | 323 } |
| 271 | 324 |
| 272 void TCPSocketPrivateImpl::PostAbortIfNecessary( | 325 void TCPSocketPrivateImpl::PostAbortIfNecessary( |
| 273 scoped_refptr<TrackedCallback>* callback) { | 326 scoped_refptr<TrackedCallback>* callback) { |
| 274 if (callback->get()) | 327 if (callback->get()) |
| 275 (*callback)->PostAbort(); | 328 (*callback)->PostAbort(); |
| 276 } | 329 } |
| 277 | 330 |
| 278 } // namespace ppapi | 331 } // namespace ppapi |
| OLD | NEW |