mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Bluetooth: use standard Qt code on Windows
We shouldn't need our hand crafted code anymore. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									d3d06bc580
								
							
						
					
					
						commit
						1f59629a76
					
				
					 3 changed files with 6 additions and 264 deletions
				
			
		| 
						 | 
					@ -98,7 +98,7 @@ void BTDiscovery::BTDiscoveryReDiscover()
 | 
				
			||||||
	if (1) {
 | 
						if (1) {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		m_btValid = true;
 | 
							m_btValid = true;
 | 
				
			||||||
#if defined(Q_OS_IOS) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
 | 
					#if defined(Q_OS_WIN) || defined(Q_OS_IOS) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
 | 
				
			||||||
		discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
 | 
							discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
 | 
				
			||||||
		connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &BTDiscovery::btDeviceDiscovered);
 | 
							connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &BTDiscovery::btDeviceDiscovered);
 | 
				
			||||||
		qDebug() << "starting BLE discovery";
 | 
							qDebug() << "starting BLE discovery";
 | 
				
			||||||
| 
						 | 
					@ -178,7 +178,7 @@ void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device)
 | 
				
			||||||
		qDebug() << id.toByteArray();
 | 
							qDebug() << id.toByteArray();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_IOS)
 | 
					#if defined(Q_OS_IOS) || defined(Q_OS_WIN)
 | 
				
			||||||
	// On Desktop this is called when "Save" button is clicked. All
 | 
						// On Desktop this is called when "Save" button is clicked. All
 | 
				
			||||||
	// DeviceInfo are stored as data on the ui list items.
 | 
						// DeviceInfo are stored as data on the ui list items.
 | 
				
			||||||
	// On mobile (iOS) the current ConnectionListModel does not support
 | 
						// On mobile (iOS) the current ConnectionListModel does not support
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,13 +10,6 @@
 | 
				
			||||||
#include "ui_btdeviceselectiondialog.h"
 | 
					#include "ui_btdeviceselectiondialog.h"
 | 
				
			||||||
#include "btdeviceselectiondialog.h"
 | 
					#include "btdeviceselectiondialog.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
Q_DECLARE_METATYPE(QBluetoothDeviceDiscoveryAgent::Error)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#if QT_VERSION < 0x050500
 | 
					 | 
				
			||||||
Q_DECLARE_METATYPE(QBluetoothDeviceInfo)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BtDeviceSelectionDialog::BtDeviceSelectionDialog(QWidget *parent) :
 | 
					BtDeviceSelectionDialog::BtDeviceSelectionDialog(QWidget *parent) :
 | 
				
			||||||
	QDialog(parent),
 | 
						QDialog(parent),
 | 
				
			||||||
	ui(new Ui::BtDeviceSelectionDialog),
 | 
						ui(new Ui::BtDeviceSelectionDialog),
 | 
				
			||||||
