Index: ppapi/shared_impl/private/udp_socket_private_impl.cc |
diff --git a/ppapi/shared_impl/private/udp_socket_private_impl.cc b/ppapi/shared_impl/private/udp_socket_private_impl.cc |
index 9b509e1f307cf8daf413908e531a4a7b27012ce3..bf2b5ebfc3310bf0f772d3648a5baa7ffc7cb235 100644 |
--- a/ppapi/shared_impl/private/udp_socket_private_impl.cc |
+++ b/ppapi/shared_impl/private/udp_socket_private_impl.cc |
@@ -40,6 +40,23 @@ UDPSocketPrivateImpl::AsPPB_UDPSocket_Private_API() { |
return this; |
} |
+int32_t UDPSocketPrivateImpl::SetSocketFeature( |
+ PP_UDPSocketFeature_Private name, |
+ PP_Var value, |
+ scoped_refptr<TrackedCallback> callback) { |
+ if (bound_ || closed_) |
+ return PP_ERROR_FAILED; |
+ if (TrackedCallback::IsPending(setsocketfeature_callback_)) |
+ return PP_ERROR_INPROGRESS; |
+ |
+ setsocketfeature_callback_ = callback; |
+ |
+ // Send the request, the browser will call us back via |
+ // SetSocketFeatureACK. |
+ SendSetSocketFeature(name, value); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
int32_t UDPSocketPrivateImpl::Bind(const PP_NetAddress_Private* addr, |
scoped_refptr<TrackedCallback> callback) { |
if (!addr) |
@@ -124,11 +141,21 @@ void UDPSocketPrivateImpl::Close() { |
socket_id_ = 0; |
+ PostAbortIfNecessary(&setsocketfeature_callback_); |
PostAbortIfNecessary(&bind_callback_); |
PostAbortIfNecessary(&recvfrom_callback_); |
PostAbortIfNecessary(&sendto_callback_); |
} |
+void UDPSocketPrivateImpl::OnSetSocketFeatureCompleted(bool succeeded) { |
+ if (!TrackedCallback::IsPending(setsocketfeature_callback_)) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ TrackedCallback::ClearAndRun(&setsocketfeature_callback_, |
+ succeeded ? PP_OK : PP_ERROR_FAILED); |
+} |
+ |
void UDPSocketPrivateImpl::OnBindCompleted( |
bool succeeded, |
const PP_NetAddress_Private& addr) { |