1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef SOFTBUS_ADAPTER_BLE_GATT_SERVER_H
17 #define SOFTBUS_ADAPTER_BLE_GATT_SERVER_H
18 
19 #include "stdbool.h"
20 #include "stdint.h"
21 #include "common_list.h"
22 #include "softbus_adapter_bt_common.h"
23 #include "softbus_def.h"
24 
25 #ifdef __cplusplus
26 #if __cplusplus
27 extern "C" {
28 #endif
29 #endif
30 
31 typedef enum {
32     SOFTBUS_GATT_SUCCESS = 0x00,
33     SOFTBUS_GATT_INVALID_HANDLE = 0x01,
34     SOFTBUS_GATT_READ_NOT_PERMITTED = 0x02,
35     SOFTBUS_GATT_WRITE_NOT_PERMITTED = 0x03,
36     SOFTBUS_GATT_INVALID_PDU = 0x04,
37     SOFTBUS_GATT_INSUFFICIENT_AUTHENTICATION = 0x05,
38     SOFTBUS_GATT_REQUEST_NOT_SUPPORTED = 0x06,
39     SOFTBUS_GATT_INVALID_OFFSET = 0x07,
40     SOFTBUS_GATT_INSUFFICIENT_AUTHORIZATION = 0x08,
41     SOFTBUS_GATT_PREPARE_QUEUE_FULL = 0x09,
42     SOFTBUS_GATT_ATTRIBUTE_NOT_FOUND = 0x0A,
43     SOFTBUS_GATT_ATTRIBUTE_NOT_LONG = 0x0B,
44     SOFTBUS_GATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0x0C,
45     SOFTBUS_GATT_INVALID_ATTRIBUTE_VALUE_LENGTH = 0x0D,
46     SOFTBUS_GATT_UNLIKELY_ERROR = 0x0E,
47     SOFTBUS_GATT_INSUFFICIENT_ENCRYPTION = 0x0F,
48     SOFTBUS_GATT_UNSUPPORTED_GROUP_TYPE = 0x10,
49     SOFTBUS_GATT_INSUFFICIENT_RESOURCES = 0x11,
50     SOFTBUS_GATT_DATABASE_OUT_OF_SYNC = 0x12,
51     SOFTBUS_GATT_VALUE_NOT_ALLOWED = 0x13,
52 } SoftBusGattStatus;
53 
54 typedef enum {
55     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_BROADCAST = 0x01,
56     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_READ = 0x02,
57     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP = 0x04,
58     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE = 0x08,
59     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_NOTIFY = 0x10,
60     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_INDICATE = 0x20,
61     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_SIGNED_WRITE = 0x40,
62     SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_EXTENDED_PROPERTY = 0x80
63 } SoftBusGattCharaProperty;
64 
65 typedef enum {
66     SOFTBUS_GATT_PERMISSION_READ = 0x01,
67     SOFTBUS_GATT_PERMISSION_READ_ENCRYPTED = 0x02,
68     SOFTBUS_GATT_PERMISSION_READ_ENCRYPTED_MITM = 0x04,
69     SOFTBUS_GATT_PERMISSION_WRITE = 0x10,
70     SOFTBUS_GATT_PERMISSION_WRITE_ENCRYPTED = 0x20,
71     SOFTBUS_GATT_PERMISSION_WRITE_ENCRYPTED_MITM = 0x40,
72     SOFTBUS_GATT_PERMISSION_WRITE_SIGNED = 0x80,
73     SOFTBUS_GATT_PERMISSION_WRITE_SIGNED_MITM = 0x100
74 } SoftBusGattAttrPermission;
75 
76 typedef struct {
77     int connId;
78     int transId;
79     SoftBusBtAddr *btAddr;
80     int attrHandle;
81     int offset;
82     bool isLong;
83 } SoftBusGattReadRequest;
84 
85 typedef struct {
86     int connId;
87     int transId;
88     SoftBusBtAddr *btAddr;
89     int attrHandle;
90     int offset;
91     int length;
92     bool needRsp;
93     bool isPrep;
94     unsigned char *value;
95 } SoftBusGattWriteRequest;
96 
97 
98 typedef struct {
99     void (*ServiceAddCallback)(int status, SoftBusBtUuid *uuid, int srvcHandle);
100     void (*CharacteristicAddCallback)(int status, SoftBusBtUuid *uuid, int srvcHandle, int characteristicHandle);
101     void (*DescriptorAddCallback)(int status, SoftBusBtUuid *uuid, int srvcHandle, int descriptorHandle);
102     void (*ServiceStartCallback)(int status, int srvcHandle);
103     void (*ServiceStopCallback)(int status, int srvcHandle);
104     void (*ServiceDeleteCallback)(int status, int srvcHandle);
105     void (*ConnectServerCallback)(int connId, const SoftBusBtAddr *btAddr);
106     void (*DisconnectServerCallback)(int connId, const SoftBusBtAddr *btAddr);
107     void (*RequestReadCallback)(SoftBusGattReadRequest readCbPara);
108     void (*RequestWriteCallback)(SoftBusGattWriteRequest writeCbPara);
109     void (*ResponseConfirmationCallback)(int status, int handle);
110     void (*NotifySentCallback)(int connId, int status);
111     void (*MtuChangeCallback)(int connId, int mtu);
112     bool (*IsConcernedAttrHandle)(int srvcHandle, int attrHandle);
113 } SoftBusGattsCallback;
114 
115 typedef struct {
116     int connectId;
117     int transId;
118     int status;
119     int attrHandle;
120     int offset;
121     int valueLen;
122     char *value;
123 } SoftBusGattsResponse;
124 
125 typedef struct {
126     int connectId;
127     int attrHandle;
128     int confirm;
129     int valueLen;
130     char *value;
131 } SoftBusGattsNotify;
132 
133 typedef struct {
134     ListNode node;
135     int32_t connId;
136     SoftBusBtAddr btAddr;
137     int32_t mtu;
138     int32_t handle;  // the id of start server
139     bool notifyConnected;
140 } ServerConnection;
141 
142 typedef struct {
143     SoftBusGattsCallback callback;
144     ListNode node;
145     SoftBusBtUuid serviceUuid;
146     int32_t handle;  // the id of start server
147 } ServerService;
148 
149 typedef struct {
150     ListNode services;
151     ListNode connections; // as server connected
152     SoftBusMutex lock;
153 } SoftBusGattsManager;
154 
155 int SoftBusRegisterGattsCallbacks(SoftBusGattsCallback *callback, SoftBusBtUuid srvcUuid);
156 void SoftBusUnRegisterGattsCallbacks(SoftBusBtUuid srvcUuid);
157 int SoftBusGattsAddService(SoftBusBtUuid srvcUuid, bool isPrimary, int number);
158 int SoftBusGattsAddCharacteristic(int srvcHandle, SoftBusBtUuid characUuid, int properties, int permissions);
159 int SoftBusGattsAddDescriptor(int srvcHandle, SoftBusBtUuid descUuid, int permissions);
160 int SoftBusGattsStartService(int srvcHandle);
161 int SoftBusGattsStopService(int srvcHandle);
162 int SoftBusGattsDeleteService(int srvcHandle);
163 int SoftBusGattsConnect(SoftBusBtAddr btAddr);
164 int SoftBusGattsDisconnect(SoftBusBtAddr btAddr, int connId);
165 int SoftBusGattsSendResponse(SoftBusGattsResponse *param);
166 int SoftBusGattsSendNotify(SoftBusGattsNotify *param);
167 int InitSoftbusAdapterServer(void);
168 
169 #ifdef __cplusplus
170 #if __cplusplus
171 }
172 #endif /* __cplusplus */
173 #endif /* __cplusplus */
174 #endif