diff options
author | Kimmo Ollila <kimmo.ollila@theqtcompany.com> | 2016-08-19 11:58:43 +0300 |
---|---|---|
committer | Kari Oikarinen <kari.oikarinen@qt.io> | 2016-08-22 12:23:24 +0000 |
commit | 6cfe4ed873b22aa6b8b9a407769b683169043221 (patch) | |
tree | 8cf96c9e48f2631be44910ab49deac86c29b27b2 /libqdb | |
parent | 3a6284c97ee1fb22f0bafe14f0f4d4ac2d8d2acf (diff) |
Windows host support
Change-Id: I8d0cd0f0b4790824df4149fb3c40c4ab962b97a0
Reviewed-by: Kari Oikarinen <kari.oikarinen@qt.io>
Diffstat (limited to 'libqdb')
-rw-r--r-- | libqdb/interruptsignalhandler.cpp | 67 | ||||
-rw-r--r-- | libqdb/interruptsignalhandler.h | 22 | ||||
-rw-r--r-- | libqdb/libqdb.pro | 19 | ||||
-rw-r--r-- | libqdb/protocol/protocol.h | 2 | ||||
-rw-r--r-- | libqdb/protocol/qdbmessage.h | 2 | ||||
-rw-r--r-- | libqdb/usb/usbconnectionreader.h | 4 |
6 files changed, 85 insertions, 31 deletions
diff --git a/libqdb/interruptsignalhandler.cpp b/libqdb/interruptsignalhandler.cpp index 067be36..3d2ade6 100644 --- a/libqdb/interruptsignalhandler.cpp +++ b/libqdb/interruptsignalhandler.cpp @@ -20,6 +20,7 @@ ******************************************************************************/ #include "interruptsignalhandler.h" +#ifdef Q_OS_UNIX #include "../utils/make_unique.h" #include <QtCore/qdebug.h> @@ -29,24 +30,59 @@ #include <sys/socket.h> #include <unistd.h> +#elif Q_OS_WINDOWS +#include <windows.h> +#endif + +#ifdef Q_OS_UNIX +int InterruptSignalHandler::s_socketPair[2] = {0, 0}; +#elif Q_OS_WINDOWS +InterruptSignalHandler* InterruptSignalHandler::m_handler = nullptr; +#endif + InterruptSignalHandler::InterruptSignalHandler(QObject *parent) - : QObject(parent), - m_socketNotifier{nullptr} + : QObject(parent) { +#ifdef Q_OS_UNIX + m_socketNotifier = nullptr; if (socketpair(AF_UNIX, SOCK_STREAM, 0, s_socketPair)) qFatal("Could not create socketpair for signal handling in InterruptSignalHandler"); m_socketNotifier = make_unique<QSocketNotifier>(s_socketPair[1], QSocketNotifier::Read); connect(m_socketNotifier.get(), SIGNAL(activated(int)), this, SLOT(handleSigInt())); +#endif if (!installSigIntHandler()) qFatal("Could not install signal handler in InterruptSignalHandler"); } -int InterruptSignalHandler::s_socketPair[2] = {0, 0}; +InterruptSignalHandler::~InterruptSignalHandler() { +#ifdef Q_OS_WINDOWS + SetConsoleCtrlHandler(&InterruptSignalHandler::consoleHandler, FALSE); +#endif +} + +bool InterruptSignalHandler::installSigIntHandler() +{ +#ifdef Q_OS_UNIX + struct sigaction action; + action.sa_handler = &InterruptSignalHandler::sigIntHandler; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + action.sa_flags |= SA_RESTART; + + if (sigaction(SIGINT, &action, &m_oldAction)) + return false; +#elif Q_OS_WINDOWS + m_handler = this; + if (!SetConsoleCtrlHandler(&InterruptSignalHandler::consoleHandler, TRUE)) + return false; +#endif -InterruptSignalHandler::~InterruptSignalHandler() = default; + return true; +} +#ifdef Q_OS_UNIX void InterruptSignalHandler::sigIntHandler(int signalId) { Q_UNUSED(signalId); @@ -54,7 +90,9 @@ void InterruptSignalHandler::sigIntHandler(int signalId) char a = 1; write(s_socketPair[0], &a, sizeof(a)); } +#endif +#ifdef Q_OS_UNIX void InterruptSignalHandler::handleSigInt() { char tmp; @@ -65,18 +103,15 @@ void InterruptSignalHandler::handleSigInt() emit interrupted(); } +#endif -bool InterruptSignalHandler::installSigIntHandler() +#ifdef Q_OS_WINDOWS +BOOL WINAPI InterruptSignalHandler::consoleHandler(DWORD signal) { - struct sigaction action; - action.sa_handler = &InterruptSignalHandler::sigIntHandler; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; - action.sa_flags |= SA_RESTART; - - if (sigaction(SIGINT, &action, &m_oldAction)) - return false; - - return true; + if (signal == CTRL_C_EVENT || signal == CTRL_CLOSE_EVENT) { + emit m_handler->interrupted(); + return true; + } + return false; } - +#endif diff --git a/libqdb/interruptsignalhandler.h b/libqdb/interruptsignalhandler.h index 4e59efe..54272a2 100644 --- a/libqdb/interruptsignalhandler.h +++ b/libqdb/interruptsignalhandler.h @@ -21,17 +21,17 @@ #ifndef INTERRUPTSIGNALHANDLER_H #define INTERRUPTSIGNALHANDLER_H -#include <QObject> -class QSocketNotifier; +#include <QtCore/qobject.h> +#ifdef Q_OS_UNIX +class QSocketNotifier; #include <memory> +#include <signal.h> -#ifndef Q_OS_UNIX -# error "InterruptSignalHandler only supports UNIX signals" +#elif Q_OS_WINDOWS +#include <windows.h> #endif -#include <signal.h> - class InterruptSignalHandler : public QObject { Q_OBJECT @@ -39,20 +39,30 @@ public: explicit InterruptSignalHandler(QObject *parent = 0); ~InterruptSignalHandler(); +#ifdef Q_OS_UNIX static void sigIntHandler(int signalId); +#elif Q_OS_WINDOWS + static BOOL WINAPI consoleHandler(DWORD signal); +#endif signals: void interrupted(); +#ifdef Q_OS_UNIX public slots: void handleSigInt(); +#endif private: bool installSigIntHandler(); +#ifdef Q_OS_UNIX static int s_socketPair[2]; struct sigaction m_oldAction; std::unique_ptr<QSocketNotifier> m_socketNotifier; +#elif Q_OS_WINDOWS + static InterruptSignalHandler* m_handler; +#endif }; #endif // INTERRUPTSIGNALHANDLER_H diff --git a/libqdb/libqdb.pro b/libqdb/libqdb.pro index 5e1a5c9..7140629 100644 --- a/libqdb/libqdb.pro +++ b/libqdb/libqdb.pro @@ -3,23 +3,22 @@ QT -= gui TARGET = qdb TEMPLATE = lib -DEFINES += QDB_LIBRARY +DEFINES += LIBQDB_LIBRARY SOURCES += \ abstractconnection.cpp \ - interruptsignalhandler.cpp \ protocol/qdbmessage.cpp \ protocol/qdbtransport.cpp \ stream.cpp \ streampacket.cpp \ usb/usbconnection.cpp \ usb/usbconnectionreader.cpp \ + interruptsignalhandler.cpp \ HEADERS += \ abstractconnection.h \ filepullcommon.h \ filepushcommon.h \ - interruptsignalhandler.h \ libqdb_global.h \ processcommon.h \ protocol/protocol.h \ @@ -30,13 +29,17 @@ HEADERS += \ streampacket.h \ usb/usbconnection.h \ usb/usbconnectionreader.h \ - -INCLUDEPATH += $$PWD - -INCLUDEPATH += $$[QT_SYSROOT]/usr/include/libusb-1.0/ -LIBS += -lusb-1.0 + interruptsignalhandler.h \ unix { + LIBS += -lusb-1.0 target.path = /usr/lib INSTALLS += target } + +win32 { + LIBS += -llibusb-1.0 +} + +INCLUDEPATH += $$PWD +INCLUDEPATH += $$[QT_SYSROOT]/usr/include/libusb-1.0/ diff --git a/libqdb/protocol/protocol.h b/libqdb/protocol/protocol.h index 5878e52..c27e072 100644 --- a/libqdb/protocol/protocol.h +++ b/libqdb/protocol/protocol.h @@ -21,6 +21,8 @@ #ifndef PROTOCOL_H #define PROTOCOL_H +#include <stdint.h> + const uint8_t qdbUsbClassId = 0xff; const uint8_t qdbUsbSubclassId = 0x52; const uint8_t qdbUsbProtocolId = 0x1; diff --git a/libqdb/protocol/qdbmessage.h b/libqdb/protocol/qdbmessage.h index 6c87635..6def63a 100644 --- a/libqdb/protocol/qdbmessage.h +++ b/libqdb/protocol/qdbmessage.h @@ -24,6 +24,8 @@ #include <QtCore/qbytearray.h> #include <QtCore/qmetatype.h> +#include <stdint.h> + class QDataStream; using StreamId = uint32_t; diff --git a/libqdb/usb/usbconnectionreader.h b/libqdb/usb/usbconnectionreader.h index 041deca..3798e6c 100644 --- a/libqdb/usb/usbconnectionreader.h +++ b/libqdb/usb/usbconnectionreader.h @@ -23,7 +23,9 @@ #include <QtCore/qobject.h> -class libusb_device_handle; +#include <stdint.h> + +struct libusb_device_handle; class UsbConnectionReader : public QObject { |