Chromium Code Reviews| Index: ppapi/proxy/ppb_flash_tcp_socket_proxy.cc |
| diff --git a/ppapi/proxy/ppb_flash_tcp_socket_proxy.cc b/ppapi/proxy/ppb_flash_tcp_socket_proxy.cc |
| index 6a6ab50e9411898b93633fcda7bd5468f023aeac..97406e3c913285348839c556425f000082d0e387 100644 |
| --- a/ppapi/proxy/ppb_flash_tcp_socket_proxy.cc |
| +++ b/ppapi/proxy/ppb_flash_tcp_socket_proxy.cc |
| @@ -89,6 +89,7 @@ class FlashTCPSocket : public PPB_Flash_TCPSocket_API, |
| void OnConnectCompleted(bool succeeded, |
| const PP_Flash_NetAddress& local_addr, |
| const PP_Flash_NetAddress& remote_addr); |
| + void OnInitiateSSLCompleted(bool succeeded); |
|
wtc
2011/08/09 21:21:29
I suggest that you change "InitiateSSL" to "SSLCon
yzshen1
2011/08/09 23:45:29
[I am open to making the change, just to make sure
|
| void OnReadCompleted(bool succeeded, const std::string& data); |
| void OnWriteCompleted(bool succeeded, int32_t bytes_written); |
| @@ -97,10 +98,17 @@ class FlashTCPSocket : public PPB_Flash_TCPSocket_API, |
| // Before a connection is successfully established (including a connect |
| // request is pending or a previous connect request failed). |
| BEFORE_CONNECT, |
| + // A connection has been successfully established (including a request of |
| + // initiating SSL is pending). |
| CONNECTED, |
| + // An SSL connection has been successfully established. |
| + SSL_CONNECTED, |
| + // The connection has been ended. |
| DISCONNECTED |
| }; |
| + bool IsConnected() const; |
| + |
| // Backend for both Connect() and ConnectWithNetAddress(). To keep things |
| // generic, the message is passed in (on error, it's deleted). |
| int32_t ConnectWithMessage(IPC::Message* msg, |
| @@ -112,6 +120,7 @@ class FlashTCPSocket : public PPB_Flash_TCPSocket_API, |
| ConnectionState connection_state_; |
| PP_CompletionCallback connect_callback_; |
| + PP_CompletionCallback initiate_ssl_callback_; |
| PP_CompletionCallback read_callback_; |
| PP_CompletionCallback write_callback_; |
| @@ -129,6 +138,7 @@ FlashTCPSocket::FlashTCPSocket(const HostResource& resource, uint32 socket_id) |
| socket_id_(socket_id), |
| connection_state_(BEFORE_CONNECT), |
| connect_callback_(PP_BlockUntilComplete()), |
| + initiate_ssl_callback_(PP_BlockUntilComplete()), |
| read_callback_(PP_BlockUntilComplete()), |
| write_callback_(PP_BlockUntilComplete()), |
| read_buffer_(NULL), |
| @@ -178,7 +188,7 @@ int32_t FlashTCPSocket::ConnectWithNetAddress( |
| } |
| PP_Bool FlashTCPSocket::GetLocalAddress(PP_Flash_NetAddress* local_addr) { |
| - if (connection_state_ != CONNECTED || !local_addr) |
| + if (!IsConnected() || !local_addr) |
| return PP_FALSE; |
| *local_addr = local_addr_; |
| @@ -186,7 +196,7 @@ PP_Bool FlashTCPSocket::GetLocalAddress(PP_Flash_NetAddress* local_addr) { |
| } |
| PP_Bool FlashTCPSocket::GetRemoteAddress(PP_Flash_NetAddress* remote_addr) { |
| - if (connection_state_ != CONNECTED || !remote_addr) |
| + if (!IsConnected() || !remote_addr) |
| return PP_FALSE; |
| *remote_addr = remote_addr_; |
| @@ -195,8 +205,22 @@ PP_Bool FlashTCPSocket::GetRemoteAddress(PP_Flash_NetAddress* remote_addr) { |
| int32_t FlashTCPSocket::InitiateSSL(const char* server_name, |
| PP_CompletionCallback callback) { |
| - // TODO(yzshen): add it. |
| - return PP_ERROR_FAILED; |
| + if (!server_name || !callback.func) |
| + return PP_ERROR_BADARGUMENT; |
| + |
| + if (connection_state_ != CONNECTED) |
| + return PP_ERROR_FAILED; |
| + if (initiate_ssl_callback_.func || read_callback_.func || |
| + write_callback_.func) |
| + return PP_ERROR_INPROGRESS; |
| + |
| + initiate_ssl_callback_ = callback; |
| + |
| + // Send the request, the browser will call us back via InitiateSSLACK. |
| + GetDispatcher()->SendToBrowser( |
| + new PpapiHostMsg_PPBFlashTCPSocket_InitiateSSL(socket_id_, |
| + std::string(server_name))); |
| + return PP_OK_COMPLETIONPENDING; |
| } |
| int32_t FlashTCPSocket::Read(char* buffer, |
| @@ -205,9 +229,9 @@ int32_t FlashTCPSocket::Read(char* buffer, |
| if (!buffer || bytes_to_read <= 0 || !callback.func) |
| return PP_ERROR_BADARGUMENT; |
| - if (connection_state_ != CONNECTED) |
| + if (!IsConnected()) |
| return PP_ERROR_FAILED; |
| - if (read_callback_.func) |
| + if (read_callback_.func || initiate_ssl_callback_.func) |
| return PP_ERROR_INPROGRESS; |
| read_buffer_ = buffer; |
| @@ -226,9 +250,9 @@ int32_t FlashTCPSocket::Write(const char* buffer, |
| if (!buffer || bytes_to_write <= 0 || !callback.func) |
| return PP_ERROR_BADARGUMENT; |
| - if (connection_state_ != CONNECTED) |
| + if (!IsConnected()) |
| return PP_ERROR_FAILED; |
| - if (write_callback_.func) |
| + if (write_callback_.func || initiate_ssl_callback_.func) |
| return PP_ERROR_INPROGRESS; |
| if (bytes_to_write > kFlashTCPSocketMaxWriteSize) |
| @@ -248,7 +272,7 @@ void FlashTCPSocket::Disconnect() { |
| return; |
| connection_state_ = DISCONNECTED; |
| - // After removed from the mapping, this object won't receive any notfications |
| + // After removed from the mapping, this object won't receive any notifications |
| // from the proxy. |
| DCHECK(g_id_to_socket->find(socket_id_) != g_id_to_socket->end()); |
| g_id_to_socket->erase(socket_id_); |
| @@ -258,6 +282,7 @@ void FlashTCPSocket::Disconnect() { |
| socket_id_ = 0; |
| PostAbortAndClearIfNecessary(&connect_callback_); |
| + PostAbortAndClearIfNecessary(&initiate_ssl_callback_); |
| PostAbortAndClearIfNecessary(&read_callback_); |
| PostAbortAndClearIfNecessary(&write_callback_); |
| read_buffer_ = NULL; |
| @@ -282,6 +307,21 @@ void FlashTCPSocket::OnConnectCompleted( |
| succeeded ? PP_OK : PP_ERROR_FAILED); |
| } |
| +void FlashTCPSocket::OnInitiateSSLCompleted(bool succeeded) { |
| + if (connection_state_ != CONNECTED || !initiate_ssl_callback_.func) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + if (succeeded) { |
| + connection_state_ = SSL_CONNECTED; |
| + PP_RunAndClearCompletionCallback(&initiate_ssl_callback_, PP_OK); |
| + } else { |
| + PP_RunAndClearCompletionCallback(&initiate_ssl_callback_, PP_ERROR_FAILED); |
| + Disconnect(); |
| + } |
| +} |
| + |
| void FlashTCPSocket::OnReadCompleted(bool succeeded, const std::string& data) { |
| if (!read_callback_.func || !read_buffer_) { |
| NOTREACHED(); |
| @@ -313,6 +353,10 @@ void FlashTCPSocket::OnWriteCompleted(bool succeeded, int32_t bytes_written) { |
| succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); |
| } |
| +bool FlashTCPSocket::IsConnected() const { |
| + return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; |
| +} |
| + |
| int32_t FlashTCPSocket::ConnectWithMessage(IPC::Message* msg, |
| PP_CompletionCallback callback) { |
| scoped_ptr<IPC::Message> msg_deletor(msg); |
| @@ -384,6 +428,8 @@ bool PPB_Flash_TCPSocket_Proxy::OnMessageReceived(const IPC::Message& msg) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(PPB_Flash_TCPSocket_Proxy, msg) |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_ConnectACK, OnMsgConnectACK) |
| + IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_InitiateSSLACK, |
| + OnMsgInitiateSSLACK) |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_ReadACK, OnMsgReadACK) |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPBFlashTCPSocket_WriteACK, OnMsgWriteACK) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| @@ -407,6 +453,20 @@ void PPB_Flash_TCPSocket_Proxy::OnMsgConnectACK( |
| iter->second->OnConnectCompleted(succeeded, local_addr, remote_addr); |
| } |
| +void PPB_Flash_TCPSocket_Proxy::OnMsgInitiateSSLACK( |
| + uint32 /* plugin_dispatcher_id */, |
| + uint32 socket_id, |
| + bool succeeded) { |
| + if (!g_id_to_socket) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); |
| + if (iter == g_id_to_socket->end()) |
| + return; |
| + iter->second->OnInitiateSSLCompleted(succeeded); |
| +} |
| + |
| void PPB_Flash_TCPSocket_Proxy::OnMsgReadACK(uint32 /* plugin_dispatcher_id */, |
| uint32 socket_id, |
| bool succeeded, |