| // 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 |