• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "pin_holder.h"
17 
18 #include "dm_anonymous.h"
19 #include "dm_crypto.h"
20 #include "dm_log.h"
21 #include "dm_radar_helper.h"
22 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
23 #include "multiple_user_connector.h"
24 #endif
25 
26 namespace OHOS {
27 namespace DistributedHardware {
28 constexpr int32_t SESSION_SIDE_SERVER = 0;
29 constexpr int32_t SESSION_ID_INVALID = -1;
30 constexpr int32_t REPLY_SUCCESS = 0;
31 constexpr int32_t REPLY_FAILED = -1;
32 
33 constexpr int32_t MSG_TYPE_CREATE_PIN_HOLDER = 600;
34 constexpr int32_t MSG_TYPE_CREATE_PIN_HOLDER_RESP = 601;
35 constexpr int32_t MSG_TYPE_DESTROY_PIN_HOLDER = 650;
36 constexpr int32_t MSG_TYPE_DESTROY_PIN_HOLDER_RESP = 651;
37 constexpr int32_t MSG_TYPE_PIN_HOLDER_CHANGE = 700;
38 constexpr int32_t MSG_TYPE_PIN_HOLDER_CHANGE_RESP = 701;
39 constexpr int32_t MSG_TYPE_PIN_CLOSE_SESSION = 800;
40 
41 constexpr const char* PINHOLDER_CREATE_TIMEOUT_TASK = "deviceManagerTimer:pinholdercreate";
42 constexpr int32_t PIN_HOLDER_SESSION_CREATE_TIMEOUT = 60;
43 
44 constexpr const char* TAG_PIN_TYPE = "PIN_TYPE";
45 constexpr const char* TAG_PAYLOAD = "PAYLOAD";
46 constexpr const char* TAG_REPLY = "REPLY";
47 constexpr const char* TAG_REMOTE_DEVICE_ID = "REMOTE_DEVICE_ID";
48 
49 constexpr int32_t DM_OK = 0;
50 constexpr int32_t ERR_DM_FAILED = 96929744;
51 constexpr int32_t ERR_DM_TIME_OUT = 96929745;
52 constexpr int32_t ERR_DM_CREATE_PIN_HOLDER_BUSY = 96929821;
53 constexpr const char* TAG_MSG_TYPE = "MSG_TYPE";
54 constexpr const char* TAG_DM_VERSION = "DM_VERSION";
55 constexpr const char* DM_CONNECTION_DISCONNECTED = "DM_CONNECTION_DISCONNECTED";
56 constexpr int32_t DEVICE_UUID_LENGTH = 65;
57 constexpr int32_t ERR_DM_INPUT_PARA_INVALID = 96929749;
58 constexpr int32_t ERR_DM_BIND_PEER_UNSUPPORTED = 96929802;
PinHolder(std::shared_ptr<IDeviceManagerServiceListener> listener)59 PinHolder::PinHolder(std::shared_ptr<IDeviceManagerServiceListener> listener): listener_(listener)
60 {
61     if (session_ == nullptr) {
62         session_ = std::make_shared<PinHolderSession>();
63     }
64     if (timer_ == nullptr) {
65         timer_ = std::make_shared<DmTimer>();
66     }
67     sinkState_ = SINK_INIT;
68     sourceState_ = SOURCE_INIT;
69 }
70 
~PinHolder()71 PinHolder::~PinHolder()
72 {
73     if (session_ != nullptr) {
74         session_->UnRegisterSessionCallback();
75         session_ = nullptr;
76     }
77     if (timer_ != nullptr) {
78         timer_->DeleteAll();
79         timer_ = nullptr;
80     }
81 }
82 
RegisterPinHolderCallback(const std::string & pkgName)83 int32_t PinHolder::RegisterPinHolderCallback(const std::string &pkgName)
84 {
85     if (session_ == nullptr) {
86         LOGE("RegisterPinHolderCallback session is nullptr.");
87         return ERR_DM_FAILED;
88     }
89     int32_t userId = -1;
90 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
91     MultipleUserConnector::GetCallerUserId(userId);
92 #endif
93     processInfo_.userId = userId;
94     processInfo_.pkgName = pkgName;
95     session_->RegisterSessionCallback(shared_from_this());
96     return DM_OK;
97 }
98 
CreatePinHolder(const std::string & pkgName,const PeerTargetId & targetId,DmPinType pinType,const std::string & payload)99 int32_t PinHolder::CreatePinHolder(const std::string &pkgName,
100     const PeerTargetId &targetId, DmPinType pinType, const std::string &payload)
101 {
102     LOGI("CreatePinHolder.");
103     if (processInfo_.pkgName.empty() || processInfo_.pkgName != pkgName) {
104         LOGE("CreatePinHolder pkgName: %{public}s is not register callback.", pkgName.c_str());
105         return ERR_DM_FAILED;
106     }
107     int32_t ret = CheckTargetIdVaild(targetId);
108     if (ret != DM_OK) {
109         LOGE("CreatePinHolder targetId is invalid.");
110         return ret;
111     }
112     if (listener_ == nullptr || session_ == nullptr) {
113         LOGE("CreatePinHolder listener or session is nullptr.");
114         return ERR_DM_FAILED;
115     }
116     if (sourceState_ != SOURCE_INIT) {
117         LOGE("CreatePinHolder failed, state is %{public}d.", sourceState_);
118         return ERR_DM_FAILED;
119     }
120     if (sessionId_ != SESSION_ID_INVALID) {
121         LOGI("CreatePinHolder session already create, sessionId: %{public}d.", sessionId_);
122         CreateGeneratePinHolderMsg();
123         return DM_OK;
124     }
125 
126     sessionId_ = session_->OpenSessionServer(targetId);
127     int32_t stageRes =
128         sessionId_ > 0 ? static_cast<int32_t>(StageRes::STAGE_SUCC) : static_cast<int32_t>(StageRes::STAGE_FAIL);
129     DmRadarHelper::GetInstance().ReportCreatePinHolder(
130         processInfo_.pkgName, sessionId_, targetId.deviceId, sessionId_, stageRes);
131     if (sessionId_ < 0) {
132         LOGE("[SOFTBUS]open session error, sessionId: %{public}d.", sessionId_);
133         listener_->OnCreateResult(processInfo_, sessionId_);
134         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT,
135             sessionId_, "");
136         sessionId_ = SESSION_ID_INVALID;
137         return sessionId_;
138     }
139     pinType_ = pinType;
140     payload_ = payload;
141     return DM_OK;
142 }
143 
DestroyPinHolder(const std::string & pkgName,const PeerTargetId & targetId,DmPinType pinType,const std::string & payload)144 int32_t PinHolder::DestroyPinHolder(const std::string &pkgName, const PeerTargetId &targetId, DmPinType pinType,
145     const std::string &payload)
146 {
147     LOGI("DestroyPinHolder.");
148     if (listener_ == nullptr || session_ == nullptr) {
149         LOGE("DestroyPinHolder listener or session is nullptr.");
150         return ERR_DM_FAILED;
151     }
152     if (processInfo_.pkgName.empty() || pkgName != processInfo_.pkgName) {
153         LOGE("DestroyPinHolder pkgName: %{public}s is not register callback.", pkgName.c_str());
154         return ERR_DM_FAILED;
155     }
156     int32_t ret = CheckTargetIdVaild(targetId);
157     if (ret != DM_OK) {
158         LOGE("DestroyPinHolder targetId is invalid.");
159         return ret;
160     }
161     if (sessionId_ == SESSION_ID_INVALID) {
162         LOGI("DestroyPinHolder session already destroy.");
163         listener_->OnDestroyResult(processInfo_, ret);
164         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, ret, "");
165         return ret;
166     }
167     if (sourceState_ != SOURCE_CREATE) {
168         LOGE("DestroyPinHolder failed, state is %{public}d.", sourceState_);
169         return ERR_DM_FAILED;
170     }
171     if (timer_ != nullptr) {
172         timer_->DeleteTimer(PINHOLDER_CREATE_TIMEOUT_TASK);
173     }
174 
175     JsonObject jsonObj;
176     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_DESTROY_PIN_HOLDER;
177     jsonObj[TAG_PIN_TYPE] = pinType;
178     jsonObj[TAG_PAYLOAD] = payload;
179     pinType_ = pinType;
180     std::string message = SafetyDump(jsonObj);
181     LOGI("DestroyPinHolder, message type is: %{public}d, pin type is: %{public}d.", MSG_TYPE_DESTROY_PIN_HOLDER,
182         pinType);
183     ret = session_->SendData(sessionId_, message);
184     int32_t stageRes =
185         ret == DM_OK ? static_cast<int32_t>(StageRes::STAGE_SUCC) : static_cast<int32_t>(StageRes::STAGE_FAIL);
186     DmRadarHelper::GetInstance().ReportDestroyPinHolder(processInfo_.pkgName, targetId.deviceId, ret, stageRes);
187     if (ret != DM_OK) {
188         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
189         listener_->OnDestroyResult(processInfo_, ERR_DM_FAILED);
190         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, ERR_DM_FAILED, "");
191         return ret;
192     }
193     return ret;
194 }
195 
CreateGeneratePinHolderMsg()196 int32_t PinHolder::CreateGeneratePinHolderMsg()
197 {
198     if (listener_ == nullptr || session_ == nullptr) {
199         LOGE("CreateGeneratePinHolderMsg listener or session is nullptr.");
200         return ERR_DM_FAILED;
201     }
202     if (timer_ != nullptr) {
203         timer_->DeleteAll();
204         timer_->StartTimer(std::string(PINHOLDER_CREATE_TIMEOUT_TASK), PIN_HOLDER_SESSION_CREATE_TIMEOUT,
205             [this] (std::string name) {
206                 PinHolder::CloseSession(name);
207             });
208     }
209     JsonObject jsonObj;
210     jsonObj[TAG_PIN_TYPE] = pinType_;
211     jsonObj[TAG_PAYLOAD] = payload_;
212     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_CREATE_PIN_HOLDER;
213     jsonObj[TAG_DM_VERSION] = "";
214     std::string message = SafetyDump(jsonObj);
215     LOGI("CreateGeneratePinHolderMsg, message type is: %{public}d, pin type is: %{public}d.",
216         MSG_TYPE_CREATE_PIN_HOLDER, pinType_);
217     int32_t ret = session_->SendData(sessionId_, message);
218     int32_t bizStage = static_cast<int32_t>(PinHolderStage::SEND_CREATE_PIN_HOLDER_MSG);
219     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(bizStage,
220         std::string("CreateGeneratePinHolderMsg"), "");
221     if (ret != DM_OK) {
222         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
223         listener_->OnCreateResult(processInfo_, ret);
224         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, ret, "");
225         return ret;
226     }
227     return ret;
228 }
229 
ParseMsgType(const std::string & message)230 int32_t PinHolder::ParseMsgType(const std::string &message)
231 {
232     JsonObject jsonObject(message);
233     if (jsonObject.IsDiscarded()) {
234         LOGE("ParseMsgType DecodeRequest jsonStr error");
235         return ERR_DM_FAILED;
236     }
237     if (!IsInt32(jsonObject, TAG_MSG_TYPE)) {
238         LOGE("ParseMsgType err json string.");
239         return ERR_DM_FAILED;
240     }
241     int32_t msgType = jsonObject[TAG_MSG_TYPE].Get<int32_t>();
242     return msgType;
243 }
244 
ProcessCloseSessionMsg(const std::string & message)245 void PinHolder::ProcessCloseSessionMsg(const std::string &message)
246 {
247     if (listener_ == nullptr || session_ == nullptr) {
248         LOGE("ProcessCloseSessionMsg listener or session is nullptr.");
249         return;
250     }
251     LOGI("CloseSessionMsg, message type is: %{public}d.", MSG_TYPE_PIN_CLOSE_SESSION);
252     session_->CloseSessionServer(sessionId_);
253     sessionId_ = SESSION_ID_INVALID;
254     sourceState_ = SOURCE_INIT;
255     sinkState_ = SINK_INIT;
256     listener_->OnCreateResult(processInfo_, ERR_DM_CREATE_PIN_HOLDER_BUSY);
257 }
258 
ProcessCreateMsg(const std::string & message)259 void PinHolder::ProcessCreateMsg(const std::string &message)
260 {
261     if (listener_ == nullptr || session_ == nullptr) {
262         LOGE("ProcessCreateMsg listener or session is nullptr.");
263         return;
264     }
265     JsonObject jsonObject(message);
266     if (jsonObject.IsDiscarded()) {
267         LOGE("ProcessCreateMsg DecodeRequest jsonStr error");
268         return;
269     }
270     if (!IsInt32(jsonObject, TAG_PIN_TYPE) || !IsString(jsonObject, TAG_PAYLOAD)) {
271         LOGE("ProcessCreateMsg err json string.");
272         return;
273     }
274     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
275     std::string payload = jsonObject[TAG_PAYLOAD].Get<std::string>();
276     isRemoteSupported_ = jsonObject.Contains(TAG_DM_VERSION);
277     int32_t bizStage = static_cast<int32_t>(PinHolderStage::RECEIVE_CREATE_PIN_HOLDER_MSG);
278     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(bizStage, std::string("ProcessCreateMsg"), "");
279     JsonObject jsonObj;
280     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_CREATE_PIN_HOLDER_RESP;
281     if (sinkState_ != SINK_INIT) {
282         jsonObj[TAG_REPLY] = REPLY_FAILED;
283     } else {
284         jsonObj[TAG_REPLY] = REPLY_SUCCESS;
285         sinkState_ = SINK_CREATE;
286         sourceState_ = SOURCE_CREATE;
287         listener_->OnPinHolderCreate(processInfo_, remoteDeviceId_, pinType, payload);
288         JsonObject jsonContent;
289         jsonContent[TAG_PIN_TYPE] = pinType;
290         jsonContent[TAG_PAYLOAD] = payload;
291         jsonContent[TAG_REMOTE_DEVICE_ID] = remoteDeviceId_;
292         std::string content = SafetyDump(jsonContent);
293         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE, DM_OK, content);
294     }
295     jsonObj[TAG_DM_VERSION] = "";
296 
297     std::string msg = SafetyDump(jsonObj);
298     LOGI("ProcessCreateMsg, message type is: %{public}d.", MSG_TYPE_CREATE_PIN_HOLDER_RESP);
299     int32_t ret = session_->SendData(sessionId_, msg);
300     if (ret != DM_OK) {
301         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
302         return;
303     }
304 }
305 
ProcessCreateRespMsg(const std::string & message)306 void PinHolder::ProcessCreateRespMsg(const std::string &message)
307 {
308     JsonObject jsonObject(message);
309     if (jsonObject.IsDiscarded()) {
310         LOGE("ProcessCreateRespMsg DecodeRequest jsonStr error.");
311         return;
312     }
313     if (!IsInt32(jsonObject, TAG_REPLY)) {
314         LOGE("ProcessCreateRespMsg err json string.");
315         return;
316     }
317     isRemoteSupported_ = jsonObject.Contains(TAG_DM_VERSION);
318     int32_t reply = jsonObject[TAG_REPLY].Get<int32_t>();
319     if (listener_ == nullptr || session_ == nullptr) {
320         LOGE("ProcessCreateRespMsg listener or session is nullptr.");
321         return;
322     }
323     if (reply == REPLY_SUCCESS) {
324         listener_->OnCreateResult(processInfo_, DM_OK);
325         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, DM_OK, "");
326         sourceState_ = SOURCE_CREATE;
327         sinkState_ = SINK_CREATE;
328     } else {
329         LOGE("ProcessCreateRespMsg remote state is wrong.");
330         listener_->OnCreateResult(processInfo_, ERR_DM_FAILED);
331         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, ERR_DM_FAILED, "");
332         session_->CloseSessionServer(sessionId_);
333         sessionId_ = SESSION_ID_INVALID;
334         destroyState_ = STATE_REMOTE_WRONG;
335         sourceState_ = SOURCE_INIT;
336         sinkState_ = SINK_INIT;
337     }
338 }
339 
ProcessDestroyMsg(const std::string & message)340 void PinHolder::ProcessDestroyMsg(const std::string &message)
341 {
342     if (listener_ == nullptr || session_ == nullptr) {
343         LOGE("ProcessDestroyMsg listener or session is nullptr.");
344         return;
345     }
346     JsonObject jsonObject(message);
347     if (jsonObject.IsDiscarded()) {
348         LOGE("ProcessDestroyMsg DecodeRequest jsonStr error.");
349         return;
350     }
351     if (!IsInt32(jsonObject, TAG_PIN_TYPE) || !IsString(jsonObject, TAG_PAYLOAD)) {
352         LOGE("ProcessDestroyMsg err json string.");
353         return;
354     }
355     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
356     std::string payload = jsonObject[TAG_PAYLOAD].Get<std::string>();
357     int32_t bizStage = static_cast<int32_t>(PinHolderStage::RECEIVE_DESTROY_PIN_HOLDER_MSG);
358     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(bizStage, std::string("ProcessDestroyMsg"), "");
359     JsonObject jsonObj;
360     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_DESTROY_PIN_HOLDER_RESP;
361     if (sinkState_ != SINK_CREATE) {
362         jsonObj[TAG_REPLY] = REPLY_FAILED;
363     } else {
364         jsonObj[TAG_REPLY] = REPLY_SUCCESS;
365         sinkState_ = SINK_INIT;
366         sourceState_ = SOURCE_INIT;
367         if (!isDestroy_.load()) {
368             listener_->OnPinHolderDestroy(processInfo_, pinType, payload);
369             JsonObject jsonContent;
370             jsonContent[TAG_PIN_TYPE] = pinType;
371             jsonContent[TAG_PAYLOAD] = payload;
372             std::string content = SafetyDump(jsonContent);
373             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, DM_OK, content);
374             isDestroy_.store(true);
375         }
376     }
377 
378     std::string msg = SafetyDump(jsonObj);
379     LOGI("ProcessDestroyMsg, message type is: %{public}d.", MSG_TYPE_DESTROY_PIN_HOLDER_RESP);
380     int32_t ret = session_->SendData(sessionId_, msg);
381     if (ret != DM_OK) {
382         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
383         return;
384     }
385 }
386 
CloseSession(const std::string & name)387 void PinHolder::CloseSession(const std::string &name)
388 {
389     LOGI("PinHolder::CloseSession start timer name %{public}s.", name.c_str());
390     if (session_ == nullptr) {
391         LOGE("CloseSession session is nullptr.");
392         return;
393     }
394     JsonObject jsonObj;
395     jsonObj[DM_CONNECTION_DISCONNECTED] = true;
396     std::string payload = SafetyDump(jsonObj);
397     if (listener_ != nullptr && !isDestroy_.load()) {
398         listener_->OnPinHolderDestroy(processInfo_, pinType_, payload);
399         JsonObject jsonContent;
400         jsonContent[TAG_PIN_TYPE] = pinType_;
401         jsonContent[TAG_PAYLOAD] = payload;
402         std::string content = SafetyDump(jsonContent);
403         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, ERR_DM_TIME_OUT, content);
404         isDestroy_.store(true);
405     }
406     session_->CloseSessionServer(sessionId_);
407     if (timer_ != nullptr) {
408         timer_->DeleteAll();
409     }
410     destroyState_ = STATE_TIME_OUT;
411     sessionId_ = SESSION_ID_INVALID;
412     sinkState_ = SINK_INIT;
413     sourceState_ = SOURCE_INIT;
414     remoteDeviceId_ = "";
415     isRemoteSupported_ = false;
416 }
417 
ProcessDestroyResMsg(const std::string & message)418 void PinHolder::ProcessDestroyResMsg(const std::string &message)
419 {
420     JsonObject jsonObject(message);
421     if (jsonObject.IsDiscarded()) {
422         LOGE("ProcessDestroyResMsg DecodeRequest jsonStr error.");
423         return;
424     }
425     if (!IsInt32(jsonObject, TAG_REPLY)) {
426         LOGE("ProcessDestroyResMsg err json string.");
427         return;
428     }
429     int32_t reply = jsonObject[TAG_REPLY].Get<int32_t>();
430     if (listener_ == nullptr || session_ == nullptr) {
431         LOGE("ProcessDestroyResMsg listener or session is nullptr.");
432         return;
433     }
434     if (reply == REPLY_SUCCESS) {
435         listener_->OnDestroyResult(processInfo_, DM_OK);
436         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, DM_OK, "");
437         sourceState_ = SOURCE_INIT;
438         sinkState_ = SINK_INIT;
439         if (timer_ != nullptr) {
440             timer_->DeleteAll();
441         }
442     } else {
443         LOGE("ProcessDestroyResMsg remote state is wrong.");
444         listener_->OnDestroyResult(processInfo_, ERR_DM_FAILED);
445         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, ERR_DM_FAILED, "");
446         sinkState_ = SINK_INIT;
447         sourceState_ = SOURCE_INIT;
448     }
449     session_->CloseSessionServer(sessionId_);
450     sessionId_ = SESSION_ID_INVALID;
451     remoteDeviceId_ = "";
452 }
453 
OnDataReceived(int32_t sessionId,std::string message)454 void PinHolder::OnDataReceived(int32_t sessionId, std::string message)
455 {
456     int32_t msgType = ParseMsgType(message);
457     LOGI("OnDataReceived, msgType: %{public}d.", msgType);
458     int32_t sessionSide = GetSessionSide(sessionId);
459     if (sessionSide == SESSION_SIDE_SERVER && sessionId != sessionId_) {
460         LOGE("another session opened, close this sessionId: %{public}d.", sessionId);
461         JsonObject jsonObj;
462         jsonObj[TAG_MSG_TYPE] = MSG_TYPE_PIN_CLOSE_SESSION;
463         std::string msg = SafetyDump(jsonObj);
464         int32_t ret = session_->SendData(sessionId, msg);
465         if (ret != DM_OK) {
466             LOGE("[SOFTBUS] SendBytes failed. ret: %{public}d.", ret);
467             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, ERR_DM_FAILED, "");
468         }
469         return;
470     }
471     switch (msgType) {
472         case MSG_TYPE_PIN_CLOSE_SESSION:
473             ProcessCloseSessionMsg(message);
474             break;
475         case MSG_TYPE_CREATE_PIN_HOLDER:
476             ProcessCreateMsg(message);
477             break;
478         case MSG_TYPE_CREATE_PIN_HOLDER_RESP:
479             ProcessCreateRespMsg(message);
480             break;
481         case MSG_TYPE_DESTROY_PIN_HOLDER:
482             ProcessDestroyMsg(message);
483             break;
484         case MSG_TYPE_DESTROY_PIN_HOLDER_RESP:
485             ProcessDestroyResMsg(message);
486             break;
487         case MSG_TYPE_PIN_HOLDER_CHANGE:
488             ProcessChangeMsg(message);
489             break;
490         case MSG_TYPE_PIN_HOLDER_CHANGE_RESP:
491             ProcessChangeRespMsg(message);
492             break;
493         default:
494             break;
495     }
496 }
497 
GetPeerDeviceId(int32_t sessionId,std::string & udidHash)498 void PinHolder::GetPeerDeviceId(int32_t sessionId, std::string &udidHash)
499 {
500     char peerDeviceId[DEVICE_UUID_LENGTH] = {0};
501     int32_t ret = ::GetPeerDeviceId(sessionId, &peerDeviceId[0], DEVICE_UUID_LENGTH);
502     if (ret != DM_OK) {
503         LOGE("[SOFTBUS]GetPeerDeviceId failed for session: %{public}d.", sessionId);
504         udidHash = "";
505         return;
506     }
507     std::string deviceId = peerDeviceId;
508     char udidHashTmp[DM_MAX_DEVICE_ID_LEN] = {0};
509     if (Crypto::GetUdidHash(deviceId, reinterpret_cast<uint8_t *>(udidHashTmp)) != DM_OK) {
510         LOGE("get udidhash by udid: %{public}s failed.", GetAnonyString(deviceId).c_str());
511         udidHash = "";
512         return;
513     }
514     udidHash = udidHashTmp;
515     LOGI("GetPeerDeviceId udid hash: %{public}s success.", GetAnonyString(udidHash).c_str());
516 }
517 
OnSessionOpened(int32_t sessionId,int32_t sessionSide,int32_t result)518 void PinHolder::OnSessionOpened(int32_t sessionId, int32_t sessionSide, int32_t result)
519 {
520     isDestroy_.store(false);
521     destroyState_ = STATE_UNKNOW;
522     char peerDeviceId[DEVICE_UUID_LENGTH] = {0};
523     int32_t ret = ::GetPeerDeviceId(sessionId, &peerDeviceId[0], DEVICE_UUID_LENGTH);
524     if (ret != DM_OK) {
525         LOGE("[SOFTBUS]GetPeerDeviceId failed for session: %{public}d.", sessionId);
526     }
527     LOGI("OnSessionOpened, peerDeviceId: %{public}s.", GetAnonyString(peerDeviceId).c_str());
528     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(static_cast<int32_t>(PinHolderStage::SESSION_OPENED),
529         std::string("OnSessionOpened"), std::string(peerDeviceId));
530     if (sessionSide == SESSION_SIDE_SERVER) {
531         LOGI("[SOFTBUS]onSesssionOpened success, side is sink. sessionId: %{public}d.", sessionId);
532         GetPeerDeviceId(sessionId, remoteDeviceId_);
533         if (sessionId_ == SESSION_ID_INVALID) {
534             sessionId_ = sessionId;
535         }
536         return;
537     }
538     sessionId_ = sessionId;
539     if (result == DM_OK) {
540         CreateGeneratePinHolderMsg();
541         return;
542     }
543     LOGE("[SOFTBUS]onSesssionOpened failed. sessionId: %{public}d.", sessionId);
544     sessionId_ = SESSION_ID_INVALID;
545     if (listener_ != nullptr) {
546         listener_->OnCreateResult(processInfo_, result);
547         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, result, "");
548     }
549     return;
550 }
551 
OnSessionClosed(int32_t sessionId)552 void PinHolder::OnSessionClosed(int32_t sessionId)
553 {
554     if (sessionId != sessionId_) {
555         return;
556     }
557     LOGI("[SOFTBUS]OnSessionClosed sessionId: %{public}d.", sessionId);
558     sessionId_ = SESSION_ID_INVALID;
559     sinkState_ = SINK_INIT;
560     sourceState_ = SOURCE_INIT;
561     remoteDeviceId_ = "";
562     isRemoteSupported_ = false;
563     JsonObject jsonObj;
564     jsonObj[DM_CONNECTION_DISCONNECTED] = true;
565     std::string payload = SafetyDump(jsonObj);
566     if (listener_ != nullptr && !isDestroy_.load()) {
567         listener_->OnPinHolderDestroy(processInfo_, pinType_, payload);
568         JsonObject jsonContent;
569         jsonContent[TAG_PIN_TYPE] = pinType_;
570         jsonContent[TAG_PAYLOAD] = payload;
571         std::string content = SafetyDump(jsonContent);
572         if (destroyState_ == STATE_UNKNOW) {
573             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, sessionId, content);
574         } else if (destroyState_ == STATE_REMOTE_WRONG) {
575             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, ERR_DM_FAILED, content);
576         } else if (destroyState_ == STATE_TIME_OUT) {
577             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, ERR_DM_TIME_OUT, content);
578         }
579         isDestroy_.store(true);
580     }
581     if (timer_ != nullptr) {
582         timer_->DeleteAll();
583     }
584     return;
585 }
586 
CheckTargetIdVaild(const PeerTargetId & targetId)587 int32_t PinHolder::CheckTargetIdVaild(const PeerTargetId &targetId)
588 {
589     if (targetId.deviceId.empty() && targetId.brMac.empty() && targetId.bleMac.empty() && targetId.wifiIp.empty()) {
590         LOGE("CheckTargetIdVaild failed. targetId is empty.");
591         return ERR_DM_INPUT_PARA_INVALID;
592     }
593     return DM_OK;
594 }
595 
NotifyPinHolderEvent(const std::string & pkgName,const std::string & event)596 int32_t PinHolder::NotifyPinHolderEvent(const std::string &pkgName, const std::string &event)
597 {
598     LOGI("NotifyPinHolderEvent.");
599     if (listener_ == nullptr || session_ == nullptr) {
600         LOGE("NotifyPinHolderEvent listener or session is nullptr.");
601         return ERR_DM_FAILED;
602     }
603     if (processInfo_.pkgName.empty() || pkgName != processInfo_.pkgName || event.empty()) {
604         LOGE("NotifyPinHolderEvent pkgName: %{public}s is not register callback.", pkgName.c_str());
605         return ERR_DM_FAILED;
606     }
607     if (sessionId_ == SESSION_ID_INVALID) {
608         LOGE("NotifyPinHolderEvent session invalid.");
609         return ERR_DM_FAILED;
610     }
611     if (!isRemoteSupported_) {
612         LOGE("NotifyPinHolderEvent failed, remote not support.");
613         return ERR_DM_BIND_PEER_UNSUPPORTED;
614     }
615     JsonObject jsonObject(event);
616     if (jsonObject.IsDiscarded() || !IsInt32(jsonObject, TAG_PIN_TYPE)) {
617         LOGE("ProcessChangeMsg DecodeRequest jsonStr error.");
618         return ERR_DM_FAILED;
619     }
620     if (timer_ != nullptr) {
621         timer_->DeleteAll();
622         timer_->StartTimer(std::string(PINHOLDER_CREATE_TIMEOUT_TASK), PIN_HOLDER_SESSION_CREATE_TIMEOUT,
623             [this] (std::string name) {
624                 PinHolder::CloseSession(name);
625             });
626     }
627     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
628     JsonObject jsonObj;
629     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_PIN_HOLDER_CHANGE;
630     jsonObj[TAG_PIN_TYPE] = pinType;
631     std::string message = SafetyDump(jsonObj);
632     LOGI("NotifyPinHolderEvent, message type is: %{public}d, pin type is: %{public}d.",
633         MSG_TYPE_PIN_HOLDER_CHANGE, pinType);
634     int32_t ret = session_->SendData(sessionId_, message);
635     if (ret != DM_OK) {
636         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
637         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE_RESULT, ERR_DM_FAILED, "");
638         return ERR_DM_FAILED;
639     }
640     return ret;
641 }
642 
ProcessChangeMsg(const std::string & message)643 void PinHolder::ProcessChangeMsg(const std::string &message)
644 {
645     if (listener_ == nullptr || session_ == nullptr) {
646         LOGE("ProcessChangeMsg listener or session is nullptr.");
647         return;
648     }
649     JsonObject jsonObject(message);
650     if (jsonObject.IsDiscarded()) {
651         LOGE("ProcessChangeMsg DecodeRequest jsonStr error.");
652         return;
653     }
654     if (!IsInt32(jsonObject, TAG_PIN_TYPE)) {
655         LOGE("ProcessChangeMsg err json string.");
656         return;
657     }
658     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
659 
660     JsonObject jsonObj;
661     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_PIN_HOLDER_CHANGE_RESP;
662     if (sinkState_ != SINK_CREATE) {
663         jsonObj[TAG_REPLY] = REPLY_FAILED;
664     } else {
665         jsonObj[TAG_REPLY] = REPLY_SUCCESS;
666         JsonObject jsonContent;
667         jsonContent[TAG_PIN_TYPE] = pinType;
668         std::string content = SafetyDump(jsonContent);
669         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE, DM_OK, content);
670         if (timer_ != nullptr) {
671             timer_->DeleteAll();
672             timer_->StartTimer(std::string(PINHOLDER_CREATE_TIMEOUT_TASK), PIN_HOLDER_SESSION_CREATE_TIMEOUT,
673                 [this] (std::string name) {
674                     PinHolder::CloseSession(name);
675                 });
676         }
677     }
678 
679     std::string msg = SafetyDump(jsonObj);
680     LOGI("ProcessChangeMsg, message type is: %{public}d.", MSG_TYPE_PIN_HOLDER_CHANGE_RESP);
681     int32_t ret = session_->SendData(sessionId_, msg);
682     if (ret != DM_OK) {
683         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
684         return;
685     }
686 }
687 
ProcessChangeRespMsg(const std::string & message)688 void PinHolder::ProcessChangeRespMsg(const std::string &message)
689 {
690     JsonObject jsonObject(message);
691     if (jsonObject.IsDiscarded()) {
692         LOGE("ProcessChangeRespMsg DecodeRequest jsonStr error.");
693         return;
694     }
695     if (!IsInt32(jsonObject, TAG_REPLY)) {
696         LOGE("ProcessChangeRespMsg err json string.");
697         return;
698     }
699     int32_t reply = jsonObject[TAG_REPLY].Get<int32_t>();
700     if (listener_ == nullptr || session_ == nullptr) {
701         LOGE("ProcessChangeRespMsg listener or session is nullptr.");
702         return;
703     }
704     if (reply == REPLY_SUCCESS) {
705         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE_RESULT, DM_OK, "");
706     } else {
707         LOGE("ProcessChangeRespMsg remote state is wrong.");
708         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE_RESULT, ERR_DM_FAILED, "");
709     }
710 }
711 } // namespace DistributedHardware
712 } // namespace OHOS