1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ppapi/cpp/private/net_address_private.h" 6 7 #include "ppapi/c/pp_bool.h" 8 #include "ppapi/cpp/module.h" 9 #include "ppapi/cpp/module_impl.h" 10 #include "ppapi/cpp/var.h" 11 12 namespace pp { 13 14 namespace { 15 16 template <> const char* interface_name<PPB_NetAddress_Private_1_1>() { 17 return PPB_NETADDRESS_PRIVATE_INTERFACE_1_1; 18 } 19 20 template <> const char* interface_name<PPB_NetAddress_Private_1_0>() { 21 return PPB_NETADDRESS_PRIVATE_INTERFACE_1_0; 22 } 23 24 template <> const char* interface_name<PPB_NetAddress_Private_0_1>() { 25 return PPB_NETADDRESS_PRIVATE_INTERFACE_0_1; 26 } 27 28 } // namespace 29 30 // static 31 bool NetAddressPrivate::IsAvailable() { 32 return has_interface<PPB_NetAddress_Private_1_1>() || 33 has_interface<PPB_NetAddress_Private_1_0>() || 34 has_interface<PPB_NetAddress_Private_0_1>(); 35 } 36 37 // static 38 bool NetAddressPrivate::AreEqual(const PP_NetAddress_Private& addr1, 39 const PP_NetAddress_Private& addr2) { 40 if (has_interface<PPB_NetAddress_Private_1_1>()) { 41 return !!get_interface<PPB_NetAddress_Private_1_1>()->AreEqual(&addr1, 42 &addr2); 43 } 44 if (has_interface<PPB_NetAddress_Private_1_0>()) { 45 return !!get_interface<PPB_NetAddress_Private_1_0>()->AreEqual(&addr1, 46 &addr2); 47 } 48 if (has_interface<PPB_NetAddress_Private_0_1>()) { 49 return !!get_interface<PPB_NetAddress_Private_0_1>()->AreEqual(&addr1, 50 &addr2); 51 } 52 return false; 53 } 54 55 // static 56 bool NetAddressPrivate::AreHostsEqual(const PP_NetAddress_Private& addr1, 57 const PP_NetAddress_Private& addr2) { 58 if (has_interface<PPB_NetAddress_Private_1_1>()) { 59 return !!get_interface<PPB_NetAddress_Private_1_1>()->AreHostsEqual(&addr1, 60 &addr2); 61 } 62 if (has_interface<PPB_NetAddress_Private_1_0>()) { 63 return !!get_interface<PPB_NetAddress_Private_1_0>()->AreHostsEqual(&addr1, 64 &addr2); 65 } 66 if (has_interface<PPB_NetAddress_Private_0_1>()) { 67 return !!get_interface<PPB_NetAddress_Private_0_1>()->AreHostsEqual(&addr1, 68 &addr2); 69 } 70 return false; 71 } 72 73 // static 74 std::string NetAddressPrivate::Describe(const PP_NetAddress_Private& addr, 75 bool include_port) { 76 Module* module = Module::Get(); 77 if (!module) 78 return std::string(); 79 80 PP_Var result_pp_var = PP_MakeUndefined(); 81 if (has_interface<PPB_NetAddress_Private_1_1>()) { 82 result_pp_var = get_interface<PPB_NetAddress_Private_1_1>()->Describe( 83 module->pp_module(), 84 &addr, 85 PP_FromBool(include_port)); 86 } else if (has_interface<PPB_NetAddress_Private_1_0>()) { 87 result_pp_var = get_interface<PPB_NetAddress_Private_1_0>()->Describe( 88 module->pp_module(), 89 &addr, 90 PP_FromBool(include_port)); 91 } else if (has_interface<PPB_NetAddress_Private_0_1>()) { 92 result_pp_var = get_interface<PPB_NetAddress_Private_0_1>()->Describe( 93 module->pp_module(), 94 &addr, 95 PP_FromBool(include_port)); 96 } 97 98 Var result(PASS_REF, result_pp_var); 99 return result.is_string() ? result.AsString() : std::string(); 100 } 101 102 // static 103 bool NetAddressPrivate::ReplacePort(const PP_NetAddress_Private& addr_in, 104 uint16_t port, 105 PP_NetAddress_Private* addr_out) { 106 if (has_interface<PPB_NetAddress_Private_1_1>()) { 107 return !!get_interface<PPB_NetAddress_Private_1_1>()->ReplacePort(&addr_in, 108 port, 109 addr_out); 110 } 111 if (has_interface<PPB_NetAddress_Private_1_0>()) { 112 return !!get_interface<PPB_NetAddress_Private_1_0>()->ReplacePort(&addr_in, 113 port, 114 addr_out); 115 } 116 if (has_interface<PPB_NetAddress_Private_0_1>()) { 117 return !!get_interface<PPB_NetAddress_Private_0_1>()->ReplacePort(&addr_in, 118 port, 119 addr_out); 120 } 121 return false; 122 } 123 124 // static 125 bool NetAddressPrivate::GetAnyAddress(bool is_ipv6, 126 PP_NetAddress_Private* addr) { 127 if (has_interface<PPB_NetAddress_Private_1_1>()) { 128 get_interface<PPB_NetAddress_Private_1_1>()->GetAnyAddress( 129 PP_FromBool(is_ipv6), 130 addr); 131 return true; 132 } else if (has_interface<PPB_NetAddress_Private_1_0>()) { 133 get_interface<PPB_NetAddress_Private_1_0>()->GetAnyAddress( 134 PP_FromBool(is_ipv6), 135 addr); 136 return true; 137 } else if (has_interface<PPB_NetAddress_Private_0_1>()) { 138 get_interface<PPB_NetAddress_Private_0_1>()->GetAnyAddress( 139 PP_FromBool(is_ipv6), 140 addr); 141 return true; 142 } 143 return false; 144 } 145 146 // static 147 PP_NetAddressFamily_Private NetAddressPrivate::GetFamily( 148 const PP_NetAddress_Private& addr) { 149 if (has_interface<PPB_NetAddress_Private_1_1>()) 150 return get_interface<PPB_NetAddress_Private_1_1>()->GetFamily(&addr); 151 if (has_interface<PPB_NetAddress_Private_1_0>()) 152 return get_interface<PPB_NetAddress_Private_1_0>()->GetFamily(&addr); 153 return PP_NETADDRESSFAMILY_PRIVATE_UNSPECIFIED; 154 } 155 156 // static 157 uint16_t NetAddressPrivate::GetPort(const PP_NetAddress_Private& addr) { 158 if (has_interface<PPB_NetAddress_Private_1_1>()) 159 return get_interface<PPB_NetAddress_Private_1_1>()->GetPort(&addr); 160 if (has_interface<PPB_NetAddress_Private_1_0>()) 161 return get_interface<PPB_NetAddress_Private_1_0>()->GetPort(&addr); 162 return 0; 163 } 164 165 // static 166 bool NetAddressPrivate::GetAddress(const PP_NetAddress_Private& addr, 167 void* address, 168 uint16_t address_size) { 169 if (has_interface<PPB_NetAddress_Private_1_1>()) { 170 return PP_ToBool(get_interface<PPB_NetAddress_Private_1_1>()->GetAddress( 171 &addr, 172 address, 173 address_size)); 174 } 175 if (has_interface<PPB_NetAddress_Private_1_0>()) { 176 return PP_ToBool(get_interface<PPB_NetAddress_Private_1_0>()->GetAddress( 177 &addr, 178 address, 179 address_size)); 180 } 181 return false; 182 } 183 184 // static 185 uint32_t NetAddressPrivate::GetScopeID(const PP_NetAddress_Private& addr) { 186 if (has_interface<PPB_NetAddress_Private_1_1>()) 187 return get_interface<PPB_NetAddress_Private_1_1>()->GetScopeID(&addr); 188 return 0; 189 } 190 191 // static 192 bool NetAddressPrivate::CreateFromIPv4Address( 193 const uint8_t ip[4], 194 uint16_t port, 195 struct PP_NetAddress_Private* addr_out) { 196 if (has_interface<PPB_NetAddress_Private_1_1>()) { 197 get_interface<PPB_NetAddress_Private_1_1>()->CreateFromIPv4Address( 198 ip, port, addr_out); 199 return true; 200 } 201 return false; 202 } 203 204 // static 205 bool NetAddressPrivate::CreateFromIPv6Address( 206 const uint8_t ip[16], 207 uint32_t scope_id, 208 uint16_t port, 209 struct PP_NetAddress_Private* addr_out) { 210 if (has_interface<PPB_NetAddress_Private_1_1>()) { 211 get_interface<PPB_NetAddress_Private_1_1>()->CreateFromIPv6Address( 212 ip, scope_id, port, addr_out); 213 return true; 214 } 215 return false; 216 } 217 218 } // namespace pp 219