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 97864d535b2678ccdb191cca0483b6350b69229f..e61e16be3675e69f0500a4b8da4828115d67a698 100644 |
--- a/ppapi/proxy/udp_socket_resource_base.cc |
+++ b/ppapi/proxy/udp_socket_resource_base.cc |
@@ -68,10 +68,12 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
if (closed_) |
return PP_ERROR_FAILED; |
- SocketOptionData option_data; |
+ // Check if socket is expected to be bound or not according to the option. |
switch (name) { |
case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
- case PP_UDPSOCKET_OPTION_BROADCAST: { |
+ case PP_UDPSOCKET_OPTION_BROADCAST: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_TTL: { |
if ((check_bind_state || name == PP_UDPSOCKET_OPTION_ADDRESS_REUSE) && |
bind_called_) { |
// SetOption should fail in this case in order to give predictable |
@@ -80,6 +82,21 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
// of Bind(). |
return PP_ERROR_FAILED; |
} |
+ break; |
+ } |
+ case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
+ case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { |
+ if (check_bind_state && !bound_) |
+ return PP_ERROR_FAILED; |
+ break; |
+ } |
+ } |
+ |
+ SocketOptionData option_data; |
+ switch (name) { |
+ case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
+ case PP_UDPSOCKET_OPTION_BROADCAST: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: { |
if (value.type != PP_VARTYPE_BOOL) |
return PP_ERROR_BADARGUMENT; |
option_data.SetBool(PP_ToBool(value.value.as_bool)); |
@@ -87,13 +104,18 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
} |
case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { |
- if (check_bind_state && !bound_) |
- return PP_ERROR_FAILED; |
if (value.type != PP_VARTYPE_INT32) |
return PP_ERROR_BADARGUMENT; |
option_data.SetInt32(value.value.as_int); |
break; |
} |
+ case PP_UDPSOCKET_OPTION_MULTICAST_TTL: { |
+ int32_t ival = value.value.as_int; |
+ if (value.type != PP_VARTYPE_INT32 && (ival < 0 || ival > 255)) |
+ return PP_ERROR_BADARGUMENT; |
+ option_data.SetInt32(ival); |
+ break; |
+ } |
default: { |
NOTREACHED(); |
return PP_ERROR_BADARGUMENT; |
@@ -103,7 +125,7 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
Call<PpapiPluginMsg_UDPSocket_SetOptionReply>( |
BROWSER, |
PpapiHostMsg_UDPSocket_SetOption(name, option_data), |
- base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply, |
+ base::Bind(&UDPSocketResourceBase::OnPluginMsgGeneralReply, |
base::Unretained(this), |
callback), |
callback); |
@@ -233,6 +255,36 @@ void UDPSocketResourceBase::CloseImpl() { |
bytes_to_read_ = -1; |
} |
+int32_t UDPSocketResourceBase::JoinGroupImpl( |
+ const PP_NetAddress_Private *group, |
+ scoped_refptr<TrackedCallback> callback) { |
+ DCHECK(group); |
+ |
+ Call<PpapiPluginMsg_UDPSocket_JoinGroupReply>( |
+ BROWSER, |
+ PpapiHostMsg_UDPSocket_JoinGroup(*group), |
+ base::Bind(&UDPSocketResourceBase::OnPluginMsgGeneralReply, |
+ base::Unretained(this), |
+ callback), |
+ callback); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
+int32_t UDPSocketResourceBase::LeaveGroupImpl( |
+ const PP_NetAddress_Private *group, |
+ scoped_refptr<TrackedCallback> callback) { |
+ DCHECK(group); |
+ |
+ Call<PpapiPluginMsg_UDPSocket_LeaveGroupReply>( |
+ BROWSER, |
+ PpapiHostMsg_UDPSocket_LeaveGroup(*group), |
+ base::Bind(&UDPSocketResourceBase::OnPluginMsgGeneralReply, |
+ base::Unretained(this), |
+ callback), |
+ callback); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
void UDPSocketResourceBase::OnReplyReceived( |
const ResourceMessageReplyParams& params, |
const IPC::Message& msg) { |
@@ -251,7 +303,7 @@ void UDPSocketResourceBase::PostAbortIfNecessary( |
(*callback)->PostAbort(); |
} |
-void UDPSocketResourceBase::OnPluginMsgSetOptionReply( |
+void UDPSocketResourceBase::OnPluginMsgGeneralReply( |
scoped_refptr<TrackedCallback> callback, |
const ResourceMessageReplyParams& params) { |
if (TrackedCallback::IsPending(callback)) |