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