| // Copyright (c) 2012 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/cpp/private/net_address_private.h" |
| |
| #include "ppapi/c/pp_bool.h" |
| #include "ppapi/cpp/module.h" |
| #include "ppapi/cpp/module_impl.h" |
| #include "ppapi/cpp/var.h" |
| |
| namespace pp { |
| |
| namespace { |
| |
| template <> const char* interface_name<PPB_NetAddress_Private_1_1>() { |
| return PPB_NETADDRESS_PRIVATE_INTERFACE_1_1; |
| } |
| |
| template <> const char* interface_name<PPB_NetAddress_Private_1_0>() { |
| return PPB_NETADDRESS_PRIVATE_INTERFACE_1_0; |
| } |
| |
| template <> const char* interface_name<PPB_NetAddress_Private_0_1>() { |
| return PPB_NETADDRESS_PRIVATE_INTERFACE_0_1; |
| } |
| |
| } // namespace |
| |
| // static |
| bool NetAddressPrivate::IsAvailable() { |
| return has_interface<PPB_NetAddress_Private_1_1>() || |
| has_interface<PPB_NetAddress_Private_1_0>() || |
| has_interface<PPB_NetAddress_Private_0_1>(); |
| } |
| |
| // static |
| bool NetAddressPrivate::AreEqual(const PP_NetAddress_Private& addr1, |
| const PP_NetAddress_Private& addr2) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| return !!get_interface<PPB_NetAddress_Private_1_1>()->AreEqual(&addr1, |
| &addr2); |
| } |
| if (has_interface<PPB_NetAddress_Private_1_0>()) { |
| return !!get_interface<PPB_NetAddress_Private_1_0>()->AreEqual(&addr1, |
| &addr2); |
| } |
| if (has_interface<PPB_NetAddress_Private_0_1>()) { |
| return !!get_interface<PPB_NetAddress_Private_0_1>()->AreEqual(&addr1, |
| &addr2); |
| } |
| return false; |
| } |
| |
| // static |
| bool NetAddressPrivate::AreHostsEqual(const PP_NetAddress_Private& addr1, |
| const PP_NetAddress_Private& addr2) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| return !!get_interface<PPB_NetAddress_Private_1_1>()->AreHostsEqual(&addr1, |
| &addr2); |
| } |
| if (has_interface<PPB_NetAddress_Private_1_0>()) { |
| return !!get_interface<PPB_NetAddress_Private_1_0>()->AreHostsEqual(&addr1, |
| &addr2); |
| } |
| if (has_interface<PPB_NetAddress_Private_0_1>()) { |
| return !!get_interface<PPB_NetAddress_Private_0_1>()->AreHostsEqual(&addr1, |
| &addr2); |
| } |
| return false; |
| } |
| |
| // static |
| std::string NetAddressPrivate::Describe(const PP_NetAddress_Private& addr, |
| bool include_port) { |
| Module* module = Module::Get(); |
| if (!module) |
| return std::string(); |
| |
| PP_Var result_pp_var = PP_MakeUndefined(); |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| result_pp_var = get_interface<PPB_NetAddress_Private_1_1>()->Describe( |
| module->pp_module(), |
| &addr, |
| PP_FromBool(include_port)); |
| } else if (has_interface<PPB_NetAddress_Private_1_0>()) { |
| result_pp_var = get_interface<PPB_NetAddress_Private_1_0>()->Describe( |
| module->pp_module(), |
| &addr, |
| PP_FromBool(include_port)); |
| } else if (has_interface<PPB_NetAddress_Private_0_1>()) { |
| result_pp_var = get_interface<PPB_NetAddress_Private_0_1>()->Describe( |
| module->pp_module(), |
| &addr, |
| PP_FromBool(include_port)); |
| } |
| |
| Var result(PASS_REF, result_pp_var); |
| return result.is_string() ? result.AsString() : std::string(); |
| } |
| |
| // static |
| bool NetAddressPrivate::ReplacePort(const PP_NetAddress_Private& addr_in, |
| uint16_t port, |
| PP_NetAddress_Private* addr_out) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| return !!get_interface<PPB_NetAddress_Private_1_1>()->ReplacePort(&addr_in, |
| port, |
| addr_out); |
| } |
| if (has_interface<PPB_NetAddress_Private_1_0>()) { |
| return !!get_interface<PPB_NetAddress_Private_1_0>()->ReplacePort(&addr_in, |
| port, |
| addr_out); |
| } |
| if (has_interface<PPB_NetAddress_Private_0_1>()) { |
| return !!get_interface<PPB_NetAddress_Private_0_1>()->ReplacePort(&addr_in, |
| port, |
| addr_out); |
| } |
| return false; |
| } |
| |
| // static |
| bool NetAddressPrivate::GetAnyAddress(bool is_ipv6, |
| PP_NetAddress_Private* addr) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| get_interface<PPB_NetAddress_Private_1_1>()->GetAnyAddress( |
| PP_FromBool(is_ipv6), |
| addr); |
| return true; |
| } else if (has_interface<PPB_NetAddress_Private_1_0>()) { |
| get_interface<PPB_NetAddress_Private_1_0>()->GetAnyAddress( |
| PP_FromBool(is_ipv6), |
| addr); |
| return true; |
| } else if (has_interface<PPB_NetAddress_Private_0_1>()) { |
| get_interface<PPB_NetAddress_Private_0_1>()->GetAnyAddress( |
| PP_FromBool(is_ipv6), |
| addr); |
| return true; |
| } |
| return false; |
| } |
| |
| // static |
| PP_NetAddressFamily_Private NetAddressPrivate::GetFamily( |
| const PP_NetAddress_Private& addr) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) |
| return get_interface<PPB_NetAddress_Private_1_1>()->GetFamily(&addr); |
| if (has_interface<PPB_NetAddress_Private_1_0>()) |
| return get_interface<PPB_NetAddress_Private_1_0>()->GetFamily(&addr); |
| return PP_NETADDRESSFAMILY_PRIVATE_UNSPECIFIED; |
| } |
| |
| // static |
| uint16_t NetAddressPrivate::GetPort(const PP_NetAddress_Private& addr) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) |
| return get_interface<PPB_NetAddress_Private_1_1>()->GetPort(&addr); |
| if (has_interface<PPB_NetAddress_Private_1_0>()) |
| return get_interface<PPB_NetAddress_Private_1_0>()->GetPort(&addr); |
| return 0; |
| } |
| |
| // static |
| bool NetAddressPrivate::GetAddress(const PP_NetAddress_Private& addr, |
| void* address, |
| uint16_t address_size) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| return PP_ToBool(get_interface<PPB_NetAddress_Private_1_1>()->GetAddress( |
| &addr, |
| address, |
| address_size)); |
| } |
| if (has_interface<PPB_NetAddress_Private_1_0>()) { |
| return PP_ToBool(get_interface<PPB_NetAddress_Private_1_0>()->GetAddress( |
| &addr, |
| address, |
| address_size)); |
| } |
| return false; |
| } |
| |
| // static |
| uint32_t NetAddressPrivate::GetScopeID(const PP_NetAddress_Private& addr) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) |
| return get_interface<PPB_NetAddress_Private_1_1>()->GetScopeID(&addr); |
| return 0; |
| } |
| |
| // static |
| bool NetAddressPrivate::CreateFromIPv4Address( |
| const uint8_t ip[4], |
| uint16_t port, |
| struct PP_NetAddress_Private* addr_out) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| get_interface<PPB_NetAddress_Private_1_1>()->CreateFromIPv4Address( |
| ip, port, addr_out); |
| return true; |
| } |
| return false; |
| } |
| |
| // static |
| bool NetAddressPrivate::CreateFromIPv6Address( |
| const uint8_t ip[16], |
| uint32_t scope_id, |
| uint16_t port, |
| struct PP_NetAddress_Private* addr_out) { |
| if (has_interface<PPB_NetAddress_Private_1_1>()) { |
| get_interface<PPB_NetAddress_Private_1_1>()->CreateFromIPv6Address( |
| ip, scope_id, port, addr_out); |
| return true; |
| } |
| return false; |
| } |
| |
| } // namespace pp |