| 
						 | 
					@ -50,24 +43,6 @@ BtDeviceSelectionDialog::BtDeviceSelectionDialog(QWidget *parent) :
 | 
				
			||||||
	connect(ui->discoveredDevicesList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
 | 
						connect(ui->discoveredDevicesList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
 | 
				
			||||||
		this, SLOT(currentItemChanged(QListWidgetItem*,QListWidgetItem*)));
 | 
							this, SLOT(currentItemChanged(QListWidgetItem*,QListWidgetItem*)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	ULONG       ulRetCode = SUCCESS;
 | 
					 | 
				
			||||||
	WSADATA     WSAData = { 0 };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Initialize WinSock and ask for version 2.2.
 | 
					 | 
				
			||||||
	ulRetCode = WSAStartup(MAKEWORD(2, 2), &WSAData);
 | 
					 | 
				
			||||||
	if (ulRetCode != SUCCESS) {
 | 
					 | 
				
			||||||
		QMessageBox::critical(this, "Bluetooth",
 | 
					 | 
				
			||||||
						   tr("Could not initialize Winsock version 2.2"), QMessageBox::Ok);
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Initialize the device discovery agent
 | 
					 | 
				
			||||||
	initializeDeviceDiscoveryAgent();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// On Windows we cannot select a device or show information about the local device
 | 
					 | 
				
			||||||
	ui->localDeviceDetails->hide();
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	// Initialize the local Bluetooth device
 | 
						// Initialize the local Bluetooth device
 | 
				
			||||||
	localDevice = new QBluetoothLocalDevice();
 | 
						localDevice = new QBluetoothLocalDevice();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,38 +78,25 @@ BtDeviceSelectionDialog::BtDeviceSelectionDialog(QWidget *parent) :
 | 
				
			||||||
	// Initialize the device discovery agent
 | 
						// Initialize the device discovery agent
 | 
				
			||||||
	if (localDevice->isValid())
 | 
						if (localDevice->isValid())
 | 
				
			||||||
		initializeDeviceDiscoveryAgent();
 | 
							initializeDeviceDiscoveryAgent();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BtDeviceSelectionDialog::~BtDeviceSelectionDialog()
 | 
					BtDeviceSelectionDialog::~BtDeviceSelectionDialog()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	delete ui;
 | 
						delete ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// Terminate the use of Winsock 2 DLL
 | 
					 | 
				
			||||||
	WSACleanup();
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	// Clean the local device
 | 
						// Clean the local device
 | 
				
			||||||
	delete localDevice;
 | 
						delete localDevice;
 | 
				
			||||||
#endif
 | 
					
 | 
				
			||||||
	if (remoteDeviceDiscoveryAgent) {
 | 
						if (remoteDeviceDiscoveryAgent) {
 | 
				
			||||||
		// Clean the device discovery agent
 | 
							// Clean the device discovery agent
 | 
				
			||||||
		if (remoteDeviceDiscoveryAgent->isActive()) {
 | 
							if (remoteDeviceDiscoveryAgent->isActive())
 | 
				
			||||||
			remoteDeviceDiscoveryAgent->stop();
 | 
								remoteDeviceDiscoveryAgent->stop();
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
			remoteDeviceDiscoveryAgent->wait();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		delete remoteDeviceDiscoveryAgent;
 | 
							delete remoteDeviceDiscoveryAgent;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::on_changeDeviceState_clicked()
 | 
					void BtDeviceSelectionDialog::on_changeDeviceState_clicked()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// TODO add implementation
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	if (localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
 | 
						if (localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
 | 
				
			||||||
		ui->dialogStatus->setText(tr("Trying to turn on the local Bluetooth device..."));
 | 
							ui->dialogStatus->setText(tr("Trying to turn on the local Bluetooth device..."));
 | 
				
			||||||
		localDevice->powerOn();
 | 
							localDevice->powerOn();
 | 
				
			||||||
| 
						 | 
					@ -142,7 +104,6 @@ void BtDeviceSelectionDialog::on_changeDeviceState_clicked()
 | 
				
			||||||
		ui->dialogStatus->setText(tr("Trying to turn off the local Bluetooth device..."));
 | 
							ui->dialogStatus->setText(tr("Trying to turn off the local Bluetooth device..."));
 | 
				
			||||||
		localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
 | 
							localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::on_save_clicked()
 | 
					void BtDeviceSelectionDialog::on_save_clicked()
 | 
				
			||||||
| 
						 | 
					@ -159,9 +120,6 @@ void BtDeviceSelectionDialog::on_save_clicked()
 | 
				
			||||||
	if (remoteDeviceDiscoveryAgent->isActive()) {
 | 
						if (remoteDeviceDiscoveryAgent->isActive()) {
 | 
				
			||||||
		// Stop the SDP agent if the clear button is pressed and enable the Scan button
 | 
							// Stop the SDP agent if the clear button is pressed and enable the Scan button
 | 
				
			||||||
		remoteDeviceDiscoveryAgent->stop();
 | 
							remoteDeviceDiscoveryAgent->stop();
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
		remoteDeviceDiscoveryAgent->wait();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		ui->scan->setEnabled(true);
 | 
							ui->scan->setEnabled(true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -177,9 +135,6 @@ void BtDeviceSelectionDialog::on_clear_clicked()
 | 
				
			||||||
	if (remoteDeviceDiscoveryAgent->isActive()) {
 | 
						if (remoteDeviceDiscoveryAgent->isActive()) {
 | 
				
			||||||
		// Stop the SDP agent if the clear button is pressed and enable the Scan button
 | 
							// Stop the SDP agent if the clear button is pressed and enable the Scan button
 | 
				
			||||||
		remoteDeviceDiscoveryAgent->stop();
 | 
							remoteDeviceDiscoveryAgent->stop();
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
		remoteDeviceDiscoveryAgent->wait();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		ui->scan->setEnabled(true);
 | 
							ui->scan->setEnabled(true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -206,9 +161,6 @@ void BtDeviceSelectionDialog::remoteDeviceScanFinished()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::hostModeStateChanged(QBluetoothLocalDevice::HostMode mode)
 | 
					void BtDeviceSelectionDialog::hostModeStateChanged(QBluetoothLocalDevice::HostMode mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// TODO add implementation
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	bool on = !(mode == QBluetoothLocalDevice::HostPoweredOff);
 | 
						bool on = !(mode == QBluetoothLocalDevice::HostPoweredOff);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//: %1 will be replaced with "turned on" or "turned off"
 | 
						//: %1 will be replaced with "turned on" or "turned off"
 | 
				
			||||||
| 
						 | 
					@ -216,7 +168,6 @@ void BtDeviceSelectionDialog::hostModeStateChanged(QBluetoothLocalDevice::HostMo
 | 
				
			||||||
				  .arg(on? tr("turned on") : tr("turned off")));
 | 
									  .arg(on? tr("turned on") : tr("turned off")));
 | 
				
			||||||
	ui->deviceState->setChecked(on);
 | 
						ui->deviceState->setChecked(on);
 | 
				
			||||||
	ui->scan->setEnabled(on);
 | 
						ui->scan->setEnabled(on);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::addRemoteDevice(const QBluetoothDeviceInfo &remoteDeviceInfo)
 | 
					void BtDeviceSelectionDialog::addRemoteDevice(const QBluetoothDeviceInfo &remoteDeviceInfo)
 | 
				
			||||||
| 
						 | 
					@ -304,9 +255,6 @@ void BtDeviceSelectionDialog::currentItemChanged(QListWidgetItem *item, QListWid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::localDeviceChanged(int index)
 | 
					void BtDeviceSelectionDialog::localDeviceChanged(int index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// TODO add implementation
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	QBluetoothAddress localDeviceSelectedAddress = ui->localSelectedDevice->itemData(index, Qt::UserRole).value<QBluetoothAddress>();
 | 
						QBluetoothAddress localDeviceSelectedAddress = ui->localSelectedDevice->itemData(index, Qt::UserRole).value<QBluetoothAddress>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Delete the old localDevice
 | 
						// Delete the old localDevice
 | 
				
			||||||
| 
						 | 
					@ -327,14 +275,10 @@ void BtDeviceSelectionDialog::localDeviceChanged(int index)
 | 
				
			||||||
	// Initialize the device discovery agent
 | 
						// Initialize the device discovery agent
 | 
				
			||||||
	if (localDevice->isValid())
 | 
						if (localDevice->isValid())
 | 
				
			||||||
		initializeDeviceDiscoveryAgent();
 | 
							initializeDeviceDiscoveryAgent();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::displayPairingMenu(const QPoint &pos)
 | 
					void BtDeviceSelectionDialog::displayPairingMenu(const QPoint &pos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// TODO add implementation
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	QMenu menu(this);
 | 
						QMenu menu(this);
 | 
				
			||||||
	QAction *pairAction = menu.addAction(tr("Pair"));
 | 
						QAction *pairAction = menu.addAction(tr("Pair"));
 | 
				
			||||||
	QAction *removePairAction = menu.addAction(tr("Remove pairing"));
 | 
						QAction *removePairAction = menu.addAction(tr("Remove pairing"));
 | 
				
			||||||
| 
						 | 
					@ -361,7 +305,6 @@ void BtDeviceSelectionDialog::displayPairingMenu(const QPoint &pos)
 | 
				
			||||||
					    .arg(currentRemoteDeviceInfo.address().toString()));
 | 
										    .arg(currentRemoteDeviceInfo.address().toString()));
 | 
				
			||||||
		localDevice->requestPairing(currentRemoteDeviceInfo.address(), QBluetoothLocalDevice::Unpaired);
 | 
							localDevice->requestPairing(currentRemoteDeviceInfo.address(), QBluetoothLocalDevice::Unpaired);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::pairingFinished(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing)
 | 
					void BtDeviceSelectionDialog::pairingFinished(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing)
 | 
				
			||||||
| 
						 | 
					@ -438,11 +381,7 @@ void BtDeviceSelectionDialog::deviceDiscoveryError(QBluetoothDeviceDiscoveryAgen
 | 
				
			||||||
		errorDescription = tr("Writing to or reading from the device resulted in an error.");
 | 
							errorDescription = tr("Writing to or reading from the device resulted in an error.");
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
		errorDescription = remoteDeviceDiscoveryAgent->errorToString();
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
		errorDescription = tr("An unknown error has occurred.");
 | 
							errorDescription = tr("An unknown error has occurred.");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -495,9 +434,6 @@ QString BtDeviceSelectionDialog::formatDeviceText(const QString &address, const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::updateLocalDeviceInformation()
 | 
					void BtDeviceSelectionDialog::updateLocalDeviceInformation()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// TODO add implementation
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	// Check if the selected Bluetooth device can be accessed
 | 
						// Check if the selected Bluetooth device can be accessed
 | 
				
			||||||
	if (!localDevice->isValid()) {
 | 
						if (!localDevice->isValid()) {
 | 
				
			||||||
		QString na = tr("Not available");
 | 
							QString na = tr("Not available");
 | 
				
			||||||
| 
						 | 
					@ -537,21 +473,10 @@ void BtDeviceSelectionDialog::updateLocalDeviceInformation()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	connect(localDevice, SIGNAL(error(QBluetoothLocalDevice::Error)),
 | 
						connect(localDevice, SIGNAL(error(QBluetoothLocalDevice::Error)),
 | 
				
			||||||
		this, SLOT(error(QBluetoothLocalDevice::Error)));
 | 
							this, SLOT(error(QBluetoothLocalDevice::Error)));
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BtDeviceSelectionDialog::initializeDeviceDiscoveryAgent()
 | 
					void BtDeviceSelectionDialog::initializeDeviceDiscoveryAgent()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	// Register QBluetoothDeviceInfo metatype
 | 
					 | 
				
			||||||
	qRegisterMetaType<QBluetoothDeviceInfo>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Register QBluetoothDeviceDiscoveryAgent metatype (Needed for QBluetoothDeviceDiscoveryAgent::Error)
 | 
					 | 
				
			||||||
	qRegisterMetaType<QBluetoothDeviceDiscoveryAgent::Error>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Intialize the discovery agent
 | 
					 | 
				
			||||||
	remoteDeviceDiscoveryAgent = new WinBluetoothDeviceDiscoveryAgent(this);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	// Intialize the discovery agent
 | 
						// Intialize the discovery agent
 | 
				
			||||||
	remoteDeviceDiscoveryAgent = new QBluetoothDeviceDiscoveryAgent(localDevice->address());
 | 
						remoteDeviceDiscoveryAgent = new QBluetoothDeviceDiscoveryAgent(localDevice->address());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -564,7 +489,6 @@ void BtDeviceSelectionDialog::initializeDeviceDiscoveryAgent()
 | 
				
			||||||
		ui->clear->setEnabled(false);
 | 
							ui->clear->setEnabled(false);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	connect(remoteDeviceDiscoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
 | 
						connect(remoteDeviceDiscoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
 | 
				
			||||||
		this, SLOT(addRemoteDevice(QBluetoothDeviceInfo)));
 | 
							this, SLOT(addRemoteDevice(QBluetoothDeviceInfo)));
 | 
				
			||||||
	connect(remoteDeviceDiscoveryAgent, SIGNAL(finished()),
 | 
						connect(remoteDeviceDiscoveryAgent, SIGNAL(finished()),
 | 
				
			||||||
| 
						 | 
					@ -572,143 +496,3 @@ void BtDeviceSelectionDialog::initializeDeviceDiscoveryAgent()
 | 
				
			||||||
	connect(remoteDeviceDiscoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)),
 | 
						connect(remoteDeviceDiscoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)),
 | 
				
			||||||
		this, SLOT(deviceDiscoveryError(QBluetoothDeviceDiscoveryAgent::Error)));
 | 
							this, SLOT(deviceDiscoveryError(QBluetoothDeviceDiscoveryAgent::Error)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
WinBluetoothDeviceDiscoveryAgent::WinBluetoothDeviceDiscoveryAgent(QObject *parent) : QThread(parent)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// Initialize the internal flags by their default values
 | 
					 | 
				
			||||||
	running = false;
 | 
					 | 
				
			||||||
	stopped = false;
 | 
					 | 
				
			||||||
	lastError = QBluetoothDeviceDiscoveryAgent::NoError;
 | 
					 | 
				
			||||||
	lastErrorToString = tr("No error");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
WinBluetoothDeviceDiscoveryAgent::~WinBluetoothDeviceDiscoveryAgent()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool WinBluetoothDeviceDiscoveryAgent::isActive() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return running;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString WinBluetoothDeviceDiscoveryAgent::errorToString() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return lastErrorToString;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QBluetoothDeviceDiscoveryAgent::Error WinBluetoothDeviceDiscoveryAgent::error() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return lastError;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void WinBluetoothDeviceDiscoveryAgent::run()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// Initialize query for device and start the lookup service
 | 
					 | 
				
			||||||
	WSAQUERYSET queryset;
 | 
					 | 
				
			||||||
	HANDLE hLookup;
 | 
					 | 
				
			||||||
	int result = SUCCESS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	running = true;
 | 
					 | 
				
			||||||
	lastError = QBluetoothDeviceDiscoveryAgent::NoError;
 | 
					 | 
				
			||||||
	lastErrorToString = tr("No error");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	memset(&queryset, 0, sizeof(WSAQUERYSET));
 | 
					 | 
				
			||||||
	queryset.dwSize = sizeof(WSAQUERYSET);
 | 
					 | 
				
			||||||
	queryset.dwNameSpace = NS_BTH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The LUP_CONTAINERS flag is used to signal that we are doing a device inquiry
 | 
					 | 
				
			||||||
	// while LUP_FLUSHCACHE flag is used to flush the device cache for all inquiries
 | 
					 | 
				
			||||||
	// and to do a fresh lookup instead.
 | 
					 | 
				
			||||||
	result = WSALookupServiceBegin(&queryset, LUP_CONTAINERS | LUP_FLUSHCACHE, &hLookup);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (result != SUCCESS) {
 | 
					 | 
				
			||||||
		// Get the last error and emit a signal
 | 
					 | 
				
			||||||
		lastErrorToString = qt_error_string();
 | 
					 | 
				
			||||||
		lastError = QBluetoothDeviceDiscoveryAgent::PoweredOffError;
 | 
					 | 
				
			||||||
		emit error(lastError);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Announce that the inquiry finished and restore the stopped flag
 | 
					 | 
				
			||||||
		running = false;
 | 
					 | 
				
			||||||
		stopped = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Declare the necessary variables to collect the information
 | 
					 | 
				
			||||||
	BYTE buffer[4096];
 | 
					 | 
				
			||||||
	DWORD bufferLength = sizeof(buffer);
 | 
					 | 
				
			||||||
	WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	memset(buffer, 0, sizeof(buffer));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pResults->dwSize = sizeof(WSAQUERYSET);
 | 
					 | 
				
			||||||
	pResults->dwNameSpace = NS_BTH;
 | 
					 | 
				
			||||||
	pResults->lpBlob = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	//Start looking for devices
 | 
					 | 
				
			||||||
	while (result == SUCCESS && !stopped){
 | 
					 | 
				
			||||||
		// LUP_RETURN_NAME and LUP_RETURN_ADDR flags are used to return the name and the address of the discovered device
 | 
					 | 
				
			||||||
		result = WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &bufferLength, pResults);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (result == SUCCESS) {
 | 
					 | 
				
			||||||
			// Found a device
 | 
					 | 
				
			||||||
			QString deviceAddress(BTH_ADDR_BUF_LEN, Qt::Uninitialized);
 | 
					 | 
				
			||||||
			DWORD addressSize = BTH_ADDR_BUF_LEN;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Collect the address of the device from the WSAQUERYSET
 | 
					 | 
				
			||||||
			SOCKADDR_BTH *socketBthAddress = (SOCKADDR_BTH *) pResults->lpcsaBuffer->RemoteAddr.lpSockaddr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Convert the BTH_ADDR to string
 | 
					 | 
				
			||||||
			if (WSAAddressToStringW((LPSOCKADDR) socketBthAddress,
 | 
					 | 
				
			||||||
						sizeof (*socketBthAddress),
 | 
					 | 
				
			||||||
						NULL,
 | 
					 | 
				
			||||||
						reinterpret_cast<wchar_t*>(deviceAddress.data()),
 | 
					 | 
				
			||||||
						&addressSize
 | 
					 | 
				
			||||||
						) != 0) {
 | 
					 | 
				
			||||||
				// Get the last error and emit a signal
 | 
					 | 
				
			||||||
				lastErrorToString = qt_error_string();
 | 
					 | 
				
			||||||
				lastError = QBluetoothDeviceDiscoveryAgent::UnknownError;
 | 
					 | 
				
			||||||
				emit error(lastError);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Remove the round parentheses
 | 
					 | 
				
			||||||
			deviceAddress.remove(')');
 | 
					 | 
				
			||||||
			deviceAddress.remove('(');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Save the name of the discovered device and truncate the address
 | 
					 | 
				
			||||||
			QString deviceName = QString(pResults->lpszServiceInstanceName);
 | 
					 | 
				
			||||||
			deviceAddress.truncate(BTH_ADDR_PRETTY_STRING_LEN);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Create an object with information about the discovered device
 | 
					 | 
				
			||||||
			QBluetoothDeviceInfo deviceInfo(QBluetoothAddress(deviceAddress), deviceName, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Raise a signal with information about the found remote device
 | 
					 | 
				
			||||||
			emit deviceDiscovered(deviceInfo);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			// Get the last error and emit a signal
 | 
					 | 
				
			||||||
			lastErrorToString = qt_error_string();
 | 
					 | 
				
			||||||
			lastError = QBluetoothDeviceDiscoveryAgent::UnknownError;
 | 
					 | 
				
			||||||
			emit error(lastError);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Announce that the inquiry finished and restore the stopped flag
 | 
					 | 
				
			||||||
	running = false;
 | 
					 | 
				
			||||||
	stopped = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Restore the error status
 | 
					 | 
				
			||||||
	lastError = QBluetoothDeviceDiscoveryAgent::NoError;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// End the lookup service
 | 
					 | 
				
			||||||
	WSALookupServiceEnd(hLookup);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void WinBluetoothDeviceDiscoveryAgent::stop()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// Stop the inqury
 | 
					 | 
				
			||||||
	stopped = true;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,48 +8,10 @@
 | 
				
			||||||
#include <QtBluetooth/QBluetoothLocalDevice>
 | 
					#include <QtBluetooth/QBluetoothLocalDevice>
 | 
				
			||||||
#include <QtBluetooth/QBluetoothDeviceDiscoveryAgent>
 | 
					#include <QtBluetooth/QBluetoothDeviceDiscoveryAgent>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	#include <QThread>
 | 
					 | 
				
			||||||
	#include <winsock2.h>
 | 
					 | 
				
			||||||
	#include <ws2bth.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	#define SUCCESS				0
 | 
					 | 
				
			||||||
	#define BTH_ADDR_BUF_LEN                40
 | 
					 | 
				
			||||||
	#define BTH_ADDR_PRETTY_STRING_LEN	17	// there are 6 two-digit hex values and 5 colons
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	#undef ERROR				// this is already declared in our headers
 | 
					 | 
				
			||||||
	#undef IGNORE				// this is already declared in our headers
 | 
					 | 
				
			||||||
	#undef DC_VERSION			// this is already declared in libdivecomputer header
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Ui {
 | 
					namespace Ui {
 | 
				
			||||||
	class BtDeviceSelectionDialog;
 | 
						class BtDeviceSelectionDialog;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
class WinBluetoothDeviceDiscoveryAgent : public QThread {
 | 
					 | 
				
			||||||
	Q_OBJECT
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
	void deviceDiscovered(const QBluetoothDeviceInfo &info);
 | 
					 | 
				
			||||||
	void error(QBluetoothDeviceDiscoveryAgent::Error error);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
	WinBluetoothDeviceDiscoveryAgent(QObject *parent);
 | 
					 | 
				
			||||||
	~WinBluetoothDeviceDiscoveryAgent();
 | 
					 | 
				
			||||||
	bool isActive() const;
 | 
					 | 
				
			||||||
	QString errorToString() const;
 | 
					 | 
				
			||||||
	QBluetoothDeviceDiscoveryAgent::Error error() const;
 | 
					 | 
				
			||||||
	void run() override;
 | 
					 | 
				
			||||||
	void stop();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
	bool running;
 | 
					 | 
				
			||||||
	bool stopped;
 | 
					 | 
				
			||||||
	QString lastErrorToString;
 | 
					 | 
				
			||||||
	QBluetoothDeviceDiscoveryAgent::Error lastError;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class BtDeviceSelectionDialog : public QDialog {
 | 
					class BtDeviceSelectionDialog : public QDialog {
 | 
				
			||||||
	Q_OBJECT
 | 
						Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,12 +40,8 @@ private slots:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	Ui::BtDeviceSelectionDialog *ui;
 | 
						Ui::BtDeviceSelectionDialog *ui;
 | 
				
			||||||
#if defined(Q_OS_WIN)
 | 
					 | 
				
			||||||
	WinBluetoothDeviceDiscoveryAgent *remoteDeviceDiscoveryAgent;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	QBluetoothLocalDevice *localDevice;
 | 
						QBluetoothLocalDevice *localDevice;
 | 
				
			||||||
	QBluetoothDeviceDiscoveryAgent *remoteDeviceDiscoveryAgent;
 | 
						QBluetoothDeviceDiscoveryAgent *remoteDeviceDiscoveryAgent;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	QScopedPointer<QBluetoothDeviceInfo> selectedRemoteDeviceInfo;
 | 
						QScopedPointer<QBluetoothDeviceInfo> selectedRemoteDeviceInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void updateLocalDeviceInformation();
 | 
						void updateLocalDeviceInformation();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue