1 /*
2  * Copyright (C) 2021-2022 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 BLE_ADVERTISER_IMPL_H
17 #define BLE_ADVERTISER_IMPL_H
18 
19 #include <map>
20 #include <mutex>
21 
22 #include "adapter_manager.h"
23 #include "ble_defs.h"
24 #include "gap_le_if.h"
25 #include "interface_adapter_ble.h"
26 #include "log.h"
27 #include "log_util.h"
28 #include "timer.h"
29 
30 /*
31  * @brief The Bluetooth subsystem.
32  */
33 namespace OHOS {
34 namespace bluetooth {
35 /**
36  * @brief BLE advertiser wrap data.
37  */
38 struct BleAdvertiserImplWrapData {
BleAdvertiserImplWrapDataOHOS::bluetooth::BleAdvertiserImplWrapData39     BleAdvertiserImplWrapData(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData,
40         const BleAdvertiserDataImpl &rspData, int advStatus,
41         const STOP_ALL_ADV_TYPE &isUserStopAdv = STOP_ADV_TYPE_SINGLE)
42         : settings_(settings), advData_(advData), rspData_(rspData), timer_(nullptr)
43     {
44         advStatus_ = advStatus;
45         stopAllAdvType_ = isUserStopAdv;
46     }
47 
48     BleAdvertiserSettingsImpl settings_ {};
49     BleAdvertiserDataImpl advData_ {};
50     BleAdvertiserDataImpl rspData_ {};
51     std::unique_ptr<utility::Timer> timer_ {};
52     int advStatus_ {};
53     STOP_ALL_ADV_TYPE stopAllAdvType_ {};
54 };
55 struct BleAdvertiserImplOp {
BleAdvertiserImplOpOHOS::bluetooth::BleAdvertiserImplOp56     BleAdvertiserImplOp(uint8_t advHandleSet, ADV_HANDLE_STATUS advStatus)
57         :advHandle(advHandleSet), advOpStatus(advStatus)
58     {}
59     uint8_t advHandle {};
60     ADV_HANDLE_STATUS advOpStatus {};
61 };
62 /**
63  * @brief BLE advertiser.
64  */
65 class BleAdvertiserImpl {
66 public:
67     /**
68      * @brief Constructor.
69      */
70     explicit BleAdvertiserImpl(
71         IBleAdvertiserCallback &callback, IAdapterBle &bleAdapter, utility::Dispatcher &dispatch);
72 
73     /**
74      * @brief Destructor.
75      */
76     ~BleAdvertiserImpl();
77 
78     /**
79      * @brief Get advertising status
80      *
81      * @return @c advertiser status.
82      */
83     int GetAdvertisingStatus() const;
84 
85     /**
86      * @brief Restart Bluetooth LE Advertising.
87      *
88      */
89     void ReStartLegacyAdvertising() const;
90 
91     /**
92      * @brief Start Bluetooth LE Advertising.
93      *
94      * @param [in] Advertising parameters.
95      * @param [in] Advertising data.
96      * @param [in] Scan response data.
97      * @param [in] Advertising handle.
98      */
99     void StartAdvertising(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData,
100         const BleAdvertiserDataImpl &scanResponse, uint8_t advHandle);
101 
102     /**
103      * @brief Stop Bluetooth LE advertising.
104      *
105      * @param [in] Advertise handle.
106      * @param [in] True:RPA timer auto stop.
107      */
108     void StopAdvertising(uint8_t advHandle) const;
109     void StartOrStopAllAdvertising(const STOP_ALL_ADV_TYPE &stopAllAdvType, bool isStartAdv = false) const;
110     /**
111      * @brief deregister scan callback to gap
112      *
113      * @return @c status.
114      */
115     int DeregisterCallbackToGap();
116 
117     /**
118      * @brief Cleans up advertisers.
119      */
120     void Close(uint8_t advHandle) const;
121 
122     /**
123      * @brief Create advertising set handle.
124      *
125      * @return @c  Advertising handle.
126      */
127     uint8_t CreateAdvertiserSetHandle() const;
128 
129     /**
130      * @brief Add characteristic value.
131      *
132      * @param adtype Type of the field.
133      * @param data Field data.
134      */
135     void AddCharacteristicValue(uint8_t adtype, const std::string &data) const;
136     void GAPExAdvClearHandle();
137 
138 private:
139     void LegacyAdvertising(uint8_t advHandle);
140     void ExtentAdvertising(uint8_t advHandle);
141     /**
142      * @brief Gap set avertising parameter callback
143      *
144      * @param [in] status.
145      * @param [in] context.
146      */
147     static void AdvSetParamResult(uint8_t status, void *context);
148 
149     /**
150      * @brief Gap set avertising read tx power callback
151      *
152      * @param [in] status.
153      * @param [in] tx power level.
154      * @param [in] context.
155      */
156     static void AdvReadTxPower(uint8_t status, int8_t txPower, void *context);
157 
158     /**
159      * @brief Gap set advertising data callback
160      *
161      * @param [in] status.
162      * @param [in] context.
163      */
164     static void AdvSetDataResult(uint8_t status, void *context);
165 
166     /**
167      * @brief Gap set scan rsp data callback
168      *
169      * @param [in] status.
170      * @param [in] context.
171      */
172     static void AdvSetScanRspDataResult(uint8_t status, void *context);
173 
174     /**
175      * @brief Gap set advertising enable callback
176      *
177      * @param [in] status.
178      * @param [in] context.
179      */
180     static void AdvSetEnableResult(uint8_t status, void *context);
181 
182     // Extended Advertising callback
183     static void ExAdvSetRandAddrResult(uint8_t status, void *context);
184     static void ExAdvSetParamResult(uint8_t status, uint8_t selectTxPower, void *context);
185     static void ExAdvSetDataResult(uint8_t status, void *context);
186     static void ExAdvSetScanRspDataResult(uint8_t status, void *context);
187     static void ExAdvSetEnableResult(uint8_t status, void *context);
188     static void ExAdvRemoveHandleResult(uint8_t status, void *context);
189     static void ExAdvClearHandleResult(uint8_t status, void *context);
190     static void ExAdvScanRequestReceived(uint8_t advHandle, const BtAddr *scannerAddr, void *context);
191     static void ExAdvTerminatedAdvSet(
192         uint8_t status, uint8_t advHandle, uint16_t connectionHandle, uint8_t completedNumber, void *context);
193 
194     /**
195      * @brief Set avertising parameter to gap
196      *
197      * @param [in] Avertising setting parameter.
198      * @return @c status.
199      */
200     int SetAdvParamToGap(const BleAdvertiserSettingsImpl &settings) const;
201 
202     /**
203      * @brief Set extend avertising parameter to gap
204      *
205      * @return @c status.
206      */
207     int SetExAdvParamToGap(uint8_t advHandle, const BleAdvertiserSettingsImpl &settings) const;
208 
209     /**
210      * @brief Set avertising parameter
211      *
212      * @param [in] Avertising setting parameter.
213      * @return @c status.
214      */
215     void SetAdvParam(const BleAdvertiserSettingsImpl &settings) const;
216 
217     /**
218      * @brief Set avertising data to gap
219      *
220      * @param [in] avertising data.
221      * @param [in] avertising setting data.
222      * @param [in] local txpower.
223      * @return @c status.
224      */
225     int SetAdvDataToGap(
226         const BleAdvertiserDataImpl &advData, const BleAdvertiserSettingsImpl &settings, int8_t txPowerLevel) const;
227 
228     /**
229      * @brief Set extend avertising data to gap
230      *
231      * @param [in] avertising data.
232      * @param [in] avertising setting data.
233      * @param [in] local txpower.
234      * @return @c status.
235      */
236     int SetExAdvDataToGap(
237         const BleAdvertiserDataImpl &advData, const BleAdvertiserSettingsImpl &settings, int8_t txPowerLevel) const;
238 
239     /**
240      * @brief Set avertising response data to gap
241      *
242      * @param [in] avertising response data.
243      * @param [in] local txpower value.
244      * @return @c status.
245      */
246     int SetAdvScanRspDataToGap(const BleAdvertiserDataImpl &scanResponse, const BleAdvertiserSettingsImpl &settings,
247         int8_t txPowerLevel) const;
248 
249     /**
250      * @brief Set extend avertising response data to gap
251      *
252      * @param [in] avertising response data.
253      * @param [in] local txpower value.
254      * @return @c status.
255      */
256     int SetExAdvScanRspDataToGap(const BleAdvertiserDataImpl &scanResponse, const BleAdvertiserSettingsImpl &settings,
257         int8_t txPowerLevel) const;
258 
259     /**
260      * @brief Set avertising enable status
261      *
262      * @param [in] avertising enable.
263      * @return @c status.
264      */
265     int SetAdvEnableToGap(bool isEnable) const;
266     /**
267      * @brief Set extend avertising enable status
268      *
269      * @param [in] avertising enable.
270      * @return @c status.
271      */
272     int SetExAdvEnableToGap(uint8_t advHandle, bool isEnable) const;
273 
274     /**
275      * @brief Setextend avertising  batch enable status
276      *
277      * @param [in] avertising enable.
278      * @return @c status.
279      */
280     int SetExAdvBatchEnableToGap(bool isEnable) const;
281 
282     /**
283      * @brief Register avertising callback to gap
284      *
285      * @return @c status.
286      */
287     int RegisterCallbackToGap();
288 
289     /**
290      * @brief Register extend avertising callback to gap
291      *
292      * @return @c status.
293      */
294     int RegisterExAdvCallbackToGap();
295 
296     /**
297      * @brief Check avertising parameter
298      *
299      * @param [in] avertising parameters.
300      * @param [in] avertising data.
301      * @param [in] scan response data.
302      * @return @c status.
303      */
304     int CheckAdvertiserPara(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData,
305         const BleAdvertiserDataImpl &scanResponse) const;
306     int CheckAdvertiserFlag(const std::string &payload) const;
307     static int CheckAdvertiserLen(uint8_t payload, uint8_t advType);
308 
309     /**
310      * @brief Set avertising max interval
311      *
312      * @param [in] interval.
313      */
314     void SetMaxInterval(uint16_t maxinterval) const;
315 
316     /**
317      * @brief Set avertising min interval
318      *
319      * @param [in] min interval.
320      */
321     void SetMinInterval(uint16_t mininterval) const;
322 
323     /**
324      * @brief Set scan filter
325      *
326      * @param [in] White list.
327      * @param [in] White list.
328      */
329     void SetFilter(bool scanReqWhitelistOnly, bool connectWhitelistOnly) const;
330 
331     /**
332      * @brief Set channel map
333      *
334      * @param [in] channel map.
335      */
336     void SetChannelMap(const BLE_ADV_CHANNEL &channelMap) const;
337 
338     /**
339      * @brief timer call back
340      *
341      */
342     static void TimerCallback(void *context, uint8_t advHandle);
343     static void TimerCallbackEx(void *context, uint8_t advHandle);
344     static void GenResPriAddrResult(uint8_t result, const uint8_t addr[BT_ADDRESS_SIZE], void *context);
345 
346     void HandleGapEvent(const BLE_GAP_CB_EVENT &event, int status, int8_t txPower = 0);
347     void HandleGapExAdvEvent(const BLE_GAP_CB_EVENT &event, int status, int8_t txPower = 0, uint8_t handle = 0);
348     void RemoveAdvHandle(uint8_t handle) const;
349     void RemoveAllAdvHandle(int status) const;
350     void AdvSetEnableResultTask(uint8_t status);
351     void ExAdvSetEnableResultTask(uint8_t status);
352     void GapAdvParamSetCompleteEvt(int status) const;
353     void GapAdvReadTxPowerEvt(int status, int8_t txPower) const;
354     void GapAdvDataSetCompleteEvt(int status, int8_t txPower) const;
355     void GapAdvScanRspDataSetCompleteEvt(int status) const;
356     void GapAdvStartCompleteEvt(int status);
357     void GapAdvStopCompleteEvt(int status) const;
358 
359     void GapExAdvSetRandAddrResultEvt(int status) const;
360     void GapExAdvParamSetCompleteEvt(int status, int8_t txPower) const;
361     void GapExAdvDataSetCompleteEvt(int status, int8_t txPower);
362     void GapExAdvScanRspDataSetCompleteEvt(int status);
363     void GapExAdvStartCompleteEvt(int status);
364     void GapExAdvStopCompleteEvt(int status) const;
365     void GapExAdvResolvingListStartCompleteEvt(int status) const;
366     void GapExAdvResolvingListStopCompleteEvt(int status) const;
367     void GapExAdvStopAllCompleteEvt(int status) const;
368     void GapExAdvRemoveHandleResultEvt(int status) const;
369     void GapExAdvTerminatedAdvSetEvt(int status, uint8_t handle) const;
370     void StartLegacyAdvOrExAdv(uint8_t advHandle);
371     static int GetMaxAdvertisingDataLength(const BleAdvertiserSettingsImpl &settings);
372     int ExAdvDataFragment(const BleAdvertiserDataImpl &data) const;
373     int ExResDataFragment(const BleAdvertiserDataImpl &data) const;
374     void GenResPriAddrResultTask(uint8_t result, BtAddr btAddr) const;
375 
376     void StartAllAdvertising(const STOP_ALL_ADV_TYPE &stopAllAdvType, bool isStartAdv) const;
377     void StopAllAdvertising(const STOP_ALL_ADV_TYPE &stopAllAdvType, bool isStartAdv) const;
378     void UpdateAllAdvertisingStatus(const ADVERTISE_STATUS &advStatus) const;
379 
380     /// Advertising callback
381     IBleAdvertiserCallback *callback_ = nullptr;
382     /// Gap exadv callback
383     GapExAdvCallback exAdvCallback_ {};
384     IAdapterBle *bleAdapter_ = nullptr;
385     utility::Dispatcher *dispatcher_ = nullptr;
386 
387     BT_DISALLOW_COPY_AND_ASSIGN(BleAdvertiserImpl);
388     DECLARE_IMPL();
389 };
390 }  // namespace bluetooth
391 }  // namespace OHOS
392 
393 #endif  // BLE_ADVERTISER_IMPL_H
394