diff --git a/kwin/client_machine.cpp b/kwin/client_machine.cpp index 0a2514b5..19a73bab 100644 --- a/kwin/client_machine.cpp +++ b/kwin/client_machine.cpp @@ -24,147 +24,14 @@ along with this program. If not, see . // KDE #include // Qt -#include -#include -// system -#include -#include -#include -#include +#include namespace KWin { -static QByteArray getHostName() -{ -#ifdef HOST_NAME_MAX - char hostnamebuf[HOST_NAME_MAX]; -#else - char hostnamebuf[256]; -#endif - if (gethostname(hostnamebuf, sizeof hostnamebuf) >= 0) { - hostnamebuf[sizeof(hostnamebuf)-1] = 0; - return QByteArray(hostnamebuf); - } - return QByteArray(); -} - -GetAddrInfo::GetAddrInfo(const QByteArray &hostName, QObject *parent) - : QObject(parent) - , m_resolving(false) - , m_resolved(false) - , m_ownResolved(false) - , m_hostName(hostName) - , m_addressHints(new addrinfo) - , m_address(NULL) - , m_ownAddress(NULL) - , m_watcher(new QFutureWatcher(this)) - , m_ownAddressWatcher(new QFutureWatcher(this)) -{ - // watcher will be deleted together with the GetAddrInfo once the future - // got canceled or finished - connect(m_watcher, SIGNAL(canceled()), SLOT(deleteLater())); - connect(m_watcher, SIGNAL(finished()), SLOT(slotResolved())); - connect(m_ownAddressWatcher, SIGNAL(canceled()), SLOT(deleteLater())); - connect(m_ownAddressWatcher, SIGNAL(finished()), SLOT(slotOwnAddressResolved())); -} - -GetAddrInfo::~GetAddrInfo() -{ - if (m_watcher && m_watcher->isRunning()) { - m_watcher->cancel(); - } - if (m_ownAddressWatcher && m_ownAddressWatcher->isRunning()) { - m_ownAddressWatcher->cancel(); - } - if (m_address) { - freeaddrinfo(m_address); - } - if (m_ownAddress) { - freeaddrinfo(m_ownAddress); - } - delete m_addressHints; -} - -void GetAddrInfo::resolve() -{ - if (m_resolving) { - return; - } - m_resolving = true; - memset(m_addressHints, 0, sizeof(*m_addressHints)); - m_addressHints->ai_family = PF_UNSPEC; - m_addressHints->ai_socktype = SOCK_STREAM; - m_addressHints->ai_flags |= AI_CANONNAME; - - // TODO: C++11 nullptr - const char* nullPtr = NULL; - m_watcher->setFuture(QtConcurrent::run(getaddrinfo, m_hostName, nullPtr, m_addressHints, &m_address)); - m_ownAddressWatcher->setFuture(QtConcurrent::run(getaddrinfo, getHostName(), nullPtr, m_addressHints, &m_ownAddress)); -} - -void GetAddrInfo::slotResolved() -{ - if (resolved(m_watcher)) { - m_resolved = true; - compare(); - } -} - -void GetAddrInfo::slotOwnAddressResolved() -{ - if (resolved(m_ownAddressWatcher)) { - m_ownResolved = true; - compare(); - } -} - -bool GetAddrInfo::resolved(QFutureWatcher< int >* watcher) -{ - if (!watcher->isFinished()) { - return false; - } - if (watcher->result() != 0) { - kDebug(1212) << "getaddrinfo failed with error:" << gai_strerror(watcher->result()); - // call failed; - deleteLater(); - return false; - } - return true; -} - -void GetAddrInfo::compare() -{ - if (!m_resolved || !m_ownResolved) { - return; - } - addrinfo *address = m_address; - while (address) { - if (address->ai_canonname && m_hostName == QByteArray(address->ai_canonname).toLower()) { - addrinfo *ownAddress = m_ownAddress; - bool localFound = false; - while (ownAddress) { - if (ownAddress->ai_canonname && QByteArray(ownAddress->ai_canonname).toLower() == m_hostName) { - localFound = true; - break; - } - ownAddress = ownAddress->ai_next; - } - if (localFound) { - emit local(); - break; - } - } - address = address->ai_next; - } - deleteLater(); -} - - ClientMachine::ClientMachine(QObject *parent) : QObject(parent) , m_localhost(false) , m_resolved(false) - , m_resolving(false) { } @@ -198,7 +65,7 @@ void ClientMachine::checkForLocalhost() // nothing to do return; } - QByteArray host = getHostName(); + QByteArray host = QHostInfo::localHostName().toAscii(); if (!host.isEmpty()) { host = host.toLower(); @@ -211,16 +78,7 @@ void ClientMachine::checkForLocalhost() *dot = '\0'; if (host == lowerHostName) { setLocal(); - return; } - } else { - m_resolving = true; - // check using information from get addr info - // GetAddrInfo gets automatically destroyed once it finished or not - GetAddrInfo *info = new GetAddrInfo(lowerHostName, this); - connect(info, SIGNAL(local()), SLOT(setLocal())); - connect(info, SIGNAL(destroyed(QObject*)), SLOT(resolveFinished())); - info->resolve(); } } } @@ -231,9 +89,4 @@ void ClientMachine::setLocal() emit localhostChanged(); } -void ClientMachine::resolveFinished() -{ - m_resolving = false; -} - } // namespace diff --git a/kwin/client_machine.h b/kwin/client_machine.h index 212a49b6..469e490e 100644 --- a/kwin/client_machine.h +++ b/kwin/client_machine.h @@ -23,42 +23,8 @@ along with this program. If not, see . #include #include -// forward declaration -struct addrinfo; -#include - namespace KWin { -class GetAddrInfo : public QObject -{ - Q_OBJECT -public: - explicit GetAddrInfo(const QByteArray &hostName, QObject *parent = NULL); - virtual ~GetAddrInfo(); - - void resolve(); - -Q_SIGNALS: - void local(); - -private Q_SLOTS: - void slotResolved(); - void slotOwnAddressResolved(); - -private: - void compare(); - bool resolved(QFutureWatcher *watcher); - bool m_resolving; - bool m_resolved; - bool m_ownResolved; - QByteArray m_hostName; - addrinfo *m_addressHints; - addrinfo *m_address; - addrinfo *m_ownAddress; - QFutureWatcher *m_watcher; - QFutureWatcher *m_ownAddressWatcher; -}; - class ClientMachine : public QObject { Q_OBJECT @@ -70,21 +36,18 @@ public: const QByteArray &hostName() const; bool isLocal() const; static QByteArray localhost(); - bool isResolving() const; Q_SIGNALS: void localhostChanged(); private Q_SLOTS: void setLocal(); - void resolveFinished(); private: void checkForLocalhost(); QByteArray m_hostName; bool m_localhost; bool m_resolved; - bool m_resolving; }; inline @@ -105,12 +68,6 @@ QByteArray ClientMachine::localhost() return "localhost"; } -inline -bool ClientMachine::isResolving() const -{ - return m_resolving; -} - } // namespace #endif diff --git a/kwin/tests/test_client_machine.cpp b/kwin/tests/test_client_machine.cpp index 574e688a..92ec7ea3 100644 --- a/kwin/tests/test_client_machine.cpp +++ b/kwin/tests/test_client_machine.cpp @@ -129,12 +129,6 @@ void TestClientMachine::hostName() clientMachine.resolve(window, XCB_WINDOW_NONE); QTEST(clientMachine.hostName(), "expectedHost"); - int i=0; - while (clientMachine.isResolving() && i++ < 50) { - // name is being resolved in an external thread, so let's wait a little bit - QTest::qWait(250); - } - QCOMPARE(clientMachine.isLocal(), local); QCOMPARE(spy.isEmpty(), !local); }