ksocketaddress.cpp

来自「konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版」· C++ 代码 · 共 952 行 · 第 1/2 页

CPP
952
字号
{  d->dup((sockaddr*)0L, len, false);  return *this;}int KSocketAddress::family() const{  if (d->invalid())    return AF_UNSPEC;  return d->addr.generic->sa_family;}KSocketAddress& KSocketAddress::setFamily(int family){  if (d->invalid())    d->dup((sockaddr*)0L, MIN_SOCKADDR_LEN);  d->addr.generic->sa_family = family;  return *this;}bool KSocketAddress::operator ==(const KSocketAddress& other) const{  // if this is invalid, it's only equal if the other one is invalid as well  if (d->invalid())    return other.d->invalid();  // check the family to make sure we don't do unnecessary comparison  if (d->addr.generic->sa_family != other.d->addr.generic->sa_family)    return false;		// not the same family, not equal  // same family then  // check the ones we know already  switch (d->addr.generic->sa_family)    {    case AF_INET:      Q_ASSERT(d->reallen == SOCKADDR_IN_LEN);      Q_ASSERT(other.d->reallen == SOCKADDR_IN_LEN);      return memcmp(d->addr.in, other.d->addr.in, SOCKADDR_IN_LEN) == 0;#ifdef AF_INET6    case AF_INET6:      Q_ASSERT(d->reallen >= MIN_SOCKADDR_IN6_LEN);      Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_IN6_LEN);# if !defined(HAVE_STRUCT_SOCKADDR_IN6) || defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID)      // check for the case where sin6_scope_id isn't present      if (d->reallen != other.d->reallen)	{	  if (memcmp(d->addr.in6, other.d->addr.in6, MIN_SOCKADDR_IN6_LEN) != 0)	    return false;	// not equal	  if (d->reallen > other.d->reallen)	    return d->addr.in6->sin6_scope_id == 0;	  else	    return other.d->addr.in6->sin6_scope_id == 0;	}# endif	return memcmp(d->addr.in6, other.d->addr.in6, d->reallen) == 0;#endif    case AF_UNIX:      Q_ASSERT(d->reallen >= MIN_SOCKADDR_UN_LEN);      Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_UN_LEN);      // do a string comparison here      return strcmp(d->addr.un->sun_path, other.d->addr.un->sun_path) == 0;    default:      // something else we don't know about      // they are equal if and only if they are exactly equal      if (d->reallen == other.d->reallen)	return memcmp(d->addr.generic, other.d->addr.generic, d->reallen) == 0;    }  return false;		// not equal in any other case}QString KSocketAddress::nodeName() const{  if (d->invalid())    return QString::null;  switch (d->addr.generic->sa_family)    {    case AF_INET:#ifdef AF_INET6    case AF_INET6:      QString scopeid("%");      if (d->addr.generic->sa_family == AF_INET6 && d->addr.in6->sin6_scope_id)	scopeid += QString::number(d->addr.in6->sin6_scope_id);      else	scopeid.truncate(0);      return d->ref.ipAddress().toString() + scopeid;#else      return d->ref.ipAddress().toString();#endif    }  // any other case, including AF_UNIX  return QString::null;}QString KSocketAddress::serviceName() const{  if (d->invalid())    return QString::null;  switch (d->addr.generic->sa_family)    {    case AF_INET:#ifdef AF_INET6    case AF_INET6:#endif      return QString::number(d->ref.port());    case AF_UNIX:      return d->ref.pathname();    }  return QString::null;}QString KSocketAddress::toString() const{  if (d->invalid())    return QString::null;  QString fmt;  if (d->addr.generic->sa_family == AF_INET)    fmt = "%1:%2";#ifdef AF_INET6  else if (d->addr.generic->sa_family == AF_INET6)    fmt = "[%1]:%2";#endif  else if (d->addr.generic->sa_family == AF_UNIX)    return QString::fromLatin1("unix:%1").arg(serviceName());  else    return i18n("1: the unknown socket address family number",		"Unknown family %1").arg(d->addr.generic->sa_family);  return fmt.arg(nodeName()).arg(serviceName());}KInetSocketAddress& KSocketAddress::asInet(){  return d->ref;}KInetSocketAddress KSocketAddress::asInet() const{  return d->ref;}KUnixSocketAddress& KSocketAddress::asUnix(){  return d->ref;}KUnixSocketAddress KSocketAddress::asUnix() const{  return d->ref;}int KSocketAddress::ianaFamily(int af){  switch (af)    {    case AF_INET:      return 1;#ifdef AF_INET6    case AF_INET6:      return 2;#endif    default:      return 0;    }}int KSocketAddress::fromIanaFamily(int iana){  switch (iana)    {    case 1:      return AF_INET;#ifdef AF_INET6    case 2:      return AF_INET6;#endif    default:      return AF_UNSPEC;    }}// default constructorKInetSocketAddress::KInetSocketAddress(){}// binary data constructorKInetSocketAddress::KInetSocketAddress(const sockaddr* sa, Q_UINT16 len)  : KSocketAddress(sa, len){  if (!d->invalid())    update();}// create from IP and portKInetSocketAddress::KInetSocketAddress(const KIpAddress& host, Q_UINT16 port){  setHost(host);  setPort(port);}// copy constructorKInetSocketAddress::KInetSocketAddress(const KInetSocketAddress& other)  : KSocketAddress(other){}// special copy constructorKInetSocketAddress::KInetSocketAddress(const KSocketAddress& other)  : KSocketAddress(other){  if (!d->invalid())    update();}// special constructorKInetSocketAddress::KInetSocketAddress(KSocketAddressData *d)  : KSocketAddress(d){}// destructorKInetSocketAddress::~KInetSocketAddress(){  /* nothing to do */}// copy operatorKInetSocketAddress& KInetSocketAddress::operator =(const KInetSocketAddress& other){  KSocketAddress::operator =(other);  return *this;}// IP versionint KInetSocketAddress::ipVersion() const{  if (d->invalid())    return 0;  switch (d->addr.generic->sa_family)    {    case AF_INET:      return 4;#ifdef AF_INET6    case AF_INET6:      return 6;#endif    }  return 0;			// for all other cases}KIpAddress KInetSocketAddress::ipAddress() const{  if (d->invalid())    return KIpAddress();	// return an empty address as well  switch (d->addr.generic->sa_family)    {    case AF_INET:      return KIpAddress(&d->addr.in->sin_addr, 4);#ifdef AF_INET6    case AF_INET6:      return KIpAddress(&d->addr.in6->sin6_addr, 6);#endif    }  return KIpAddress();		// empty in all other cases}KInetSocketAddress& KInetSocketAddress::setHost(const KIpAddress& ip){  switch (ip.version())    {    case 4:      makeIPv4();      memcpy(&d->addr.in->sin_addr, ip.addr(), sizeof(d->addr.in->sin_addr));      break;    case 6:      makeIPv6();      memcpy(&d->addr.in6->sin6_addr, ip.addr(), sizeof(d->addr.in6->sin6_addr));      break;    default:      // empty      d->invalidate();    }  return *this;}// returns the portQ_UINT16 KInetSocketAddress::port() const{  if (d->invalid())    return 0;  switch (d->addr.generic->sa_family)    {    case AF_INET:      return ntohs(d->addr.in->sin_port);#ifdef AF_INET6    case AF_INET6:      return ntohs(d->addr.in6->sin6_port);#endif    }  return 0;}KInetSocketAddress& KInetSocketAddress::setPort(Q_UINT16 port){  if (d->invalid())    makeIPv4();  switch (d->addr.generic->sa_family)    {    case AF_INET:      d->addr.in->sin_port = htons(port);      break;      #ifdef AF_INET6    case AF_INET6:      d->addr.in6->sin6_port = htons(port);      break;#endif          default:      d->invalidate();		// setting the port on something else    }  return *this;}KInetSocketAddress& KInetSocketAddress::makeIPv4(){  d->makeipv4();  return *this;}KInetSocketAddress& KInetSocketAddress::makeIPv6(){  d->makeipv6();  return *this;}Q_UINT32 KInetSocketAddress::flowinfo() const{#ifndef AF_INET6  return 0;#else  if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6)    return d->addr.in6->sin6_flowinfo;  return 0;#endif}KInetSocketAddress& KInetSocketAddress::setFlowinfo(Q_UINT32 flowinfo){  makeIPv6();			// must set here  d->addr.in6->sin6_flowinfo = flowinfo;  return *this;}int KInetSocketAddress::scopeId() const{#ifndef AF_INET6  return 0;#else  if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6)    return d->addr.in6->sin6_scope_id;  return 0;#endif}KInetSocketAddress& KInetSocketAddress::setScopeId(int scopeid){  makeIPv6();			// must set here  d->addr.in6->sin6_scope_id = scopeid;  return *this;}void KInetSocketAddress::update(){  if (d->addr.generic->sa_family == AF_INET)    return;#ifdef AF_INET6  else if (d->addr.generic->sa_family == AF_INET6)    return;#endif  else    d->invalidate();}KUnixSocketAddress::KUnixSocketAddress(){}KUnixSocketAddress::KUnixSocketAddress(const sockaddr* sa, Q_UINT16 len)  : KSocketAddress(sa, len){  if (!d->invalid() && d->addr.un->sun_family != AF_UNIX)    d->invalidate();}KUnixSocketAddress::KUnixSocketAddress(const KUnixSocketAddress& other)  : KSocketAddress(other){}KUnixSocketAddress::KUnixSocketAddress(const QString& pathname){  setPathname(pathname);}KUnixSocketAddress::KUnixSocketAddress(KSocketAddressData* d)  : KSocketAddress(d){}KUnixSocketAddress::~KUnixSocketAddress(){}KUnixSocketAddress& KUnixSocketAddress::operator =(const KUnixSocketAddress& other){  KSocketAddress::operator =(other);  return *this;}QString KUnixSocketAddress::pathname() const{  if (!d->invalid() && d->addr.un->sun_family == AF_UNIX)    return QFile::decodeName(d->addr.un->sun_path);  return QString::null;}KUnixSocketAddress& KUnixSocketAddress::setPathname(const QString& path){  d->dup(0L, MIN_SOCKADDR_UN_LEN + path.length());  d->addr.un->sun_family = AF_UNIX;  strcpy(d->addr.un->sun_path, QFile::encodeName(path));#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN  d->addr.un->sun_len = d->reallen;#endif  return *this;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?