1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/udp_socket_resource.h"
6
7#include "ppapi/shared_impl/tracked_callback.h"
8#include "ppapi/thunk/enter.h"
9#include "ppapi/thunk/ppb_net_address_api.h"
10#include "ppapi/thunk/resource_creation_api.h"
11
12namespace ppapi {
13namespace proxy {
14
15namespace {
16
17typedef thunk::EnterResourceNoLock<thunk::PPB_NetAddress_API>
18    EnterNetAddressNoLock;
19
20}  // namespace
21
22UDPSocketResource::UDPSocketResource(Connection connection,
23                                     PP_Instance instance)
24    : UDPSocketResourceBase(connection, instance, false) {
25}
26
27UDPSocketResource::~UDPSocketResource() {
28}
29
30thunk::PPB_UDPSocket_API* UDPSocketResource::AsPPB_UDPSocket_API() {
31  return this;
32}
33
34int32_t UDPSocketResource::Bind(PP_Resource addr,
35                                scoped_refptr<TrackedCallback> callback) {
36  EnterNetAddressNoLock enter(addr, true);
37  if (enter.failed())
38    return PP_ERROR_BADARGUMENT;
39
40  return BindImpl(&enter.object()->GetNetAddressPrivate(), callback);
41}
42
43PP_Resource UDPSocketResource::GetBoundAddress() {
44  PP_NetAddress_Private addr_private;
45  if (!GetBoundAddressImpl(&addr_private))
46    return 0;
47
48  thunk::EnterResourceCreationNoLock enter(pp_instance());
49  if (enter.failed())
50    return 0;
51  return enter.functions()->CreateNetAddressFromNetAddressPrivate(
52      pp_instance(), addr_private);
53}
54
55int32_t UDPSocketResource::RecvFrom(char* buffer,
56                                    int32_t num_bytes,
57                                    PP_Resource* addr,
58                                    scoped_refptr<TrackedCallback> callback) {
59  return RecvFromImpl(buffer, num_bytes, addr, callback);
60}
61
62int32_t UDPSocketResource::SendTo(const char* buffer,
63                                  int32_t num_bytes,
64                                  PP_Resource addr,
65                                  scoped_refptr<TrackedCallback> callback) {
66  EnterNetAddressNoLock enter(addr, true);
67  if (enter.failed())
68    return PP_ERROR_BADARGUMENT;
69
70  return SendToImpl(buffer, num_bytes, &enter.object()->GetNetAddressPrivate(),
71                    callback);
72}
73
74void UDPSocketResource::Close() {
75  CloseImpl();
76}
77
78int32_t UDPSocketResource::SetOption(
79    PP_UDPSocket_Option name,
80    const PP_Var& value,
81    scoped_refptr<TrackedCallback> callback) {
82  return SetOptionImpl(name, value, callback);
83}
84
85}  // namespace proxy
86}  // namespace ppapi
87