Index: ppapi/proxy/udp_socket_resource_base.cc |
diff --git a/ppapi/proxy/udp_socket_resource_base.cc b/ppapi/proxy/udp_socket_resource_base.cc |
index 5d318902f3e875a20e611536bc2db48f6a4db9b1..30608779bc08bfe8bc893a3e74097c83afe43edd 100644 |
--- a/ppapi/proxy/udp_socket_resource_base.cc |
+++ b/ppapi/proxy/udp_socket_resource_base.cc |
@@ -12,18 +12,43 @@ |
#include "ppapi/c/pp_completion_callback.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/proxy/ppapi_messages.h" |
+#include "ppapi/shared_impl/socket_option_data.h" |
#include "ppapi/thunk/enter.h" |
#include "ppapi/thunk/resource_creation_api.h" |
namespace ppapi { |
namespace proxy { |
+namespace { |
+ |
+int32_t ConvertPPError(int32_t pp_error, bool private_api) { |
+ // The private API doesn't return network-specific error codes or |
+ // PP_ERROR_NOACCESS. In order to preserve the behavior, we convert those to |
+ // PP_ERROR_FAILED. |
+ if (private_api && |
+ (pp_error <= PP_ERROR_CONNECTION_CLOSED || |
+ pp_error == PP_ERROR_NOACCESS)) { |
+ return PP_ERROR_FAILED; |
+ } |
+ |
+ return pp_error; |
+} |
+ |
+} // namespace |
+ |
const int32_t UDPSocketResourceBase::kMaxReadSize = 1024 * 1024; |
const int32_t UDPSocketResourceBase::kMaxWriteSize = 1024 * 1024; |
+const int32_t UDPSocketResourceBase::kMaxSendBufferSize = |
+ 1024 * UDPSocketResourceBase::kMaxWriteSize; |
+const int32_t UDPSocketResourceBase::kMaxReceiveBufferSize = |
+ 1024 * UDPSocketResourceBase::kMaxReadSize; |
+ |
UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, |
- PP_Instance instance) |
+ PP_Instance instance, |
+ bool private_api) |
: PluginResource(connection, instance), |
+ private_api_(private_api), |
bound_(false), |
closed_(false), |
read_buffer_(NULL), |
@@ -35,33 +60,55 @@ UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, |
memset(bound_addr_.data, 0, |
arraysize(bound_addr_.data) * sizeof(*bound_addr_.data)); |
- SendCreate(BROWSER, PpapiHostMsg_UDPSocketPrivate_Create()); |
+ if (private_api) |
+ SendCreate(BROWSER, PpapiHostMsg_UDPSocket_CreatePrivate()); |
+ else |
+ SendCreate(BROWSER, PpapiHostMsg_UDPSocket_Create()); |
} |
UDPSocketResourceBase::~UDPSocketResourceBase() { |
} |
-int32_t UDPSocketResourceBase::SetSocketFeatureImpl( |
- PP_UDPSocketFeature_Private name, |
- const PP_Var& value) { |
- if (bound_ || closed_) |
+int32_t UDPSocketResourceBase::SetOptionImpl( |
+ PP_UDPSocket_Option_Dev name, |
+ const PP_Var& value, |
+ scoped_refptr<TrackedCallback> callback) { |
+ if (closed_) |
return PP_ERROR_FAILED; |
+ SocketOptionData option_data; |
switch (name) { |
- case PP_UDPSOCKETFEATURE_ADDRESS_REUSE: |
- case PP_UDPSOCKETFEATURE_BROADCAST: { |
+ case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
+ case PP_UDPSOCKET_OPTION_BROADCAST: { |
+ if (bound_) |
+ return PP_ERROR_FAILED; |
if (value.type != PP_VARTYPE_BOOL) |
return PP_ERROR_BADARGUMENT; |
- Post(BROWSER, |
- PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature( |
- static_cast<int32_t>(name), PP_ToBool(value.value.as_bool))); |
+ option_data.SetBool(PP_ToBool(value.value.as_bool)); |
+ break; |
+ } |
+ case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
+ case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { |
+ if (!bound_) |
+ return PP_ERROR_FAILED; |
+ if (value.type != PP_VARTYPE_INT32) |
+ return PP_ERROR_BADARGUMENT; |
+ option_data.SetInt32(value.value.as_int); |
break; |
} |
default: { |
+ NOTREACHED(); |
return PP_ERROR_BADARGUMENT; |
} |
} |
- return PP_OK; |
+ |
+ Call<PpapiPluginMsg_UDPSocket_SetOptionReply>( |
+ BROWSER, |
+ PpapiHostMsg_UDPSocket_SetOption(name, option_data), |
+ base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply, |
+ base::Unretained(this), |
+ callback)); |
+ return PP_OK_COMPLETIONPENDING; |
} |
int32_t UDPSocketResourceBase::BindImpl( |
@@ -77,9 +124,9 @@ int32_t UDPSocketResourceBase::BindImpl( |
bind_callback_ = callback; |
// Send the request, the browser will call us back via BindReply. |
- Call<PpapiPluginMsg_UDPSocketPrivate_BindReply>( |
+ Call<PpapiPluginMsg_UDPSocket_BindReply>( |
BROWSER, |
- PpapiHostMsg_UDPSocketPrivate_Bind(*addr), |
+ PpapiHostMsg_UDPSocket_Bind(*addr), |
base::Bind(&UDPSocketResourceBase::OnPluginMsgBindReply, |
base::Unretained(this))); |
return PP_OK_COMPLETIONPENDING; |
@@ -111,9 +158,9 @@ int32_t UDPSocketResourceBase::RecvFromImpl( |
recvfrom_callback_ = callback; |
// Send the request, the browser will call us back via RecvFromReply. |
- Call<PpapiPluginMsg_UDPSocketPrivate_RecvFromReply>( |
+ Call<PpapiPluginMsg_UDPSocket_RecvFromReply>( |
BROWSER, |
- PpapiHostMsg_UDPSocketPrivate_RecvFrom(bytes_to_read_), |
+ PpapiHostMsg_UDPSocket_RecvFrom(bytes_to_read_), |
base::Bind(&UDPSocketResourceBase::OnPluginMsgRecvFromReply, |
base::Unretained(this), addr)); |
return PP_OK_COMPLETIONPENDING; |
@@ -145,10 +192,9 @@ int32_t UDPSocketResourceBase::SendToImpl( |
sendto_callback_ = callback; |
// Send the request, the browser will call us back via SendToReply. |
- Call<PpapiPluginMsg_UDPSocketPrivate_SendToReply>( |
+ Call<PpapiPluginMsg_UDPSocket_SendToReply>( |
BROWSER, |
- PpapiHostMsg_UDPSocketPrivate_SendTo( |
- std::string(buffer, num_bytes), *addr), |
+ PpapiHostMsg_UDPSocket_SendTo(std::string(buffer, num_bytes), *addr), |
base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply, |
base::Unretained(this))); |
return PP_OK_COMPLETIONPENDING; |
@@ -161,7 +207,7 @@ void UDPSocketResourceBase::CloseImpl() { |
bound_ = false; |
closed_ = true; |
- Post(BROWSER, PpapiHostMsg_UDPSocketPrivate_Close()); |
+ Post(BROWSER, PpapiHostMsg_UDPSocket_Close()); |
PostAbortIfNecessary(&bind_callback_); |
PostAbortIfNecessary(&recvfrom_callback_); |
@@ -174,6 +220,13 @@ void UDPSocketResourceBase::PostAbortIfNecessary( |
(*callback)->PostAbort(); |
} |
+void UDPSocketResourceBase::OnPluginMsgSetOptionReply( |
+ scoped_refptr<TrackedCallback> callback, |
+ const ResourceMessageReplyParams& params) { |
+ if (TrackedCallback::IsPending(callback)) |
+ callback->Run(ConvertPPError(params.result(), private_api_)); |
+} |
+ |
void UDPSocketResourceBase::OnPluginMsgBindReply( |
const ResourceMessageReplyParams& params, |
const PP_NetAddress_Private& bound_addr) { |
@@ -184,7 +237,7 @@ void UDPSocketResourceBase::OnPluginMsgBindReply( |
if (params.result() == PP_OK) |
bound_ = true; |
bound_addr_ = bound_addr; |
- bind_callback_->Run(params.result()); |
+ bind_callback_->Run(ConvertPPError(params.result(), private_api_)); |
} |
void UDPSocketResourceBase::OnPluginMsgRecvFromReply( |
@@ -196,18 +249,18 @@ void UDPSocketResourceBase::OnPluginMsgRecvFromReply( |
NOTREACHED(); |
return; |
} |
- bool succeeded = (params.result() == PP_OK); |
- if (succeeded && output_addr) { |
+ int32_t result = params.result(); |
+ if (result == PP_OK && output_addr) { |
thunk::EnterResourceCreationNoLock enter(pp_instance()); |
if (enter.succeeded()) { |
*output_addr = enter.functions()->CreateNetAddressFromNetAddressPrivate( |
pp_instance(), addr); |
} else { |
- succeeded = false; |
+ result = PP_ERROR_FAILED; |
} |
} |
- if (succeeded) { |
+ if (result == PP_OK) { |
CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_); |
if (!data.empty()) |
memcpy(read_buffer_, data.c_str(), data.size()); |
@@ -217,10 +270,10 @@ void UDPSocketResourceBase::OnPluginMsgRecvFromReply( |
bytes_to_read_ = -1; |
recvfrom_addr_ = addr; |
- if (succeeded) |
+ if (result == PP_OK) |
recvfrom_callback_->Run(static_cast<int32_t>(data.size())); |
else |
- recvfrom_callback_->Run(params.result()); |
+ recvfrom_callback_->Run(ConvertPPError(result, private_api_)); |
} |
void UDPSocketResourceBase::OnPluginMsgSendToReply( |
@@ -233,7 +286,7 @@ void UDPSocketResourceBase::OnPluginMsgSendToReply( |
if (params.result() == PP_OK) |
sendto_callback_->Run(bytes_written); |
else |
- sendto_callback_->Run(params.result()); |
+ sendto_callback_->Run(ConvertPPError(params.result(), private_api_)); |
} |
} // namespace proxy |