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/net_address.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_bool.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/instance_handle.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/module_impl.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace pp {
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <> const char* interface_name<PPB_NetAddress_1_0>() {
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PPB_NETADDRESS_INTERFACE_1_0;
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress::NetAddress() {
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress::NetAddress(PassRef, PP_Resource resource)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : Resource(PASS_REF, resource) {
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress::NetAddress(const InstanceHandle& instance,
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const PP_NetAddress_IPv4& ipv4_addr) {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_NetAddress_1_0>()) {
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PassRefFromConstructor(
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        get_interface<PPB_NetAddress_1_0>()->CreateFromIPv4Address(
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            instance.pp_instance(), &ipv4_addr));
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress::NetAddress(const InstanceHandle& instance,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const PP_NetAddress_IPv6& ipv6_addr) {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_NetAddress_1_0>()) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PassRefFromConstructor(
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        get_interface<PPB_NetAddress_1_0>()->CreateFromIPv6Address(
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            instance.pp_instance(), &ipv6_addr));
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress::NetAddress(const NetAddress& other) : Resource(other) {
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress::~NetAddress() {
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress& NetAddress::operator=(const NetAddress& other) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Resource::operator=(other);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return *this;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool NetAddress::IsAvailable() {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return has_interface<PPB_NetAddress_1_0>();
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_NetAddress_Family NetAddress::GetFamily() const {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_NetAddress_1_0>())
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_NetAddress_1_0>()->GetFamily(pp_resource());
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_NETADDRESS_FAMILY_UNSPECIFIED;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVar NetAddress::DescribeAsString(bool include_port) const {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_NetAddress_1_0>()) {
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return Var(PASS_REF,
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               get_interface<PPB_NetAddress_1_0>()->DescribeAsString(
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   pp_resource(), PP_FromBool(include_port)));
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return Var();
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool NetAddress::DescribeAsIPv4Address(PP_NetAddress_IPv4* ipv4_addr) const {
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_NetAddress_1_0>()) {
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_ToBool(
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        get_interface<PPB_NetAddress_1_0>()->DescribeAsIPv4Address(
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            pp_resource(), ipv4_addr));
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool NetAddress::DescribeAsIPv6Address(PP_NetAddress_IPv6* ipv6_addr) const {
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_NetAddress_1_0>()) {
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_ToBool(
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        get_interface<PPB_NetAddress_1_0>()->DescribeAsIPv6Address(
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            pp_resource(), ipv6_addr));
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace pp
100