Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Unified Diff: ppapi/proxy/udp_socket_resource_base.cc

Issue 16959005: Implement PPB_UDPSocket_Dev: part 2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/proxy/udp_socket_resource_base.h ('k') | ppapi/shared_impl/socket_option_data.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ppapi/proxy/udp_socket_resource_base.h ('k') | ppapi/shared_impl/socket_option_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698