mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-15 07:06:11 -04:00
Fix BluetoothAdapter bug to enable Bluetooth Classic Advertising
PiperOrigin-RevId: 456609115
This commit is contained in:
committed by
Copybara-Service
parent
7046d24dfe
commit
75aa59d57e
@@ -162,86 +162,21 @@ std::string BluetoothAdapter::GetName() const {
|
||||
&hKey); // A pointer to a variable that receives a handle to the opened
|
||||
// key
|
||||
|
||||
std::string adapter_name;
|
||||
|
||||
if (status == ERROR_SUCCESS) {
|
||||
DWORD local_name_size = 0;
|
||||
DWORD value_type;
|
||||
|
||||
// Retrieves the size of the data for the specified value name associated
|
||||
// with an open registry key.
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa
|
||||
LSTATUS status = RegQueryValueExA(
|
||||
hKey, // A handle to an open registry key.
|
||||
BLUETOOTH_RADIO_REGISTRY_NAME_KEY, // The name of the registry
|
||||
// value.
|
||||
nullptr, // This parameter is reserved and must be NULL.
|
||||
&value_type, // A pointer to a variable that receives a code
|
||||
// indicating the type of data stored in the
|
||||
// specified value.
|
||||
nullptr, // null tells the function to just get the buffer size.
|
||||
// value's data.
|
||||
&local_name_size); // A pointer to a variable that specifies the
|
||||
// size of the buffer pointed to by the lpData
|
||||
// parameter, in bytes.
|
||||
if (status == ERROR_SUCCESS) {
|
||||
unsigned char *local_name = new unsigned char[local_name_size];
|
||||
memset(local_name, '\0', local_name_size);
|
||||
|
||||
status = RegQueryValueExA(
|
||||
hKey, // A handle to an open registry key.
|
||||
BLUETOOTH_RADIO_REGISTRY_NAME_KEY, // The name of the registry
|
||||
// value.
|
||||
nullptr, // This parameter is reserved and must be NULL.
|
||||
&value_type, // A pointer to a variable that receives a code
|
||||
// indicating the type of data stored in the
|
||||
// specified value.
|
||||
local_name, // A pointer to a buffer that
|
||||
// receives the value's data.
|
||||
&local_name_size); // A pointer to a variable that specifies the
|
||||
// size of the buffer pointed to by the lpData
|
||||
// parameter, in bytes.
|
||||
|
||||
// Closes a handle to the specified registry key.
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regclosekey
|
||||
RegCloseKey(hKey);
|
||||
|
||||
if (status == ERROR_SUCCESS) {
|
||||
std::string local_name_return = std::string(
|
||||
local_name, local_name + local_name_size / sizeof local_name[0]);
|
||||
|
||||
delete[] local_name;
|
||||
|
||||
return local_name_return;
|
||||
}
|
||||
delete[] local_name;
|
||||
} else {
|
||||
NEARBY_LOGS(ERROR)
|
||||
<< __func__
|
||||
<< ": Failed to get the required size of the local name buffer";
|
||||
}
|
||||
adapter_name = GetNameFromRegistry(&hKey);
|
||||
}
|
||||
|
||||
// Closes a handle to the specified registry key.
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regclosekey
|
||||
RegCloseKey(hKey);
|
||||
|
||||
// The local name is not in the registry, return the machine name
|
||||
std::string local_name;
|
||||
DWORD name_size = 0;
|
||||
|
||||
if (GetComputerNameA(nullptr, &name_size)) {
|
||||
NEARBY_LOGS(ERROR)
|
||||
<< __func__
|
||||
<< ": Failed to get the required size of the local name buffer";
|
||||
return {};
|
||||
if (adapter_name.empty()) {
|
||||
return GetNameFromComputerName();
|
||||
}
|
||||
|
||||
local_name.resize(name_size);
|
||||
|
||||
// Retrieves the NetBIOS name of the local computer.
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getcomputernamea
|
||||
if (GetComputerNameA(local_name.data(), &name_size)) {
|
||||
return local_name;
|
||||
}
|
||||
|
||||
// If we're here, we couldn't get a local name, this should never happen
|
||||
NEARBY_LOGS(ERROR) << __func__ << ": Failed to get any radio name";
|
||||
return {};
|
||||
return adapter_name;
|
||||
}
|
||||
|
||||
// https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#setName(java.lang.String)
|
||||
@@ -414,8 +349,9 @@ bool BluetoothAdapter::SetName(absl::string_view name) {
|
||||
0, // This parameter is reserved and must be zero.
|
||||
REG_BINARY, // The type of data pointed to by the lpData parameter.
|
||||
(LPBYTE)std::string(name).c_str(), // The data to be stored.
|
||||
std::string(name).size()); // The size of the information pointed
|
||||
// to by the lpData parameter, in bytes.
|
||||
strlen(std::string(name)
|
||||
.c_str())); // The size of the information pointed
|
||||
// to by the lpData parameter, in bytes.
|
||||
} else {
|
||||
// If we are told to set the key to "", we treat this as a reset
|
||||
// If we delete the key value the OS will default to the system
|
||||
@@ -573,6 +509,71 @@ std::string BluetoothAdapter::GetMacAddress() const {
|
||||
windows_bluetooth_adapter_.BluetoothAddress());
|
||||
}
|
||||
|
||||
std::string BluetoothAdapter::GetNameFromRegistry(PHKEY hKey) const {
|
||||
DWORD local_name_size = 0;
|
||||
DWORD value_type;
|
||||
|
||||
// Retrieves the size of the data for the specified value name associated
|
||||
// with an open registry key.
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa
|
||||
LSTATUS status = RegQueryValueExA(
|
||||
*hKey, // A handle to an open registry key.
|
||||
BLUETOOTH_RADIO_REGISTRY_NAME_KEY, // The name of the registry
|
||||
// value.
|
||||
nullptr, // This parameter is reserved and must be NULL.
|
||||
&value_type, // A pointer to a variable that receives a code
|
||||
// indicating the type of data stored in the
|
||||
// specified value.
|
||||
nullptr, // null tells the function to just get the buffer size.
|
||||
// value's data.
|
||||
&local_name_size); // A pointer to a variable that specifies the
|
||||
// size of the buffer pointed to by the lpData
|
||||
// parameter, in bytes.
|
||||
if (status != ERROR_SUCCESS) {
|
||||
NEARBY_LOGS(ERROR)
|
||||
<< __func__
|
||||
<< ": Failed to get the required size of the local name buffer";
|
||||
return "";
|
||||
}
|
||||
unsigned char *local_name = new unsigned char[local_name_size];
|
||||
memset(local_name, '\0', local_name_size);
|
||||
|
||||
status = RegQueryValueExA(
|
||||
*hKey, // A handle to an open registry key.
|
||||
BLUETOOTH_RADIO_REGISTRY_NAME_KEY, // The name of the registry
|
||||
// value.
|
||||
nullptr, // This parameter is reserved and must be NULL.
|
||||
&value_type, // A pointer to a variable that receives a code
|
||||
// indicating the type of data stored in the
|
||||
// specified value.
|
||||
local_name, // A pointer to a buffer that
|
||||
// receives the value's data.
|
||||
&local_name_size); // A pointer to a variable that specifies the
|
||||
// size of the buffer pointed to by the lpData
|
||||
// parameter, in bytes.
|
||||
|
||||
if (status == ERROR_SUCCESS) {
|
||||
std::string local_name_return = std::string(
|
||||
local_name, local_name + local_name_size / sizeof local_name[0]);
|
||||
|
||||
delete[] local_name;
|
||||
return local_name_return;
|
||||
}
|
||||
delete[] local_name;
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string BluetoothAdapter::GetNameFromComputerName() const {
|
||||
DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
|
||||
CHAR computer_name[MAX_COMPUTERNAME_LENGTH + 1];
|
||||
if (GetComputerNameA(computer_name, &size)) {
|
||||
return std::string(computer_name);
|
||||
}
|
||||
|
||||
NEARBY_LOGS(ERROR) << __func__ << ": Failed to get any computer name";
|
||||
return "";
|
||||
}
|
||||
|
||||
} // namespace windows
|
||||
} // namespace nearby
|
||||
} // namespace location
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#define PLATFORM_IMPL_WINDOWS_BLUETOOTH_ADAPTER_H_
|
||||
|
||||
#include <guiddef.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
@@ -77,6 +78,12 @@ class BluetoothAdapter : public api::BluetoothAdapter {
|
||||
// Returns BT MAC address assigned to this adapter.
|
||||
std::string GetMacAddress() const override;
|
||||
|
||||
// Returns bluetooth device name from registry
|
||||
std::string GetNameFromRegistry(PHKEY hKey) const;
|
||||
|
||||
// Returns computer name
|
||||
std::string GetNameFromComputerName() const;
|
||||
|
||||
void SetOnScanModeChanged(ScanModeCallback callback) {
|
||||
if (scan_mode_changed_ == nullptr) {
|
||||
scan_mode_changed_ = callback;
|
||||
|
||||
@@ -124,6 +124,11 @@ TEST(BluetoothAdapter, DISABLED_IsExtendedAdvertisingSupported) {
|
||||
EXPECT_TRUE(bluetooth_adapter.IsExtendedAdvertisingSupported());
|
||||
}
|
||||
|
||||
TEST(BluetoothAdapter, DISABLED_GetNameFromComputerName) {
|
||||
BluetoothAdapter bluetooth_adapter;
|
||||
EXPECT_TRUE(!bluetooth_adapter.GetNameFromComputerName().empty());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace windows
|
||||
} // namespace nearby
|
||||
|
||||
Reference in New Issue
Block a user