master
  1/**
  2 * This file has no copyright assigned and is placed in the Public Domain.
  3 * This file is part of the mingw-w64 runtime package.
  4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  5 */
  6
  7#ifndef __BTHLEDEF_H__
  8#define __BTHLEDEF_H__
  9
 10#include <winapifamily.h>
 11#include <minwindef.h>
 12
 13#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 14
 15#if NTDDI_VERSION >= NTDDI_WIN8
 16
 17DEFINE_GUID(GUID_BLUETOOTHLE_DEVICE_INTERFACE, 0x781aee18, 0x7733, 0x4ce4, 0xad, 0xd0, 0x91, 0xf4, 0x1c, 0x67, 0xb5, 0x92);
 18DEFINE_GUID(GUID_BLUETOOTH_GATT_SERVICE_DEVICE_INTERFACE, 0x6e3bb679, 0x4372, 0x40c8, 0x9e, 0xaa, 0x45, 0x09, 0xdf, 0x26, 0x0c, 0xd8);
 19DEFINE_GUID(BTH_LE_ATT_BLUETOOTH_BASE_GUID, 0x00000000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb);
 20
 21#define BTH_LE_SERVICE_GAP (0x1800)
 22#define BTH_LE_SERVICE_GATT (0x1801)
 23
 24#define BTH_LE_GATT_ATTRIBUTE_TYPE_PRIMARY_SERVICE (0x2800)
 25#define BTH_LE_GATT_ATTRIBUTE_TYPE_SECONDARY_SERVICE (0x2801)
 26#define BTH_LE_GATT_ATTRIBUTE_TYPE_INCLUDE (0x2802)
 27#define BTH_LE_GATT_ATTRIBUTE_TYPE_CHARACTERISTIC (0x2803)
 28
 29#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_EXTENDED_PROPERTIES (0x2900)
 30#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_USER_DESCRIPTION (0x2901)
 31#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_CLIENT_CONFIGURATION (0x2902)
 32#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_SERVER_CONFIGURATION (0x2903)
 33#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_FORMAT (0x2904)
 34#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_AGGREGATE_FORMAT (0x2905)
 35
 36#define BTH_LE_GATT_CHARACTERISTIC_TYPE_DEVICE_NAME (0x2a00)
 37#define BTH_LE_GATT_CHARACTERISTIC_TYPE_APPEARANCE (0x2a01)
 38#define BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PRIVACY_FLAG (0x2a02)
 39#define BTH_LE_GATT_CHARACTERISTIC_TYPE_RECONNECTION_ADDRESS (0x2a03)
 40#define BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PREFERED_CONNECTION_PARAMETER (0x2a04)
 41#define BTH_LE_GATT_CHARACTERISTIC_TYPE_SERVICE_CHANGED (0x2a05)
 42
 43#define BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET 0x6
 44#define BTH_LE_GAP_APPEARANCE_CATEGORY_MASK 0x3ff
 45#define BTH_LE_GAP_APPEARANCE_GET_CATEGORY(a) ((a >> BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET) & BTH_LE_GAP_APPEARANCE_CATEGORY_MASK)
 46#define BTH_LE_GAP_APPEARANCE_SET_CATEGORY(a, c) a = ((a & ~BTH_LE_GAP_APPEARANCE_CATEGORY_MASK) | (c << BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET))
 47#define BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK 0x3f
 48#define BTH_LE_GAP_APPEARANCE_GET_SUB_CATEGORY(a) ((UCHAR)(a & BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK))
 49#define BTH_LE_GAP_APPEARANCE_SET_SUB_CATEGORY(a, s) a = ((a & ~BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK) | s)
 50
 51#define BTH_LE_GAP_APPEARANCE_CATEGORY_UNCATEGORIZED 0x0000
 52#define BTH_LE_GAP_APPEARANCE_CATEGORY_PHONE 0x0001
 53#define BTH_LE_GAP_APPEARANCE_CATEGORY_COMPUTER 0x0002
 54#define BTH_LE_GAP_APPEARANCE_CATEGORY_WATCH 0x0003
 55#define BTH_LE_GAP_APPEARANCE_CATEGORY_CLOCK 0x0004
 56#define BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY 0x0005
 57#define BTH_LE_GAP_APPEARANCE_CATEGORY_REMOTE_CONTROL 0x0006
 58#define BTH_LE_GAP_APPEARANCE_CATEGORY_EYE_GLASSES 0x0007
 59#define BTH_LE_GAP_APPEARANCE_CATEGORY_TAG 0x0008
 60#define BTH_LE_GAP_APPEARANCE_CATEGORY_KEYRING 0x0009
 61#define BTH_LE_GAP_APPEARANCE_CATEGORY_MEDIA_PLAYER 0x000a
 62#define BTH_LE_GAP_APPEARANCE_CATEGORY_BARCODE_SCANNER 0x000b
 63#define BTH_LE_GAP_APPEARANCE_CATEGORY_THERMOMETER 0x000c
 64#define BTH_LE_GAP_APPEARANCE_CATEGORY_HEART_RATE 0x000d
 65#define BTH_LE_GAP_APPEARANCE_CATEGORY_BLOOD_PRESSURE 0x000e
 66#define BTH_LE_GAP_APPEARANCE_CATEGORY_HID 0x000f
 67#define BTH_LE_GAP_APPEARANCE_CATEGORY_GLUCOSE_METER 0x0010
 68#define BTH_LE_GAP_APPEARANCE_CATEGORY_RUNNING_WALKING_SENSOR 0x0011
 69#define BTH_LE_GAP_APPEARANCE_CATEGORY_CYCLING 0x0012
 70#define BTH_LE_GAP_APPEARANCE_CATEGORY_CONTROL_DEVICE 0x0013
 71#define BTH_LE_GAP_APPEARANCE_CATEGORY_NETWORK_DEVICE 0x0014
 72#define BTH_LE_GAP_APPEARANCE_CATEGORY_SENSOR 0x0015
 73#define BTH_LE_GAP_APPEARANCE_CATEGORY_LIGHT_FIXTURES 0x0016
 74#define BTH_LE_GAP_APPEARANCE_CATEGORY_FAN 0x0017
 75#define BTH_LE_GAP_APPEARANCE_CATEGORY_HVAC 0x0018
 76#define BTH_LE_GAP_APPEARANCE_CATEGORY_AIR_CONDITIONING 0x0019
 77#define BTH_LE_GAP_APPEARANCE_CATEGORY_HUMIDIFIER 0x001a
 78#define BTH_LE_GAP_APPEARANCE_CATEGORY_HEATING 0x001b
 79#define BTH_LE_GAP_APPEARANCE_CATEGORY_ACCESS_CONTROL 0x001c
 80#define BTH_LE_GAP_APPEARANCE_CATEGORY_MOTORIZED_DEVICE 0x001d
 81#define BTH_LE_GAP_APPEARANCE_CATEGORY_POWER_DEVICE 0x001e
 82#define BTH_LE_GAP_APPEARANCE_CATEGORY_LIGHT_SOURCE 0x001f
 83#define BTH_LE_GAP_APPEARANCE_CATEGORY_WINDOW_COVERING 0x0020
 84#define BTH_LE_GAP_APPEARANCE_CATEGORY_AUDIO_SINK 0x0021
 85#define BTH_LE_GAP_APPEARANCE_CATEGORY_AUDIO_SOURCE 0x0022
 86#define BTH_LE_GAP_APPEARANCE_CATEGORY_MOTORIZED_VEHICLE 0x0023
 87#define BTH_LE_GAP_APPEARANCE_CATEGORY_DOMESTIC_APPLIANCE 0x0024
 88#define BTH_LE_GAP_APPEARANCE_CATEGORY_WEARABLE_AUDIO_DEVICE 0x0025
 89#define BTH_LE_GAP_APPEARANCE_CATEGORY_AIRCRAFT 0x0026
 90#define BTH_LE_GAP_APPEARANCE_CATEGORY_AV_EQUIPMENT 0x0027
 91#define BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY_EQUIPMENT 0x0028
 92#define BTH_LE_GAP_APPEARANCE_CATEGORY_HEARING_AID 0x0029
 93#define BTH_LE_GAP_APPEARANCE_CATEGORY_GAMING 0x002a
 94#define BTH_LE_GAP_APPEARANCE_CATEGORY_SIGNAGE 0x002b
 95#define BTH_LE_GAP_APPEARANCE_CATEGORY_PLUSE_OXIMETER 0x0031
 96#define BTH_LE_GAP_APPEARANCE_CATEGORY_WEIGHT_SCALE 0x0032
 97#define BTH_LE_GAP_APPEARANCE_CATEGORY_PERSONAL_MOBILITY_DEVICE 0x0033
 98#define BTH_LE_GAP_APPEARANCE_CATEGORY_CONTINUOUS_GLUCOSE_MONITOR 0x0034
 99#define BTH_LE_GAP_APPEARANCE_CATEGORY_INSULIN_PUMP 0x0035
100#define BTH_LE_GAP_APPEARANCE_CATEGORY_MEDICATION_DELIVERY 0x0036
101#define BTH_LE_GAP_APPEARANCE_CATEGORY_OUTDOOR_SPORTS_ACTIVITY 0x0051
102#define BTH_LE_GAP_APPEARANCE_SUBCATEGORY_GENERIC 0x00
103#define BTH_LE_GAP_APPEARANCE_WATCH_SUBCATEGORY_SPORTS_WATCH 0x01
104#define BTH_LE_GAP_APPEARANCE_THERMOMETER_SUBCATEGORY_EAR 0x01
105#define BTH_LE_GAP_APPEARANCE_HEART_RATE_SUBCATEGORY_HEART_RATE_BELT 0x01
106#define BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_ARM 0x01
107#define BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_WRIST 0x02
108#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_KEYBOARD 0x01
109#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_MOUSE 0x02
110#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_JOYSTICK 0x03
111#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_GAMEPAD 0x04
112#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITIZER_TABLET 0x05
113#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_CARD_READER 0x06
114#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITAL_PEN 0x07
115#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_BARCODE_SCANNER 0x08
116#define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_IN_SHOE 0x01
117#define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_SHOE 0x02
118#define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_HIP 0x03
119#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CYCLING_COMPUTER 0x01
120#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_SENSOR 0x02
121#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CADENCE_SENSOR 0x03
122#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_POWER_SENSOR 0x04
123#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_AND_CADENCE_SENSOR 0x05
124#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_STANDALONE_SPEAKER 0x01
125#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_SOUNDBAR 0x02
126#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_BOOKSHELF_SPEAKER 0x03
127#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_STANDMOUNTED_SPEAKER 0x04
128#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_SPEAKERPHONE 0x05
129#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_MICROPHONE 0x01
130#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_ALARM 0x02
131#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BELL 0x03
132#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_HORN 0x04
133#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BROADCASTING_DEVICE 0x05
134#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_SERVICE_DESK 0x06
135#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_KIOSK 0x07
136#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BROADCASTING_ROOM 0x08
137#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_AUDITORIUM 0x09
138#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_EARBUD 0x01
139#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_HEADSET 0x02
140#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_HEADPHONES 0x03
141#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_NECKBAND 0x04
142#define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_IN_EAR_HEARING_AID 0x01
143#define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_BEHIND_EAR_HEARING_AID 0x02
144#define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_COCHLEAR_IMPLANT 0x03
145#define BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_FINGERTIP 0x01
146#define BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_WRIST_WORN 0x02
147#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_DISPLAY_DEVICE 0x01
148#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_DISPLAY_DEVICE 0x02
149#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_POD 0x03
150#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_POD 0x04
151
152#define BTH_LE_GATT_DEFAULT_MAX_INCLUDED_SERVICES_DEPTH (3)
153
154#define BTH_LE_ATT_TRANSACTION_TIMEOUT 30
155
156#define BTH_LE_ATT_MAX_VALUE_SIZE 512
157
158#define BTH_LE_ATT_CID (0x0004)
159
160#define BTHLEENUM_ATT_MTU_MIN (23)
161#define BTHLEENUM_ATT_MTU_MAX (0xffff)
162#define BTHLEENUM_ATT_MTU_DEFAULT (BTHLEENUM_ATT_MTU_MIN)
163#define BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION (525)
164
165#define BTH_LE_ERROR_INVALID_HANDLE (0x01)
166#define BTH_LE_ERROR_READ_NOT_PERMITTED (0x02)
167#define BTH_LE_ERROR_WRITE_NOT_PERMITTED (0x03)
168#define BTH_LE_ERROR_INVALID_PDU (0x04)
169#define BTH_LE_ERROR_INSUFFICIENT_AUTHENTICATION (0x05)
170#define BTH_LE_ERROR_REQUEST_NOT_SUPPORTED (0x06)
171#define BTH_LE_ERROR_INVALID_OFFSET (0x07)
172#define BTH_LE_ERROR_INSUFFICIENT_AUTHORIZATION (0x08)
173#define BTH_LE_ERROR_PREPARE_QUEUE_FULL (0x09)
174#define BTH_LE_ERROR_ATTRIBUTE_NOT_FOUND (0x0a)
175#define BTH_LE_ERROR_ATTRIBUTE_NOT_LONG (0x0b)
176#define BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE (0x0c)
177#define BTH_LE_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH (0x0d)
178#define BTH_LE_ERROR_UNLIKELY (0x0e)
179#define BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION (0x0f)
180#define BTH_LE_ERROR_UNSUPPORTED_GROUP_TYPE (0x10)
181#define BTH_LE_ERROR_INSUFFICIENT_RESOURCES (0x11)
182#define BTH_LE_ERROR_UNKNOWN (0x1000)
183
184#define BLUETOOTH_GATT_FLAG_NONE 0x00000000
185#define BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED 0x00000001
186#define BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED 0x00000002
187#define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE 0x00000004
188#define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE 0x00000008
189#define BLUETOOTH_GATT_FLAG_SIGNED_WRITE 0x00000010
190#define BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE 0x00000020
191#define BLUETOOTH_GATT_FLAG_RETURN_ALL 0x00000040
192#define BLUETOOTH_GATT_FLAG_VALID_MASK (BLUETOOTH_GATT_FLAG_NONE | BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED | BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED | BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE | BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE | BLUETOOTH_GATT_FLAG_SIGNED_WRITE | BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE | BLUETOOTH_GATT_FLAG_RETURN_ALL)
193
194#define IS_BLUETOOTH_GATT_FLAG_VALID(f) (0 == (f & ~BLUETOOTH_GATT_FLAG_VALID_MASK))
195
196typedef HANDLE BLUETOOTH_GATT_EVENT_HANDLE;
197
198typedef struct _BTH_LE_UUID {
199  BOOLEAN IsShortUuid;
200#ifdef __WIDL__
201  [switch_type(BOOLEAN), switch_is((BOOLEAN)IsShortUuid)]
202#endif
203  union {
204#ifdef __WIDL__
205    [case(TRUE)]
206#endif
207    USHORT ShortUuid;
208#ifdef __WIDL__
209    [case(FALSE)]
210#endif
211    GUID LongUuid;
212  } Value;
213} BTH_LE_UUID, *PBTH_LE_UUID;
214
215typedef struct _BTH_LE_GATT_SERVICE {
216  BTH_LE_UUID ServiceUuid;
217  USHORT AttributeHandle;
218} BTH_LE_GATT_SERVICE, *PBTH_LE_GATT_SERVICE;
219
220typedef enum _BTH_LE_GATT_DESCRIPTOR_TYPE {
221  CharacteristicExtendedProperties,
222  CharacteristicUserDescription,
223  ClientCharacteristicConfiguration,
224  ServerCharacteristicConfiguration,
225  CharacteristicFormat,
226  CharacteristicAggregateFormat,
227  CustomDescriptor
228} BTH_LE_GATT_DESCRIPTOR_TYPE, *PBTH_LE_GATT_DESCRIPTOR_TYPE;
229
230typedef struct _BTH_LE_GATT_CHARACTERISTIC {
231  USHORT ServiceHandle;
232  BTH_LE_UUID CharacteristicUuid;
233  USHORT AttributeHandle;
234  USHORT CharacteristicValueHandle;
235  BOOLEAN IsBroadcastable;
236  BOOLEAN IsReadable;
237  BOOLEAN IsWritable;
238  BOOLEAN IsWritableWithoutResponse;
239  BOOLEAN IsSignedWritable;
240  BOOLEAN IsNotifiable;
241  BOOLEAN IsIndicatable;
242  BOOLEAN HasExtendedProperties;
243} BTH_LE_GATT_CHARACTERISTIC, *PBTH_LE_GATT_CHARACTERISTIC;
244
245typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE {
246  ULONG DataSize;
247#ifdef __WIDL__
248  [size_is(DataSize)] UCHAR Data[*];
249#else
250  UCHAR Data[1];
251#endif
252} BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE;
253
254typedef struct _BTH_LE_GATT_DESCRIPTOR {
255  USHORT ServiceHandle;
256  USHORT CharacteristicHandle;
257  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
258  BTH_LE_UUID DescriptorUuid;
259  USHORT AttributeHandle;
260} BTH_LE_GATT_DESCRIPTOR, *PBTH_LE_GATT_DESCRIPTOR;
261
262typedef struct _BTH_LE_GATT_DESCRIPTOR_VALUE {
263  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
264  BTH_LE_UUID DescriptorUuid;
265#ifdef __WIDL__
266  [switch_type(BTH_LE_GATT_DESCRIPTOR_TYPE), switch_is((BTH_LE_GATT_DESCRIPTOR_TYPE)DescriptorType)]
267#endif
268  __C89_NAMELESS union {
269#ifdef __WIDL__
270    [case(CharacteristicExtendedProperties)]
271#endif
272    struct {
273      BOOLEAN IsReliableWriteEnabled;
274      BOOLEAN IsAuxiliariesWritable;
275    } CharacteristicExtendedProperties;
276#ifdef __WIDL__
277    [case(ClientCharacteristicConfiguration)]
278#endif
279    struct {
280      BOOLEAN IsSubscribeToNotification;
281      BOOLEAN IsSubscribeToIndication;
282    } ClientCharacteristicConfiguration;
283#ifdef __WIDL__
284    [case(ServerCharacteristicConfiguration)]
285#endif
286    struct {
287      BOOLEAN IsBroadcast;
288    } ServerCharacteristicConfiguration;
289#ifdef __WIDL__
290    [case(CharacteristicFormat)]
291#endif
292    struct {
293      UCHAR Format;
294      UCHAR Exponent;
295      BTH_LE_UUID Unit;
296      UCHAR NameSpace;
297      BTH_LE_UUID Description;
298    } CharacteristicFormat;
299#ifdef __WIDL__
300    [default]
301      ;
302#endif
303  };
304  ULONG DataSize;
305#ifdef __WIDL__
306  [size_is(DataSize)] UCHAR Data[*];
307#else
308  UCHAR Data[1];
309#endif
310} BTH_LE_GATT_DESCRIPTOR_VALUE, *PBTH_LE_GATT_DESCRIPTOR_VALUE;
311
312typedef enum _BTH_LE_GATT_EVENT_TYPE {
313  CharacteristicValueChangedEvent
314} BTH_LE_GATT_EVENT_TYPE;
315
316typedef VOID (CALLBACK *PFNBLUETOOTH_GATT_EVENT_CALLBACK)(BTH_LE_GATT_EVENT_TYPE EventType, PVOID EventOutParameter, PVOID Context);
317
318typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION {
319  USHORT NumCharacteristics;
320  BTH_LE_GATT_CHARACTERISTIC Characteristics[1];
321} BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION;
322
323typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT {
324  USHORT ChangedAttributeHandle;
325  size_t CharacteristicValueDataSize;
326  PBTH_LE_GATT_CHARACTERISTIC_VALUE CharacteristicValue;
327} BLUETOOTH_GATT_VALUE_CHANGED_EVENT, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT;
328
329typedef ULONG64 BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, *PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT;
330
331#ifdef __cplusplus
332extern "C"{
333#endif
334
335FORCEINLINE BOOLEAN IsBthLEUuidMatch(BTH_LE_UUID uuid1, BTH_LE_UUID uuid2) {
336  BTH_LE_UUID tempLongUuid = {0};
337  tempLongUuid.IsShortUuid = FALSE;
338  tempLongUuid.Value.LongUuid = BTH_LE_ATT_BLUETOOTH_BASE_GUID;
339  if (uuid1.IsShortUuid && uuid2.IsShortUuid) {
340    return (uuid1.Value.ShortUuid == uuid2.Value.ShortUuid);
341  } else if (!uuid1.IsShortUuid && !uuid2.IsShortUuid) {
342    return (0 == memcmp(&uuid1.Value.LongUuid, &uuid2.Value.LongUuid, sizeof(GUID)));
343  } else if (uuid1.IsShortUuid) {
344    tempLongUuid.Value.LongUuid.Data1 += uuid1.Value.ShortUuid;
345    return (0 == memcmp(&tempLongUuid, &uuid2.Value.LongUuid, sizeof(GUID)));
346  } else if (uuid2.IsShortUuid) {
347    tempLongUuid.Value.LongUuid.Data1 += uuid2.Value.ShortUuid;
348    return (0 == memcmp(&uuid1.Value.LongUuid, &tempLongUuid.Value.LongUuid, sizeof(GUID)));
349  }
350  return FALSE;
351}
352
353#ifdef __cplusplus
354  }
355#endif
356
357#endif /* NTDDI_WIN8 */
358
359#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
360
361#endif /* __BTHLEDEF_H__ */