Index: ppapi/shared_impl/private/tcp_socket_private_impl.cc |
diff --git a/ppapi/shared_impl/private/tcp_socket_private_impl.cc b/ppapi/shared_impl/private/tcp_socket_private_impl.cc |
index 7ec1535907a7f76022dd1d3dd6af8a732b57d84f..a26880127f364e1a96cc71300ddf62e5608a6887 100644 |
--- a/ppapi/shared_impl/private/tcp_socket_private_impl.cc |
+++ b/ppapi/shared_impl/private/tcp_socket_private_impl.cc |
@@ -17,14 +17,6 @@ |
namespace ppapi { |
-namespace { |
- |
-void AbortCallback(PP_CompletionCallback callback) { |
- PP_RunCompletionCallback(&callback, PP_ERROR_ABORTED); |
-} |
- |
-} // namespace |
- |
const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; |
const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; |
@@ -57,10 +49,10 @@ int32_t TCPSocketPrivateImpl::Connect(const char* host, |
return PP_ERROR_BLOCKS_MAIN_THREAD; |
if (connection_state_ != BEFORE_CONNECT) |
return PP_ERROR_FAILED; |
- if (connect_callback_.func) |
+ if (TrackedCallback::IsPending(connect_callback_)) |
return PP_ERROR_INPROGRESS; // Can only have one pending request. |
- connect_callback_ = callback; |
+ connect_callback_ = new TrackedCallback(this, callback); |
// Send the request, the browser will call us back via ConnectACK. |
SendConnect(host, port); |
return PP_OK_COMPLETIONPENDING; |
@@ -75,10 +67,10 @@ int32_t TCPSocketPrivateImpl::ConnectWithNetAddress( |
return PP_ERROR_BLOCKS_MAIN_THREAD; |
if (connection_state_ != BEFORE_CONNECT) |
return PP_ERROR_FAILED; |
- if (connect_callback_.func) |
+ if (TrackedCallback::IsPending(connect_callback_)) |
return PP_ERROR_INPROGRESS; // Can only have one pending request. |
- connect_callback_ = callback; |
+ connect_callback_ = new TrackedCallback(this, callback); |
// Send the request, the browser will call us back via ConnectACK. |
SendConnectWithNetAddress(*addr); |
return PP_OK_COMPLETIONPENDING; |
@@ -112,11 +104,12 @@ int32_t TCPSocketPrivateImpl::SSLHandshake(const char* server_name, |
if (connection_state_ != CONNECTED) |
return PP_ERROR_FAILED; |
- if (ssl_handshake_callback_.func || read_callback_.func || |
- write_callback_.func) |
+ if (TrackedCallback::IsPending(ssl_handshake_callback_) || |
+ TrackedCallback::IsPending(read_callback_) || |
+ TrackedCallback::IsPending(write_callback_)) |
return PP_ERROR_INPROGRESS; |
- ssl_handshake_callback_ = callback; |
+ ssl_handshake_callback_ = new TrackedCallback(this, callback); |
// Send the request, the browser will call us back via SSLHandshakeACK. |
SendSSLHandshake(server_name, server_port); |
@@ -133,13 +126,14 @@ int32_t TCPSocketPrivateImpl::Read(char* buffer, |
if (!IsConnected()) |
return PP_ERROR_FAILED; |
- if (read_callback_.func || ssl_handshake_callback_.func) |
+ if (TrackedCallback::IsPending(read_callback_) || |
+ TrackedCallback::IsPending(ssl_handshake_callback_)) |
return PP_ERROR_INPROGRESS; |
// TODO(dmichael): use some other strategy for determining if an |
// operation is in progress |
read_buffer_ = buffer; |
bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); |
- read_callback_ = callback; |
+ read_callback_ = new TrackedCallback(this, callback); |
// Send the request, the browser will call us back via ReadACK. |
SendRead(bytes_to_read_); |
@@ -156,13 +150,14 @@ int32_t TCPSocketPrivateImpl::Write(const char* buffer, |
if (!IsConnected()) |
return PP_ERROR_FAILED; |
- if (write_callback_.func || ssl_handshake_callback_.func) |
+ if (TrackedCallback::IsPending(write_callback_) || |
+ TrackedCallback::IsPending(ssl_handshake_callback_)) |
return PP_ERROR_INPROGRESS; |
if (bytes_to_write > kMaxWriteSize) |
bytes_to_write = kMaxWriteSize; |
- write_callback_ = callback; |
+ write_callback_ = new TrackedCallback(this, callback); |
// Send the request, the browser will call us back via WriteACK. |
SendWrite(std::string(buffer, bytes_to_write)); |
@@ -178,10 +173,10 @@ void TCPSocketPrivateImpl::Disconnect() { |
SendDisconnect(); |
socket_id_ = 0; |
- PostAbortAndClearIfNecessary(&connect_callback_); |
- PostAbortAndClearIfNecessary(&ssl_handshake_callback_); |
- PostAbortAndClearIfNecessary(&read_callback_); |
- PostAbortAndClearIfNecessary(&write_callback_); |
+ PostAbortIfNecessary(&connect_callback_); |
+ PostAbortIfNecessary(&ssl_handshake_callback_); |
+ PostAbortIfNecessary(&read_callback_); |
+ PostAbortIfNecessary(&write_callback_); |
read_buffer_ = NULL; |
bytes_to_read_ = -1; |
} |
@@ -190,7 +185,8 @@ void TCPSocketPrivateImpl::OnConnectCompleted( |
bool succeeded, |
const PP_NetAddress_Private& local_addr, |
const PP_NetAddress_Private& remote_addr) { |
- if (connection_state_ != BEFORE_CONNECT || !connect_callback_.func) { |
+ if (connection_state_ != BEFORE_CONNECT || |
+ !TrackedCallback::IsPending(connect_callback_)) { |
NOTREACHED(); |
return; |
} |
@@ -200,28 +196,29 @@ void TCPSocketPrivateImpl::OnConnectCompleted( |
remote_addr_ = remote_addr; |
connection_state_ = CONNECTED; |
} |
- PP_RunAndClearCompletionCallback(&connect_callback_, |
- succeeded ? PP_OK : PP_ERROR_FAILED); |
+ TrackedCallback::ClearAndRun(&connect_callback_, |
+ succeeded ? PP_OK : PP_ERROR_FAILED); |
} |
void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) { |
- if (connection_state_ != CONNECTED || !ssl_handshake_callback_.func) { |
+ if (connection_state_ != CONNECTED || |
+ !TrackedCallback::IsPending(ssl_handshake_callback_)) { |
NOTREACHED(); |
return; |
} |
if (succeeded) { |
connection_state_ = SSL_CONNECTED; |
- PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_OK); |
+ TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK); |
} else { |
- PP_RunAndClearCompletionCallback(&ssl_handshake_callback_, PP_ERROR_FAILED); |
+ TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED); |
Disconnect(); |
} |
} |
void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, |
const std::string& data) { |
- if (!read_callback_.func || !read_buffer_) { |
+ if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) { |
NOTREACHED(); |
return; |
} |
@@ -234,7 +231,7 @@ void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, |
read_buffer_ = NULL; |
bytes_to_read_ = -1; |
- PP_RunAndClearCompletionCallback( |
+ TrackedCallback::ClearAndRun( |
&read_callback_, |
succeeded ? static_cast<int32_t>(data.size()) : |
static_cast<int32_t>(PP_ERROR_FAILED)); |
@@ -242,12 +239,13 @@ void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, |
void TCPSocketPrivateImpl::OnWriteCompleted(bool succeeded, |
int32_t bytes_written) { |
- if (!write_callback_.func || (succeeded && bytes_written < 0)) { |
+ if (!TrackedCallback::IsPending(write_callback_) || |
+ (succeeded && bytes_written < 0)) { |
NOTREACHED(); |
return; |
} |
- PP_RunAndClearCompletionCallback( |
+ TrackedCallback::ClearAndRun( |
&write_callback_, |
succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); |
} |
@@ -256,10 +254,6 @@ void TCPSocketPrivateImpl::Init(uint32 socket_id) { |
DCHECK(socket_id != 0); |
socket_id_ = socket_id; |
connection_state_ = BEFORE_CONNECT; |
- connect_callback_ = PP_BlockUntilComplete(); |
- ssl_handshake_callback_ = PP_BlockUntilComplete(); |
- read_callback_ = PP_BlockUntilComplete(); |
- write_callback_ = PP_BlockUntilComplete(); |
read_buffer_ = NULL; |
bytes_to_read_ = -1; |
@@ -275,15 +269,10 @@ bool TCPSocketPrivateImpl::IsConnected() const { |
return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; |
} |
-void TCPSocketPrivateImpl::PostAbortAndClearIfNecessary( |
- PP_CompletionCallback* callback) { |
- DCHECK(callback); |
- |
- if (callback->func) { |
- MessageLoop::current()->PostTask(FROM_HERE, |
- base::Bind(&AbortCallback, *callback)); |
- *callback = PP_BlockUntilComplete(); |
- } |
+void TCPSocketPrivateImpl::PostAbortIfNecessary( |
+ scoped_refptr<TrackedCallback>* callback) { |
viettrungluu
2012/01/04 01:15:14
Hmmm, this could now just take a scoped_refptr --
|
+ if (callback->get()) |
+ (*callback)->PostAbort(); |
} |
} // namespace ppapi |