1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_INCLUDE_BT_GATT_SERVER_H
18 #define ANDROID_INCLUDE_BT_GATT_SERVER_H
19 
20 #include <stdint.h>
21 #include <vector>
22 
23 #include "bt_gatt_types.h"
24 
25 __BEGIN_DECLS
26 
27 /** GATT value type used in response to remote read requests */
28 typedef struct {
29   uint8_t value[BTGATT_MAX_ATTR_LEN];
30   uint16_t handle;
31   uint16_t offset;
32   uint16_t len;
33   uint8_t auth_req;
34 } btgatt_value_t;
35 
36 /** GATT remote read request response type */
37 typedef union {
38   btgatt_value_t attr_value;
39   uint16_t handle;
40 } btgatt_response_t;
41 
42 /** BT-GATT Server callback structure. */
43 
44 /** Callback invoked in response to register_server */
45 typedef void (*register_server_callback)(int status, int server_if,
46                                          const bluetooth::Uuid& app_uuid);
47 
48 /** Callback indicating that a remote device has connected or been disconnected
49  */
50 typedef void (*connection_callback)(int conn_id, int server_if, int connected,
51                                     const RawAddress& bda);
52 
53 /** Callback invoked in response to create_service */
54 typedef void (*service_added_callback)(
55     int status, int server_if, std::vector<btgatt_db_element_t> service);
56 
57 /** Callback invoked in response to stop_service */
58 typedef void (*service_stopped_callback)(int status, int server_if,
59                                          int srvc_handle);
60 
61 /** Callback triggered when a service has been deleted */
62 typedef void (*service_deleted_callback)(int status, int server_if,
63                                          int srvc_handle);
64 
65 /**
66  * Callback invoked when a remote device has requested to read a characteristic
67  * or descriptor. The application must respond by calling send_response
68  */
69 typedef void (*request_read_callback)(int conn_id, int trans_id,
70                                       const RawAddress& bda, int attr_handle,
71                                       int offset, bool is_long);
72 
73 /**
74  * Callback invoked when a remote device has requested to write to a
75  * characteristic or descriptor.
76  */
77 typedef void (*request_write_callback)(int conn_id, int trans_id,
78                                        const RawAddress& bda, int attr_handle,
79                                        int offset, bool need_rsp, bool is_prep,
80                                        std::vector<uint8_t> value);
81 
82 /** Callback invoked when a previously prepared write is to be executed */
83 typedef void (*request_exec_write_callback)(int conn_id, int trans_id,
84                                             const RawAddress& bda,
85                                             int exec_write);
86 
87 /**
88  * Callback triggered in response to send_response if the remote device
89  * sends a confirmation.
90  */
91 typedef void (*response_confirmation_callback)(int status, int handle);
92 
93 /**
94  * Callback confirming that a notification or indication has been sent
95  * to a remote device.
96  */
97 typedef void (*indication_sent_callback)(int conn_id, int status);
98 
99 /**
100  * Callback notifying an application that a remote device connection is
101  * currently congested and cannot receive any more data. An application should
102  * avoid sending more data until a further callback is received indicating the
103  * congestion status has been cleared.
104  */
105 typedef void (*congestion_callback)(int conn_id, bool congested);
106 
107 /** Callback invoked when the MTU for a given connection changes */
108 typedef void (*mtu_changed_callback)(int conn_id, int mtu);
109 
110 /** Callback invoked when the PHY for a given connection changes */
111 typedef void (*phy_updated_callback)(int conn_id, uint8_t tx_phy,
112                                      uint8_t rx_phy, uint8_t status);
113 
114 /** Callback invoked when the connection parameters for a given connection
115  * changes */
116 typedef void (*conn_updated_callback)(int conn_id, uint16_t interval,
117                                       uint16_t latency, uint16_t timeout,
118                                       uint8_t status);
119 typedef struct {
120   register_server_callback register_server_cb;
121   connection_callback connection_cb;
122   service_added_callback service_added_cb;
123   service_stopped_callback service_stopped_cb;
124   service_deleted_callback service_deleted_cb;
125   request_read_callback request_read_characteristic_cb;
126   request_read_callback request_read_descriptor_cb;
127   request_write_callback request_write_characteristic_cb;
128   request_write_callback request_write_descriptor_cb;
129   request_exec_write_callback request_exec_write_cb;
130   response_confirmation_callback response_confirmation_cb;
131   indication_sent_callback indication_sent_cb;
132   congestion_callback congestion_cb;
133   mtu_changed_callback mtu_changed_cb;
134   phy_updated_callback phy_updated_cb;
135   conn_updated_callback conn_updated_cb;
136 } btgatt_server_callbacks_t;
137 
138 /** Represents the standard BT-GATT server interface. */
139 typedef struct {
140   /** Registers a GATT server application with the stack */
141   bt_status_t (*register_server)(const bluetooth::Uuid& uuid);
142 
143   /** Unregister a server application from the stack */
144   bt_status_t (*unregister_server)(int server_if);
145 
146   /** Create a connection to a remote peripheral */
147   bt_status_t (*connect)(int server_if, const RawAddress& bd_addr,
148                          bool is_direct, int transport);
149 
150   /** Disconnect an established connection or cancel a pending one */
151   bt_status_t (*disconnect)(int server_if, const RawAddress& bd_addr,
152                             int conn_id);
153 
154   /** Create a new service */
155   bt_status_t (*add_service)(int server_if,
156                              std::vector<btgatt_db_element_t> service);
157 
158   /** Stops a local service */
159   bt_status_t (*stop_service)(int server_if, int service_handle);
160 
161   /** Delete a local service */
162   bt_status_t (*delete_service)(int server_if, int service_handle);
163 
164   /** Send value indication to a remote device */
165   bt_status_t (*send_indication)(int server_if, int attribute_handle,
166                                  int conn_id, int confirm,
167                                  std::vector<uint8_t> value);
168 
169   /** Send a response to a read/write operation */
170   bt_status_t (*send_response)(int conn_id, int trans_id, int status,
171                                const btgatt_response_t& response);
172 
173   bt_status_t (*set_preferred_phy)(const RawAddress& bd_addr, uint8_t tx_phy,
174                                    uint8_t rx_phy, uint16_t phy_options);
175 
176   bt_status_t (*read_phy)(
177       const RawAddress& bd_addr,
178       base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb);
179 
180 } btgatt_server_interface_t;
181 
182 __END_DECLS
183 
184 #endif /* ANDROID_INCLUDE_BT_GATT_CLIENT_H */
185