/**************************************************************************** ** ** Copyright (C) 2018 The Qt Company Ltd. ** Copyright (C) 2014 Denis Shienkov ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QWINLOWENERGYBLUETOOTH_P_H #define QWINLOWENERGYBLUETOOTH_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #define WIN32_FROM_HRESULT(hr) \ (SUCCEEDED(hr) ? ERROR_SUCCESS : \ (HRESULT_FACILITY(hr) == FACILITY_WIN32 ? HRESULT_CODE(hr) : (hr))) #define BLUETOOTH_GATT_FLAG_NONE 0x00000000 #define BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED 0x00000001 #define BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED 0x00000002 #define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE 0x00000004 #define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE 0x00000008 #define BLUETOOTH_GATT_FLAG_SIGNED_WRITE 0x00000010 #define BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE 0x00000020 #define BLUETOOTH_GATT_FLAG_RETURN_ALL 0x00000040 typedef enum _BTH_LE_GATT_DESCRIPTOR_TYPE { CharacteristicExtendedProperties, CharacteristicUserDescription, ClientCharacteristicConfiguration, ServerCharacteristicConfiguration, CharacteristicFormat, CharacteristicAggregateFormat, CustomDescriptor } BTH_LE_GATT_DESCRIPTOR_TYPE, *PBTH_LE_GATT_DESCRIPTOR_TYPE; typedef enum _BTH_LE_GATT_EVENT_TYPE { CharacteristicValueChangedEvent } BTH_LE_GATT_EVENT_TYPE; typedef struct _BTH_LE_UUID { BOOLEAN IsShortUuid; union { USHORT ShortUuid; GUID LongUuid; } Value; } BTH_LE_UUID, *PBTH_LE_UUID; typedef struct _BTH_LE_GATT_SERVICE { BTH_LE_UUID ServiceUuid; USHORT AttributeHandle; } BTH_LE_GATT_SERVICE, *PBTH_LE_GATT_SERVICE; typedef struct _BTH_LE_GATT_CHARACTERISTIC { USHORT ServiceHandle; BTH_LE_UUID CharacteristicUuid; USHORT AttributeHandle; USHORT CharacteristicValueHandle; BOOLEAN IsBroadcastable; BOOLEAN IsReadable; BOOLEAN IsWritable; BOOLEAN IsWritableWithoutResponse; BOOLEAN IsSignedWritable; BOOLEAN IsNotifiable; BOOLEAN IsIndicatable; BOOLEAN HasExtendedProperties; } BTH_LE_GATT_CHARACTERISTIC, *PBTH_LE_GATT_CHARACTERISTIC; typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE { ULONG DataSize; UCHAR Data[1]; } BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE; typedef struct _BTH_LE_GATT_DESCRIPTOR { USHORT ServiceHandle; USHORT CharacteristicHandle; BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType; BTH_LE_UUID DescriptorUuid; USHORT AttributeHandle; } BTH_LE_GATT_DESCRIPTOR, *PBTH_LE_GATT_DESCRIPTOR; typedef struct _BTH_LE_GATT_DESCRIPTOR_VALUE { BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType; BTH_LE_UUID DescriptorUuid; union { struct { BOOLEAN IsReliableWriteEnabled; BOOLEAN IsAuxiliariesWritable; } CharacteristicExtendedProperties; struct { BOOLEAN IsSubscribeToNotification; BOOLEAN IsSubscribeToIndication; } ClientCharacteristicConfiguration; struct { BOOLEAN IsBroadcast; } ServerCharacteristicConfiguration; struct { UCHAR Format; UCHAR Exponent; BTH_LE_UUID Unit; UCHAR NameSpace; BTH_LE_UUID Description; } CharacteristicFormat; }; ULONG DataSize; UCHAR Data[1]; } BTH_LE_GATT_DESCRIPTOR_VALUE, *PBTH_LE_GATT_DESCRIPTOR_VALUE; typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT { USHORT ChangedAttributeHandle; size_t CharacteristicValueDataSize; PBTH_LE_GATT_CHARACTERISTIC_VALUE CharacteristicValue; } BLUETOOTH_GATT_VALUE_CHANGED_EVENT, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT; typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION { USHORT NumCharacteristics; BTH_LE_GATT_CHARACTERISTIC Characteristics[1]; } BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION; typedef VOID (CALLBACK *PFNBLUETOOTH_GATT_EVENT_CALLBACK)( BTH_LE_GATT_EVENT_TYPE EventType, PVOID EventOutParameter, PVOID Context ); typedef ULONG64 BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, *PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT; #define DEFINEFUNC(ret, func, ...) \ typedef ret (WINAPI *fp_##func)(__VA_ARGS__); \ static fp_##func func; #define RESOLVEFUNC(func) \ func = (fp_##func)resolveFunction(library, #func); \ if (!func) \ return false; DEFINEFUNC(HRESULT, BluetoothGATTGetServices, HANDLE, USHORT, PBTH_LE_GATT_SERVICE, PUSHORT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTGetIncludedServices, HANDLE, PBTH_LE_GATT_SERVICE, USHORT, PBTH_LE_GATT_SERVICE, PUSHORT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTGetCharacteristics, HANDLE, PBTH_LE_GATT_SERVICE, USHORT, PBTH_LE_GATT_CHARACTERISTIC, PUSHORT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTGetDescriptors, HANDLE, PBTH_LE_GATT_CHARACTERISTIC, USHORT, PBTH_LE_GATT_DESCRIPTOR, PUSHORT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTGetCharacteristicValue, HANDLE, PBTH_LE_GATT_CHARACTERISTIC, ULONG, PBTH_LE_GATT_CHARACTERISTIC_VALUE, PUSHORT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTGetDescriptorValue, HANDLE, PBTH_LE_GATT_DESCRIPTOR, ULONG, PBTH_LE_GATT_DESCRIPTOR_VALUE, PUSHORT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTBeginReliableWrite, HANDLE, PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTEndReliableWrite, HANDLE, BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTAbortReliableWrite, HANDLE, BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTSetCharacteristicValue, HANDLE, PBTH_LE_GATT_CHARACTERISTIC, PBTH_LE_GATT_CHARACTERISTIC_VALUE, BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTSetDescriptorValue, HANDLE, PBTH_LE_GATT_DESCRIPTOR, PBTH_LE_GATT_DESCRIPTOR_VALUE, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTRegisterEvent, HANDLE, BTH_LE_GATT_EVENT_TYPE, PVOID, PFNBLUETOOTH_GATT_EVENT_CALLBACK, PVOID, PHANDLE, ULONG) DEFINEFUNC(HRESULT, BluetoothGATTUnregisterEvent, HANDLE, ULONG) static inline QFunctionPointer resolveFunction(QLibrary *library, const char *func) { QFunctionPointer symbolFunctionPointer = library->resolve(func); if (!symbolFunctionPointer) qWarning("Cannot resolve '%s' in '%s'.", func, qPrintable(library->fileName())); return symbolFunctionPointer; } static inline bool resolveFunctions(QLibrary *library) { if (!library->isLoaded()) { library->setFileName(QStringLiteral("bluetoothapis")); if (!library->load()) { qWarning("Unable to load '%s' library.", qPrintable(library->fileName())); return false; } } RESOLVEFUNC(BluetoothGATTGetServices) RESOLVEFUNC(BluetoothGATTGetIncludedServices) RESOLVEFUNC(BluetoothGATTGetCharacteristics) RESOLVEFUNC(BluetoothGATTGetDescriptors) RESOLVEFUNC(BluetoothGATTGetCharacteristicValue) RESOLVEFUNC(BluetoothGATTGetDescriptorValue) RESOLVEFUNC(BluetoothGATTBeginReliableWrite) RESOLVEFUNC(BluetoothGATTEndReliableWrite) RESOLVEFUNC(BluetoothGATTAbortReliableWrite) RESOLVEFUNC(BluetoothGATTSetCharacteristicValue) RESOLVEFUNC(BluetoothGATTSetDescriptorValue) RESOLVEFUNC(BluetoothGATTRegisterEvent) RESOLVEFUNC(BluetoothGATTUnregisterEvent) return true; } #endif // QWINLOWENERGYBLUETOOTH_P_H