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