• 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 /**
17  * @addtogroup Bluetooth
18  * @{
19  *
20  * @brief Defines map client instance object.
21  *
22  */
23 
24 /**
25  * @file map_mce_instance_client.cpp
26  *
27  * @brief map instance client source file .
28  *
29  */
30 #include "map_mce_instance_client.h"
31 #include "btm.h"
32 #include "log.h"
33 #include "map_mce_instance_stm.h"
34 #include "map_mce_mns_server.h"
35 #include "securec.h"
36 
37 namespace OHOS {
38 namespace bluetooth {
39 // client uuid
40 const uint8_t MapMceInstanceClient::mceClientUuidTbl_[MAX_OF_MASCLIENT_OBEX_UUID_TBL] = {
41     0xbb, 0x58, 0x2b, 0x40, 0x42, 0x0c, 0x11, 0xdb, 0xb0, 0xde, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66
42 };
43 
44 // call back
MapMceRequestSecurityCb(uint16_t result,GapServiceSecurityInfo security,void * context)45 void MapMceRequestSecurityCb(uint16_t result, GapServiceSecurityInfo security, void *context)
46 {
47     LOG_INFO("%{public}s enter, result = %{public}d", __PRETTY_FUNCTION__, int(result));
48     auto pThis = static_cast<MapMceInstanceClient *>(context);
49     if (pThis != nullptr) {
50         pThis->OnGapRequestSecurityCb(result);
51     }
52 }
53 
MapMceInstanceClient(utility::StateMachine & mapStm,utility::Dispatcher & dispacher,MapMceObserverManager & observeMgr,const MasInstanceConfig & config,std::recursive_mutex & mutex)54 MapMceInstanceClient::MapMceInstanceClient(utility::StateMachine &mapStm, utility::Dispatcher &dispacher,
55     MapMceObserverManager &observeMgr, const MasInstanceConfig &config, std::recursive_mutex &mutex)
56     : instanceStm_(mapStm), mceDispacher_(dispacher), observerMgrPtr_(observeMgr), stmMutex_(mutex)
57 {
58     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
59     // same statemachine
60     obexClientIns_ = nullptr;
61     insDefaultConfig_ = config;
62     currentRequestPtr_ = nullptr;
63     masRequestQue_.clear();
64     // response data init;
65     resMasInstanceInfo_.isValid = false;
66     resMasInstanceInfo_.masInstanceInfoUtf8 = "";
67     resMasInstanceInfo_.ownerUciUtf8 = "";
68     masObexObserver_ = nullptr;
69     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
70 };
71 
~MapMceInstanceClient()72 MapMceInstanceClient::~MapMceInstanceClient()
73 {
74     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
75     if (currentRequestPtr_ != nullptr) {
76         LOG_INFO("%{public}s currentRequestPtr_ is not null", __PRETTY_FUNCTION__);
77         currentRequestPtr_ = nullptr;
78     }
79     // clear the request list
80     ClientDeleteAllSavedRequestInternal();
81 }
82 
83 // call by device ctrl
SetDefaultSdpParam(const MasSdpParam & sdpSave)84 void MapMceInstanceClient::SetDefaultSdpParam(const MasSdpParam &sdpSave)
85 {
86     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
87     std::lock_guard<std::recursive_mutex> lock(stmMutex_);
88 
89     masSdpParamSave_ = sdpSave;
90     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
91 }
92 
93 // call by device ctrl
GetMasSdpParam()94 MasSdpParam MapMceInstanceClient::GetMasSdpParam()
95 {
96     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
97     std::lock_guard<std::recursive_mutex> lock(stmMutex_);
98 
99     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
100     return masSdpParamSave_;
101 }
102 
103 // call by client internal
SetObexConfig()104 void MapMceInstanceClient::SetObexConfig()
105 {
106     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
107     BtAddr btAddr;
108     BtUuid btUuid;
109     btAddr.type = BT_PUBLIC_DEVICE_ADDRESS;
110     btUuid.type = BT_PUBLIC_DEVICE_ADDRESS;
111     (void)memcpy_s(btUuid.uuid128, MAX_OF_MASCLIENT_OBEX_UUID_TBL,
112         mceClientUuidTbl_, MAX_OF_MASCLIENT_OBEX_UUID_TBL);
113     RawAddress rawAddr(((MapMceInstanceStm &)instanceStm_).GetBtDevice());
114     rawAddr.ConvertToUint8(btAddr.addr, sizeof(btAddr.addr));
115 
116     // set obex config value
117     masClientConfig_.addr_ = btAddr;
118     masClientConfig_.isGoepL2capPSM_ = masSdpParamSave_.isGoepL2capPSM;  // rfcomm is false or l2cap is true
119     masClientConfig_.mtu_ = insDefaultConfig_.rfcommMtu;
120 #ifdef MCE_DISABLE_L2CAP
121     // GOEP 2.0 srm set true
122     masClientConfig_.isSupportSrm_ = insDefaultConfig_.isSupportSrm;
123 #else
124     // GOEP 2.0 srm set true
125     if (masClientConfig_.isGoepL2capPSM_) {
126         masClientConfig_.isSupportSrm_ = true;
127         masClientConfig_.mtu_ = insDefaultConfig_.l2capMtu;
128     }
129 #endif
130     masClientConfig_.isSupportReliableSession_ = false;
131     masClientConfig_.scn_ = masSdpParamSave_.scn;
132     masClientConfig_.serviceUUID_ = btUuid;
133     masClientConfig_.lpsm_ = MAP_MCE_GOEP_L2CAP_PSM_VALUE;
134 }
135 
136 // call by stm
StartClientConnect()137 int MapMceInstanceClient::StartClientConnect()
138 {
139     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
140     int ret;
141     BtAddr addr = ((MapMceInstanceStm &)instanceStm_).GetBtAddress();
142     // prepare obex config
143     SetObexConfig();
144     // set obex config data , set obex observer
145     if (masObexObserver_ == nullptr) {
146         masObexObserver_ = std::make_unique<MasObexClientObserver>(instanceStm_);
147     }
148     if (obexClientIns_ == nullptr) {
149         obexClientIns_ =
150             std::make_unique<ObexMpClient>((const ObexClientConfig)masClientConfig_, *masObexObserver_, mceDispacher_);
151         LOG_INFO("%{public}s,new ObexMpClient, rawAddr=%{public}s,isL2cap=%{public}d,"
152             "scn=0x%x,lpsm=0x%x,instId=%{public}d",
153             __PRETTY_FUNCTION__,
154             ((MapMceInstanceStm &)instanceStm_).GetBtDevice().c_str(),
155             masClientConfig_.isGoepL2capPSM_,
156             masClientConfig_.scn_,
157             masClientConfig_.lpsm_,
158             int(masSdpParamSave_.instanceId));
159     }
160     // register gap
161     ret = RegisterServiceSecurity(securityInfo_);
162     if (ret == BT_SUCCESS) {
163         if (masClientConfig_.isGoepL2capPSM_ != true) {
164             // base on rfcomm, request gap is doing in rfcomm
165             ret = ExcuteObexConnectInternal();
166             BTM_AddRemoteRfcommScnForLogging(BTM_HCI_LOG_FILTER_MODULE_MAP, masClientConfig_.scn_, &addr);
167         } else {
168             // base on l2cap, mce need request gap self
169             ret = RequestSecurity(securityInfo_);
170             BTM_AddRemoteL2capPsmForLogging(BTM_HCI_LOG_FILTER_MODULE_MAP, masClientConfig_.scn_, &addr);
171         }
172     } else {
173         LOG_ERROR("%{public}s Register gap error", __PRETTY_FUNCTION__);
174     }
175     return ret;
176 }
177 
ReconnectAfterTransportFailed()178 int MapMceInstanceClient::ReconnectAfterTransportFailed()
179 {
180     LOG_ERROR("%{public}s, execute", __PRETTY_FUNCTION__);
181     return RequestSecurity(securityInfo_);
182 }
183 
184 // call by stm
ExcuteObexConnect()185 int MapMceInstanceClient::ExcuteObexConnect()
186 {
187     LOG_INFO("%{public}s, obex->Connect() execute", __PRETTY_FUNCTION__);
188     return ExcuteObexConnectInternal();
189 }
190 
ExcuteObexConnectInternal()191 int MapMceInstanceClient::ExcuteObexConnectInternal()
192 {
193     LOG_INFO("%{public}s, obex->Connect() execute", __PRETTY_FUNCTION__);
194     // set obex param value
195     TlvTriplet supportedFeatures(MCE_MAP_SUPPORTED_FEATURES, MAP_MCE_SUPPORTED_FEATURES_V14);
196     ObexTlvParamters params;
197     if (CheckSupportedFeatures(MAP_SUPPORTED_FEATURES_MAPSUPPORTED_FEATURES)) {
198         params.AppendTlvtriplet(supportedFeatures);
199     }
200     // obex connect execute
201     ObexConnectParams obexParam;
202     obexParam.appParams_ = &params;
203     int ret = obexClientIns_->Connect(obexParam);
204     if (ret != BT_SUCCESS) {
205         LOG_ERROR("%{public}s, obex->Connect() execute error, ret=%{public}d", __PRETTY_FUNCTION__, ret);
206     }
207     return ret;
208 }
209 
210 // internal
RegisterServiceSecurity(GapServiceSecurityInfo & info)211 int MapMceInstanceClient::RegisterServiceSecurity(GapServiceSecurityInfo &info)
212 {
213     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
214     info.direction = OUTGOING;
215     info.serviceId = masSdpParamSave_.gapNumber;
216     // init
217     info.channelId.l2capPsm = 0;
218     info.channelId.rfcommChannel = 0;
219 
220     // set gap param
221     if (masSdpParamSave_.isGoepL2capPSM) {
222         // l2cap
223         info.protocolId = SEC_PROTOCOL_L2CAP;  // if l2cap ,then  true
224         info.channelId.l2capPsm = masSdpParamSave_.scn;
225     } else {
226         // rfcomm
227         info.protocolId = SEC_PROTOCOL_RFCOMM;  // if not l2cap ,then  false
228         info.channelId.rfcommChannel = masSdpParamSave_.scn;
229     }
230     // register gap
231     uint16_t securityMode =
232         GAP_SEC_IN_AUTHENTICATION | GAP_SEC_IN_ENCRYPTION | GAP_SEC_OUT_AUTHENTICATION | GAP_SEC_OUT_ENCRYPTION;
233     LOG_INFO("%{public}s gap execute,dir=%{public}d,servic=%{public}d,protocol=%{public}d,rfchannel=%{public}d,"
234         "l2psm=0x%x,securityMode=0x%x",
235         __PRETTY_FUNCTION__,
236         info.direction,
237         info.serviceId,
238         info.protocolId,
239         info.channelId.rfcommChannel,
240         info.channelId.l2capPsm,
241         securityMode);
242     // bluetooth device address
243     BtAddr addr = ((MapMceInstanceStm &)instanceStm_).GetBtAddress();
244     int ret = GAPIF_RegisterServiceSecurity(&addr, &info, securityMode);
245     LOG_INFO("%{public}s end,ret=%{public}d", __PRETTY_FUNCTION__, ret);
246     return ret;
247 }
248 
249 // internal
RequestSecurity(GapServiceSecurityInfo info)250 int MapMceInstanceClient::RequestSecurity(GapServiceSecurityInfo info)
251 {
252     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
253     GapRequestSecurityParam requestParam;
254     requestParam.info = info;
255     requestParam.callback = MapMceRequestSecurityCb;
256     requestParam.context = this;
257 
258     BtAddr addr = ((MapMceInstanceStm &)instanceStm_).GetBtAddress();
259     int ret = GAPIF_RequestSecurity(&addr, &requestParam);
260     if (ret != BT_SUCCESS) {
261         LOG_ERROR("%{public}s GAPIF_RequestSecurity execute error", __PRETTY_FUNCTION__);
262     }
263     return ret;
264 }
265 
266 // call back
OnGapRequestSecurityCb(uint16_t result)267 void MapMceInstanceClient::OnGapRequestSecurityCb(uint16_t result)
268 {
269     // Request Security callback
270     LOG_INFO("%{public}s enter, result = %{public}d", __PRETTY_FUNCTION__, int(result));
271     if (result == BT_SUCCESS) {
272         utility::Message msg(MSG_MASSTM_GAP_REQUEST_FINISH);
273         ((MapMceInstanceStm &)instanceStm_).PostMessage(msg);
274     } else {  // gap request security failure
275         utility::Message msg(MSG_MASSTM_GAP_REQUEST_FAILED);
276         ((MapMceInstanceStm &)instanceStm_).PostMessage(msg);
277         LOG_ERROR("%{public}s gap failed", __PRETTY_FUNCTION__);
278     }
279 }
280 
281 // call by stm
StartClientDisConnect()282 int MapMceInstanceClient::StartClientDisConnect()
283 {
284     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
285     int ret;
286     if (obexClientIns_ == nullptr) {
287         LOG_ERROR("%{public}s obexClientIns_ null", __PRETTY_FUNCTION__);
288         return BT_OPERATION_FAILED;
289     }
290     // obex callback will send msg Start Client DisConnect to mce stm
291     ret = obexClientIns_->Disconnect();
292     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
293     return ret;
294 }
295 
296 // call by stm
ObexConnectFailedDisConnect()297 int MapMceInstanceClient::ObexConnectFailedDisConnect()
298 {
299     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
300     int ret;
301     if (obexClientIns_ == nullptr) {
302         LOG_ERROR("%{public}s obexClientIns_ null", __PRETTY_FUNCTION__);
303         return BT_OPERATION_FAILED;
304     }
305     // obex callback will send msg Start Client DisConnect to mce stm
306     ret = obexClientIns_->Disconnect(false);
307     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
308     return ret;
309 }
310 
311 // call by stm
ProcessDisConnectFinish()312 void MapMceInstanceClient::ProcessDisConnectFinish()
313 {
314     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
315     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
316 
317     BtAddr addr = ((MapMceInstanceStm &)instanceStm_).GetBtAddress();
318     // unregister service security
319     int ret = GAPIF_DeregisterServiceSecurity(&addr, &securityInfo_);
320     if (ret != BT_SUCCESS) {
321         LOG_ERROR("%{public}s error,error=%{public}d", __PRETTY_FUNCTION__, ret);
322     }
323     if (masClientConfig_.isGoepL2capPSM_) {
324         BTM_RemoveRemoteL2capPsmForLogging(BTM_HCI_LOG_FILTER_MODULE_MAP, masClientConfig_.scn_, &addr);
325     } else {
326         BTM_RemoveRemoteRfcommScnChannelForLogging(BTM_HCI_LOG_FILTER_MODULE_MAP, masClientConfig_.scn_, &addr);
327     }
328 
329     // clear current request
330     currentRequestPtr_ = nullptr;
331 
332     resMasInstanceInfo_.isValid = false;
333     resMasInstanceInfo_.masInstanceInfoUtf8 = "";
334     resMasInstanceInfo_.ownerUciUtf8 = "";
335     // delete all the left request
336     ClientDeleteAllSavedRequestInternal();
337     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
338 }
339 
340 // call by stm
GetCurrentRequest()341 MceRequestType MapMceInstanceClient::GetCurrentRequest()
342 {
343     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
344     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
345     MceRequestType ret;
346     if (currentRequestPtr_ != nullptr) {
347         ret = currentRequestPtr_->GetRequestType();
348     } else {
349         ret = MCE_REQUEST_TYPE_IDLE;
350     }
351     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
352     return ret;
353 }
354 
355 // call by stm
ClientSendRequest(std::unique_ptr<MapMceInstanceRequest> & req)356 int MapMceInstanceClient::ClientSendRequest(std::unique_ptr<MapMceInstanceRequest> &req)
357 {
358     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
359     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
360 
361     int ret = req->SendRequest(*obexClientIns_);
362     if (ret == BT_SUCCESS) {
363         currentRequestPtr_ = std::move(req);
364         currentRequestPtr_->SaveReq();
365     }
366     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
367     return ret;
368 }
369 
370 // call by stm
ClientSaveRequest(std::unique_ptr<MapMceInstanceRequest> & req)371 void MapMceInstanceClient::ClientSaveRequest(std::unique_ptr<MapMceInstanceRequest> &req)
372 {
373     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
374     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
375 
376     req->SaveReq();
377     masRequestQue_.push_back(std::move(req));
378     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
379 }
380 
381 // call by device ctrl
ClientSendReqSetNotificationRegistration(bool value)382 int MapMceInstanceClient::ClientSendReqSetNotificationRegistration(bool value)
383 {
384     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
385     std::lock_guard<std::recursive_mutex> lock(stmMutex_);
386 
387     int ret = BT_SUCCESS;
388     if (obexClientIns_ == nullptr) {
389         return BT_OPERATION_FAILED;
390     }
391     // api only valid in connected state, if not valid return error at now
392     utility::Message outMsg(MSG_MASSTM_REQ_SEND_REQUEST_SELF);
393     std::unique_ptr<MapMceInstanceRequest> reqPtr =
394         std::make_unique<MapMceRequestSetNotificationRegistration>(value);
395     ((MapMceInstanceStm &)instanceStm_).MceProcessMessageWithRequestInternal(outMsg, reqPtr);
396     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
397     return ret;
398 }
399 
400 // call by stm
ClientSendReqSetPath(const uint8_t flags,const std::u16string & paths,std::vector<std::u16string> & pathList)401 int MapMceInstanceClient::ClientSendReqSetPath(
402     const uint8_t flags, const std::u16string &paths, std::vector<std::u16string> &pathList)
403 {
404     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
405     int ret = BT_SUCCESS;
406     if (obexClientIns_ == nullptr) {
407         return BT_OPERATION_FAILED;
408     }
409     // api only valid in connected state, if not valid return error at now
410     utility::Message outMsg(MSG_MASSTM_REQ_SEND_REQUEST_SELF);
411     std::unique_ptr<MapMceInstanceRequest> reqPtr = std::make_unique<MapMceRequestSetPath>(flags, paths, pathList);
412     ((MapMceInstanceStm &)instanceStm_).MceProcessMessageWithRequestInternal(outMsg, reqPtr);
413 
414     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
415     return ret;
416 }
417 
418 // call by stm
ClientSendReqGetMasInstanceInformation()419 int MapMceInstanceClient::ClientSendReqGetMasInstanceInformation()
420 {
421     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
422     // api only valid in connected state, if not valid return error at now
423     utility::Message outMsg(MSG_MASSTM_REQ_SEND_REQUEST_SELF);
424     std::unique_ptr<MapMceInstanceRequest> reqPtr =
425         std::make_unique<MapMceRequestGetMasInstanceInformation>(masSdpParamSave_.instanceId);
426     ((MapMceInstanceStm &)instanceStm_).MceProcessMessageWithRequestInternal(outMsg, reqPtr);
427 
428     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
429     return BT_SUCCESS;
430 }
431 
432 // call by stm
ClientProcResponseCommonProcess(const ObexHeader & resp)433 int MapMceInstanceClient::ClientProcResponseCommonProcess(const ObexHeader &resp)
434 {
435     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
436     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
437 
438     MapExecuteStatus resCode = MapExecuteStatus::NOT_SUPPORT;
439     int ret = MCE_RESPONSE_FINISH;
440     if (currentRequestPtr_ == nullptr) {
441         LOG_ERROR("%{public}s lost the current request pointer", __PRETTY_FUNCTION__);
442         return ret;
443     }
444     // process response
445     MapRequestResponseAction retAction;
446     ret = currentRequestPtr_->ProcessResponse(*this, resp, retAction);
447     uint8_t obexCode = resp.GetFieldCode();
448     LOG_INFO("%{public}s obexCode=%{public}d", __PRETTY_FUNCTION__, int(obexCode));
449     if ((obexCode == uint8_t(ObexRspCode::SUCCESS)) || (obexCode == uint8_t(ObexRspCode::CONTINUE))) {
450         if (ret == MCE_RESPONSE_FINISH_NG) {
451             resCode = MapExecuteStatus::NOT_SUPPORT;
452         } else if (ret == MCE_RESPONSE_CONTINUE_WITH_CALLBACK) {
453             resCode = MapExecuteStatus::CONTINUE;
454         } else {
455             resCode = MapExecuteStatus::SUCCEED;
456         }
457     }
458     if ((ret == MCE_RESPONSE_FINISH) || (ret == MCE_RESPONSE_FINISH_NG) ||
459         (ret == MCE_RESPONSE_CONTINUE_WITH_CALLBACK)) {  // FINISH OR FINISH NOCALLBACK
460         // execute callback to framework
461         ExcuteCallbackToFramework(retAction, resCode);
462     }
463     if ((ret == MCE_RESPONSE_FINISH) || (ret == MCE_RESPONSE_FINISH_NG) ||
464         (ret == MCE_RESPONSE_FINISH_NO_CALLBACK)) {  // FINISH OR FINISH NOCALLBACK
465         // destry request
466         currentRequestPtr_ = nullptr;
467     }
468     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
469     return ret;
470 }
471 
472 // call by device ctrl
ClientCountSendingRequest(MceRequestType requestType)473 int MapMceInstanceClient::ClientCountSendingRequest(MceRequestType requestType)
474 {
475     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
476     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
477 
478     int sum = 0;
479     MapMceInstanceRequest *requestPtr = nullptr;
480     // no request sending
481     if (currentRequestPtr_ == nullptr) {
482         return sum;
483     }
484     // count all
485     if (requestType == MCE_REQUEST_TYPE_ALL) {
486         // need add current
487         sum = 1 + masRequestQue_.size();
488         return sum;
489     }
490     // normal request
491     if (currentRequestPtr_->GetRequestType() == requestType) {
492         sum++;
493     }
494     for (auto it = masRequestQue_.begin(); it != masRequestQue_.end(); it++) {
495         requestPtr = it->get();
496         if (requestPtr != nullptr) {
497             if (requestPtr->GetRequestType() == requestType) {
498                 sum++;
499             }
500         }
501     }
502     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
503     return sum;
504 }
505 
506 // call by stm
ClientSendSavedRequest()507 int MapMceInstanceClient::ClientSendSavedRequest()
508 {
509     LOG_INFO("%{public}s enter,request.size=%{public}d", __PRETTY_FUNCTION__, int(masRequestQue_.size()));
510     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
511 
512     int ret = BT_OPERATION_FAILED;
513     currentRequestPtr_ = nullptr;
514     std::unique_ptr<MapMceInstanceRequest> nextReq = nullptr;
515     while (masRequestQue_.size() != 0) {
516         // send request continue
517         nextReq = std::move(masRequestQue_.front());
518         masRequestQue_.pop_front();
519         ret = nextReq->SendRequest(*obexClientIns_);
520         if (ret == BT_SUCCESS) {
521             currentRequestPtr_ = std::move(nextReq);
522             break;
523         } else {
524             currentRequestPtr_ = nullptr;
525             nextReq = nullptr;
526             LOG_ERROR("%{public}s obex send request error,ret=%{public}d", __PRETTY_FUNCTION__, ret);
527         }
528     }
529     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
530     return ret;
531 }
532 
533 // call by stm
ClientDeleteAllSavedRequest()534 void MapMceInstanceClient::ClientDeleteAllSavedRequest()
535 {
536     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
537     std::lock_guard<std::recursive_mutex> lock(mceSendRequestMutex_);
538 
539     ClientDeleteAllSavedRequestInternal();
540     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
541 }
542 
ClientDeleteAllSavedRequestInternal()543 void MapMceInstanceClient::ClientDeleteAllSavedRequestInternal()
544 {
545     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
546     while (masRequestQue_.size() != 0) {
547         masRequestQue_.pop_front();
548     }
549     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
550 }
551 
552 // call by request, by stm
SaveMasInstanceInformation(const MasInstanceInformation & instInfo)553 void MapMceInstanceClient::SaveMasInstanceInformation(const MasInstanceInformation &instInfo)
554 {
555     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
556     resMasInstanceInfo_ = instInfo;
557 }
558 
559 // call by device ctrl
GetMasInstanceInformation()560 MasInstanceInformation MapMceInstanceClient::GetMasInstanceInformation()
561 {
562     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
563     std::lock_guard<std::recursive_mutex> lock(stmMutex_);
564 
565     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
566     return resMasInstanceInfo_;
567 }
568 
569 // internal
CheckSupportedFeatures(int mask) const570 bool MapMceInstanceClient::CheckSupportedFeatures(int mask) const
571 {
572     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
573     if (masSdpParamSave_.supportedFeatrue & mask) {
574         return true;
575     } else {
576         return false;
577     }
578 }
579 
580 // internal
ExcuteCallbackToFramework(MapRequestResponseAction & retAction,MapExecuteStatus resCode)581 void MapMceInstanceClient::ExcuteCallbackToFramework(MapRequestResponseAction &retAction, MapExecuteStatus resCode)
582 {
583     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
584     if ((retAction.action_ == MapActionType::GET_MESSAGE) ||
585         (retAction.action_ == MapActionType::GET_UNREAD_MESSAGES)) {
586         IProfileBMessage bmsg;
587         bmsg.bMessageParam_ = retAction.bmessage_.GetBMessageData();
588         bmsg.bMessageStringObject_ = retAction.bmessage_.GetBmessageObject();
589         bmsg.FractionDeliver = retAction.bmessage_.GetFractionDeliver();
590         observerMgrPtr_.ExcuteObserverOnBmessageCompleted(
591             ((MapMceInstanceStm &)instanceStm_).GetBtDevice(), bmsg, resCode);
592     } else if (retAction.action_ == MapActionType::GET_MESSAGES_LISTING) {
593         IProfileMessagesListing msgListing;
594         msgListing.messageOutlineList_ = retAction.messageList_.GetList();
595         msgListing.messagesListingParam_ = retAction.messageList_.GetParam();
596         msgListing.messagesListingStringObject_ = retAction.messageList_.GetStringObject();
597         observerMgrPtr_.ExcuteObserverOnMessagesListingCompleted(
598             ((MapMceInstanceStm &)instanceStm_).GetBtDevice(), msgListing, resCode);
599     } else if (retAction.action_ == MapActionType::GET_CONVERSATION_LISTING) {
600         IProfileConversationListing convListing;
601         convListing.conversationOutlineList_ = retAction.conversationList_.GetList();
602         convListing.conversationListingParam_ = retAction.conversationList_.GetParam();
603         convListing.conversationListingStringObject_ = retAction.conversationList_.GetStringObject();
604         observerMgrPtr_.ExcuteObserverOnConversationListingCompleted(
605             ((MapMceInstanceStm &)instanceStm_).GetBtDevice(), convListing, resCode);
606     } else {
607         IProfileMapAction prifileAction;
608         prifileAction.action_ = retAction.action_;
609         prifileAction.ownerStatus_ = retAction.ownerStatus_;
610         prifileAction.supportedFeatures_ = retAction.supportedFeatures;
611         observerMgrPtr_.ExcuteObserverOnMapActionCompleted(
612             ((MapMceInstanceStm &)instanceStm_).GetBtDevice(), prifileAction, resCode);
613     }
614     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
615 }
616 
~MasObexClientObserver()617 MapMceInstanceClient::MasObexClientObserver::~MasObexClientObserver()
618 {
619     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
620 }
621 
OnTransportFailed(ObexClient & client,int errCd)622 void MapMceInstanceClient::MasObexClientObserver::OnTransportFailed(ObexClient &client, int errCd)
623 {
624     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
625     utility::Message msg = MSG_MASSTM_OBEX_TRANSPORT_FAILED;
626     msg.arg1_ = errCd;
627     // post msg to mns state machine instance. execute in mns service thread
628     ((MapMceInstanceStm &)obexObserverInstStm_).PostMessage(msg);
629     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
630 }
631 
OnConnected(ObexClient & client,const ObexHeader & resp)632 void MapMceInstanceClient::MasObexClientObserver::OnConnected(ObexClient &client, const ObexHeader &resp)
633 {
634     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
635     utility::Message msg = MSG_MASSTM_OBEX_CONNECTED;
636     // post msg to mns state machine instance. execute in mns service thread
637     ((MapMceInstanceStm &)obexObserverInstStm_).PostMessage(msg);
638     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
639 }
640 
OnConnectFailed(ObexClient & client,const ObexHeader & resp)641 void MapMceInstanceClient::MasObexClientObserver::OnConnectFailed(ObexClient &client, const ObexHeader &resp)
642 {
643     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
644     ObexHeader *tempPtr = const_cast<ObexHeader *>(&resp);
645     utility::Message msg(MSG_MASSTM_OBEX_CONNECTED_FAILED);
646     // save error code
647     msg.arg1_ = int(tempPtr->GetFieldCode());
648     // post msg to mns state machine instance. execute in mns service thread
649     ((MapMceInstanceStm &)obexObserverInstStm_).PostMessage(msg);
650     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
651 }
652 
OnDisconnected(ObexClient & client)653 void MapMceInstanceClient::MasObexClientObserver::OnDisconnected(ObexClient &client)
654 {
655     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
656     utility::Message msg = MSG_MASSTM_OBEX_DISCONNECTED;
657     // post msg to mns state machine instance. execute in mns service thread
658     ((MapMceInstanceStm &)obexObserverInstStm_).PostMessage(msg);
659     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
660 }
661 
OnActionCompleted(ObexClient & client,const ObexHeader & resp)662 void MapMceInstanceClient::MasObexClientObserver::OnActionCompleted(ObexClient &client, const ObexHeader &resp)
663 {
664     LOG_INFO("%{public}s enter", __PRETTY_FUNCTION__);
665     // action finish
666     utility::Message msg(MSG_MASSTM_RECEIVE_REQUEST_COMPLETED);
667     ((MapMceInstanceStm &)obexObserverInstStm_).PostMessageWithObexHeader(msg, resp);
668     LOG_INFO("%{public}s end", __PRETTY_FUNCTION__);
669 }
670 
OnBusy(ObexClient & client,bool isBusy)671 void MapMceInstanceClient::MasObexClientObserver::OnBusy(ObexClient &client, bool isBusy)
672 {
673     LOG_INFO("%{public}s execute", __PRETTY_FUNCTION__);
674     utility::Message msg = MSG_MASSTM_OBEX_INFO_CHG_CONTINUEBUSY_STATUS;
675     msg.arg1_ = int(isBusy);
676     ((MapMceInstanceStm &)obexObserverInstStm_).PostMessage(msg);
677 }
678 }  // namespace bluetooth
679 }  // namespace OHOS
680