From cfbdd55bb39f6e2012103a506d8d2506145cc936 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Mon, 27 Aug 2012 11:31:08 -0500 Subject: Add very preliminary network-manager backend support --- tdecore/tdenetworkconnections.cpp | 351 +++++++++++++++++++++++++++++++++++++- 1 file changed, 347 insertions(+), 4 deletions(-) (limited to 'tdecore/tdenetworkconnections.cpp') diff --git a/tdecore/tdenetworkconnections.cpp b/tdecore/tdenetworkconnections.cpp index e137457ed..0a3893f1f 100644 --- a/tdecore/tdenetworkconnections.cpp +++ b/tdecore/tdenetworkconnections.cpp @@ -19,13 +19,297 @@ #include "tdehardwaredevices.h" #include "tdenetworkconnections.h" +#define SET_BIT(x, y) (x |= 1 << y) +#define TEST_BIT(x, y) ((x & (1 << y)) >> y) + +/*================================================================================================*/ +/* TDENetworkSearchDomain */ +/*================================================================================================*/ + +TDENetworkSearchDomain::TDENetworkSearchDomain() { + m_isIPV6 = false; +} + +TDENetworkSearchDomain::TDENetworkSearchDomain(TQString domain, bool ipv6) { + m_isIPV6 = ipv6; + m_domain = domain; +} + +TDENetworkSearchDomain::~TDENetworkSearchDomain() { + // +} + +TQString TDENetworkSearchDomain::searchDomain() { + return m_domain; +} + +void TDENetworkSearchDomain::setSearchDomain(TQString domain, bool ipv6) { + m_isIPV6 = ipv6; + m_domain = domain; +} + +bool TDENetworkSearchDomain::isIPv4() { + return !m_isIPV6; +} + +bool TDENetworkSearchDomain::isIPv6() { + return m_isIPV6; +} + +/*================================================================================================*/ +/* TDENetMask */ +/*================================================================================================*/ + +TDENetMask::TDENetMask() { + m_ipv4NetMask = 0; + m_isIPV6 = false; +} + +TDENetMask::TDENetMask(TQ_UINT32 netmask) { + m_ipv4NetMask = netmask; + m_isIPV6 = false; +} + +TDENetMask::TDENetMask(TQ_UINT8* netmask) { + m_ipv6NetMask = TQHostAddress(netmask); + m_isIPV6 = true; +} + +TDENetMask::~TDENetMask() { + // +} + +void TDENetMask::fromCIDRMask(unsigned char mask, bool ipv6) { + unsigned int i; + unsigned int j; + if (!ipv6) { + m_ipv4NetMask = 0; + for (i=31;i>=(32-mask);i--) { + SET_BIT(m_ipv4NetMask, i); + } + m_isIPV6 = false; + } + else { + Q_IPV6ADDR maskarray; + j=0; + unsigned int byteno=0; + memset(maskarray.c, 0, 16); + for (i=127;i>=(128-mask);i--) { + SET_BIT(maskarray.c[byteno], (i-((15-byteno)*8))); + j++; + if (j>7) { + j=0; + byteno++; + } + } + m_ipv6NetMask = TQHostAddress(maskarray); + m_isIPV6 = true; + } +} + +unsigned char TDENetMask::toCIDRMask() { + unsigned int i; + unsigned int j; + if (!m_isIPV6) { + for (i=0; i<32; i++) { + if (TEST_BIT(m_ipv4NetMask, i)) { + break; + } + } + return 32-i; + } + else { + Q_IPV6ADDR mask = m_ipv6NetMask.toIPv6Address(); + bool found = false; + for (j=0; j<16; ++j) { + for (i=0; i<8; i++) { + if (!TEST_BIT(mask.c[j], i)) { + found = true; + break; + } + } + if (found) break; + } + return ((j*8)+i); + } +} + +void TDENetMask::fromString(TQString mask) { + if (mask.contains(".")) { + m_isIPV6 = false; + m_ipv4NetMask = 0; + TQStringList pieces = TQStringList::split(".", mask); + TQ_UINT8 chunk; + chunk = pieces[0].toUShort(); + m_ipv4NetMask = m_ipv4NetMask | (chunk << 24); + chunk = pieces[1].toUShort(); + m_ipv4NetMask = m_ipv4NetMask | (chunk << 16); + chunk = pieces[2].toUShort(); + m_ipv4NetMask = m_ipv4NetMask | (chunk << 8); + chunk = pieces[3].toUShort(); + m_ipv4NetMask = m_ipv4NetMask | (chunk << 0); + } + else if (mask.contains(":")) { + m_isIPV6 = true; + m_ipv6NetMask.setAddress(mask); + } +} + +TQString TDENetMask::toString() { + if (!m_isIPV6) { + return TQString("%1.%2.%3.%4").arg((m_ipv4NetMask & 0xff000000) >> 24).arg((m_ipv4NetMask & 0x00ff0000) >> 16).arg((m_ipv4NetMask & 0x0000ff00) >> 8).arg((m_ipv4NetMask & 0x000000ff) >> 0); + } + else { + return m_ipv6NetMask.toString(); + } +} + +bool TDENetMask::isIPv4() { + return !m_isIPV6; +} + +bool TDENetMask::isIPv6() { + return m_isIPV6; +} + +/*================================================================================================*/ +/* TDEMACAddress */ +/*================================================================================================*/ + +TDEMACAddress::TDEMACAddress() { + m_macAddress.clear(); + m_isValid = false; +} + +TDEMACAddress::TDEMACAddress(TDENetworkByteList address) { + m_macAddress = address; + m_isValid = true; +} + +TDEMACAddress::~TDEMACAddress() { + // +} + +TDENetworkByteList TDEMACAddress::address() { + return m_macAddress; +} + +void TDEMACAddress::setAddress(TDENetworkByteList address) { + m_macAddress = address; + m_isValid = true; +} + +bool TDEMACAddress::isValid() { + return m_isValid; +} + +void TDEMACAddress::fromString(TQString address) { + TQStringList pieces = TQStringList::split(":", address); + m_macAddress.clear(); + for (TQStringList::Iterator it = pieces.begin(); it != pieces.end(); ++it) { + m_macAddress.append((*it).toUShort(0, 16)); + } + m_isValid = true; +} + +TQString TDEMACAddress::toString() { + TQString ret; + TDENetworkByteList::iterator it; + for (it = m_macAddress.begin(); it != m_macAddress.end(); ++it) { + if (ret != "") { + ret.append(":"); + } + ret.append(TQString().sprintf("%02x", *it)); + } + return ret.lower(); +} + +bool operator==(const TDEMACAddress &a1, const TDEMACAddress &a2) { + if (a1.m_macAddress.count() != a2.m_macAddress.count()) { + return false; + } + else { + unsigned int i; + for (i=0; ifirst(); connection; connection = m_connectionList->next()) { + if (connection->UUID == uuid) { + return connection; + } + } + return NULL; +} + +void TDENetworkConnectionManager::clearTDENetworkConnectionList() { + TDENetworkConnection *connection; + for (connection = m_connectionList->first(); connection; connection = m_connectionList->next()) { + delete connection; + } + m_connectionList->clear(); +} + +void TDENetworkConnectionManager::clearTDENetworkHWNeighborList() { + TDENetworkHWNeighbor *neighbor; + for (neighbor = m_hwNeighborList->first(); neighbor; neighbor = m_hwNeighborList->next()) { + delete neighbor; + } + m_hwNeighborList->clear(); +} + +void TDENetworkConnectionManager::internalNetworkConnectionStateChanged(TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags newState) { + emit(networkConnectionStateChanged(m_prevConnectionStatus, newState)); + m_prevConnectionStatus = newState; +} + +void TDENetworkConnectionManager::internalNetworkDeviceStateChanged(TDENetworkConnectionStatus::TDENetworkConnectionStatus newState, TQString hwAddress) { + if (!m_prevDeviceStatus.contains("hwAddress")) { + m_prevDeviceStatus[hwAddress] = TDENetworkConnectionStatus::Invalid; + } + emit(networkDeviceStateChanged(m_prevDeviceStatus[hwAddress], newState, hwAddress)); + m_prevDeviceStatus[hwAddress] = newState; +} + /*================================================================================================*/ /* End */ /*================================================================================================*/ -- cgit v1.2.1