15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_DEFS_WIN_H_
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_DEFS_WIN_H_
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <windows.h>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <cfg.h>
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <devpkey.h>
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <setupapi.h>
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// #include <bthledef.h>
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(rpaquay):
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// bthledef.h from Win8 SDK has a couple of issues when used in a Win32 app:
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// * line 420: usage of "pragma pop" instead of "pragma warning(pop)"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// * line 349: no CALLBACK modifier in the definition of
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// PFNBLUETOOTH_GATT_EVENT_CALLBACK.
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// So, we duplicate the definitions we need and prevent the build from including
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the content of bthledef.h.
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef __BTHLEDEF_H__
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __BTHLEDEF_H__
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Bluetooth LE device interface GUID
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// {781aee18-7733-4ce4-adb0-91f41c67b592}
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DEFINE_GUID(GUID_BLUETOOTHLE_DEVICE_INTERFACE,
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x781aee18,
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x7733,
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x4ce4,
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0xad,
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0xd0,
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x91,
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0xf4,
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x1c,
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x67,
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0xb5,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x92);
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DEFINE_GUID(BTH_LE_ATT_BLUETOOTH_BASE_GUID,
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x00000000,
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x0000,
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x1000,
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x80,
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x00,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x00,
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x80,
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x5F,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x9B,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0x34,
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            0xFB);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define BLUETOOTH_GATT_FLAG_NONE 0x00000000
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct _BTH_LE_UUID {
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsShortUuid;
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  [ switch_type(BOOLEAN), switch_is((BOOLEAN)IsShortUuid) ]
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      union {
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [case(TRUE)]
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        USHORT ShortUuid;
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [case(FALSE)]
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        GUID LongUuid;
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } Value;
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_UUID, *PBTH_LE_UUID;
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct _BTH_LE_GATT_SERVICE {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BTH_LE_UUID ServiceUuid;
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT AttributeHandle;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_SERVICE, *PBTH_LE_GATT_SERVICE;
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct _BTH_LE_GATT_CHARACTERISTIC {
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT ServiceHandle;
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BTH_LE_UUID CharacteristicUuid;
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT AttributeHandle;
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT CharacteristicValueHandle;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsBroadcastable;
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsReadable;
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsWritable;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsWritableWithoutResponse;
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsSignedWritable;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsNotifiable;
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN IsIndicatable;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BOOLEAN HasExtendedProperties;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_CHARACTERISTIC, *PBTH_LE_GATT_CHARACTERISTIC;
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE {
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ULONG DataSize;
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  [size_is(DataSize)] UCHAR Data[*];
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Field_size_bytes_(DataSize) UCHAR Data[1];
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE;
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef enum _BTH_LE_GATT_DESCRIPTOR_TYPE {
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CharacteristicExtendedProperties,
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CharacteristicUserDescription,
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ClientCharacteristicConfiguration,
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ServerCharacteristicConfiguration,
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CharacteristicFormat,
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CharacteristicAggregateFormat,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CustomDescriptor
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_DESCRIPTOR_TYPE,
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *PBTH_LE_GATT_DESCRIPTOR_TYPE;
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct _BTH_LE_GATT_DESCRIPTOR {
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT ServiceHandle;
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT CharacteristicHandle;
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BTH_LE_UUID DescriptorUuid;
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  USHORT AttributeHandle;
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_DESCRIPTOR, *PBTH_LE_GATT_DESCRIPTOR;
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct _BTH_LE_GATT_DESCRIPTOR_VALUE {
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BTH_LE_UUID DescriptorUuid;
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  [
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    switch_type(BTH_LE_GATT_DESCRIPTOR_TYPE),
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    switch_is((BTH_LE_GATT_DESCRIPTOR_TYPE)DescriptorType)
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ]
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      union {
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [case(CharacteristicExtendedProperties)]
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        struct {
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BOOLEAN IsReliableWriteEnabled;
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BOOLEAN IsAuxiliariesWritable;
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } CharacteristicExtendedProperties;
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [case(ClientCharacteristicConfiguration)]
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        struct {
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BOOLEAN IsSubscribeToNotification;
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BOOLEAN IsSubscribeToIndication;
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } ClientCharacteristicConfiguration;
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [case(ServerCharacteristicConfiguration)]
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        struct {
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BOOLEAN IsBroadcast;
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } ServerCharacteristicConfiguration;
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [case(CharacteristicFormat)]
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        struct {
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      UCHAR Format;
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      UCHAR Exponent;
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BTH_LE_UUID Unit;
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      UCHAR NameSpace;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BTH_LE_UUID Description;
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } CharacteristicFormat;
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    [default];
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ULONG DataSize;
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef MIDL_PASS
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  [size_is(DataSize)] UCHAR Data[*];
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Field_size_bytes_(DataSize) UCHAR Data[1];
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_DESCRIPTOR_VALUE, *PBTH_LE_GATT_DESCRIPTOR_VALUE;
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef enum _BTH_LE_GATT_EVENT_TYPE {
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CharacteristicValueChangedEvent,
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} BTH_LE_GATT_EVENT_TYPE;
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef ULONG64 BTH_LE_GATT_RELIABLE_WRITE_CONTEXT,
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT;
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // __BTHLEDEF_H__
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <bluetoothapis.h>
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <bluetoothleapis.h>
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_DEFS_WIN_H_
193