aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-06-16 13:23:49 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-06-17 08:23:14 +0000
commited0a6a5e47b320ed9dadca0256b8e4b008d298c6 (patch)
treec170b9aa7c2d8d0caa479585f1497ea669b31c96
parentfb60f6a15e6c94a9c8b8ec2275239df6a01d850f (diff)
PySide6: Expose QHostInfo.lookupHost()
Fixes: PYSIDE-1160 Change-Id: If8fa16d965fcadaf622beee9ee45e207dc7195d8 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit e392613181ef5d8592989addbd01f96dbebf65e8) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/pyside6/PySide6/QtNetwork/typesystem_network.xml6
-rw-r--r--sources/pyside6/PySide6/glue/qtnetwork.cpp16
-rw-r--r--sources/pyside6/tests/QtNetwork/CMakeLists.txt1
-rw-r--r--sources/pyside6/tests/QtNetwork/qhostinfo_test.py101
4 files changed, 123 insertions, 1 deletions
diff --git a/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml b/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml
index a5afafbd3..0d0c480d6 100644
--- a/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml
+++ b/sources/pyside6/PySide6/QtNetwork/typesystem_network.xml
@@ -222,7 +222,11 @@
<value-type name="QHostInfo">
<enum-type name="HostInfoError"/>
- <modify-function signature="lookupHost(QString,QObject*,const char*)" access="private"/>
+ <add-function signature="lookupHost(const QString &amp;,PyCallable)">
+ <inject-code class="target" position="beginning"
+ file="../glue/qtnetwork.cpp"
+ snippet="qhostinfo-lookuphost-callable"/>
+ </add-function>
</value-type>
<value-type name="QNetworkAddressEntry">
diff --git a/sources/pyside6/PySide6/glue/qtnetwork.cpp b/sources/pyside6/PySide6/glue/qtnetwork.cpp
index cdb330c40..277dd6d7c 100644
--- a/sources/pyside6/PySide6/glue/qtnetwork.cpp
+++ b/sources/pyside6/PySide6/glue/qtnetwork.cpp
@@ -51,6 +51,22 @@ PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QHostAddress](ha));
PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[quint16](port));
// @snippet qudpsocket-readdatagram
+// @snippet qhostinfo-lookuphost-callable
+auto *callable = %PYARG_2;
+auto cppCallback = [callable](const QHostInfo &hostInfo)
+{
+ Shiboken::GilState state;
+ Shiboken::AutoDecRef arglist(PyTuple_New(1));
+ auto *pyHostInfo = %CONVERTTOPYTHON[QHostInfo](hostInfo);
+ PyTuple_SET_ITEM(arglist.object(), 0, pyHostInfo);
+ Shiboken::AutoDecRef ret(PyObject_CallObject(callable, arglist));
+ Py_DECREF(callable);
+};
+
+Py_INCREF(callable);
+%CPPSELF.%FUNCTION_NAME(%1, cppCallback);
+// @snippet qhostinfo-lookuphost-callable
+
// @snippet qipv6address-len
return 16;
// @snippet qipv6address-len
diff --git a/sources/pyside6/tests/QtNetwork/CMakeLists.txt b/sources/pyside6/tests/QtNetwork/CMakeLists.txt
index 754f8e5af..dd1d7c85d 100644
--- a/sources/pyside6/tests/QtNetwork/CMakeLists.txt
+++ b/sources/pyside6/tests/QtNetwork/CMakeLists.txt
@@ -3,6 +3,7 @@ PYSIDE_TEST(bug_1084.py)
PYSIDE_TEST(accessManager_test.py)
PYSIDE_TEST(dnslookup_test.py)
# Qt${QT_MAJOR_VERSION}: QHttp is gone PYSIDE_TEST(http_test.py)
+PYSIDE_TEST(qhostinfo_test.py)
PYSIDE_TEST(qpassworddigestor_test.py)
PYSIDE_TEST(tcpserver_test.py)
PYSIDE_TEST(udpsocket_test.py)
diff --git a/sources/pyside6/tests/QtNetwork/qhostinfo_test.py b/sources/pyside6/tests/QtNetwork/qhostinfo_test.py
new file mode 100644
index 000000000..d32d8c9b0
--- /dev/null
+++ b/sources/pyside6/tests/QtNetwork/qhostinfo_test.py
@@ -0,0 +1,101 @@
+#############################################################################
+##
+## Copyright (C) 2021 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of Qt for Python.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test case for QHostInfo.'''
+
+import os
+import sys
+import unittest
+
+from pathlib import Path
+sys.path.append(os.fspath(Path(__file__).resolve().parents[1]))
+from init_paths import init_test_paths
+init_test_paths(False)
+
+from helper.usesqcoreapplication import UsesQCoreApplication
+from PySide6.QtCore import (QCoreApplication, QElapsedTimer, QObject, QThread,
+ Slot, SLOT)
+from PySide6.QtNetwork import QHostInfo
+
+
+HOST = 'www.qt.io'
+
+
+TIMEOUT = 30000
+
+
+class Receiver(QObject):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._slot_called = False
+
+ def slot_called(self):
+ return self._slot_called
+
+ @Slot(QHostInfo)
+ def info_received(self, host_info):
+ name = host_info.hostName()
+ if host_info.error() == QHostInfo.NoError:
+ addresses = [a.toString() for a in host_info.addresses()]
+ addresses_str = ', '.join(addresses)
+ print(f'"{name}" resolved to {addresses_str}')
+ else:
+ error = host_info.errorString()
+ print(f'Unable to resolve "{name}": {error}', file=sys.stderr)
+ self._slot_called = True
+
+
+class QHostInfoTest(UsesQCoreApplication):
+ '''Test case for QHostInfo.'''
+ def setUp(self):
+ UsesQCoreApplication.setUp(self)
+ self._timer = QElapsedTimer()
+
+ def testStringBasedLookup(self):
+ receiver = Receiver()
+ self._timer.restart()
+ QHostInfo.lookupHost(HOST, receiver, SLOT('info_received(QHostInfo)'))
+ while not receiver.slot_called() and self._timer.elapsed() < TIMEOUT:
+ QCoreApplication.processEvents()
+ QThread.msleep(10)
+ print(f'String-based: Elapsed {self._timer.elapsed()}ms')
+ self.assertTrue(receiver.slot_called())
+
+ def testCallableLookup(self):
+ receiver = Receiver()
+ self._timer.restart()
+ QHostInfo.lookupHost(HOST, receiver.info_received)
+ while not receiver.slot_called() and self._timer.elapsed() < TIMEOUT:
+ QCoreApplication.processEvents()
+ QThread.msleep(10)
+ print(f'Callable: Elapsed {self._timer.elapsed()}ms')
+ self.assertTrue(receiver.slot_called())
+
+
+if __name__ == '__main__':
+ unittest.main()