mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Bluetooth: add helper to separate BT name and address
And restructure the existing "isBtAddress()" function in the process. Also add more tests. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									7512a6e915
								
							
						
					
					
						commit
						c8fec97695
					
				
					 4 changed files with 49 additions and 1 deletions
				
			
		| 
						 | 
					@ -305,6 +305,10 @@ bool BTDiscovery::checkException(const char* method, const QAndroidJniObject *ob
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BTDiscovery::discoverAddress(QString address)
 | 
					void BTDiscovery::discoverAddress(QString address)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						// let's make sure there is no device name mixed in with the address
 | 
				
			||||||
 | 
						QString btAddress;
 | 
				
			||||||
 | 
						btAddress = extractBluetoothAddress(address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Q_OS_MACOS)
 | 
					#if defined(Q_OS_MACOS)
 | 
				
			||||||
	// macOS appears to need a fresh scan if we want to switch devices
 | 
						// macOS appears to need a fresh scan if we want to switch devices
 | 
				
			||||||
	static QString lastAddress;
 | 
						static QString lastAddress;
 | 
				
			||||||
| 
						 | 
					@ -321,11 +325,34 @@ void BTDiscovery::discoverAddress(QString address)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool isBluetoothAddress(const QString &address)
 | 
					bool isBluetoothAddress(const QString &address)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return extractBluetoothAddress(address) != QString();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					QString extractBluetoothAddress(const QString &address)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	QRegularExpression re("(LE:)*([0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}|{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}})",
 | 
						QRegularExpression re("(LE:)*([0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}|{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}})",
 | 
				
			||||||
			      QRegularExpression::CaseInsensitiveOption);
 | 
								      QRegularExpression::CaseInsensitiveOption);
 | 
				
			||||||
	QRegularExpressionMatch m = re.match(address);
 | 
						QRegularExpressionMatch m = re.match(address);
 | 
				
			||||||
	return m.hasMatch();
 | 
						return m.captured(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString extractBluetoothNameAddress(const QString &address, QString &name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// sometimes our device text is of the form "name (address)", sometimes it's just "address"
 | 
				
			||||||
 | 
						// let's simply return the address
 | 
				
			||||||
 | 
						name = QString();
 | 
				
			||||||
 | 
						QString extractedAddress = extractBluetoothAddress(address);
 | 
				
			||||||
 | 
						if (extractedAddress == address.trimmed())
 | 
				
			||||||
 | 
							return address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QRegularExpression re("^([^()]+)\\(([^)]*\\))$");
 | 
				
			||||||
 | 
						QRegularExpressionMatch m = re.match(address);
 | 
				
			||||||
 | 
						if (m.hasMatch()) {
 | 
				
			||||||
 | 
							name = m.captured(1).trimmed();
 | 
				
			||||||
 | 
							return extractedAddress;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						qDebug() << "can't parse address" << address;
 | 
				
			||||||
 | 
						return QString();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void saveBtDeviceInfo(const QString &devaddr, QBluetoothDeviceInfo deviceInfo)
 | 
					void saveBtDeviceInfo(const QString &devaddr, QBluetoothDeviceInfo deviceInfo)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void saveBtDeviceInfo(const QString &devaddr, QBluetoothDeviceInfo deviceInfo);
 | 
					void saveBtDeviceInfo(const QString &devaddr, QBluetoothDeviceInfo deviceInfo);
 | 
				
			||||||
bool isBluetoothAddress(const QString &address);
 | 
					bool isBluetoothAddress(const QString &address);
 | 
				
			||||||
 | 
					QString extractBluetoothAddress(const QString &address);
 | 
				
			||||||
 | 
					QString extractBluetoothNameAddress(const QString &address, QString &name);
 | 
				
			||||||
QBluetoothDeviceInfo getBtDeviceInfo(const QString &devaddr);
 | 
					QBluetoothDeviceInfo getBtDeviceInfo(const QString &devaddr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BTDiscovery : public QObject {
 | 
					class BTDiscovery : public QObject {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,4 +23,22 @@ void TestHelper::recognizeBtAddress()
 | 
				
			||||||
	QCOMPARE(isBluetoothAddress("LE:{6e50ff5d-cdd3-4c43-ag0a-1ed4c7d2d2a5}"), false);
 | 
						QCOMPARE(isBluetoothAddress("LE:{6e50ff5d-cdd3-4c43-ag0a-1ed4c7d2d2a5}"), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TestHelper::parseNameAddress()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						QString name, address;
 | 
				
			||||||
 | 
						address = extractBluetoothNameAddress("01:a2:b3:c4:d5:06", name);
 | 
				
			||||||
 | 
						QCOMPARE(address, "01:a2:b3:c4:d5:06");
 | 
				
			||||||
 | 
						QCOMPARE(name, QString());
 | 
				
			||||||
 | 
						address = extractBluetoothNameAddress("somename (01:a2:b3:c4:d5:06)", name);
 | 
				
			||||||
 | 
						QCOMPARE(address, "01:a2:b3:c4:d5:06");
 | 
				
			||||||
 | 
						QCOMPARE(name, QString("somename"));
 | 
				
			||||||
 | 
						address = extractBluetoothNameAddress("garbage", name);
 | 
				
			||||||
 | 
						QCOMPARE(address, QString());
 | 
				
			||||||
 | 
						QCOMPARE(name, QString());
 | 
				
			||||||
 | 
						address = extractBluetoothNameAddress("somename (LE:{6e50ff5d-cdd3-4c43-a80a-1ed4c7d2d2a5})", name);
 | 
				
			||||||
 | 
						QCOMPARE(address, "LE:{6e50ff5d-cdd3-4c43-a80a-1ed4c7d2d2a5}");
 | 
				
			||||||
 | 
						QCOMPARE(name, QString("somename"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QTEST_GUILESS_MAIN(TestHelper)
 | 
					QTEST_GUILESS_MAIN(TestHelper)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@ class TestHelper : public QObject {
 | 
				
			||||||
private slots:
 | 
					private slots:
 | 
				
			||||||
	void initTestCase();
 | 
						void initTestCase();
 | 
				
			||||||
	void recognizeBtAddress();
 | 
						void recognizeBtAddress();
 | 
				
			||||||
 | 
						void parseNameAddress();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue