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 #include "gatt_connection_manager.h"
17 #include "adapter_config.h"
18 #include "att.h"
19 #include "btm.h"
20 #include "gap_if.h"
21 #include "gap_le_if.h"
22 #include "gatt_defines.h"
23 #include "gatt_service_base.h"
24 #include "hisysevent.h"
25 #include "interface_adapter_ble.h"
26 #include "interface_adapter_manager.h"
27 #include "log.h"
28 #include "log_util.h"
29 #include "securec.h"
30
31 namespace OHOS {
32 namespace bluetooth {
33 constexpr uint8_t OBSERVER_EVENT_CONNECTED = 0x0;
34 constexpr uint8_t OBSERVER_EVENT_DISCONNECTED = 0x1;
35 constexpr uint8_t OBSERVER_EVENT_CONNECTING = 0x2;
36 constexpr uint8_t OBSERVER_EVENT_DISCONNECTING = 0x3;
37 constexpr uint8_t OBSERVER_EVENT_RECONNECTED = 0x04;
38 constexpr uint8_t OBSERVER_EVENT_DISCONNECTED_INTER = 0x05;
39
40 constexpr uint8_t MAX_RETRY_CONNECT_TIMES = 0;
41 constexpr uint8_t HCI_CONNECTION_FAILED_TO_BE_ESTABLISHED = 0x3E;
42
43 const std::string GattConnectionManager::Device::STATE_IDLE = "IDLE";
44 const std::string GattConnectionManager::Device::STATE_CONNECTING = "CONNECTING";
45 const std::string GattConnectionManager::Device::STATE_CONNECTED = "CONNECTED";
46 const std::string GattConnectionManager::Device::STATE_DISCONNECTING = "DISCONNECTING";
47 const std::string GattConnectionManager::Device::STATE_DISCONNECTED = "DISCONNECTED";
48
49 using DeviceIterator = std::list<std::unique_ptr<GattConnectionManager::Device>>::iterator;
50
51 struct GattConnectionManager::impl : public GattServiceBase {
52 utility::Dispatcher *dispatcher_ = nullptr;
53 std::array<std::pair<bool, GattConnectionObserver *>, MAX_OBSERVER_NUM> observers_
54 = {std::make_pair(false, nullptr)};
55 std::list<std::unique_ptr<GattConnectionManager::Device>> devices_ = {};
56 std::mutex registerMutex_ = {};
57 std::mutex devicelistRWMutex_ = {};
58 struct {
59 uint16_t connIntervalMin_;
60 uint16_t connIntervalMax_;
61 uint16_t connLatency_;
62 uint16_t supervisionTimeout_;
63 uint16_t mtu_;
64 uint16_t flushTimeout_;
65 uint8_t mode_;
66 uint8_t securityMode_;
67 uint16_t bleMaxConnections_;
68 uint16_t classicMaxConnections_;
69 } connectionParameter_ = {};
70
71 impl();
72
73 GattConnectionManager::Device *FindOrRegister(
74 const GattDevice &device, bool autoConnect, std::unique_lock<std::mutex> &deviceLock);
75 GattConnectionManager::Device *FindOrRegister(
76 const BtAddr &addr, uint8_t transport, std::unique_lock<std::mutex> &deviceLock);
77 bool HasSpareDeviceSpace(uint8_t transport);
78 GattConnectionManager::Device *FindDevice(
79 const BtAddr &addr, uint8_t transport, std::unique_lock<std::mutex> &deviceLock);
80 GattConnectionManager::Device *FindDevice(const GattDevice &device, std::unique_lock<std::mutex> &deviceLock);
81 GattConnectionManager::Device *FindDevice(uint16_t handle, std::unique_lock<std::mutex> &deviceLock);
82 void ClearDeviceList();
83 void RemoveDevice(const GattDevice &device);
84 void DisconnectAllDevice();
85 void NotifyObserver(const GattDevice &device, uint8_t event, uint16_t connectionHandle, int ret);
86 int DoConnect(GattConnectionManager::Device &device);
87 int DoConnectComplete(GattConnectionManager::Device &device, const utility::Message &msg);
88 static void DoDisconnect(uint16_t handle);
89 static int DoDisconnectComplete(GattConnectionManager::Device &device, const utility::Message &msg);
90 int DoRequestConnectionPriority(GattConnectionManager::Device &device, int connPriority);
91 void NotifyPriorityUpdated(
92 const GattDevice &device, uint16_t connInterval, uint16_t connLatency, uint16_t timeout, int status);
93 static void ConnectionInComming(const BtAddr &addr, uint8_t transport, uint16_t connectHandle, void *data);
94 static int CheckDeviceParameter(const GattDevice &device);
95 static int ConvertTransport(int transport);
96 static int ConvertConnectionState(const std::string &state);
97 void DoShutDown();
98 static uint16_t GetBleMaxConnectedDevices();
99 static uint16_t GetBleMinConnectionInterval(int connPriority);
100 static uint16_t GetBleMaxConnectionInterval(int connPriority);
101 static uint16_t GetBleConnectionLatency(int connPriority);
102 static uint16_t GetBleConnectionSupervisionTimeout(int connPriority);
103 static uint16_t GetClassicMaxConnectedDevices();
104 static uint16_t GetClassicConnectionMtu();
105 uint8_t GetClassicConnectionMode();
106 uint16_t GetClassicConnectionFlushTimeout();
107 uint8_t GetClassicConnectionSecurityMode();
108
109 static void LEConnectCompleted(uint16_t connectHandle, AttLeConnectCallback *data, void *context);
110 static void LEDisconnectCompleted(uint16_t connectHandle, AttLeDisconnectCallback *data, void *context);
111 static void BREDRConnectCompleted(uint16_t connectHandle, AttBredrConnectCallback *data, void *context);
112 static void BREDRDisconnectCompleted(uint16_t connectHandle, AttBredrDisconnectCallback *data, void *context);
113 static void BREDRConnectInd(uint16_t connectHandle, void *context);
114
115 static void LEConnectionParamterReq(const BtAddr *addr, uint16_t connIntervalMin, uint16_t connIntervalMax,
116 uint16_t connLatency, uint16_t timeout, void *context);
117 static void LEConnectionUpdateComplete(uint8_t status, const BtAddr *addr, uint16_t connInterval,
118 uint16_t connLatency, uint16_t timeout, void *context);
119
120 void LEConnectionParamterReqImpl(
121 BtAddr addr, uint16_t connIntervalMin, uint16_t connIntervalMax, uint16_t connLatency, uint16_t timeout);
122 void LEConnectionUpdateCompleteImpl(
123 uint8_t status, BtAddr addr, uint16_t connInterval, uint16_t connLatency, uint16_t timeout);
124
125 void LEConnectCompletedImpl(uint16_t connectHandle, AttLeConnectCallback data);
126 void LEDisconnectCompletedImpl(uint16_t connectHandle, AttLeDisconnectCallback data);
127 void BREDRConnectCompletedImpl(uint16_t connectHandle, AttBredrConnectCallback data);
128 void BREDRDisconnectCompletedImpl(uint16_t connectHandle, AttBredrDisconnectCallback data);
129 static AttConnectCallback BuildAttConnectCallback();
130
131 static void ChangeConnectionMode(bool isDirect);
132 void DirectConnectTimeout(const GattDevice &device);
133
134 BT_DISALLOW_COPY_AND_ASSIGN(impl);
135 };
136
GattConnectionManager()137 GattConnectionManager::GattConnectionManager() : pimpl(std::make_unique<impl>())
138 {}
139
~GattConnectionManager()140 GattConnectionManager::~GattConnectionManager()
141 {
142 pimpl->ClearDeviceList();
143 }
144
Connect(const GattDevice & device,bool autoConnect) const145 int GattConnectionManager::Connect(const GattDevice &device, bool autoConnect) const
146 {
147 int result = pimpl->CheckDeviceParameter(device);
148 if (GattStatus::GATT_SUCCESS == result) {
149 {
150 std::unique_lock<std::mutex> devLock;
151 auto internalDevice = pimpl->FindOrRegister(device, autoConnect, devLock);
152 if (internalDevice != nullptr) {
153 if (internalDevice->ProcessMessage(Device::StateMachine::MSG_CONNECT)) {
154 result = GattStatus::GATT_SUCCESS;
155 } else {
156 result = GattStatus::INTERNAL_ERROR;
157 }
158 } else {
159 result = GattStatus::MAX_CONNECTIONS;
160 }
161 }
162 }
163
164 if (GattStatus::INTERNAL_ERROR == result) {
165 pimpl->RemoveDevice(device);
166 }
167
168 return result;
169 }
170
Disconnect(const GattDevice & device) const171 int GattConnectionManager::Disconnect(const GattDevice &device) const
172 {
173 LOG_DEBUG("%{public}s:%{public}s:%{public}d Entry!", __FILE__, __FUNCTION__, __LINE__);
174 int ret = GattStatus::INVALID_PARAMETER;
175 std::unique_lock<std::mutex> devLock;
176 auto internalDevice = pimpl->FindDevice(device, devLock);
177 if (internalDevice != nullptr) {
178 internalDevice->AutoConnect() = false;
179 if (internalDevice->ProcessMessage(Device::StateMachine::MSG_DISCONNECT)) {
180 ret = GattStatus::GATT_SUCCESS;
181 } else {
182 ret = GattStatus::INTERNAL_ERROR;
183 }
184 }
185 return ret;
186 }
187
RegisterObserver(GattConnectionObserver & observer) const188 int GattConnectionManager::RegisterObserver(GattConnectionObserver &observer) const
189 {
190 std::lock_guard<std::mutex> lck(pimpl->registerMutex_);
191 int id = -1;
192 for (int i = 0; i < MAX_OBSERVER_NUM; i++) {
193 if (!pimpl->observers_[i].first) {
194 pimpl->observers_[i].first = true;
195 pimpl->observers_[i].second = &observer;
196 id = i;
197 break;
198 }
199 }
200 return id;
201 }
202
DeregisterObserver(int registerId) const203 void GattConnectionManager::DeregisterObserver(int registerId) const
204 {
205 std::lock_guard<std::mutex> lck(pimpl->registerMutex_);
206 if (registerId >= 0 && registerId < MAX_OBSERVER_NUM) {
207 pimpl->observers_[registerId] = std::make_pair(false, nullptr);
208 }
209 }
210
GetDeviceState(const GattDevice & device) const211 const std::string &GattConnectionManager::GetDeviceState(const GattDevice &device) const
212 {
213 std::unique_lock<std::mutex> devLock;
214 auto internalDevice = pimpl->FindDevice(device, devLock);
215 if (internalDevice != nullptr) {
216 return internalDevice->SM().GetState()->Name();
217 }
218 return Device::STATE_IDLE;
219 }
220
GetDevices(std::vector<GattDevice> & devices) const221 void GattConnectionManager::GetDevices(std::vector<GattDevice> &devices) const
222 {
223 std::lock_guard<std::mutex> lck(pimpl->devicelistRWMutex_);
224 std::transform(
225 pimpl->devices_.begin(), pimpl->devices_.end(), std::back_inserter(devices), [&](auto &item) -> GattDevice {
226 return GattDevice(item->Info().addr_,
227 item->Info().addressType_,
228 item->Info().transport_,
229 pimpl->ConvertConnectionState(item->SM().GetState()->Name()));
230 });
231 }
232
GetMaximumNumberOfConnections() const233 std::pair<uint16_t, uint16_t> GattConnectionManager::GetMaximumNumberOfConnections() const
234 {
235 return std::pair<uint16_t, uint16_t>(
236 pimpl->connectionParameter_.classicMaxConnections_, pimpl->connectionParameter_.bleMaxConnections_);
237 }
238
GetDeviceInformation(const GattDevice & device) const239 std::tuple<std::string, uint16_t, uint16_t> GattConnectionManager::GetDeviceInformation(const GattDevice &device) const
240 {
241 std::unique_lock<std::mutex> devLock;
242 auto internalDevice = pimpl->FindDevice(device, devLock);
243 if (internalDevice != nullptr) {
244 return std::make_tuple(
245 internalDevice->SM().GetState()->Name(), internalDevice->Handle(), internalDevice->MTU());
246 }
247
248 return std::make_tuple(Device::STATE_IDLE, 0, 0);
249 }
250
GetDeviceTransport(uint16_t handle) const251 uint8_t GattConnectionManager::GetDeviceTransport(uint16_t handle) const
252 {
253 std::unique_lock<std::mutex> devLock;
254 auto internalDevice = pimpl->FindDevice(handle, devLock);
255 if (internalDevice != nullptr) {
256 return internalDevice->Info().transport_;
257 }
258
259 return GATT_TRANSPORT_TYPE_AUTO;
260 }
261
RequestConnectionPriority(uint16_t handle,int connPriority) const262 int GattConnectionManager::RequestConnectionPriority(uint16_t handle, int connPriority) const
263 {
264 std::unique_lock<std::mutex> devLock;
265 auto internalDevice = pimpl->FindDevice(handle, devLock);
266 if (internalDevice != nullptr) {
267 return (
268 (internalDevice->Info().transport_ != GATT_TRANSPORT_TYPE_LE)
269 ? GattStatus::INVALID_PARAMETER
270 : (internalDevice->ProcessMessage(Device::StateMachine::MSG_REQUEST_CONNECTION_PRIORITY, connPriority)
271 ? GattStatus::GATT_SUCCESS
272 : GattStatus::GATT_FAILURE));
273 }
274
275 return GattStatus::REQUEST_NOT_SUPPORT;
276 }
277
GetEncryptionInfo(uint16_t connectHandle) const278 bool GattConnectionManager::GetEncryptionInfo(uint16_t connectHandle) const
279 {
280 std::unique_lock<std::mutex> devLock;
281 auto device = pimpl->FindDevice(connectHandle, devLock);
282 if (device != nullptr) {
283 device->CheckEncryption();
284 return device->Info().isEncryption_;
285 }
286
287 return false;
288 }
289
GetEncryptionInfo(const GattDevice & device) const290 bool GattConnectionManager::GetEncryptionInfo(const GattDevice &device) const
291 {
292 std::unique_lock<std::mutex> devLock;
293 auto dev = pimpl->FindDevice(device, devLock);
294 if (dev != nullptr) {
295 dev->CheckEncryption();
296 return dev->Info().isEncryption_;
297 }
298
299 return false;
300 }
301
SetConnectionType(const GattDevice & device,bool autoConnect) const302 int GattConnectionManager::SetConnectionType(const GattDevice &device, bool autoConnect) const
303 {
304 std::unique_lock<std::mutex> devLock;
305 auto dev = pimpl->FindDevice(device, devLock);
306 if (dev != nullptr) {
307 dev->AutoConnect() = autoConnect;
308 return GattStatus::GATT_SUCCESS;
309 }
310
311 return GattStatus::GATT_FAILURE;
312 }
313
StartUp(utility::Dispatcher & dispatcher)314 int GattConnectionManager::StartUp(utility::Dispatcher &dispatcher)
315 {
316 if (pimpl->InRunningState()) {
317 return GattStatus::GATT_SUCCESS;
318 }
319
320 pimpl->dispatcher_ = &dispatcher;
321
322 ATT_ConnectRegister(pimpl->BuildAttConnectCallback(), this);
323
324 GapServiceSecurityInfo clientServiceInfo = {OUTGOING, GATT_CLIENT, SEC_PROTOCOL_L2CAP, {BT_PSM_GATT}};
325 GapServiceSecurityInfo serverServiceInfo = {INCOMING, GATT_SERVER, SEC_PROTOCOL_L2CAP, {BT_PSM_GATT}};
326
327 if (GAPIF_RegisterServiceSecurity(nullptr, &clientServiceInfo, GAP_SEC_OUT_AUTHENTICATION | GAP_SEC_OUT_ENCRYPTION)
328 != BT_NO_ERROR) {
329 LOG_WARN("%{public}s:%{public}d:%{public}s GAPIF_RegisterServiceSecurity client failed!", __FILE__, __LINE__, __FUNCTION__);
330 }
331
332 if (GAPIF_RegisterServiceSecurity(nullptr, &serverServiceInfo, GAP_SEC_IN_AUTHENTICATION | GAP_SEC_IN_ENCRYPTION)
333 != BT_NO_ERROR) {
334 LOG_WARN("%{public}s:%{public}d:%{public}s GAPIF_RegisterServiceSecurity server failed!", __FILE__, __LINE__, __FUNCTION__);
335 }
336
337 GapLeConnCallback callback = {impl::LEConnectionParamterReq, impl::LEConnectionUpdateComplete, nullptr, nullptr};
338 if (GAPIF_RegisterLeConnCallback(&callback, nullptr) != BT_NO_ERROR) {
339 LOG_WARN("%{public}s:%{public}d:%{public}s GAPIF_RegisterLeConnCallback failed!", __FILE__, __LINE__, __FUNCTION__);
340 }
341
342 pimpl->Start();
343
344 return GattStatus::GATT_SUCCESS;
345 }
346
ShutDown() const347 int GattConnectionManager::ShutDown() const
348 {
349 LOG_DEBUG("%{public}s:%{public}s:%{public}d Entry!", __FILE__, __FUNCTION__, __LINE__);
350
351 if (!pimpl->InRunningState()) {
352 return GattStatus::GATT_SUCCESS;
353 }
354
355 GapServiceSecurityInfo clientServiceInfo = {OUTGOING, GATT_CLIENT, SEC_PROTOCOL_L2CAP, {BT_PSM_GATT}};
356 GapServiceSecurityInfo serverServiceInfo = {INCOMING, GATT_SERVER, SEC_PROTOCOL_L2CAP, {BT_PSM_GATT}};
357
358 GAPIF_DeregisterServiceSecurity(nullptr, &clientServiceInfo);
359 GAPIF_DeregisterServiceSecurity(nullptr, &serverServiceInfo);
360
361 GAPIF_DeregisterLeConnCallback();
362
363 pimpl->Stop();
364
365 pimpl->DisconnectAllDevice();
366 pimpl->DoShutDown();
367
368 LOG_DEBUG("%{public}s:%{public}s:%{public}d Exit!", __FILE__, __FUNCTION__, __LINE__);
369
370 return GattStatus::GATT_SUCCESS;
371 }
372
impl()373 GattConnectionManager::impl::impl()
374 {
375 connectionParameter_.connIntervalMin_ =
376 GetBleMinConnectionInterval(static_cast<int>(GattConnectionPriority::BALANCED));
377 connectionParameter_.connIntervalMax_ =
378 GetBleMaxConnectionInterval(static_cast<int>(GattConnectionPriority::BALANCED));
379 connectionParameter_.connLatency_ = GetBleConnectionLatency(static_cast<int>(GattConnectionPriority::BALANCED));
380 connectionParameter_.supervisionTimeout_ =
381 GetBleConnectionSupervisionTimeout(static_cast<int>(GattConnectionPriority::BALANCED));
382 connectionParameter_.mtu_ = GetClassicConnectionMtu();
383 connectionParameter_.flushTimeout_ = GetClassicConnectionFlushTimeout();
384 connectionParameter_.mode_ = GetClassicConnectionMode();
385 connectionParameter_.securityMode_ = GetClassicConnectionSecurityMode();
386 connectionParameter_.bleMaxConnections_ = GetBleMaxConnectedDevices();
387 connectionParameter_.classicMaxConnections_ = GetClassicMaxConnectedDevices();
388 }
389
FindOrRegister(const GattDevice & device,bool autoConnect,std::unique_lock<std::mutex> & deviceLock)390 GattConnectionManager::Device *GattConnectionManager::impl::FindOrRegister(
391 const GattDevice &device, bool autoConnect, std::unique_lock<std::mutex> &deviceLock)
392 {
393 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
394
395 for (auto &dev : devices_) {
396 if (dev->Info() == device) {
397 deviceLock = std::unique_lock<std::mutex>(dev->DeviceRWMutex());
398 dev->AutoConnect() = autoConnect;
399 return dev.get();
400 }
401 }
402
403 if (HasSpareDeviceSpace(device.transport_)) {
404 auto &dev = devices_.emplace_back(std::make_unique<GattConnectionManager::Device>(device, autoConnect));
405 deviceLock = std::unique_lock<std::mutex>(dev->DeviceRWMutex());
406 return dev.get();
407 }
408
409 LOG_INFO("%{public}s: The maximum number of device connections has been reached", __FUNCTION__);
410 return nullptr;
411 }
412
FindOrRegister(const BtAddr & addr,uint8_t transport,std::unique_lock<std::mutex> & deviceLock)413 GattConnectionManager::Device *GattConnectionManager::impl::FindOrRegister(
414 const BtAddr &addr, uint8_t transport, std::unique_lock<std::mutex> &deviceLock)
415 {
416 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
417
418 for (auto &dev : devices_) {
419 if (dev->Info().transport_ == transport &&
420 memcmp(addr.addr, dev->Addr(), RawAddress::BT_ADDRESS_BYTE_LEN) == 0) {
421 deviceLock = std::unique_lock<std::mutex>(dev->DeviceRWMutex());
422 return dev.get();
423 }
424 }
425
426 if (HasSpareDeviceSpace(transport)) {
427 auto &device =
428 devices_.emplace_back(std::make_unique<GattConnectionManager::Device>(addr.addr, transport, addr.type));
429 deviceLock = std::unique_lock<std::mutex>(device->DeviceRWMutex());
430 return device.get();
431 }
432
433 LOG_INFO("%{public}s: The maximum number of device connections has been reached", __FUNCTION__);
434 return nullptr;
435 }
436
HasSpareDeviceSpace(uint8_t transport)437 bool GattConnectionManager::impl::HasSpareDeviceSpace(uint8_t transport)
438 {
439 size_t count = 0;
440 for (auto &device : devices_) {
441 if (device->Info().transport_ == transport) {
442 count++;
443 }
444 }
445 return ((transport == GATT_TRANSPORT_TYPE_CLASSIC) ? (count < connectionParameter_.classicMaxConnections_)
446 : (count < connectionParameter_.bleMaxConnections_));
447 }
448
FindDevice(const BtAddr & addr,uint8_t transport,std::unique_lock<std::mutex> & deviceLock)449 GattConnectionManager::Device *GattConnectionManager::impl::FindDevice(
450 const BtAddr &addr, uint8_t transport, std::unique_lock<std::mutex> &deviceLock)
451 {
452 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
453
454 for (auto &dev : devices_) {
455 if (dev->Info().transport_ == transport &&
456 memcmp(addr.addr, dev->Addr(), RawAddress::BT_ADDRESS_BYTE_LEN) == 0) {
457 deviceLock = std::unique_lock<std::mutex>(dev->DeviceRWMutex());
458 return dev.get();
459 }
460 }
461
462 return nullptr;
463 }
464
FindDevice(const GattDevice & device,std::unique_lock<std::mutex> & deviceLock)465 GattConnectionManager::Device *GattConnectionManager::impl::FindDevice(
466 const GattDevice &device, std::unique_lock<std::mutex> &deviceLock)
467 {
468 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
469 for (auto &dev : devices_) {
470 if (dev->Info() == device) {
471 deviceLock = std::unique_lock<std::mutex>(dev->DeviceRWMutex());
472 return dev.get();
473 }
474 }
475 return nullptr;
476 }
477
FindDevice(uint16_t handle,std::unique_lock<std::mutex> & deviceLock)478 GattConnectionManager::Device *GattConnectionManager::impl::FindDevice(
479 uint16_t handle, std::unique_lock<std::mutex> &deviceLock)
480 {
481 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
482 for (auto &device : devices_) {
483 if (device->Handle() == handle) {
484 deviceLock = std::unique_lock<std::mutex>(device->DeviceRWMutex());
485 return device.get();
486 }
487 }
488 return nullptr;
489 }
490
RemoveDevice(const GattDevice & device)491 void GattConnectionManager::impl::RemoveDevice(const GattDevice &device)
492 {
493 LOG_INFO("%{public}s: enter", __FUNCTION__);
494 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
495 for (auto dev = devices_.begin(); dev != devices_.end(); ++dev) {
496 if ((*dev)->Info() == device) {
497 devices_.erase(dev);
498 LOG_INFO("%{public}s: device is found and removed", __FUNCTION__);
499 return;
500 }
501 }
502 LOG_INFO("%{public}s: can not find device", __FUNCTION__);
503 }
504
ClearDeviceList()505 void GattConnectionManager::impl::ClearDeviceList()
506 {
507 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
508 devices_.clear();
509 }
510
DisconnectAllDevice()511 void GattConnectionManager::impl::DisconnectAllDevice()
512 {
513 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
514 for (auto &device : devices_) {
515 std::lock_guard<std::mutex> lock(device->DeviceRWMutex());
516 device->AutoConnect() = false;
517 device->Info().role_ = GATT_ROLE_MASTER;
518 device->ProcessMessage(Device::StateMachine::MSG_DISCONNECT);
519 }
520 }
521
NotifyObserver(const GattDevice & device,uint8_t event,uint16_t connectionHandle,int ret)522 void GattConnectionManager::impl::NotifyObserver(
523 const GattDevice &device, uint8_t event, uint16_t connectionHandle, int ret)
524 {
525 std::lock_guard<std::mutex> lck(registerMutex_);
526 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::BLUETOOTH, "GATT_CONNECT_STATE",
527 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, "ADDRESS", device.addr_.GetAddress(), "STATE",
528 event, "ROLE", device.role_);
529 for (auto &item : observers_) {
530 if (item.first) {
531 switch (event) {
532 case OBSERVER_EVENT_CONNECTED:
533 item.second->OnConnect(device, connectionHandle, ret);
534 break;
535 case OBSERVER_EVENT_DISCONNECTED:
536 item.second->OnDisconnect(device, connectionHandle, ret);
537 break;
538 case OBSERVER_EVENT_CONNECTING:
539 item.second->OnConnectionChanged(device,
540 connectionHandle, static_cast<int>(BTConnectState::CONNECTING));
541 break;
542 case OBSERVER_EVENT_DISCONNECTING:
543 item.second->OnConnectionChanged(device,
544 connectionHandle, static_cast<int>(BTConnectState::DISCONNECTING));
545 break;
546 case OBSERVER_EVENT_RECONNECTED:
547 item.second->OnConnectionChanged(device,
548 connectionHandle, static_cast<int>(BTConnectState::CONNECTED));
549 item.second->OnReconnect(device,
550 connectionHandle, static_cast<int>(BTConnectState::CONNECTED));
551 break;
552 case OBSERVER_EVENT_DISCONNECTED_INTER:
553 item.second->OnDisconnectInter(device,
554 connectionHandle, static_cast<int>(BTConnectState::CONNECTED));
555 break;
556 default:
557 break;
558 }
559 }
560 }
561 }
562
LEConnectCompletedImpl(uint16_t connectHandle,AttLeConnectCallback data)563 void GattConnectionManager::impl::LEConnectCompletedImpl(uint16_t connectHandle, AttLeConnectCallback data)
564 {
565 ConnectionInComming(data.addr, GATT_TRANSPORT_TYPE_LE, connectHandle, &data);
566 }
567
LEConnectCompleted(uint16_t connectHandle,AttLeConnectCallback * data,void * context)568 void GattConnectionManager::impl::LEConnectCompleted(uint16_t connectHandle, AttLeConnectCallback *data, void *context)
569 {
570 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(
571 &impl::LEConnectCompletedImpl, GattConnectionManager::GetInstance().pimpl.get(), connectHandle, *data));
572
573 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(
574 std::bind(&impl::DoShutDown, GattConnectionManager::GetInstance().pimpl.get()));
575 }
576
LEDisconnectCompletedImpl(uint16_t connectHandle,AttLeDisconnectCallback data)577 void GattConnectionManager::impl::LEDisconnectCompletedImpl(uint16_t connectHandle, AttLeDisconnectCallback data)
578 {
579 bool ret = false;
580 GattConnectionManager::Device *device = nullptr;
581 {
582 std::unique_lock<std::mutex> devLock;
583 device = FindDevice(connectHandle, devLock);
584 if (device != nullptr) {
585 LOG_DEBUG("%{public}s: disconnect reason:%{public}d", __FUNCTION__, data.reason);
586 if (data.reason == HCI_CONNECTION_FAILED_TO_BE_ESTABLISHED &&
587 device->Role() == 0 && device->RetryTimes() < MAX_RETRY_CONNECT_TIMES) {
588 device->RetryTimes() ++;
589 ret = device->ProcessMessage(Device::StateMachine::MSG_RECONNECT_CAUSE_0X3E, connectHandle, &data);
590 } else {
591 device->RetryTimes() = 0;
592 ret = device->ProcessMessage(Device::StateMachine::MSG_DISCONNECT_COMPLETE, connectHandle, &data);
593 }
594 } else {
595 LOG_ERROR("%{public}s: Call - FindDevice - Fail!", __FUNCTION__);
596 }
597 }
598
599 if (ret && device->RetryTimes() == 0 && !device->AutoConnect()) {
600 GattConnectionManager::GetInstance().pimpl->RemoveDevice(device->Info());
601 }
602 }
603
LEDisconnectCompleted(uint16_t connectHandle,AttLeDisconnectCallback * data,void * context)604 void GattConnectionManager::impl::LEDisconnectCompleted(
605 uint16_t connectHandle, AttLeDisconnectCallback *data, void *context)
606 {
607 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(
608 &impl::LEDisconnectCompletedImpl, GattConnectionManager::GetInstance().pimpl.get(), connectHandle, *data));
609
610 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(
611 std::bind(&impl::DoShutDown, GattConnectionManager::GetInstance().pimpl.get()));
612 }
613
BREDRConnectCompletedImpl(uint16_t connectHandle,AttBredrConnectCallback data)614 void GattConnectionManager::impl::BREDRConnectCompletedImpl(uint16_t connectHandle, AttBredrConnectCallback data)
615 {
616 ConnectionInComming(data.addr, GATT_TRANSPORT_TYPE_CLASSIC, connectHandle, &data);
617 }
618
BREDRConnectCompleted(uint16_t connectHandle,AttBredrConnectCallback * data,void * context)619 void GattConnectionManager::impl::BREDRConnectCompleted(
620 uint16_t connectHandle, AttBredrConnectCallback *data, void *context)
621 {
622 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(
623 &impl::BREDRConnectCompletedImpl, GattConnectionManager::GetInstance().pimpl.get(), connectHandle, *data));
624
625 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(
626 std::bind(&impl::DoShutDown, GattConnectionManager::GetInstance().pimpl.get()));
627 }
628
BREDRDisconnectCompletedImpl(uint16_t connectHandle,AttBredrDisconnectCallback data)629 void GattConnectionManager::impl::BREDRDisconnectCompletedImpl(uint16_t connectHandle, AttBredrDisconnectCallback data)
630 {
631 bool ret = false;
632 GattConnectionManager::Device *device = nullptr;
633 {
634 std::unique_lock<std::mutex> devLock;
635 device = FindDevice(connectHandle, devLock);
636 if (device != nullptr) {
637 ret = device->ProcessMessage(Device::StateMachine::MSG_DISCONNECT_COMPLETE, connectHandle, &data);
638 } else {
639 LOG_ERROR("%{public}s: Call - FindDevice - Fail!", __FUNCTION__);
640 }
641 }
642
643 if (ret && !device->AutoConnect()) {
644 GattConnectionManager::GetInstance().pimpl->RemoveDevice(device->Info());
645 }
646 }
647
BREDRDisconnectCompleted(uint16_t connectHandle,AttBredrDisconnectCallback * data,void * context)648 void GattConnectionManager::impl::BREDRDisconnectCompleted(
649 uint16_t connectHandle, AttBredrDisconnectCallback *data, void *context)
650 {
651 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(
652 &impl::BREDRDisconnectCompletedImpl, GattConnectionManager::GetInstance().pimpl.get(), connectHandle, *data));
653
654 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(
655 std::bind(&impl::DoShutDown, GattConnectionManager::GetInstance().pimpl.get()));
656 }
657
BREDRConnectInd(uint16_t connectHandle,void * context)658 void GattConnectionManager::impl::BREDRConnectInd(uint16_t connectHandle, void *context)
659 {
660 GattConnectionManager &instance = GattConnectionManager::GetInstance();
661 if (!instance.pimpl->InRunningState()) {
662 ATT_ConnectRsp(connectHandle, BREDR_CONNECT_REJECTED, 0, nullptr);
663 }
664
665 AttConnect connectionParameter;
666 connectionParameter.bredrConnParaVar.mtu = instance.pimpl->connectionParameter_.mtu_;
667 connectionParameter.bredrConnParaVar.mode = instance.pimpl->connectionParameter_.mode_;
668 connectionParameter.bredrConnParaVar.flushTimeout = instance.pimpl->connectionParameter_.flushTimeout_;
669 /* When passively connected, GATT will not reject the connection request */
670 ATT_ConnectRsp(connectHandle, BREDR_CONNECT_ACCEPT, 0, &connectionParameter);
671 }
672
LEConnectionParamterReqImpl(BtAddr addr,uint16_t connIntervalMin,uint16_t connIntervalMax,uint16_t connLatency,uint16_t timeout)673 void GattConnectionManager::impl::LEConnectionParamterReqImpl(BtAddr addr, uint16_t connIntervalMin,
674 uint16_t connIntervalMax, uint16_t connLatency, uint16_t timeout)
675 {
676 static const std::pair<uint16_t, uint16_t> connIntervalMinRange(0x0006, 0x0C80);
677 static const std::pair<uint16_t, uint16_t> connIntervalMaxRange(0x0006, 0x0C80);
678 static const std::pair<uint16_t, uint16_t> connLatencyRange(0x0000, 0x01F3);
679 static const std::pair<uint16_t, uint16_t> timeoutRange(0x000A, 0x0C80);
680
681 std::unique_lock<std::mutex> devLock;
682 auto Device = FindDevice(addr, GATT_TRANSPORT_TYPE_LE, devLock);
683 if (Device == nullptr ||
684 connIntervalMin < connIntervalMinRange.first || connIntervalMin > connIntervalMinRange.second ||
685 connIntervalMax < connIntervalMaxRange.first || connIntervalMax > connIntervalMaxRange.second ||
686 connLatency < connLatencyRange.first || connLatency > connLatencyRange.second ||
687 timeout < timeoutRange.first || timeout > timeoutRange.second) {
688 GAPIF_LeConnectionParameterRsp(&addr, GAP_NOT_ACCEPT, nullptr);
689 }
690
691 GapLeConnectionParameter connParam = {connIntervalMin, connIntervalMax, connLatency, timeout, 0, 0};
692 GAPIF_LeConnectionParameterRsp(&addr, GAP_ACCEPT, &connParam);
693 }
694
LEConnectionParamterReq(const BtAddr * addr,uint16_t connIntervalMin,uint16_t connIntervalMax,uint16_t connLatency,uint16_t timeout,void * context)695 void GattConnectionManager::impl::LEConnectionParamterReq(const BtAddr *addr, uint16_t connIntervalMin,
696 uint16_t connIntervalMax, uint16_t connLatency, uint16_t timeout, void *context)
697 {
698 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(&impl::LEConnectionParamterReqImpl,
699 GattConnectionManager::GetInstance().pimpl.get(),
700 *addr,
701 connIntervalMin,
702 connIntervalMax,
703 connLatency,
704 timeout));
705 }
706
LEConnectionUpdateCompleteImpl(uint8_t status,BtAddr addr,uint16_t connInterval,uint16_t connLatency,uint16_t timeout)707 void GattConnectionManager::impl::LEConnectionUpdateCompleteImpl(uint8_t status, BtAddr addr, uint16_t connInterval,
708 uint16_t connLatency, uint16_t timeout)
709 {
710 Device::ConnectionPriorityResult res = {
711 .interval_ = connInterval,
712 .latency_ = connLatency,
713 .timeout_ = timeout,
714 .status = status == GAP_STATUS_SUCCESS ? GattStatus::GATT_SUCCESS : GattStatus::GATT_FAILURE
715 };
716
717 std::unique_lock<std::mutex> devLock;
718 auto Device = FindDevice(addr, GATT_TRANSPORT_TYPE_LE, devLock);
719 if (Device != nullptr) {
720 Device->ProcessMessage(Device::StateMachine::MSG_RESPONSE_CONNECTION_PRIORITY, 0, &res);
721 }
722 }
723
LEConnectionUpdateComplete(uint8_t status,const BtAddr * addr,uint16_t connInterval,uint16_t connLatency,uint16_t timeout,void * context)724 void GattConnectionManager::impl::LEConnectionUpdateComplete(uint8_t status, const BtAddr *addr, uint16_t connInterval,
725 uint16_t connLatency, uint16_t timeout, void *context)
726 {
727 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(&impl::LEConnectionUpdateCompleteImpl,
728 GattConnectionManager::GetInstance().pimpl.get(),
729 status,
730 *addr,
731 connInterval,
732 connLatency,
733 timeout));
734 }
735
DoConnect(GattConnectionManager::Device & device)736 int GattConnectionManager::impl::DoConnect(GattConnectionManager::Device &device)
737 {
738 int result = GattStatus::GATT_SUCCESS;
739 const GattConnectionManager &instance = GattConnectionManager::GetInstance();
740
741 AttConnect connectionParameter;
742 BtAddr addr;
743 if (memcpy_s(addr.addr, RawAddress::BT_ADDRESS_BYTE_LEN, device.Addr(), RawAddress::BT_ADDRESS_BYTE_LEN) != EOK) {
744 return GattStatus::INTERNAL_ERROR;
745 }
746
747 if (device.Info().transport_ == GATT_TRANSPORT_TYPE_CLASSIC) {
748 device.Info().role_ = GATT_ROLE_MASTER;
749 device.Info().addressType_ = addr.type = BT_PUBLIC_DEVICE_ADDRESS;
750 connectionParameter.bredrConnParaVar.mtu = instance.pimpl->connectionParameter_.mtu_;
751 connectionParameter.bredrConnParaVar.mode = instance.pimpl->connectionParameter_.mode_;
752 connectionParameter.bredrConnParaVar.flushTimeout = instance.pimpl->connectionParameter_.flushTimeout_;
753 ATT_ConnectReq(ConvertTransport(GATT_TRANSPORT_TYPE_CLASSIC), &connectionParameter, &addr, &device.Handle());
754 } else if (device.Info().transport_ == GATT_TRANSPORT_TYPE_LE) {
755 IAdapterBle *adapter = (IAdapterBle *)(IAdapterManager::GetInstance()->GetAdapter(ADAPTER_BLE));
756 if (adapter != nullptr && adapter->GetPeerDeviceAddrType(device.Info().addr_) <= BLE_ADDR_TYPE_RANDOM) {
757 device.Info().role_ = GATT_ROLE_MASTER;
758 device.Info().addressType_ = addr.type = adapter->GetPeerDeviceAddrType(device.Info().addr_);
759 connectionParameter.leConnParaVar.connIntervalMin = instance.pimpl->connectionParameter_.connIntervalMin_;
760 connectionParameter.leConnParaVar.connIntervalMax = instance.pimpl->connectionParameter_.connIntervalMax_;
761 connectionParameter.leConnParaVar.connLatency = instance.pimpl->connectionParameter_.connLatency_;
762 connectionParameter.leConnParaVar.supervisionTimeout =
763 instance.pimpl->connectionParameter_.supervisionTimeout_;
764
765 ChangeConnectionMode(!device.AutoConnect());
766 if (!device.AutoConnect()) {
767 device.DirectConnect().Start(DIRECT_CONNECT_TIMEOUT);
768 }
769 ATT_ConnectReq(ConvertTransport(GATT_TRANSPORT_TYPE_LE), &connectionParameter, &addr, &device.Handle());
770 } else {
771 device.Info().role_ = GATT_ROLE_INVALID;
772 result = GattStatus::REQUEST_NOT_SUPPORT;
773 }
774 } else {
775 device.Info().role_ = GATT_ROLE_INVALID;
776 result = GattStatus::INTERNAL_ERROR;
777 LOG_ERROR("%{public}s: Call - Connect - Fail! - Return: %{public}d - Parameter(1): transportType: %{public}d",
778 __FUNCTION__,
779 result,
780 device.Info().transport_);
781 }
782
783 return result;
784 }
785
DoConnectComplete(GattConnectionManager::Device & device,const utility::Message & msg)786 int GattConnectionManager::impl::DoConnectComplete(GattConnectionManager::Device &device, const utility::Message &msg)
787 {
788 int result = GattStatus::INTERNAL_ERROR;
789
790 if (GATT_TRANSPORT_TYPE_CLASSIC == device.Info().transport_ &&
791 ((AttBredrConnectCallback *)msg.arg2_)->status == BREDR_CONNECT_SUCCESS) {
792 device.Handle() = msg.arg1_;
793 device.MTU() = ((AttBredrConnectCallback *)msg.arg2_)->mtu;
794 if (device.Info().role_ != GATT_ROLE_MASTER) {
795 device.Info().role_ = GATT_ROLE_SLAVE;
796 }
797
798 result = GattStatus::GATT_SUCCESS;
799 } else if (GATT_TRANSPORT_TYPE_LE == device.Info().transport_ &&
800 ((AttLeConnectCallback *)msg.arg2_)->status == LE_CONNECT_SUCCESS) {
801 device.Handle() = msg.arg1_;
802 device.Info().role_ = ((AttLeConnectCallback *)msg.arg2_)->role;
803
804 if (device.Info().role_ == GATT_ROLE_MASTER && !device.AutoConnect()) {
805 device.DirectConnect().Stop();
806 ChangeConnectionMode(false);
807 }
808 result = GattStatus::GATT_SUCCESS;
809 } else {
810 device.AutoConnect() = false;
811 }
812
813 return result;
814 }
815
DoDisconnect(uint16_t handle)816 void GattConnectionManager::impl::DoDisconnect(uint16_t handle)
817 {
818 ATT_DisconnectReq(handle);
819 }
820
DoDisconnectComplete(GattConnectionManager::Device & device,const utility::Message & msg)821 int GattConnectionManager::impl::DoDisconnectComplete(
822 GattConnectionManager::Device &device, const utility::Message &msg)
823 {
824 int result = GattStatus::INTERNAL_ERROR;
825
826 if (device.Info().transport_ == GATT_TRANSPORT_TYPE_CLASSIC) {
827 if (((AttBredrDisconnectCallback *)msg.arg2_)->reason == INITIATIVECONNECT_DISCONNECT_SUCCESS ||
828 ((AttBredrDisconnectCallback *)msg.arg2_)->reason == PASSIVECONNECT_DISCONNECT_SUCCESS ||
829 ((AttBredrDisconnectCallback *)msg.arg2_)->reason == DISCONNECT_ABNORMAL) {
830 result = GattStatus::GATT_SUCCESS;
831 }
832 } else if (device.Info().transport_ == GATT_TRANSPORT_TYPE_LE) {
833 if (((AttLeDisconnectCallback *)msg.arg2_)->status == LE_DISCONNECT_SUCCESS) {
834 result = GattStatus::GATT_SUCCESS;
835 }
836 }
837
838 return result;
839 }
840
DoRequestConnectionPriority(GattConnectionManager::Device & device,int connPriority)841 int GattConnectionManager::impl::DoRequestConnectionPriority(GattConnectionManager::Device &device, int connPriority)
842 {
843 BtAddr addr;
844 addr.type = device.Info().addressType_;
845 if (memcpy_s(addr.addr, RawAddress::BT_ADDRESS_BYTE_LEN, device.Addr(), RawAddress::BT_ADDRESS_BYTE_LEN) != EOK) {
846 return GattStatus::INTERNAL_ERROR;
847 }
848
849 GapLeConnectionParameter connParam = {
850 GetBleMinConnectionInterval(connPriority),
851 GetBleMaxConnectionInterval(connPriority),
852 GetBleConnectionLatency(connPriority),
853 GetBleConnectionSupervisionTimeout(connPriority),
854 0,
855 0
856 };
857 if (GAPIF_LeConnParamUpdate(&addr, &connParam) != BT_NO_ERROR) {
858 return GattStatus::GATT_FAILURE;
859 }
860
861 return GattStatus::GATT_SUCCESS;
862 }
863
NotifyPriorityUpdated(const GattDevice & device,uint16_t connInterval,uint16_t connLatency,uint16_t timeout,int status)864 void GattConnectionManager::impl::NotifyPriorityUpdated(
865 const GattDevice &device, uint16_t connInterval, uint16_t connLatency, uint16_t timeout, int status)
866 {
867 std::lock_guard<std::mutex> lck(registerMutex_);
868 for (auto &item : observers_) {
869 if (item.first) {
870 item.second->OnConnectionParameterChanged(device, connInterval, connLatency, timeout, status);
871 }
872 }
873 }
874
ConnectionInComming(const BtAddr & addr,uint8_t transport,uint16_t connectHandle,void * data)875 void GattConnectionManager::impl::ConnectionInComming(
876 const BtAddr &addr, uint8_t transport, uint16_t connectHandle, void *data)
877 {
878 GattConnectionManager &instance = GattConnectionManager::GetInstance();
879
880 std::unique_lock<std::mutex> devLock;
881 auto Device = instance.pimpl->FindOrRegister(addr, transport, devLock);
882 if (Device != nullptr) {
883 Device->Info().addressType_ = addr.type;
884 Device->ProcessMessage(Device::StateMachine::MSG_CONNECT_COMPLETE, connectHandle, data);
885 } else {
886 instance.pimpl->DoDisconnect(connectHandle);
887 LOG_INFO("%{public}s: The maximum number of device connections has been reached", __FUNCTION__);
888 }
889 LOG_DEBUG("%{public}s:%{public}s:%{public}d Exit!", __FILE__, __FUNCTION__, __LINE__);
890 }
891
CheckDeviceParameter(const GattDevice & device)892 int GattConnectionManager::impl::CheckDeviceParameter(const GattDevice &device)
893 {
894 int result = GattStatus::REQUEST_NOT_SUPPORT;
895
896 if ((device.transport_ == GATT_TRANSPORT_TYPE_LE &&
897 IAdapterManager::GetInstance()->GetState(ADAPTER_BLE) == STATE_TURN_ON) ||
898 (device.transport_ == GATT_TRANSPORT_TYPE_CLASSIC &&
899 IAdapterManager::GetInstance()->GetState(ADAPTER_BREDR) == STATE_TURN_ON)) {
900 return GattStatus::GATT_SUCCESS;
901 }
902
903 return result;
904 }
905
ConvertTransport(int transport)906 int GattConnectionManager::impl::ConvertTransport(int transport)
907 {
908 int type = BT_TRANSPORT_INVALID;
909 switch (transport) {
910 case GATT_TRANSPORT_TYPE_LE:
911 type = BT_TRANSPORT_LE;
912 break;
913 case GATT_TRANSPORT_TYPE_CLASSIC:
914 type = BT_TRANSPORT_BR_EDR;
915 break;
916 default:
917 ASSERT(false);
918 break;
919 }
920 return type;
921 }
922
ConvertConnectionState(const std::string & state)923 int GattConnectionManager::impl::ConvertConnectionState(const std::string &state)
924 {
925 BTConnectState result = BTConnectState::DISCONNECTED;
926 if (state.compare(GattConnectionManager::Device::STATE_CONNECTED) == 0) {
927 result = BTConnectState::CONNECTED;
928 } else if (state.compare(GattConnectionManager::Device::STATE_CONNECTING) == 0) {
929 result = BTConnectState::CONNECTING;
930 } else if (state.compare(GattConnectionManager::Device::STATE_DISCONNECTING) == 0) {
931 result = BTConnectState::DISCONNECTING;
932 }
933 return static_cast<int>(result);
934 }
935
DoShutDown()936 void GattConnectionManager::impl::DoShutDown()
937 {
938 if (InRunningState()) {
939 return;
940 }
941
942 std::lock_guard<std::mutex> lck(devicelistRWMutex_);
943 for (auto &dev : devices_) {
944 std::string state = dev->SM().GetState()->Name();
945 if (state == GattConnectionManager::Device::STATE_DISCONNECTED) {
946 continue;
947 }
948
949 if (state == GattConnectionManager::Device::STATE_CONNECTED) {
950 std::unique_lock<std::mutex> devLock;
951 dev->AutoConnect() = false;
952 dev->Info().role_ = GATT_ROLE_MASTER;
953 dev->ProcessMessage(Device::StateMachine::MSG_DISCONNECT);
954 }
955
956 return;
957 }
958
959 devices_.clear();
960
961 ATT_ConnectDeregister();
962
963 std::lock_guard<std::mutex> lg(registerMutex_);
964 for (auto &item : observers_) {
965 if (item.first) {
966 item.second->OnShutDown();
967 }
968 }
969 }
970
GetBleMaxConnectedDevices()971 uint16_t GattConnectionManager::impl::GetBleMaxConnectedDevices()
972 {
973 int result = DEFAULT_BLE_MAX_CONNECTED_DEVICES;
974 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, PROPERTY_BLE_MAX_CONNECTED_DEVICES, result);
975 return result;
976 }
977
GetBleMinConnectionInterval(int connPriority)978 uint16_t GattConnectionManager::impl::GetBleMinConnectionInterval(int connPriority)
979 {
980 int result = DEFAULT_BLE_MIN_CONNECTION_INTERVAL;
981 const std::string *property = &PROPERTY_BALANCED_PRIORITY_MIN_INTERVAL;
982 if (connPriority == static_cast<int>(GattConnectionPriority::LOW_POWER)) {
983 property = &PROPERTY_LOW_POWER_MIN_INTERVAL;
984 } else if (connPriority == static_cast<int>(GattConnectionPriority::HIGH)) {
985 property = &PROPERTY_HIGH_PRIORITY_MIN_INTERVAL;
986 }
987
988 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, *property, result);
989 return result;
990 }
991
GetBleMaxConnectionInterval(int connPriority)992 uint16_t GattConnectionManager::impl::GetBleMaxConnectionInterval(int connPriority)
993 {
994 int result = DEFAULT_BLE_MAX_CONNECTION_INTERVAL;
995 const std::string *property = &PROPERTY_BALANCED_PRIORITY_MAX_INTERVAL;
996 if (connPriority == static_cast<int>(GattConnectionPriority::LOW_POWER)) {
997 property = &PROPERTY_LOW_POWER_MAX_INTERVAL;
998 } else if (connPriority == static_cast<int>(GattConnectionPriority::HIGH)) {
999 property = &PROPERTY_HIGH_PRIORITY_MAX_INTERVAL;
1000 }
1001
1002 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, *property, result);
1003 return result;
1004 }
1005
GetBleConnectionLatency(int connPriority)1006 uint16_t GattConnectionManager::impl::GetBleConnectionLatency(int connPriority)
1007 {
1008 int result = DEFAULT_BLE_CONNECTION_LATENCY;
1009 const std::string *property = &PROPERTY_BALANCED_PRIORITY_LATENCY;
1010 if (connPriority == static_cast<int>(GattConnectionPriority::LOW_POWER)) {
1011 property = &PROPERTY_LOW_POWER_LATENCY;
1012 } else if (connPriority == static_cast<int>(GattConnectionPriority::HIGH)) {
1013 property = &PROPERTY_HIGH_PRIORITY_LATENCY;
1014 }
1015
1016 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, *property, result);
1017 return result;
1018 }
1019
GetBleConnectionSupervisionTimeout(int connPriority)1020 uint16_t GattConnectionManager::impl::GetBleConnectionSupervisionTimeout(int connPriority)
1021 {
1022 int result = DEFAULT_BLE_CONNECTION_SUPERVISION_TIMEOUT;
1023 const std::string *property = &PROPERTY_BALANCED_PRIORITY_TIMEOUT;
1024 if (connPriority == static_cast<int>(GattConnectionPriority::LOW_POWER)) {
1025 property = &PROPERTY_LOW_POWER_TIMEOUT;
1026 } else if (connPriority == static_cast<int>(GattConnectionPriority::HIGH)) {
1027 property = &PROPERTY_HIGH_PRIORITY_TIMEOUT;
1028 }
1029
1030 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, *property, result);
1031 return result;
1032 }
1033
GetClassicMaxConnectedDevices()1034 uint16_t GattConnectionManager::impl::GetClassicMaxConnectedDevices()
1035 {
1036 int result = DEFAULT_CLASSIC_MAX_CONNECTED_DEVICES;
1037 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, PROPERTY_CLASSIC_MAX_CONNECTED_DEVICES, result);
1038 return result;
1039 }
1040
GetClassicConnectionMtu()1041 uint16_t GattConnectionManager::impl::GetClassicConnectionMtu()
1042 {
1043 int result = DEFAULT_CLASSIC_CONNECTION_MTU;
1044 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, PROPERTY_CLASSIC_CONNECTION_MTU, result);
1045 return result;
1046 }
1047
GetClassicConnectionMode()1048 uint8_t GattConnectionManager::impl::GetClassicConnectionMode()
1049 {
1050 int result = DEFAULT_CLASSIC_CONNECTION_MODE;
1051 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, PROPERTY_CLASSIC_CONNECTION_MODE, result);
1052 return result;
1053 }
1054
GetClassicConnectionFlushTimeout()1055 uint16_t GattConnectionManager::impl::GetClassicConnectionFlushTimeout()
1056 {
1057 int result = DEFAULT_CLASSIC_CONNECTION_FLUSH_TIMEOUT;
1058 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, PROPERTY_CLASSIC_CONNECTION_FLUSH_TIMEOUT, result);
1059 return result;
1060 }
1061
GetClassicConnectionSecurityMode()1062 uint8_t GattConnectionManager::impl::GetClassicConnectionSecurityMode()
1063 {
1064 int result = DEFAULT_CLASSIC_CONNECTION_SECURITY_MODE;
1065 AdapterConfig::GetInstance()->GetValue(SECTION_GATT_SERVICE, PROPERTY_CLASSIC_CONNECTION_SECURITY_MODE, result);
1066 return result;
1067 }
1068
BuildAttConnectCallback()1069 AttConnectCallback GattConnectionManager::impl::BuildAttConnectCallback()
1070 {
1071 AttConnectCallback callback;
1072 callback.attBREDRConnectCompleted = BREDRConnectCompleted;
1073 callback.attBREDRConnectInd = BREDRConnectInd;
1074 callback.attBREDRDisconnectCompleted = BREDRDisconnectCompleted;
1075 callback.attLEConnectCompleted = LEConnectCompleted;
1076 callback.attLEDisconnectCompleted = LEDisconnectCompleted;
1077
1078 return callback;
1079 }
1080
ChangeConnectionMode(bool isDirect)1081 void GattConnectionManager::impl::ChangeConnectionMode(bool isDirect)
1082 {
1083 static int directCount = 0;
1084 static std::mutex lock;
1085 {
1086 std::lock_guard<std::mutex> lg(lock);
1087 if (isDirect) {
1088 directCount++;
1089 } else if (directCount != 0) {
1090 directCount--;
1091 }
1092 }
1093 LOG_DEBUG("%{public}s: directCount is %{public}d", __FUNCTION__, directCount);
1094 if (directCount > 0) {
1095 BTM_SetLeConnectionModeToFast();
1096 } else {
1097 BTM_SetLeConnectionModeToSlow();
1098 }
1099 }
1100
DirectConnectTimeout(const GattDevice & device)1101 void GattConnectionManager::impl::DirectConnectTimeout(const GattDevice &device)
1102 {
1103 std::unique_lock<std::mutex> devLock;
1104 auto internalDevice = FindDevice(device, devLock);
1105 if (internalDevice != nullptr) {
1106 internalDevice->ProcessMessage(Device::StateMachine::MSG_DIRECT_CONNECT_TIMEOUT);
1107 }
1108 }
1109
Device(const uint8_t * addr,uint8_t transport,uint8_t type,bool autoConnect)1110 GattConnectionManager::Device::Device(const uint8_t *addr, uint8_t transport, uint8_t type, bool autoConnect)
1111 : autoConnect_(autoConnect),
1112 mtu_(GATT_DEFAULT_MTU),
1113 handle_(0),
1114 role_(0),
1115 retry_(0),
1116 info_(RawAddress::ConvertToString(addr), type, transport),
1117 deviceRWMutex_(),
1118 sm_(*this),
1119 directConnect_([&addr, transport]() {
1120 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(std::bind(&impl::DirectConnectTimeout,
1121 GattConnectionManager::GetInstance().pimpl.get(),
1122 GattDevice(RawAddress::ConvertToString(addr), transport)));
1123 })
1124 {
1125 CopyAddress(addr, RawAddress::BT_ADDRESS_BYTE_LEN);
1126 }
1127
Device(const GattDevice & device,bool autoConnect)1128 GattConnectionManager::Device::Device(const GattDevice &device, bool autoConnect)
1129 : autoConnect_(autoConnect),
1130 mtu_(GATT_DEFAULT_MTU),
1131 handle_(0),
1132 role_(0),
1133 retry_(0),
1134 info_(device),
1135 deviceRWMutex_(),
1136 sm_(*this),
1137 directConnect_([&device]() {
1138 GattConnectionManager::GetInstance().pimpl->dispatcher_->PostTask(
1139 std::bind(&impl::DirectConnectTimeout, GattConnectionManager::GetInstance().pimpl.get(), device));
1140 })
1141 {
1142 uint8_t addr[RawAddress::BT_ADDRESS_BYTE_LEN] = {0};
1143 device.addr_.ConvertToUint8(addr, sizeof(addr));
1144 CopyAddress(addr, RawAddress::BT_ADDRESS_BYTE_LEN);
1145 }
1146
CopyAddress(const uint8_t * addr,size_t length)1147 void GattConnectionManager::Device::CopyAddress(const uint8_t *addr, size_t length)
1148 {
1149 for (size_t i = 0; i < length; i++) {
1150 addr_[i] = addr[i];
1151 }
1152 }
1153
CheckEncryption()1154 void GattConnectionManager::Device::CheckEncryption()
1155 {
1156 if (Info().transport_ == GATT_TRANSPORT_TYPE_CLASSIC) {
1157 return;
1158 }
1159
1160 BtAddr addr;
1161 uint8_t encKeySize = 0;
1162 GAP_LeSecurityStatus status = GAP_LE_NO_ENCRYPTION;
1163 IAdapterBle *adapter = (IAdapterBle *)(IAdapterManager::GetInstance()->GetAdapter(ADAPTER_BLE));
1164 if (adapter != nullptr) {
1165 (void)memcpy_s(addr.addr, RawAddress::BT_ADDRESS_BYTE_LEN, addr_, RawAddress::BT_ADDRESS_BYTE_LEN);
1166 addr.type = Info().addressType_;
1167 if (GAPIF_LeGetSecurityStatus(&addr, &status, &encKeySize) == BT_NO_ERROR && encKeySize != GAP_LE_NO_ENCRYPTION) {
1168 Info().isEncryption_ = true;
1169 } else {
1170 Info().isEncryption_ = false;
1171 }
1172 }
1173 }
1174
~Device()1175 GattConnectionManager::Device::~Device()
1176 {
1177 std::lock_guard<std::mutex> lck(deviceRWMutex_);
1178 }
1179
StateMachine(GattConnectionManager::Device & device)1180 GattConnectionManager::Device::StateMachine::StateMachine(GattConnectionManager::Device &device)
1181 {
1182 std::unique_ptr<State> idle = std::make_unique<Idle>(*this, device);
1183 Move(idle);
1184 std::unique_ptr<State> connecting = std::make_unique<Connecting>(*this, device);
1185 Move(connecting);
1186 std::unique_ptr<State> connected = std::make_unique<Connected>(*this, device);
1187 Move(connected);
1188 std::unique_ptr<State> disconnecting = std::make_unique<Disconnecting>(*this, device);
1189 Move(disconnecting);
1190 std::unique_ptr<State> disconnected = std::make_unique<Disconnected>(*this, device);
1191 Move(disconnected);
1192
1193 InitState(STATE_IDLE);
1194 }
1195
~StateMachine()1196 GattConnectionManager::Device::StateMachine::~StateMachine()
1197 {}
1198
ProcessMessage(int messageId,int arg1,void * arg2)1199 bool GattConnectionManager::Device::ProcessMessage(int messageId, int arg1, void *arg2)
1200 {
1201 HILOGI("Call Massage ID: %{public}d, Device Address:[%{public}s] Transport:[%{public}d]", messageId,
1202 GetEncryptAddr(this->Info().addr_.GetAddress()).c_str(), this->Info().transport_);
1203
1204 return SM().ProcessMessage(utility::Message(messageId, arg1, arg2));
1205 }
1206
AutoConnect()1207 bool &GattConnectionManager::Device::AutoConnect()
1208 {
1209 return autoConnect_;
1210 }
1211
Addr()1212 uint8_t *GattConnectionManager::Device::Addr()
1213 {
1214 return addr_;
1215 }
1216
Info()1217 GattDevice &GattConnectionManager::Device::Info()
1218 {
1219 return info_;
1220 }
1221
SM()1222 GattConnectionManager::Device::StateMachine &GattConnectionManager::Device::SM()
1223 {
1224 return sm_;
1225 }
1226
MTU()1227 uint16_t &GattConnectionManager::Device::MTU()
1228 {
1229 return mtu_;
1230 }
1231
Handle()1232 uint16_t &GattConnectionManager::Device::Handle()
1233 {
1234 return handle_;
1235 }
1236
RetryTimes()1237 uint8_t &GattConnectionManager::Device::RetryTimes()
1238 {
1239 return retry_;
1240 }
1241
Role()1242 uint8_t &GattConnectionManager::Device::Role()
1243 {
1244 return role_;
1245 }
1246
DeviceRWMutex()1247 std::mutex &GattConnectionManager::Device::DeviceRWMutex()
1248 {
1249 return deviceRWMutex_;
1250 }
1251
DirectConnect()1252 utility::Timer &GattConnectionManager::Device::DirectConnect()
1253 {
1254 return directConnect_;
1255 }
1256
StateBase(const std::string & name,utility::StateMachine & stateMachine,GattConnectionManager::Device & device)1257 GattConnectionManager::Device::StateMachine::StateBase::StateBase(
1258 const std::string &name, utility::StateMachine &stateMachine, GattConnectionManager::Device &device)
1259 : State(name, stateMachine), device_(device)
1260 {}
1261
Idle(utility::StateMachine & stateMachine,GattConnectionManager::Device & device)1262 GattConnectionManager::Device::StateMachine::Idle::Idle(
1263 utility::StateMachine &stateMachine, GattConnectionManager::Device &device)
1264 : StateBase(STATE_IDLE, stateMachine, device)
1265 {}
1266
Entry()1267 void GattConnectionManager::Device::StateMachine::Idle::Entry()
1268 {
1269 HILOGI("Device Address:[%{public}s] Transport:[%{public}d], Entry %{public}s State",
1270 GetEncryptAddr(device_.Info().addr_.GetAddress()).c_str(), device_.Info().transport_, "Idle");
1271 }
1272
Dispatch(const utility::Message & msg)1273 bool GattConnectionManager::Device::StateMachine::Idle::Dispatch(const utility::Message &msg)
1274 {
1275 LOG_DEBUG("%{public}s:%{public}d:%{public}s : Call Massage ID: %{public}d", __FILE__, __LINE__, __PRETTY_FUNCTION__, msg.what_);
1276 bool result = false;
1277
1278 switch (msg.what_) {
1279 case MSG_CONNECT:
1280 if (GattConnectionManager::GetInstance().pimpl->DoConnect(device_) == GattStatus::GATT_SUCCESS) {
1281 Transition(STATE_CONNECTING);
1282 result = true;
1283 } else {
1284 Transition(STATE_DISCONNECTED);
1285 }
1286 break;
1287 case MSG_CONNECT_COMPLETE:
1288 if (GattConnectionManager::GetInstance().pimpl->DoConnectComplete(device_, msg) ==
1289 GattStatus::GATT_SUCCESS) {
1290 Transition(STATE_CONNECTED);
1291 } else {
1292 Transition(STATE_DISCONNECTED);
1293 }
1294 result = true;
1295 break;
1296 case MSG_DISCONNECT:
1297 Transition(STATE_DISCONNECTED);
1298 break;
1299 case MSG_DISCONNECT_COMPLETE:
1300 case MSG_DIRECT_CONNECT_TIMEOUT:
1301 default:
1302 LOG_ERROR("Idle::%{public}s, StateMachine is %{public}d", __FUNCTION__, msg.what_);
1303 break;
1304 }
1305 return result;
1306 }
1307
Connecting(utility::StateMachine & stateMachine,GattConnectionManager::Device & device)1308 GattConnectionManager::Device::StateMachine::Connecting::Connecting(
1309 utility::StateMachine &stateMachine, GattConnectionManager::Device &device)
1310 : StateBase(STATE_CONNECTING, stateMachine, device)
1311 {}
1312
Entry()1313 void GattConnectionManager::Device::StateMachine::Connecting::Entry()
1314 {
1315 HILOGI("Device Address:[%{public}s] Transport:[%{public}d], Entry %{public}s State",
1316 GetEncryptAddr(device_.Info().addr_.GetAddress()).c_str(), device_.Info().transport_, "Connecting");
1317 GattConnectionManager::GetInstance().pimpl->NotifyObserver(
1318 device_.Info(), OBSERVER_EVENT_CONNECTING, device_.handle_, GattStatus::GATT_SUCCESS);
1319 }
1320
Dispatch(const utility::Message & msg)1321 bool GattConnectionManager::Device::StateMachine::Connecting::Dispatch(const utility::Message &msg)
1322 {
1323 LOG_DEBUG("%{public}s:%{public}d:%{public}s : Call Massage ID: %{public}d", __FILE__, __LINE__, __PRETTY_FUNCTION__, msg.what_);
1324 bool result = false;
1325
1326 switch (msg.what_) {
1327 case MSG_CONNECT_COMPLETE:
1328 if (GattConnectionManager::GetInstance().pimpl->DoConnectComplete(device_, msg) ==
1329 GattStatus::GATT_SUCCESS) {
1330 Transition(STATE_CONNECTED);
1331 } else {
1332 Transition(STATE_DISCONNECTED);
1333 }
1334 result = true;
1335 break;
1336 case MSG_DISCONNECT_COMPLETE:
1337 Transition(STATE_DISCONNECTED);
1338 result = true;
1339 break;
1340 case MSG_DIRECT_CONNECT_TIMEOUT:
1341 case MSG_DISCONNECT:
1342 BtAddr addr;
1343 if (memcpy_s(addr.addr, RawAddress::BT_ADDRESS_BYTE_LEN, device_.addr_, RawAddress::BT_ADDRESS_BYTE_LEN)
1344 == EOK) {
1345 addr.type = device_.info_.addressType_;
1346 ATT_LeConnectCancel(&addr);
1347 result = true;
1348 }
1349 break;
1350 case MSG_CONNECT:
1351 default:
1352 LOG_ERROR("Connecting::%{public}s, StateMachine is %{public}d", __FUNCTION__, msg.what_);
1353 break;
1354 }
1355 return result;
1356 }
1357
Connected(utility::StateMachine & stateMachine,GattConnectionManager::Device & device)1358 GattConnectionManager::Device::StateMachine::Connected::Connected(
1359 utility::StateMachine &stateMachine, GattConnectionManager::Device &device)
1360 : StateBase(STATE_CONNECTED, stateMachine, device)
1361 {}
1362
Entry()1363 void GattConnectionManager::Device::StateMachine::Connected::Entry()
1364 {
1365 HILOGI("Device Address:[%{public}s] Transport:[%{public}d], Entry %{public}s State",
1366 GetEncryptAddr(device_.Info().addr_.GetAddress()).c_str(), device_.Info().transport_, "Connected");
1367
1368 device_.CheckEncryption();
1369
1370 GattConnectionManager::GetInstance().pimpl->NotifyObserver(
1371 device_.Info(), OBSERVER_EVENT_CONNECTED, device_.handle_, GattStatus::GATT_SUCCESS);
1372 }
1373
Dispatch(const utility::Message & msg)1374 bool GattConnectionManager::Device::StateMachine::Connected::Dispatch(const utility::Message &msg)
1375 {
1376 LOG_DEBUG("%{public}s:%{public}d:%{public}s : Call Massage ID: %{public}d", __FILE__, __LINE__, __PRETTY_FUNCTION__, msg.what_);
1377 bool result = false;
1378
1379 switch (msg.what_) {
1380 case MSG_DISCONNECT:
1381 GattConnectionManager::GetInstance().pimpl->DoDisconnect(device_.handle_);
1382 Transition(STATE_DISCONNECTING);
1383 result = true;
1384 break;
1385 case MSG_DISCONNECT_COMPLETE:
1386 GattConnectionManager::GetInstance().pimpl->DoDisconnectComplete(device_, msg);
1387 Transition(STATE_DISCONNECTED);
1388 result = true;
1389 break;
1390 case MSG_REQUEST_CONNECTION_PRIORITY:
1391 if (GattConnectionManager::GetInstance().pimpl->DoRequestConnectionPriority(device_, msg.arg1_) ==
1392 GattStatus::GATT_SUCCESS) {
1393 result = true;
1394 }
1395 break;
1396 case MSG_RESPONSE_CONNECTION_PRIORITY:
1397 GattConnectionManager::GetInstance().pimpl->NotifyPriorityUpdated(device_.Info(),
1398 ((ConnectionPriorityResult *)msg.arg2_)->interval_,
1399 ((ConnectionPriorityResult *)msg.arg2_)->latency_,
1400 ((ConnectionPriorityResult *)msg.arg2_)->timeout_,
1401 ((ConnectionPriorityResult *)msg.arg2_)->status);
1402 result = true;
1403 break;
1404 case MSG_DIRECT_CONNECT_TIMEOUT:
1405 BtAddr addr;
1406 if (memcpy_s(addr.addr, RawAddress::BT_ADDRESS_BYTE_LEN, device_.addr_, RawAddress::BT_ADDRESS_BYTE_LEN)
1407 == EOK) {
1408 addr.type = device_.info_.addressType_;
1409 ATT_LeConnectCancel(&addr);
1410 result = true;
1411 }
1412 break;
1413 case MSG_RECONNECT_CAUSE_0X3E:
1414 GattConnectionManager::GetInstance().pimpl->NotifyObserver(
1415 device_.Info(), OBSERVER_EVENT_DISCONNECTED_INTER, device_.handle_, GattStatus::GATT_SUCCESS);
1416 if (GattConnectionManager::GetInstance().pimpl->DoConnect(device_) == GattStatus::GATT_SUCCESS) {
1417 result = true;
1418 }
1419 break;
1420 case MSG_CONNECT_COMPLETE:
1421 if (GattConnectionManager::GetInstance().pimpl->DoConnectComplete(device_, msg) !=
1422 GattStatus::GATT_SUCCESS) {
1423 Transition(STATE_DISCONNECTED);
1424 } else {
1425 GattConnectionManager::GetInstance().pimpl->NotifyObserver(
1426 device_.Info(), OBSERVER_EVENT_RECONNECTED, device_.handle_, GattStatus::GATT_SUCCESS);
1427 }
1428 result = true;
1429 break;
1430 case MSG_CONNECT:
1431 default:
1432 LOG_INFO("Connected::%{public}s, StateMachine is %{public}d", __FUNCTION__, msg.what_);
1433 break;
1434 }
1435 return result;
1436 }
1437
Disconnecting(utility::StateMachine & stateMachine,GattConnectionManager::Device & device)1438 GattConnectionManager::Device::StateMachine::Disconnecting::Disconnecting(
1439 utility::StateMachine &stateMachine, GattConnectionManager::Device &device)
1440 : StateBase(STATE_DISCONNECTING, stateMachine, device)
1441 {}
1442
Entry()1443 void GattConnectionManager::Device::StateMachine::Disconnecting::Entry()
1444 {
1445 HILOGI("Device Address:[%{public}s] Transport:[%{public}d], Entry %{public}s State",
1446 GetEncryptAddr(device_.Info().addr_.GetAddress()).c_str(), device_.Info().transport_, "Disconnecting");
1447
1448 GattConnectionManager::GetInstance().pimpl->NotifyObserver(
1449 device_.Info(), OBSERVER_EVENT_DISCONNECTING, device_.handle_, GattStatus::GATT_SUCCESS);
1450 }
1451
Dispatch(const utility::Message & msg)1452 bool GattConnectionManager::Device::StateMachine::Disconnecting::Dispatch(const utility::Message &msg)
1453 {
1454 LOG_DEBUG("%{public}s:%{public}d:%{public}s : Call Massage ID: %{public}d", __FILE__, __LINE__, __PRETTY_FUNCTION__, msg.what_);
1455 bool result = false;
1456
1457 switch (msg.what_) {
1458 case MSG_DISCONNECT_COMPLETE:
1459 if (GattConnectionManager::GetInstance().pimpl->DoDisconnectComplete(device_, msg) ==
1460 GattStatus::GATT_SUCCESS) {
1461 Transition(STATE_DISCONNECTED);
1462 } else {
1463 Transition(STATE_CONNECTED);
1464 }
1465 result = true;
1466 break;
1467 case MSG_CONNECT:
1468 case MSG_CONNECT_COMPLETE:
1469 case MSG_DISCONNECT:
1470 case MSG_DIRECT_CONNECT_TIMEOUT:
1471 default:
1472 LOG_ERROR("Disconnecting::%{public}s, StateMachine is %{public}d", __FUNCTION__, msg.what_);
1473 break;
1474 }
1475 return result;
1476 }
1477
Disconnected(utility::StateMachine & stateMachine,GattConnectionManager::Device & device)1478 GattConnectionManager::Device::StateMachine::Disconnected::Disconnected(
1479 utility::StateMachine &stateMachine, GattConnectionManager::Device &device)
1480 : StateBase(STATE_DISCONNECTED, stateMachine, device)
1481 {}
1482
Entry()1483 void GattConnectionManager::Device::StateMachine::Disconnected::Entry()
1484 {
1485 HILOGI("Device Address:[%{public}s] Transport:[%{public}d], Entry %{public}s State",
1486 GetEncryptAddr(device_.Info().addr_.GetAddress()).c_str(), device_.Info().transport_, "Disconnected");
1487
1488 device_.CheckEncryption();
1489
1490 GattConnectionManager::GetInstance().pimpl->NotifyObserver(
1491 device_.Info(), OBSERVER_EVENT_DISCONNECTED, device_.handle_, GattStatus::GATT_SUCCESS);
1492
1493 device_.mtu_ = GATT_DEFAULT_MTU;
1494 device_.handle_ = 0;
1495
1496 if (device_.autoConnect_) {
1497 device_.sm_.ProcessMessage(utility::Message(MSG_CONNECT));
1498 }
1499 }
1500
Dispatch(const utility::Message & msg)1501 bool GattConnectionManager::Device::StateMachine::Disconnected::Dispatch(const utility::Message &msg)
1502 {
1503 LOG_DEBUG("%{public}s:%{public}d:%{public}s : Call Massage ID: %{public}d", __FILE__, __LINE__, __PRETTY_FUNCTION__, msg.what_);
1504 bool result = false;
1505
1506 GattConnectionManager &instance = GattConnectionManager::GetInstance();
1507
1508 switch (msg.what_) {
1509 case MSG_CONNECT:
1510 if (instance.pimpl->DoConnect(device_) == GattStatus::GATT_SUCCESS) {
1511 Transition(STATE_CONNECTING);
1512 result = true;
1513 }
1514 break;
1515 case MSG_CONNECT_COMPLETE:
1516 if (instance.pimpl->DoConnectComplete(device_, msg) == GattStatus::GATT_SUCCESS) {
1517 Transition(STATE_CONNECTED);
1518 }
1519 result = true;
1520 break;
1521 case MSG_DIRECT_CONNECT_TIMEOUT:
1522 break;
1523 case MSG_DISCONNECT:
1524 case MSG_DISCONNECT_COMPLETE:
1525 default:
1526 LOG_INFO("Disconnected::%{public}s, StateMachine is %{public}d", __FUNCTION__, msg.what_);
1527 break;
1528 }
1529 return result;
1530 }
1531 } // namespace bluetooth
1532 } // namespace OHOS
1533