Index: ppapi/shared_impl/private/net_address_private_impl.cc |
diff --git a/ppapi/shared_impl/private/net_address_private_impl.cc b/ppapi/shared_impl/private/net_address_private_impl.cc |
index 6cd87b8195f28928d87deb6ff8bcc1dbeccf7a35..6f831c9c5926605866841309247f6b74282ae87a 100644 |
--- a/ppapi/shared_impl/private/net_address_private_impl.cc |
+++ b/ppapi/shared_impl/private/net_address_private_impl.cc |
@@ -54,7 +54,15 @@ namespace { |
// Define our own net-host-net conversion, rather than reuse the one in |
// base/sys_byteorder.h, to simplify the NaCl port. NaCl has no byte swap |
// primitives. |
-uint16 ConvertNetEndian16(uint16 x) { |
+uint16 ConvertFromNetEndian16(uint16 x) { |
+#if defined(ARCH_CPU_LITTLE_ENDIAN) |
+ return (x << 8) | (x >> 8); |
+#else |
+ return x; |
+#endif |
+} |
+ |
+uint16 ConvertToNetEndian16(uint16 x) { |
bbudge
2013/06/06 19:01:10
Since the functions are identical, why create this
yzshen1
2013/06/06 20:57:15
I think it is clearer to have two different names.
|
#if defined(ARCH_CPU_LITTLE_ENDIAN) |
return (x << 8) | (x >> 8); |
#else |
@@ -261,7 +269,7 @@ std::string ConvertIPv6AddressToString(const NetAddress* net_addr, |
need_sep = false; |
i += longest_length; |
} else { |
- uint16_t v = ConvertNetEndian16(address16[i]); |
+ uint16_t v = ConvertFromNetEndian16(address16[i]); |
base::StringAppendF(&description, need_sep ? ":%x" : "%x", v); |
need_sep = true; |
i++; |
@@ -419,7 +427,7 @@ bool NetAddressPrivateImpl::SockaddrToNetAddress( |
reinterpret_cast<const struct sockaddr_in*>(sa); |
net_addr->is_valid = true; |
net_addr->is_ipv6 = false; |
- net_addr->port = ConvertNetEndian16(addr4->sin_port); |
+ net_addr->port = ConvertFromNetEndian16(addr4->sin_port); |
memcpy(net_addr->address, &addr4->sin_addr.s_addr, kIPv4AddressSize); |
break; |
} |
@@ -428,7 +436,7 @@ bool NetAddressPrivateImpl::SockaddrToNetAddress( |
reinterpret_cast<const struct sockaddr_in6*>(sa); |
net_addr->is_valid = true; |
net_addr->is_ipv6 = true; |
- net_addr->port = ConvertNetEndian16(addr6->sin6_port); |
+ net_addr->port = ConvertFromNetEndian16(addr6->sin6_port); |
net_addr->flow_info = addr6->sin6_flowinfo; |
net_addr->scope_id = addr6->sin6_scope_id; |
memcpy(net_addr->address, addr6->sin6_addr.s6_addr, kIPv6AddressSize); |
@@ -509,4 +517,72 @@ std::string NetAddressPrivateImpl::DescribeNetAddress( |
return ConvertIPv4AddressToString(net_addr, include_port); |
} |
+// static |
+void NetAddressPrivateImpl::CreateNetAddressPrivateFromIPv4Address( |
+ const PP_NetAddress_IPv4_Dev& ipv4_addr, |
+ PP_NetAddress_Private* addr) { |
+ CreateFromIPv4Address(ipv4_addr.addr, ConvertFromNetEndian16(ipv4_addr.port), |
+ addr); |
+} |
+ |
+// static |
+void NetAddressPrivateImpl::CreateNetAddressPrivateFromIPv6Address( |
+ const PP_NetAddress_IPv6_Dev& ipv6_addr, |
+ PP_NetAddress_Private* addr) { |
+ CreateFromIPv6Address(ipv6_addr.addr, 0, |
+ ConvertFromNetEndian16(ipv6_addr.port), addr); |
+} |
+ |
+// static |
+PP_NetAddress_Family_Dev NetAddressPrivateImpl::GetFamilyFromNetAddressPrivate( |
+ const PP_NetAddress_Private& addr) { |
+ const NetAddress* net_addr = ToNetAddress(&addr); |
+ if (!IsValid(net_addr)) |
+ return PP_NETADDRESS_FAMILY_UNSPECIFIED; |
+ return net_addr->is_ipv6 ? PP_NETADDRESS_FAMILY_IPV6 : |
+ PP_NETADDRESS_FAMILY_IPV4; |
+} |
+ |
+// static |
+bool NetAddressPrivateImpl::DescribeNetAddressPrivateAsIPv4Address( |
+ const PP_NetAddress_Private& addr, |
+ PP_NetAddress_IPv4_Dev* ipv4_addr) { |
+ if (!ipv4_addr) |
+ return false; |
+ |
+ const NetAddress* net_addr = ToNetAddress(&addr); |
+ if (!IsValid(net_addr) || net_addr->is_ipv6) |
+ return false; |
+ |
+ ipv4_addr->port = ConvertToNetEndian16(net_addr->port); |
+ |
+ COMPILE_ASSERT(sizeof(ipv4_addr->addr) == kIPv4AddressSize, |
+ mismatched_IPv4_address_size); |
+ memcpy(ipv4_addr->addr, net_addr->address, kIPv4AddressSize); |
+ |
+ ipv4_addr->unused_padding = 0; |
+ return true; |
+} |
+ |
+// static |
+bool NetAddressPrivateImpl::DescribeNetAddressPrivateAsIPv6Address( |
+ const PP_NetAddress_Private& addr, |
+ PP_NetAddress_IPv6_Dev* ipv6_addr) { |
+ if (!ipv6_addr) |
+ return false; |
+ |
+ const NetAddress* net_addr = ToNetAddress(&addr); |
+ if (!IsValid(net_addr) || !net_addr->is_ipv6) |
+ return false; |
+ |
+ ipv6_addr->port = ConvertToNetEndian16(net_addr->port); |
+ |
+ COMPILE_ASSERT(sizeof(ipv6_addr->addr) == kIPv6AddressSize, |
+ mismatched_IPv6_address_size); |
+ memcpy(ipv6_addr->addr, net_addr->address, kIPv6AddressSize); |
+ |
+ ipv6_addr->unused_padding = 0; |
+ return true; |
+} |
+ |
} // namespace ppapi |