1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_DEFS_WIN_H_
6#define DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_DEFS_WIN_H_
7
8#include <windows.h>
9#include <cfg.h>
10#include <devpkey.h>
11#include <setupapi.h>
12// #include <bthledef.h>
13// TODO(rpaquay):
14// bthledef.h from Win8 SDK has a couple of issues when used in a Win32 app:
15// * line 420: usage of "pragma pop" instead of "pragma warning(pop)"
16// * line 349: no CALLBACK modifier in the definition of
17// PFNBLUETOOTH_GATT_EVENT_CALLBACK.
18//
19// So, we duplicate the definitions we need and prevent the build from including
20// the content of bthledef.h.
21#ifndef __BTHLEDEF_H__
22#define __BTHLEDEF_H__
23
24//
25// Bluetooth LE device interface GUID
26//
27// {781aee18-7733-4ce4-adb0-91f41c67b592}
28DEFINE_GUID(GUID_BLUETOOTHLE_DEVICE_INTERFACE,
29            0x781aee18,
30            0x7733,
31            0x4ce4,
32            0xad,
33            0xd0,
34            0x91,
35            0xf4,
36            0x1c,
37            0x67,
38            0xb5,
39            0x92);
40
41DEFINE_GUID(BTH_LE_ATT_BLUETOOTH_BASE_GUID,
42            0x00000000,
43            0x0000,
44            0x1000,
45            0x80,
46            0x00,
47            0x00,
48            0x80,
49            0x5F,
50            0x9B,
51            0x34,
52            0xFB);
53
54#define BLUETOOTH_GATT_FLAG_NONE 0x00000000
55
56typedef struct _BTH_LE_UUID {
57  BOOLEAN IsShortUuid;
58#ifdef MIDL_PASS
59  [ switch_type(BOOLEAN), switch_is((BOOLEAN)IsShortUuid) ]
60#endif
61      union {
62#ifdef MIDL_PASS
63    [case(TRUE)]
64#endif
65        USHORT ShortUuid;
66#ifdef MIDL_PASS
67    [case(FALSE)]
68#endif
69        GUID LongUuid;
70  } Value;
71} BTH_LE_UUID, *PBTH_LE_UUID;
72
73typedef struct _BTH_LE_GATT_SERVICE {
74  BTH_LE_UUID ServiceUuid;
75  USHORT AttributeHandle;
76} BTH_LE_GATT_SERVICE, *PBTH_LE_GATT_SERVICE;
77
78typedef struct _BTH_LE_GATT_CHARACTERISTIC {
79  USHORT ServiceHandle;
80  BTH_LE_UUID CharacteristicUuid;
81  USHORT AttributeHandle;
82  USHORT CharacteristicValueHandle;
83  BOOLEAN IsBroadcastable;
84  BOOLEAN IsReadable;
85  BOOLEAN IsWritable;
86  BOOLEAN IsWritableWithoutResponse;
87  BOOLEAN IsSignedWritable;
88  BOOLEAN IsNotifiable;
89  BOOLEAN IsIndicatable;
90  BOOLEAN HasExtendedProperties;
91} BTH_LE_GATT_CHARACTERISTIC, *PBTH_LE_GATT_CHARACTERISTIC;
92
93typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE {
94  ULONG DataSize;
95
96#ifdef MIDL_PASS
97  [size_is(DataSize)] UCHAR Data[*];
98#else
99  _Field_size_bytes_(DataSize) UCHAR Data[1];
100#endif
101} BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE;
102
103typedef enum _BTH_LE_GATT_DESCRIPTOR_TYPE {
104  CharacteristicExtendedProperties,
105  CharacteristicUserDescription,
106  ClientCharacteristicConfiguration,
107  ServerCharacteristicConfiguration,
108  CharacteristicFormat,
109  CharacteristicAggregateFormat,
110  CustomDescriptor
111} BTH_LE_GATT_DESCRIPTOR_TYPE,
112    *PBTH_LE_GATT_DESCRIPTOR_TYPE;
113
114typedef struct _BTH_LE_GATT_DESCRIPTOR {
115  USHORT ServiceHandle;
116  USHORT CharacteristicHandle;
117  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
118  BTH_LE_UUID DescriptorUuid;
119  USHORT AttributeHandle;
120} BTH_LE_GATT_DESCRIPTOR, *PBTH_LE_GATT_DESCRIPTOR;
121
122typedef struct _BTH_LE_GATT_DESCRIPTOR_VALUE {
123  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
124  BTH_LE_UUID DescriptorUuid;
125
126#ifdef MIDL_PASS
127  [
128    switch_type(BTH_LE_GATT_DESCRIPTOR_TYPE),
129    switch_is((BTH_LE_GATT_DESCRIPTOR_TYPE)DescriptorType)
130  ]
131#endif
132      union {
133
134#ifdef MIDL_PASS
135    [case(CharacteristicExtendedProperties)]
136#endif
137        struct {
138      BOOLEAN IsReliableWriteEnabled;
139      BOOLEAN IsAuxiliariesWritable;
140    } CharacteristicExtendedProperties;
141
142#ifdef MIDL_PASS
143    [case(ClientCharacteristicConfiguration)]
144#endif
145        struct {
146      BOOLEAN IsSubscribeToNotification;
147      BOOLEAN IsSubscribeToIndication;
148    } ClientCharacteristicConfiguration;
149
150#ifdef MIDL_PASS
151    [case(ServerCharacteristicConfiguration)]
152#endif
153        struct {
154      BOOLEAN IsBroadcast;
155    } ServerCharacteristicConfiguration;
156
157#ifdef MIDL_PASS
158    [case(CharacteristicFormat)]
159#endif
160        struct {
161      UCHAR Format;
162      UCHAR Exponent;
163      BTH_LE_UUID Unit;
164      UCHAR NameSpace;
165      BTH_LE_UUID Description;
166    } CharacteristicFormat;
167#ifdef MIDL_PASS
168    [default];
169#endif
170  };
171
172  ULONG DataSize;
173
174#ifdef MIDL_PASS
175  [size_is(DataSize)] UCHAR Data[*];
176#else
177  _Field_size_bytes_(DataSize) UCHAR Data[1];
178#endif
179} BTH_LE_GATT_DESCRIPTOR_VALUE, *PBTH_LE_GATT_DESCRIPTOR_VALUE;
180
181typedef enum _BTH_LE_GATT_EVENT_TYPE {
182  CharacteristicValueChangedEvent,
183} BTH_LE_GATT_EVENT_TYPE;
184
185typedef ULONG64 BTH_LE_GATT_RELIABLE_WRITE_CONTEXT,
186    *PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT;
187
188#endif  // __BTHLEDEF_H__
189#include <bluetoothapis.h>
190#include <bluetoothleapis.h>
191
192#endif  // DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_DEFS_WIN_H_
193