File indexing completed on 2024-04-14 05:41:27
0001 /* 0002 SPDX-FileCopyrightText: 2016 ROSA 0003 SPDX-License-Identifier: GPL-3.0-or-later 0004 */ 0005 0006 //////////////////////////////////////////////////////////////////////////////// 0007 // Windows implementation of UsbDeviceMonitor 0008 0009 #include "usbdevicemonitor_win_p.h" 0010 #include "usbdevicemonitor.h" 0011 0012 #include <QApplication> 0013 0014 0015 // Private class implementation 0016 0017 UsbDeviceMonitorPrivate::UsbDeviceMonitorPrivate() 0018 { 0019 } 0020 0021 UsbDeviceMonitorPrivate::~UsbDeviceMonitorPrivate() 0022 { 0023 } 0024 0025 0026 // Main class implementation 0027 0028 UsbDeviceMonitor::UsbDeviceMonitor(QObject *parent) : 0029 QObject(parent), 0030 d_ptr(new UsbDeviceMonitorPrivate()) 0031 { 0032 } 0033 0034 UsbDeviceMonitor::~UsbDeviceMonitor() 0035 { 0036 cleanup(); 0037 delete d_ptr; 0038 } 0039 0040 // Closes handles and frees resources 0041 void UsbDeviceMonitor::cleanup() 0042 { 0043 } 0044 0045 // Implements QAbstractNativeEventFilter interface for processing WM_DEVICECHANGE messages (Windows) 0046 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0047 bool UsbDeviceMonitor::nativeEventFilter(const QByteArray& eventType, void* message, long* result) 0048 #else 0049 bool UsbDeviceMonitor::nativeEventFilter(const QByteArray& eventType, void* message, qintptr* result) 0050 #endif 0051 { 0052 Q_UNUSED(eventType); 0053 0054 MSG* msg = static_cast<MSG*>(message); 0055 if ((msg->message == WM_DEVICECHANGE) && 0056 ((msg->wParam == DBT_DEVICEARRIVAL) || (msg->wParam == DBT_DEVICEREMOVECOMPLETE))) 0057 { 0058 // If the event was caused by adding or removing a device, mark the WinAPI message as processed 0059 // and emit the notification signal 0060 *result = TRUE; 0061 emit deviceChanged(); 0062 return true; 0063 } 0064 return false; 0065 } 0066 0067 bool UsbDeviceMonitor::startMonitoring() 0068 { 0069 // In Windows we use QAbstractNativeEventFilter interface implementation and process native Windows messages 0070 qApp->installNativeEventFilter(this); 0071 return true; 0072 }