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