netwerk/base/src/nsNetAddr.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/netwerk/base/src/nsNetAddr.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,158 @@
     1.4 +/* vim: et ts=2 sw=2 tw=80 
     1.5 + */
     1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +#include "nsNetAddr.h"
    1.11 +#include "nsString.h"
    1.12 +#include "mozilla/net/DNS.h"
    1.13 +
    1.14 +using namespace mozilla::net;
    1.15 +
    1.16 +NS_IMPL_ISUPPORTS(nsNetAddr, nsINetAddr)
    1.17 +
    1.18 +/* Makes a copy of |addr| */
    1.19 +nsNetAddr::nsNetAddr(NetAddr* addr)
    1.20 +{
    1.21 +  NS_ASSERTION(addr, "null addr");
    1.22 +  mAddr = *addr;
    1.23 +}
    1.24 +
    1.25 +/* readonly attribute unsigned short family; */
    1.26 +NS_IMETHODIMP nsNetAddr::GetFamily(uint16_t *aFamily)
    1.27 +{
    1.28 +  switch(mAddr.raw.family) {
    1.29 +  case AF_INET:
    1.30 +    *aFamily = nsINetAddr::FAMILY_INET;
    1.31 +    break;
    1.32 +  case AF_INET6:
    1.33 +    *aFamily = nsINetAddr::FAMILY_INET6;
    1.34 +    break;
    1.35 +#if defined(XP_UNIX)
    1.36 +  case AF_LOCAL:
    1.37 +    *aFamily = nsINetAddr::FAMILY_LOCAL;
    1.38 +    break;
    1.39 +#endif
    1.40 +  default:
    1.41 +    return NS_ERROR_UNEXPECTED;
    1.42 +  }
    1.43 +
    1.44 +  return NS_OK;
    1.45 +}
    1.46 +
    1.47 +/* readonly attribute AUTF8String address; */
    1.48 +NS_IMETHODIMP nsNetAddr::GetAddress(nsACString & aAddress)
    1.49 +{
    1.50 +  switch(mAddr.raw.family) {
    1.51 +  /* PR_NetAddrToString can handle INET and INET6, but not LOCAL. */
    1.52 +  case AF_INET:
    1.53 +    aAddress.SetCapacity(kIPv4CStrBufSize);
    1.54 +    NetAddrToString(&mAddr, aAddress.BeginWriting(), kIPv4CStrBufSize);
    1.55 +    aAddress.SetLength(strlen(aAddress.BeginReading()));
    1.56 +    break;
    1.57 +  case AF_INET6:
    1.58 +    aAddress.SetCapacity(kIPv6CStrBufSize);
    1.59 +    NetAddrToString(&mAddr, aAddress.BeginWriting(), kIPv6CStrBufSize);
    1.60 +    aAddress.SetLength(strlen(aAddress.BeginReading()));
    1.61 +    break;
    1.62 +#if defined(XP_UNIX)
    1.63 +  case AF_LOCAL:
    1.64 +    aAddress.Assign(mAddr.local.path);
    1.65 +    break;
    1.66 +#endif
    1.67 +  // PR_AF_LOCAL falls through to default when not XP_UNIX
    1.68 +  default:
    1.69 +    return NS_ERROR_UNEXPECTED;
    1.70 +  }
    1.71 +  
    1.72 +  return NS_OK;
    1.73 +}
    1.74 +
    1.75 +/* readonly attribute unsigned short port; */
    1.76 +NS_IMETHODIMP nsNetAddr::GetPort(uint16_t *aPort)
    1.77 +{
    1.78 +  switch(mAddr.raw.family) {
    1.79 +  case AF_INET:
    1.80 +    *aPort = ntohs(mAddr.inet.port);
    1.81 +    break;
    1.82 +  case AF_INET6:
    1.83 +    *aPort = ntohs(mAddr.inet6.port);
    1.84 +    break;
    1.85 +#if defined(XP_UNIX)
    1.86 +  case AF_LOCAL:
    1.87 +    // There is no port number for local / connections.
    1.88 +    return NS_ERROR_NOT_AVAILABLE;
    1.89 +#endif
    1.90 +  default:
    1.91 +    return NS_ERROR_UNEXPECTED;
    1.92 +  }
    1.93 +
    1.94 +  return NS_OK;
    1.95 +}
    1.96 +
    1.97 +/* readonly attribute unsigned long flow; */
    1.98 +NS_IMETHODIMP nsNetAddr::GetFlow(uint32_t *aFlow)
    1.99 +{
   1.100 +  switch(mAddr.raw.family) {
   1.101 +  case AF_INET6:
   1.102 +    *aFlow = ntohl(mAddr.inet6.flowinfo);
   1.103 +    break;
   1.104 +  case AF_INET:
   1.105 +#if defined(XP_UNIX)
   1.106 +  case AF_LOCAL:
   1.107 +#endif
   1.108 +    // only for IPv6
   1.109 +    return NS_ERROR_NOT_AVAILABLE;
   1.110 +  default:
   1.111 +    return NS_ERROR_UNEXPECTED;
   1.112 +  }
   1.113 +
   1.114 +  return NS_OK;
   1.115 +}
   1.116 +
   1.117 +/* readonly attribute unsigned long scope; */
   1.118 +NS_IMETHODIMP nsNetAddr::GetScope(uint32_t *aScope)
   1.119 +{
   1.120 +  switch(mAddr.raw.family) {
   1.121 +  case AF_INET6:
   1.122 +    *aScope = ntohl(mAddr.inet6.scope_id);
   1.123 +    break;
   1.124 +  case AF_INET:
   1.125 +#if defined(XP_UNIX)
   1.126 +  case AF_LOCAL:
   1.127 +#endif
   1.128 +    // only for IPv6
   1.129 +    return NS_ERROR_NOT_AVAILABLE;
   1.130 +  default:
   1.131 +    return NS_ERROR_UNEXPECTED;
   1.132 +  }
   1.133 +
   1.134 +  return NS_OK;
   1.135 +}
   1.136 +
   1.137 +/* readonly attribute boolean isV4Mapped; */
   1.138 +NS_IMETHODIMP nsNetAddr::GetIsV4Mapped(bool *aIsV4Mapped)
   1.139 +{
   1.140 +  switch(mAddr.raw.family) {
   1.141 +  case AF_INET6:
   1.142 +    *aIsV4Mapped = IPv6ADDR_IS_V4MAPPED(&mAddr.inet6.ip);
   1.143 +    break;
   1.144 +  case AF_INET:
   1.145 +#if defined(XP_UNIX)
   1.146 +  case AF_LOCAL:
   1.147 +#endif
   1.148 +    // only for IPv6
   1.149 +    return NS_ERROR_NOT_AVAILABLE;
   1.150 +  default:
   1.151 +    return NS_ERROR_UNEXPECTED;
   1.152 +  }
   1.153 +
   1.154 +  return NS_OK;
   1.155 +}
   1.156 +
   1.157 +NS_IMETHODIMP nsNetAddr::GetNetAddr(NetAddr *aResult) {
   1.158 +  memcpy(aResult, &mAddr, sizeof(mAddr));
   1.159 +  return NS_OK;
   1.160 +}
   1.161 +

mercurial