1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/udp_socket.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_errors.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/completion_callback.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/instance_handle.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/module_impl.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/var.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace pp {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <> const char* interface_name<PPB_UDPSocket_1_0>() {
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PPB_UDPSOCKET_INTERFACE_1_0;
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket() {
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket(const InstanceHandle& instance) {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>()) {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PassRefFromConstructor(get_interface<PPB_UDPSocket_1_0>()->Create(
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        instance.pp_instance()));
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket(PassRef, PP_Resource resource)
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : Resource(PASS_REF, resource) {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket(const UDPSocket& other) : Resource(other) {
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::~UDPSocket() {
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket& UDPSocket::operator=(const UDPSocket& other) {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Resource::operator=(other);
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return *this;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool UDPSocket::IsAvailable() {
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return has_interface<PPB_UDPSocket_1_0>();
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::Bind(const NetAddress& addr,
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        const CompletionCallback& callback) {
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>()) {
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_UDPSocket_1_0>()->Bind(
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return callback.MayForce(PP_ERROR_NOINTERFACE);
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress UDPSocket::GetBoundAddress() {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>()) {
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return NetAddress(
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        PASS_REF,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        get_interface<PPB_UDPSocket_1_0>()->GetBoundAddress(pp_resource()));
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return NetAddress();
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::RecvFrom(
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    char* buffer,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int32_t num_bytes,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const CompletionCallbackWithOutput<NetAddress>& callback) {
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>()) {
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_UDPSocket_1_0>()->RecvFrom(
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), buffer, num_bytes, callback.output(),
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        callback.pp_completion_callback());
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return callback.MayForce(PP_ERROR_NOINTERFACE);
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::SendTo(const char* buffer,
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          int32_t num_bytes,
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          const NetAddress& addr,
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          const CompletionCallback& callback) {
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>()) {
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_UDPSocket_1_0>()->SendTo(
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), buffer, num_bytes, addr.pp_resource(),
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        callback.pp_completion_callback());
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return callback.MayForce(PP_ERROR_NOINTERFACE);
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UDPSocket::Close() {
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>())
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_UDPSocket_1_0>()->Close(pp_resource());
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::SetOption(PP_UDPSocket_Option name,
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             const Var& value,
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             const CompletionCallback& callback) {
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_UDPSocket_1_0>()) {
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_UDPSocket_1_0>()->SetOption(
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return callback.MayForce(PP_ERROR_NOINTERFACE);
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace pp
111