• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "pbap_pse_service.h"
17 #include "../obex/obex_utils.h"
18 #include "../obex/obex_mp_server.h"
19 #include "adapter_config.h"
20 #include "adapter_manager.h"
21 #include "base_observer_list.h"
22 #include "btm.h"
23 #include "class_creator.h"
24 #include "log.h"
25 #include "log_util.h"
26 #include "pbap_pse_def.h"
27 #include "pbap_pse_gap.h"
28 #include "pbap_pse_header_msg.h"
29 #include "pbap_pse_obex_server.h"
30 #include "pbap_pse_sdp.h"
31 #include "pbap_pse_state_machine.h"
32 #include "profile_config.h"
33 #include "rfcomm.h"
34 
35 namespace OHOS {
36 namespace bluetooth {
37 struct PbapPseService::impl {
38     // state machine
39     std::map<std::string, std::unique_ptr<PbapPseStateMachine>> machineMap_ {};
40 
41     // observer
42     BaseObserverList<IPbapPseObserver> observerMgrList_ {};
43     // gap
44     std::unique_ptr<PbapPseGap> pbapPseGap_ = nullptr;
45     // sdp
46     std::unique_ptr<PbapPseSdp> pbapPseSdp_ = nullptr;
47 
48     // obex server
49     std::unique_ptr<PbapPseObexServer> pseObexServer_ = nullptr;
50     // is disable?
51     bool disableFlag_ = false;
52     // rfcomm channel
53     uint8_t rfcommScn_ = 0x00;
54     // connection id mutex
55     std::mutex connectIdMutex_ {};
56     // machineMap mutex
57     std::recursive_mutex machineMapMutex_ {};
58     // connection id
59     uint32_t connectIdSeq_ = 0;
60     struct AdapterConfig {
61         bool srmEnable_ = true;
62         int rfcommMtu_ = 0;
63         int l2capMtu_ = 0;
64     } adapterConfig_ {};
65 };
66 
PbapPseService()67 PbapPseService::PbapPseService() : utility::Context(PROFILE_NAME_PBAP_PSE, "1.2.3"), pimpl(std::make_unique<impl>())
68 {
69     PBAP_PSE_LOG_INFO("ProfileService:%{public}s Create", Name().c_str());
70 }
71 
~PbapPseService()72 PbapPseService::~PbapPseService()
73 {
74     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
75 }
76 
GetContext()77 utility::Context *PbapPseService::GetContext()
78 {
79     return this;
80 }
81 
EnableService()82 void PbapPseService::EnableService()
83 {
84     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
85     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
86     // load config
87     LoadAdapterConfig();
88 
89     pimpl->disableFlag_ = false;
90     pimpl->rfcommScn_ = RFCOMM_AssignServerNum();
91     pimpl->pbapPseSdp_ = std::make_unique<PbapPseSdp>(pimpl->rfcommScn_, PBAP_PSE_GOEP_L2CAP_PSM);
92     int retVal = pimpl->pbapPseSdp_->Register();
93     if (retVal != BT_SUCCESS) {
94         GetContext()->OnEnable(PROFILE_NAME_PBAP_PSE, false);
95         PBAP_PSE_LOG_ERROR("Enable PbapPse Service failure!");
96         return;
97     }
98     BTM_AddLocalL2capPsmForLogging(BTM_HCI_LOG_FILTER_MODULE_PBAP, PBAP_PSE_GOEP_L2CAP_PSM);
99     BTM_AddLocalRfcommScnForLogging(BTM_HCI_LOG_FILTER_MODULE_PBAP, pimpl->rfcommScn_);
100 
101     pimpl->pbapPseGap_ = std::make_unique<PbapPseGap>(pimpl->rfcommScn_, PBAP_PSE_GOEP_L2CAP_PSM);
102     retVal = pimpl->pbapPseGap_->Register();
103     if (retVal != BT_SUCCESS) {
104         GetContext()->OnEnable(PROFILE_NAME_PBAP_PSE, false);
105         PBAP_PSE_LOG_ERROR("Enable PbapPse Service failure!");
106         return;
107     }
108 
109     ObexServerConfig config;
110 #ifdef PBAP_PSE_L2CAP_ENABLE
111     config.useL2cap_ = true;
112 #else
113     config.useL2cap_ = false;
114 #endif
115     config.l2capPsm_ = PBAP_PSE_GOEP_L2CAP_PSM;
116     config.l2capMtu_ = pimpl->adapterConfig_.l2capMtu_;
117     config.useRfcomm_ = true;
118     config.rfcommScn_ = pimpl->rfcommScn_;
119     config.rfcommMtu_ = pimpl->adapterConfig_.rfcommMtu_;
120     config.isSupportSrm_ = true;
121     config.isSupportReliableSession_ = false;
122 
123     // call obex server startup
124     pimpl->pseObexServer_ = std::make_unique<PbapPseObexServer>(PBAP_PSE_SERVICE_NAME, config, *this);
125     bool isStarted = pimpl->pseObexServer_->StartUp() == 0;
126     GetContext()->OnEnable(PROFILE_NAME_PBAP_PSE, isStarted);
127     if (!isStarted) {
128         PBAP_PSE_LOG_ERROR("Enable PbapPse Service failure!");
129     }
130 }
131 
Enable()132 void PbapPseService::Enable()
133 {
134     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
135     GetDispatcher()->PostTask(std::bind(&PbapPseService::EnableService, this));
136 }
137 
DisableService()138 void PbapPseService::DisableService()
139 {
140     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
141     PBAP_PSE_LOG_INFO("Call %{public}s start", __PRETTY_FUNCTION__);
142     pimpl->disableFlag_ = true;
143     if (pimpl->pbapPseSdp_) {
144         pimpl->pbapPseSdp_->Deregister();
145         BTM_RemoveLocalL2capPsmForLogging(BTM_HCI_LOG_FILTER_MODULE_PBAP, PBAP_PSE_GOEP_L2CAP_PSM);
146         BTM_RemoveLocalRfcommScnChannelForLogging(BTM_HCI_LOG_FILTER_MODULE_PBAP, pimpl->rfcommScn_);
147     }
148     for (auto &stm : pimpl->machineMap_) {
149         if (stm.second->GetConnectState() == BTConnectState::DISCONNECTED) {
150             continue;
151         }
152         if (!stm.second->IsConnected() && !stm.second->IsAccepted()) {
153             utility::Message msg(PSE_INCOMING_REJECT);
154             stm.second->ProcessMessage(msg);
155         } else if (!stm.second->IsConnected() && stm.second->IsAccepted()) {
156             ProcessWaitToDisconnect(stm.second->GetDevice());
157         } else if (stm.second->IsConnected()) {
158             utility::Message msg(PSE_API_DISCONNECT);
159             stm.second->ProcessMessage(msg);
160         }
161     }
162     if (IsAllDisconnected()) {
163         pimpl->pseObexServer_->ShutDown();
164     }
165     PBAP_PSE_LOG_INFO("Call %{public}s end", __PRETTY_FUNCTION__);
166 }
167 
Disable()168 void PbapPseService::Disable()
169 {
170     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
171     GetDispatcher()->PostTask(std::bind(&PbapPseService::DisableService, this));
172 }
173 
Connect(const RawAddress & device)174 int PbapPseService::Connect(const RawAddress &device)
175 {
176     return RET_NO_SUPPORT;
177 }
178 
Disconnect(const RawAddress & device)179 int PbapPseService::Disconnect(const RawAddress &device)
180 {
181     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
182     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
183     auto target = pimpl->machineMap_.find(device.GetAddress());
184     if (target == pimpl->machineMap_.end()) {
185         HILOGI("Disconnect: %{public}s doesn't exist.", GET_ENCRYPT_ADDR(device));
186         return RET_BAD_STATUS;
187     }
188     BTConnectState state = target->second->GetConnectState();
189     if (state != BTConnectState::CONNECTED) {
190         HILOGI("Disconnect: %{public}s isn't connected.", GET_ENCRYPT_ADDR(device));
191         return RET_BAD_STATUS;
192     }
193     GetDispatcher()->PostTask(std::bind(&PbapPseService::DisConnectInternal, this, device));
194     return BT_SUCCESS;
195 }
196 
DisConnectInternal(RawAddress device)197 void PbapPseService::DisConnectInternal(RawAddress device)
198 {
199     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
200     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
201     auto target = pimpl->machineMap_.find(device.GetAddress());
202     if (target != pimpl->machineMap_.end()) {
203         if (target->second->GetConnectState() == BTConnectState::DISCONNECTED) {
204             return;
205         }
206         if (target->second->IsConnected()) {
207             utility::Message msg(PSE_API_DISCONNECT);
208             target->second->ProcessMessage(msg);
209         } else if (!target->second->IsConnected() && !target->second->IsAccepted()) {
210             ProcessGrantPermission(device, false, false);
211         } else if (!target->second->IsConnected() && target->second->IsAccepted()) {
212             ProcessWaitToDisconnect(device);
213         }
214     }
215 }
216 
GetConnectDevices()217 std::list<RawAddress> PbapPseService::GetConnectDevices()
218 {
219     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
220     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
221     std::list<RawAddress> devList;
222     for (auto &stm : pimpl->machineMap_) {
223         BTConnectState state = stm.second->GetConnectState();
224         if (state == BTConnectState::CONNECTED) {
225             devList.push_front(stm.second->GetDevice());
226         }
227     }
228     return devList;
229 }
230 
GetConnectState()231 int PbapPseService::GetConnectState()
232 {
233     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
234     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
235     uint8_t result = 0x00;
236     for (auto &stm : pimpl->machineMap_) {
237         BTConnectState state = stm.second->GetConnectState();
238         if (state == BTConnectState::DISCONNECTED) {
239             result |= PROFILE_STATE_DISCONNECTED;
240         } else if (state == BTConnectState::CONNECTING) {
241             result |= PROFILE_STATE_CONNECTING;
242         } else if (state == BTConnectState::CONNECTED) {
243             result |= PROFILE_STATE_CONNECTED;
244         } else if (state == BTConnectState::DISCONNECTING) {
245             result |= PROFILE_STATE_DISCONNECTING;
246         }
247     }
248     return result;
249 }
250 
GetMaxConnectNum()251 int PbapPseService::GetMaxConnectNum()
252 {
253     return RET_NO_SUPPORT;
254 }
255 
SetConnectionStrategy(const RawAddress & device,int strategy)256 int PbapPseService::SetConnectionStrategy(const RawAddress &device, int strategy)
257 {
258     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
259     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
260     switch (strategy) {
261         case static_cast<int>(BTStrategyType::CONNECTION_ALLOWED):
262         case static_cast<int>(BTStrategyType::CONNECTION_FORBIDDEN):
263             if (!SaveConnectPolicy(device.GetAddress(), strategy)) {
264                 return RET_NO_SUPPORT;
265             }
266             break;
267         default:
268             return RET_BAD_PARAM;
269     }
270     if (strategy == static_cast<int>(BTStrategyType::CONNECTION_FORBIDDEN)) {
271         GetDispatcher()->PostTask(std::bind(&PbapPseService::DisConnectInternal, this, device));
272     }
273     return BT_SUCCESS;
274 }
275 
GetConnectionStrategy(const RawAddress & device) const276 int PbapPseService::GetConnectionStrategy(const RawAddress &device) const
277 {
278     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
279     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
280     int strategy = 0;
281     if (!LoadConnectPolicy(device.GetAddress(), strategy)) {
282         return static_cast<int>(BTStrategyType::CONNECTION_UNKNOWN);
283     }
284     if (strategy == static_cast<int>(BTStrategyType::CONNECTION_ALLOWED) ||
285         strategy == static_cast<int>(BTStrategyType::CONNECTION_FORBIDDEN)) {
286         return strategy;
287     }
288     return static_cast<int>(BTStrategyType::CONNECTION_UNKNOWN);
289 }
290 
GrantPermission(const RawAddress & device,bool allow,bool save)291 void PbapPseService::GrantPermission(const RawAddress &device, bool allow, bool save)
292 {
293     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
294     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
295     GetDispatcher()->PostTask(std::bind(&PbapPseService::ProcessGrantPermission, this, device, allow, save));
296 }
297 
SetDevicePassword(const RawAddress & device,const std::string & password,std::string userId)298 int PbapPseService::SetDevicePassword(const RawAddress &device, const std::string &password, std::string userId)
299 {
300     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
301     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
302     if (password.empty() || userId.size() > ObexDigestResponse::MAX_USER_ID_LEN) {
303         PBAP_PSE_LOG_ERROR("SetDevicePassword: password or userId is invalid!");
304         return RET_BAD_PARAM;
305     }
306     auto target = pimpl->machineMap_.find(device.GetAddress());
307     if (target == pimpl->machineMap_.end()) {
308         HILOGI("SetDevicePassword: %{public}s doesn't exist!", GET_ENCRYPT_ADDR(device));
309         return RET_BAD_STATUS;
310     }
311     if (target->second->GetConnectState() != BTConnectState::CONNECTING) {
312         HILOGI("SetDevicePassword: %{public}s isn't connecting, now state is %{public}d.",
313             GET_ENCRYPT_ADDR(device), static_cast<int>(target->second->GetConnectState()));
314         return RET_BAD_STATUS;
315     }
316     GetDispatcher()->PostTask(std::bind(&PbapPseService::ProcessSetDevicePassword, this, device, password, userId));
317     return BT_SUCCESS;
318 }
319 
GetDeviceState(const RawAddress & device) const320 int PbapPseService::GetDeviceState(const RawAddress &device) const
321 {
322     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
323     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
324     BTConnectState result = BTConnectState::DISCONNECTED;
325     auto target = pimpl->machineMap_.find(device.GetAddress());
326     if (target != pimpl->machineMap_.end()) {
327         result = target->second->GetConnectState();
328     }
329     return static_cast<int>(result);
330 }
331 
GetDevicesByStates(const std::vector<int> & states) const332 std::vector<RawAddress> PbapPseService::GetDevicesByStates(const std::vector<int> &states) const
333 {
334     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
335     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
336     std::vector<RawAddress> devices;
337     for (auto &state : states) {
338         for (auto &stm : pimpl->machineMap_) {
339             if (static_cast<int>(stm.second->GetConnectState()) == state) {
340                 devices.push_back(stm.second->GetDevice());
341             }
342         }
343     }
344     return devices;
345 }
346 
RegisterObserver(IPbapPseObserver & observer)347 void PbapPseService::RegisterObserver(IPbapPseObserver &observer)
348 {
349     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
350     pimpl->observerMgrList_.Register(observer);
351 }
352 
DeregisterObserver(IPbapPseObserver & observer)353 void PbapPseService::DeregisterObserver(IPbapPseObserver &observer)
354 {
355     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
356     pimpl->observerMgrList_.Deregister(observer);
357 }
358 
GetNextConnectId() const359 uint32_t PbapPseService::GetNextConnectId() const
360 {
361     std::lock_guard<std::mutex> lock(pimpl->connectIdMutex_);
362     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
363     return ++pimpl->connectIdSeq_;
364 }
365 
PostMessage(utility::Message msg)366 void PbapPseService::PostMessage(utility::Message msg)
367 {
368     switch (msg.what_) {
369         case PSE_SHUTDOWN_COMPLETED:
370             GetDispatcher()->PostTask(std::bind(&PbapPseService::ProcessShutDownComplete, this, msg));
371             break;
372         default:
373             break;
374     }
375 }
376 
ProcessObexRequest(int what,const RawAddress & device) const377 void PbapPseService::ProcessObexRequest(int what, const RawAddress &device) const
378 {
379     switch (what) {
380         case PSE_DEVICE_DISCONNECTED:
381             ProcessDeviceDisconnected(device, utility::Message(what));
382             break;
383         case PSE_DEVICE_TRANSPORT_ERROR:
384             // is need ?
385             break;
386         default:
387             break;
388     }
389 }
390 
ProcessObexRequest(int what,const RawAddress & device,ObexIncomingConnect & incomingConnect)391 void PbapPseService::ProcessObexRequest(int what, const RawAddress &device, ObexIncomingConnect &incomingConnect)
392 {
393     switch (what) {
394         case PSE_DEVICE_CONNECT_INCOMING:
395             ProcessConnectIncoming(device, utility::Message(what, 0, static_cast<void *>(&incomingConnect)));
396             break;
397         default:
398             break;
399     }
400 }
401 
ProcessObexRequest(int what,const RawAddress & device,ObexServerSession & session,const ObexHeader & req)402 void PbapPseService::ProcessObexRequest(
403     int what, const RawAddress &device, ObexServerSession &session, const ObexHeader &req)
404 {
405     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
406     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
407     auto target = pimpl->machineMap_.find(device.GetAddress());
408     if (target == pimpl->machineMap_.end()) {
409         HILOGI("ProcessObexRequest: %{public}s doesn't exist! ", GET_ENCRYPT_ADDR(device));
410         return;
411     }
412     auto obexMsg = std::make_unique<PbapPseObexMessage>(session, req);
413     utility::Message msg(what, 0, static_cast<void *>(obexMsg.get()));
414     switch (what) {
415         case PSE_REQ_OBEX_CONNECT:
416             target->second->ProcessMessage(msg);
417             break;
418         case PSE_REQ_OBEX_DISCONNECT:
419             target->second->ProcessMessage(msg);
420             break;
421         case PSE_REQ_OBEX_GET:
422             target->second->ProcessMessage(msg);
423             break;
424         case PSE_REQ_OBEX_SETPATH:
425             target->second->ProcessMessage(msg);
426             break;
427         default:
428             break;
429     }
430 }
431 
ProcessObexBusy(const RawAddress & device,bool isBusy) const432 void PbapPseService::ProcessObexBusy(const RawAddress &device, bool isBusy) const
433 {
434     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
435     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
436     auto target = pimpl->machineMap_.find(device.GetAddress());
437     if (target == pimpl->machineMap_.end()) {
438         return;
439     }
440     target->second->SetBusy(isBusy);
441 }
442 
ProcessConnectIncoming(const RawAddress & device,const utility::Message & msg)443 void PbapPseService::ProcessConnectIncoming(const RawAddress &device, const utility::Message &msg)
444 {
445     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
446     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
447     auto target = pimpl->machineMap_.find(device.GetAddress());
448     if (target != pimpl->machineMap_.end() && target->second->GetConnectState() != BTConnectState::DISCONNECTED) {
449         HILOGI("ProcessConnectIncoming: %{public}s already exists! , state is %{public}d .",
450             GET_ENCRYPT_ADDR(device), static_cast<int>(target->second->GetConnectState()));
451         auto incomeConnect = static_cast<ObexIncomingConnect *>(msg.arg2_);
452         incomeConnect->RejectConnection();
453         return;
454     }
455     auto stm = std::make_unique<PbapPseStateMachine>(
456         device, pimpl->observerMgrList_, std::bind(&PbapPseService::GetNextConnectId, this));
457     stm->Init();
458     pimpl->machineMap_[device.GetAddress()] = std::move(stm);
459     pimpl->machineMap_[device.GetAddress()]->ProcessMessage(msg);
460     if (pimpl->disableFlag_) {
461         HILOGI("PBAP DISABLING AUTO FORBIDDEN FOR DEVICE:%{public}s", GET_ENCRYPT_ADDR(device));
462         ProcessGrantPermission(device, false, false);
463         return;
464     }
465     BTPermissionType permission = AdapterManager::GetInstance()->GetPhonebookPermission(device.GetAddress());
466     if (BTPermissionType::ACCESS_ALLOWED == permission) {
467         HILOGI("PBAP ACCESS AUTO ALLOWED FOR DEVICE:%{public}s", GET_ENCRYPT_ADDR(device));
468         SetConnectionStrategy(device, static_cast<int>(BTStrategyType::CONNECTION_ALLOWED));
469         ProcessGrantPermission(device, true, false);
470     } else if (BTPermissionType::ACCESS_FORBIDDEN == permission) {
471         HILOGI("PBAP ACCESS AUTO FORBIDDEN FOR DEVICE:%{public}s", GET_ENCRYPT_ADDR(device));
472         ProcessGrantPermission(device, false, false);
473     } else {
474         pimpl->machineMap_[device.GetAddress()]->StartTimer(
475             std::bind(&PbapPseService::IncomingTimeout, this, device), PBAP_PSE_INCOMING_TIME_OUT);
476         HILOGI("PBAP ACCESS UNKNOWN FOR DEVICE:%{public}s", GET_ENCRYPT_ADDR(device));
477         pimpl->observerMgrList_.ForEach([device](IPbapPseObserver &observer) {
478             HILOGI("OnServicePermission(%{public}s) is called.", GET_ENCRYPT_ADDR(device));
479             observer.OnServicePermission(device);
480         });
481     }
482 }
483 
ProcessGrantPermission(const RawAddress & device,bool allow,bool save) const484 void PbapPseService::ProcessGrantPermission(const RawAddress &device, bool allow, bool save) const
485 {
486     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
487     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
488     auto target = pimpl->machineMap_.find(device.GetAddress());
489     if (target == pimpl->machineMap_.end()) {
490         HILOGI("ProcessGrantPermission: %{public}s doesn't exist.", GET_ENCRYPT_ADDR(device));
491         return;
492     }
493     if (target->second->GetConnectState() != BTConnectState::CONNECTING) {
494         HILOGI("ProcessGrantPermission: %{public}s isn't connecting, now state is %{public}d.",
495             GET_ENCRYPT_ADDR(device), static_cast<int>(target->second->GetConnectState()));
496         return;
497     }
498     target->second->StopTimer();
499     if (save) {
500         auto adapterManager = AdapterManager::GetInstance();
501         // Save Permission
502         BTPermissionType permission = adapterManager->GetPhonebookPermission(device.GetAddress());
503         if (allow && BTPermissionType::ACCESS_ALLOWED != permission) {
504             HILOGI("Pbap permission changed to ALLOWED for device: %{public}s", GET_ENCRYPT_ADDR(device));
505             adapterManager->SetPhonebookPermission(device.GetAddress(), BTPermissionType::ACCESS_ALLOWED);
506         } else if (!allow && BTPermissionType::ACCESS_FORBIDDEN != permission) {
507             HILOGI("Pbap permission changed to FORBIDDEN for device: %{public}s", GET_ENCRYPT_ADDR(device));
508             adapterManager->SetPhonebookPermission(device.GetAddress(), BTPermissionType::ACCESS_FORBIDDEN);
509         }
510     }
511     utility::Message msg(allow ? PSE_INCOMING_ACCEPT : PSE_INCOMING_REJECT, static_cast<int>(save));
512     target->second->ProcessMessage(msg);
513 }
514 
ProcessSetDevicePassword(const RawAddress & device,std::string password,std::string userId) const515 void PbapPseService::ProcessSetDevicePassword(const RawAddress &device, std::string password, std::string userId) const
516 {
517     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
518     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
519     auto target = pimpl->machineMap_.find(device.GetAddress());
520     if (target == pimpl->machineMap_.end()) {
521         HILOGI("ProcessSetDevicePassword: %{public}s doesn't exist! ", GET_ENCRYPT_ADDR(device));
522         return;
523     }
524     if (target->second->GetConnectState() != BTConnectState::CONNECTING) {
525         HILOGI("ProcessSetDevicePassword: %{public}s isn't connecting, now state is %{public}d.",
526             GET_ENCRYPT_ADDR(device), static_cast<int>(target->second->GetConnectState()));
527         return;
528     }
529     auto msgData = std::make_unique<PbapPsePasswordInputMsg>(password, userId);
530     utility::Message msg(PSE_PASSWORD_INPUT, 0, static_cast<void *>(msgData.get()));
531     target->second->ProcessMessage(msg);
532 }
533 
ProcessShutDownComplete(const utility::Message & msg)534 void PbapPseService::ProcessShutDownComplete(const utility::Message &msg)
535 {
536     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
537     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
538     if (pimpl->pbapPseGap_) {
539         pimpl->pbapPseGap_->Deregister();
540     }
541     int retVal = RFCOMM_FreeServerNum(pimpl->rfcommScn_);
542     if (retVal != BT_SUCCESS) {
543         PBAP_PSE_LOG_ERROR("Pbap free server num 0x%02X error, retVal=%{public}d", pimpl->rfcommScn_, retVal);
544     }
545     GetContext()->OnDisable(PROFILE_NAME_PBAP_PSE, true);
546 }
547 
ProcessDeviceDisconnected(const RawAddress & device,const utility::Message & msg) const548 void PbapPseService::ProcessDeviceDisconnected(const RawAddress &device, const utility::Message &msg) const
549 {
550     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
551     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
552     auto target = pimpl->machineMap_.find(device.GetAddress());
553     if (target != pimpl->machineMap_.end()) {
554         target->second->ProcessMessage(msg);
555     }
556     if (pimpl->disableFlag_ && IsAllDisconnected()) {
557         pimpl->pseObexServer_->ShutDown();
558     }
559 }
560 
IncomingTimeout(const RawAddress & device)561 void PbapPseService::IncomingTimeout(const RawAddress &device)
562 {
563     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
564     GetDispatcher()->PostTask(std::bind(&PbapPseService::ProcessIncomingTimeout, this, device));
565 }
566 
ProcessIncomingTimeout(const RawAddress & device) const567 void PbapPseService::ProcessIncomingTimeout(const RawAddress &device) const
568 {
569     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
570     PBAP_PSE_LOG_INFO("Call %{public}s", __PRETTY_FUNCTION__);
571     auto target = pimpl->machineMap_.find(device.GetAddress());
572     if (target != pimpl->machineMap_.end()) {
573         utility::Message msg(PSE_INCOMING_REJECT);
574         target->second->ProcessMessage(msg);
575     }
576 }
577 
SaveConnectPolicy(const std::string & addr,int strategy) const578 bool PbapPseService::SaveConnectPolicy(const std::string &addr, int strategy) const
579 {
580     IProfileConfig *config = ProfileConfig::GetInstance();
581     if (!config->SetValue(addr, SECTION_CONNECTION_POLICIES, PROPERTY_PBAP_CONNECTION_POLICY, strategy)) {
582         HILOGE("SaveConnectPolicy: %{public}s %{public}s save fail.",
583             GetEncryptAddr(addr).c_str(), PROPERTY_PBAP_CONNECTION_POLICY.c_str());
584         return false;
585     }
586     return true;
587 }
588 
LoadConnectPolicy(const std::string & addr,int & strategy) const589 bool PbapPseService::LoadConnectPolicy(const std::string &addr, int &strategy) const
590 {
591     IProfileConfig *config = ProfileConfig::GetInstance();
592     if (!config->GetValue(addr, SECTION_CONNECTION_POLICIES, PROPERTY_PBAP_CONNECTION_POLICY, strategy)) {
593         HILOGE("LoadConnectPolicy: %{public}s %{public}s load fail.",
594             GetEncryptAddr(addr).c_str(), PROPERTY_PBAP_CONNECTION_POLICY.c_str());
595         return false;
596     }
597     return true;
598 }
599 
ProcessWaitToDisconnect(const RawAddress & device) const600 void PbapPseService::ProcessWaitToDisconnect(const RawAddress &device) const
601 {
602     std::lock_guard<std::recursive_mutex> lock(pimpl->machineMapMutex_);
603     HILOGI("device is accepted, wait it connected: %{public}s ", GET_ENCRYPT_ADDR(device));
604     auto target = pimpl->machineMap_.find(device.GetAddress());
605     if (target != pimpl->machineMap_.end()) {
606         utility::Message msg(PSE_WAITING_CONNECTED_TO_DISCONNECT);
607         target->second->ProcessMessage(msg);
608     }
609 }
610 
IsAllDisconnected() const611 bool PbapPseService::IsAllDisconnected() const
612 {
613     bool result = true;
614     for (auto &stm : pimpl->machineMap_) {
615         if (stm.second->GetConnectState() != BTConnectState::DISCONNECTED) {
616             result = false;
617             break;
618         }
619     }
620     return result;
621 }
622 
LoadAdapterConfig() const623 void PbapPseService::LoadAdapterConfig() const
624 {
625     IAdapterConfig *adpterConfig = AdapterConfig::GetInstance();
626     auto &config = pimpl->adapterConfig_;
627     if (!adpterConfig->GetValue(SECTION_PBAP_PSE_SERVICE, PROPERTY_SRM_ENABLE, config.srmEnable_)) {
628         PBAP_PSE_LOG_ERROR("Load config %{public}s failure", PROPERTY_SRM_ENABLE.c_str());
629         config.srmEnable_ = true;
630     }
631     if (!adpterConfig->GetValue(SECTION_PBAP_PSE_SERVICE, PROPERTY_RFCOMM_MTU, config.rfcommMtu_)) {
632         PBAP_PSE_LOG_ERROR("Load config %{public}s failure", PROPERTY_RFCOMM_MTU.c_str());
633         config.rfcommMtu_ = OBEX_DEFAULT_MTU;
634     }
635     if (!adpterConfig->GetValue(SECTION_PBAP_PSE_SERVICE, PROPERTY_L2CAP_MTU, config.l2capMtu_)) {
636         PBAP_PSE_LOG_ERROR("Load config %{public}s failure", PROPERTY_L2CAP_MTU.c_str());
637         config.l2capMtu_ = OBEX_DEFAULT_MTU;
638     }
639     PBAP_PSE_LOG_INFO("srmEnable = %{public}d, rfcommMtu = 0x%X, l2capMtu_ = 0x%X",
640         config.srmEnable_, config.rfcommMtu_, config.l2capMtu_);
641 }
642 
643 REGISTER_CLASS_CREATOR(PbapPseService);
644 }  // namespace bluetooth
645 }  // namespace OHOS
646