summaryrefslogtreecommitdiffstats
path: root/libqdb
diff options
context:
space:
mode:
authorKimmo Ollila <kimmo.ollila@theqtcompany.com>2016-08-19 11:58:43 +0300
committerKari Oikarinen <kari.oikarinen@qt.io>2016-08-22 12:23:24 +0000
commit6cfe4ed873b22aa6b8b9a407769b683169043221 (patch)
tree8cf96c9e48f2631be44910ab49deac86c29b27b2 /libqdb
parent3a6284c97ee1fb22f0bafe14f0f4d4ac2d8d2acf (diff)
Windows host support
Change-Id: I8d0cd0f0b4790824df4149fb3c40c4ab962b97a0 Reviewed-by: Kari Oikarinen <kari.oikarinen@qt.io>
Diffstat (limited to 'libqdb')
-rw-r--r--libqdb/interruptsignalhandler.cpp67
-rw-r--r--libqdb/interruptsignalhandler.h22
-rw-r--r--libqdb/libqdb.pro19
-rw-r--r--libqdb/protocol/protocol.h2
-rw-r--r--libqdb/protocol/qdbmessage.h2
-rw-r--r--libqdb/usb/usbconnectionreader.h4
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
{