• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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