|
qCNC 0.82-alpha
|
00001 00007 #ifndef _QEXTSERIALENUMERATOR_H_ 00008 #define _QEXTSERIALENUMERATOR_H_ 00009 00010 00011 #include <QString> 00012 #include <QList> 00013 #include <QObject> 00014 #include "qextserialport_global.h" 00015 00016 #ifdef Q_OS_WIN 00017 #include <windows.h> 00018 #include <setupapi.h> 00019 #include <dbt.h> 00020 #endif /*Q_OS_WIN*/ 00021 00022 #ifdef Q_OS_MAC 00023 #include <IOKit/usb/IOUSBLib.h> 00024 #endif 00025 00029 struct QextPortInfo { 00030 QString portName; 00031 QString physName; 00032 QString friendName; 00033 QString enumName; 00034 int vendorID; 00035 int productID; 00036 }; 00037 00038 #ifdef Q_OS_WIN 00039 #ifdef QT_GUI_LIB 00040 #include <QWidget> 00041 class QextSerialEnumerator; 00042 00043 class QextSerialRegistrationWidget : public QWidget 00044 { 00045 Q_OBJECT 00046 public: 00047 QextSerialRegistrationWidget( QextSerialEnumerator* qese ) { 00048 this->qese = qese; 00049 } 00050 ~QextSerialRegistrationWidget( ) { } 00051 00052 protected: 00053 QextSerialEnumerator* qese; 00054 bool winEvent( MSG* message, long* result ); 00055 }; 00056 #endif // QT_GUI_LIB 00057 #endif // Q_OS_WIN 00058 00096 class QEXTSERIALPORT_EXPORT QextSerialEnumerator : public QObject 00097 { 00098 Q_OBJECT 00099 public: 00100 QextSerialEnumerator( ); 00101 ~QextSerialEnumerator( ); 00102 00103 #ifdef Q_OS_WIN 00104 LRESULT onDeviceChangeWin( WPARAM wParam, LPARAM lParam ); 00105 private: 00112 static QString getRegKeyValue(HKEY key, LPCTSTR property); 00113 00123 static QString getDeviceProperty(HDEVINFO devInfo, PSP_DEVINFO_DATA devData, DWORD property); 00124 00129 static void setupAPIScan(QList<QextPortInfo> & infoList); 00130 void setUpNotificationWin( ); 00131 static bool getDeviceDetailsWin( QextPortInfo* portInfo, HDEVINFO devInfo, 00132 PSP_DEVINFO_DATA devData, WPARAM wParam = DBT_DEVICEARRIVAL ); 00133 static void enumerateDevicesWin( const GUID & guidDev, QList<QextPortInfo>* infoList ); 00134 bool matchAndDispatchChangedDevice(const QString & deviceID, const GUID & guid, WPARAM wParam); 00135 #ifdef QT_GUI_LIB 00136 QextSerialRegistrationWidget* notificationWidget; 00137 #endif 00138 #endif /*Q_OS_WIN*/ 00139 00140 #ifdef Q_OS_UNIX 00141 #ifdef Q_OS_MAC 00142 private: 00147 static void scanPortsOSX(QList<QextPortInfo> & infoList); 00148 static void iterateServicesOSX(io_object_t service, QList<QextPortInfo> & infoList); 00149 static bool getServiceDetailsOSX( io_object_t service, QextPortInfo* portInfo ); 00150 00151 void setUpNotificationOSX( ); 00152 void onDeviceDiscoveredOSX( io_object_t service ); 00153 void onDeviceTerminatedOSX( io_object_t service ); 00154 friend void deviceDiscoveredCallbackOSX( void *ctxt, io_iterator_t serialPortIterator ); 00155 friend void deviceTerminatedCallbackOSX( void *ctxt, io_iterator_t serialPortIterator ); 00156 00157 IONotificationPortRef notificationPortRef; 00158 00159 #else // Q_OS_MAC 00160 private: 00165 static void scanPortsNix(QList<QextPortInfo> & infoList); 00166 #endif // Q_OS_MAC 00167 #endif /* Q_OS_UNIX */ 00168 00169 public: 00174 static QList<QextPortInfo> getPorts(); 00178 void setUpNotifications( ); 00179 00180 signals: 00188 void deviceDiscovered( const QextPortInfo & info ); 00196 void deviceRemoved( const QextPortInfo & info ); 00197 }; 00198 00199 #endif /*_QEXTSERIALENUMERATOR_H_*/