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 e2c645f0ae5a1d20cb14c301362fe80e7979dec6..87cc600d57c3d0079fe920aa18c91d6798692004 100644 |
--- a/ppapi/shared_impl/private/tcp_socket_private_impl.cc |
+++ b/ppapi/shared_impl/private/tcp_socket_private_impl.cc |
@@ -212,11 +212,34 @@ void TCPSocketPrivateImpl::Disconnect() { |
PostAbortIfNecessary(&ssl_handshake_callback_); |
PostAbortIfNecessary(&read_callback_); |
PostAbortIfNecessary(&write_callback_); |
+ PostAbortIfNecessary(&set_option_callback_); |
read_buffer_ = NULL; |
bytes_to_read_ = -1; |
server_certificate_ = NULL; |
} |
+int32_t TCPSocketPrivateImpl::SetOption( |
+ PP_TCPSocketOption_Private name, |
+ const PP_Var& value, |
+ scoped_refptr<TrackedCallback> callback) { |
+ if (!IsConnected()) |
+ return PP_ERROR_FAILED; |
+ if (TrackedCallback::IsPending(set_option_callback_)) |
+ return PP_ERROR_INPROGRESS; |
+ |
+ set_option_callback_ = callback; |
+ |
+ switch (name) { |
+ case PP_TCPSOCKETOPTION_NO_DELAY: |
+ if (value.type != PP_VARTYPE_BOOL) |
+ return PP_ERROR_BADARGUMENT; |
+ SendSetBoolOption(name, PP_ToBool(value.value.as_bool)); |
+ return PP_OK_COMPLETIONPENDING; |
+ default: |
+ return PP_ERROR_BADARGUMENT; |
+ } |
+} |
+ |
void TCPSocketPrivateImpl::OnConnectCompleted( |
bool succeeded, |
const PP_NetAddress_Private& local_addr, |
@@ -293,6 +316,15 @@ void TCPSocketPrivateImpl::OnWriteCompleted(bool succeeded, |
succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); |
} |
+void TCPSocketPrivateImpl::OnSetOptionCompleted(bool succeeded) { |
+ if (!TrackedCallback::IsPending(set_option_callback_)) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ set_option_callback_->Run(succeeded ? PP_OK : PP_ERROR_FAILED); |
+} |
+ |
void TCPSocketPrivateImpl::Init(uint32 socket_id) { |
DCHECK(socket_id != 0); |
socket_id_ = socket_id; |