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