| // Copyright 2013 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "ppapi/proxy/udp_socket_resource.h" | |
| #include "ppapi/shared_impl/tracked_callback.h" | |
| #include "ppapi/thunk/enter.h" | |
| #include "ppapi/thunk/ppb_net_address_api.h" | |
| #include "ppapi/thunk/resource_creation_api.h" | |
| namespace ppapi { | |
| namespace proxy { | |
| namespace { | |
| typedef thunk::EnterResourceNoLock<thunk::PPB_NetAddress_API> | |
| EnterNetAddressNoLock; | |
| } // namespace | |
| UDPSocketResource::UDPSocketResource(Connection connection, | |
| PP_Instance instance) | |
| : UDPSocketResourceBase(connection, instance, false) { | |
| } | |
| UDPSocketResource::~UDPSocketResource() { | |
| } | |
| thunk::PPB_UDPSocket_API* UDPSocketResource::AsPPB_UDPSocket_API() { | |
| return this; | |
| } | |
| int32_t UDPSocketResource::Bind(PP_Resource addr, | |
| scoped_refptr<TrackedCallback> callback) { | |
| EnterNetAddressNoLock enter(addr, true); | |
| if (enter.failed()) | |
| return PP_ERROR_BADARGUMENT; | |
| return BindImpl(&enter.object()->GetNetAddressPrivate(), callback); | |
| } | |
| PP_Resource UDPSocketResource::GetBoundAddress() { | |
| PP_NetAddress_Private addr_private; | |
| if (!GetBoundAddressImpl(&addr_private)) | |
| return 0; | |
| thunk::EnterResourceCreationNoLock enter(pp_instance()); | |
| if (enter.failed()) | |
| return 0; | |
| return enter.functions()->CreateNetAddressFromNetAddressPrivate( | |
| pp_instance(), addr_private); | |
| } | |
| int32_t UDPSocketResource::RecvFrom(char* buffer, | |
| int32_t num_bytes, | |
| PP_Resource* addr, | |
| scoped_refptr<TrackedCallback> callback) { | |
| return RecvFromImpl(buffer, num_bytes, addr, callback); | |
| } | |
| int32_t UDPSocketResource::SendTo(const char* buffer, | |
| int32_t num_bytes, | |
| PP_Resource addr, | |
| scoped_refptr<TrackedCallback> callback) { | |
| EnterNetAddressNoLock enter(addr, true); | |
| if (enter.failed()) | |
| return PP_ERROR_BADARGUMENT; | |
| return SendToImpl(buffer, num_bytes, &enter.object()->GetNetAddressPrivate(), | |
| callback); | |
| } | |
| void UDPSocketResource::Close() { | |
| CloseImpl(); | |
| } | |
| int32_t UDPSocketResource::SetOption1_0( | |
| PP_UDPSocket_Option name, | |
| const PP_Var& value, | |
| scoped_refptr<TrackedCallback> callback) { | |
| if (name > PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE) | |
| return PP_ERROR_BADARGUMENT; | |
| return SetOptionImpl(name, value, | |
| true, // Check bind() state. | |
| callback); | |
| } | |
| int32_t UDPSocketResource::SetOption1_1( | |
| PP_UDPSocket_Option name, | |
| const PP_Var& value, | |
| scoped_refptr<TrackedCallback> callback) { | |
| if (name > PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE) | |
| return PP_ERROR_BADARGUMENT; | |
| return SetOptionImpl(name, value, | |
| false, // Check bind() state. | |
| callback); | |
| } | |
| int32_t UDPSocketResource::SetOption( | |
| PP_UDPSocket_Option name, | |
| const PP_Var& value, | |
| scoped_refptr<TrackedCallback> callback) { | |
| return SetOptionImpl(name, value, | |
| false, // Check bind() state. | |
| callback); | |
| } | |
| int32_t UDPSocketResource::JoinGroup( | |
| PP_Resource group, | |
| scoped_refptr<TrackedCallback> callback) { | |
| EnterNetAddressNoLock enter(group, true); | |
| if (enter.failed()) | |
| return PP_ERROR_BADRESOURCE; | |
| return JoinGroupImpl(&enter.object()->GetNetAddressPrivate(), | |
| callback); | |
| } | |
| int32_t UDPSocketResource::LeaveGroup( | |
| PP_Resource group, | |
| scoped_refptr<TrackedCallback> callback) { | |
| EnterNetAddressNoLock enter(group, true); | |
| if (enter.failed()) | |
| return PP_ERROR_BADRESOURCE; | |
| return LeaveGroupImpl(&enter.object()->GetNetAddressPrivate(), | |
| callback); | |
| } | |
| } // namespace proxy | |
| } // namespace ppapi |