• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2025 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 "ability_connection_manager.h"
17 
18 #include <map>
19 #include <memory>
20 #include <unistd.h>
21 #include <sstream>
22 #include <iomanip>
23 
24 #include "ability_info.h"
25 #include "ability_connection_session.h"
26 #include "accesstoken_kit.h"
27 #include "distributed_client.h"
28 #include "distributed_sched_utils.h"
29 #include "dtbcollabmgr_log.h"
30 #include "ipc_skeleton.h"
31 #include "openssl/sha.h"
32 #include "single_instance.h"
33 #include "tokenid_kit.h"
34 
35 namespace OHOS {
36 namespace DistributedCollab {
37 using namespace OHOS::DistributedSchedule;
38 namespace {
39 const std::string TAG = "AbilityConnectionManager";
40 constexpr int32_t SERVER_SOCKET_NAME_LENGTH = 64;
41 constexpr int32_t HEX_WIDTH = 2;
42 constexpr char FILL_CHAR = '0';
43 static const std::vector<std::string> REQUIRED_PERMISSIONS = {
44     "ohos.permission.INTERNET",
45     "ohos.permission.GET_NETWORK_INFO",
46     "ohos.permission.SET_NETWORK_INFO",
47     "ohos.permission.DISTRIBUTED_DATASYNC"
48 };
49 }
50 
51 IMPLEMENT_SINGLE_INSTANCE(AbilityConnectionManager);
52 
AbilityConnectionManager()53 AbilityConnectionManager::AbilityConnectionManager()
54 {
55 }
56 
~AbilityConnectionManager()57 AbilityConnectionManager::~AbilityConnectionManager()
58 {
59 }
60 
CreateSession(const std::string & serverId,std::shared_ptr<OHOS::AppExecFwk::AbilityInfo> abilityInfo,PeerInfo & peerInfo,ConnectOption & options,int32_t & sessionId)61 int32_t AbilityConnectionManager::CreateSession(const std::string& serverId,
62     std::shared_ptr<OHOS::AppExecFwk::AbilityInfo> abilityInfo, PeerInfo& peerInfo,
63     ConnectOption& options, int32_t& sessionId)
64 {
65     HILOGI("called.");
66     if (!IsVaildPeerInfo(peerInfo)) {
67         HILOGE("peerInfo is invalid parameter");
68         return INVALID_PARAMETERS_ERR;
69     }
70     if (!IsVaildConnectOption(options)) {
71         HILOGE("ConnectOption is invalid parameter");
72         return INVALID_PARAMETERS_ERR;
73     }
74     if (!CheckSessionPermission()) {
75         HILOGE("create session permission denied");
76         return COLLAB_PERMISSION_DENIED;
77     }
78 
79     PeerInfo localInfo = {"", abilityInfo->bundleName, abilityInfo->moduleName,
80         abilityInfo->name, peerInfo.serverId};
81 
82     std::string serverSocketName = GetServerSocketName(getprocpid(), abilityInfo->uid, abilityInfo->bundleName);
83     if (ChannelManager::GetInstance().Init(serverSocketName) != ERR_OK) {
84         HILOGE("ChannelManager init failed.");
85         return INVALID_PARAMETERS_ERR;
86     }
87     AbilityConnectionSessionInfo sessionInfo = { serverId, localInfo, peerInfo };
88     sessionId = sessionId_++;
89     auto connectionSesion = std::make_shared<AbilityConnectionSession>(sessionId, serverSocketName,
90         sessionInfo, options);
91     connectionSesion->Init();
92 
93     std::unique_lock<std::shared_mutex> writeLock(sessionMutex_);
94     sessionMap_.emplace(sessionId, connectionSesion);
95     return ERR_OK;
96 }
97 
CheckSessionPermission()98 bool AbilityConnectionManager::CheckSessionPermission()
99 {
100     uint64_t tokenId = OHOS::IPCSkeleton::GetSelfTokenID();
101     if (OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(tokenId)) {
102         HILOGI("The current application is a system app.");
103         return true;
104     }
105     for (const auto& permission : REQUIRED_PERMISSIONS) {
106         int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, permission);
107         if (result == Security::AccessToken::PermissionState::PERMISSION_DENIED) {
108             HILOGE("permission denied, permissionName:%{public}s", permission.c_str());
109             return false;
110         }
111     }
112     HILOGI("All permissions matched.");
113     return true;
114 }
115 
FindExistingSession(const PeerInfo & peerInfo,const PeerInfo & localInfo,int32_t & sessionId)116 bool AbilityConnectionManager::FindExistingSession(const PeerInfo& peerInfo, const PeerInfo& localInfo,
117     int32_t& sessionId)
118 {
119     std::shared_lock<std::shared_mutex> readLock(sessionMutex_);
120     for (auto iterItem = sessionMap_.begin(); iterItem != sessionMap_.end(); ++iterItem) {
121         if (iterItem->second != nullptr) {
122             auto connectionSession = iterItem->second;
123             if (connectionSession->GetPeerInfo() == peerInfo &&
124                 connectionSession->GetLocalInfo() == localInfo) {
125                 sessionId = iterItem->first;
126                 return true;
127             }
128         }
129     }
130     return false;
131 }
132 
DestroySession(int32_t sessionId)133 int32_t AbilityConnectionManager::DestroySession(int32_t sessionId)
134 {
135     HILOGI("called, sessionId is %{public}d", sessionId);
136     auto connectionSesion = GetAbilityConnectionSession(sessionId);
137     if (connectionSesion == nullptr) {
138         HILOGE("sessionId is invalid parameter");
139         return INVALID_PARAMETERS_ERR;
140     }
141 
142     connectionSesion->Disconnect();
143     connectionSesion->UnInit();
144 
145     std::unique_lock<std::shared_mutex> writeLock(sessionMutex_);
146     sessionMap_.erase(sessionId);
147     return ERR_OK;
148 }
149 
getPeerInfoBySessionId(int32_t sessionId,PeerInfo & peerInfo)150 int32_t AbilityConnectionManager::getPeerInfoBySessionId(int32_t sessionId, PeerInfo& peerInfo)
151 {
152     HILOGI("called.");
153     auto connectionSesion = GetAbilityConnectionSession(sessionId);
154     if (connectionSesion == nullptr) {
155         HILOGE("sessionId is invalid parameter");
156         return INVALID_PARAMETERS_ERR;
157     }
158     peerInfo = connectionSesion->GetPeerInfo();
159     return ERR_OK;
160 }
161 
ConnectSession(int32_t sessionId,ConnectCallback & callback)162 int32_t AbilityConnectionManager::ConnectSession(int32_t sessionId, ConnectCallback& callback)
163 {
164     HILOGI("called, sessionId is %{public}d", sessionId);
165     auto connectionSesion = GetAbilityConnectionSession(sessionId);
166     if (connectionSesion == nullptr) {
167         HILOGE("sessionId is invalid parameter");
168         ConnectResult connectResult(false, ConnectErrorCode::INVALID_SESSION_ID, "");
169         callback(connectResult);
170         return INVALID_SESSION_ID;
171     }
172     return connectionSesion->Connect(callback);
173 }
174 
FinishSessionConnect(int32_t sessionId)175 void AbilityConnectionManager::FinishSessionConnect(int32_t sessionId)
176 {
177     HILOGI("called, sessionId is %{public}d", sessionId);
178     auto connectionSesion = GetAbilityConnectionSession(sessionId);
179     if (connectionSesion == nullptr) {
180         HILOGE("sessionId is invalid parameter");
181         return;
182     }
183 
184     return connectionSesion->FinishSessionConnect();
185 }
186 
DisconnectSession(int32_t sessionId)187 int32_t AbilityConnectionManager::DisconnectSession(int32_t sessionId)
188 {
189     HILOGI("called, sessionId is %{public}d", sessionId);
190     auto connectionSesion = GetAbilityConnectionSession(sessionId);
191     if (connectionSesion == nullptr) {
192         HILOGE("sessionId is invalid parameter");
193         return INVALID_PARAMETERS_ERR;
194     }
195 
196     return connectionSesion->Disconnect();
197 }
198 
AcceptConnect(int32_t sessionId,const std::string & token)199 int32_t AbilityConnectionManager::AcceptConnect(int32_t sessionId, const std::string& token)
200 {
201     HILOGI("called, sessionId is %{public}d", sessionId);
202     auto connectionSesion = GetAbilityConnectionSession(sessionId);
203     if (connectionSesion == nullptr) {
204         HILOGE("sessionId is invalid parameter");
205         return INVALID_PARAMETERS_ERR;
206     }
207 
208     return connectionSesion->AcceptConnect(token);
209 }
210 
Reject(const std::string & token,const std::string & reason)211 int32_t AbilityConnectionManager::Reject(const std::string& token, const std::string& reason)
212 {
213     HILOGI("called, token is %{public}s", GetAnonymStr(token).c_str());
214     DistributedClient dmsClient;
215     return dmsClient.NotifyRejectReason(token, reason);
216 }
217 
NotifyCollabResult(int32_t sessionId,int32_t result,const std::string & peerServerName,const std::string & dmsServerToken,const std::string & reason)218 int32_t AbilityConnectionManager::NotifyCollabResult(int32_t sessionId, int32_t result,
219     const std::string& peerServerName, const std::string& dmsServerToken, const std::string& reason)
220 {
221     HILOGI("called, sessionId is %{public}d", sessionId);
222     auto connectionSesion = GetAbilityConnectionSession(sessionId);
223     if (connectionSesion == nullptr) {
224         HILOGE("sessionId is invalid parameter");
225         return INVALID_PARAMETERS_ERR;
226     }
227 
228     return connectionSesion->HandleCollabResult(result, peerServerName, dmsServerToken, reason);
229 }
230 
NotifyDisconnect(int32_t sessionId)231 int32_t AbilityConnectionManager::NotifyDisconnect(int32_t sessionId)
232 {
233     HILOGI("called, sessionId is %{public}d", sessionId);
234     auto connectionSesion = GetAbilityConnectionSession(sessionId);
235     if (connectionSesion == nullptr) {
236         HILOGE("sessionId is invalid parameter");
237         return INVALID_PARAMETERS_ERR;
238     }
239 
240     connectionSesion->HandleDisconnect();
241     return ERR_OK;
242 }
243 
SendMessage(int32_t sessionId,const std::string & msg)244 int32_t AbilityConnectionManager::SendMessage(int32_t sessionId, const std::string& msg)
245 {
246     HILOGI("called, sessionId is %{public}d", sessionId);
247     auto connectionSesion = GetAbilityConnectionSession(sessionId);
248     if (connectionSesion == nullptr) {
249         HILOGE("sessionId is invalid parameter");
250         return INVALID_PARAMETERS_ERR;
251     }
252 
253     return connectionSesion->SendMessage(msg);
254 }
255 
SendData(int32_t sessionId,const std::shared_ptr<AVTransDataBuffer> & buffer)256 int32_t AbilityConnectionManager::SendData(int32_t sessionId, const std::shared_ptr<AVTransDataBuffer>& buffer)
257 {
258     HILOGI("called, sessionId is %{public}d", sessionId);
259     auto connectionSesion = GetAbilityConnectionSession(sessionId);
260     if (connectionSesion == nullptr) {
261         HILOGE("sessionId is invalid parameter");
262         return INVALID_PARAMETERS_ERR;
263     }
264 
265     return connectionSesion->SendData(buffer);
266 }
267 
SendImage(int32_t sessionId,const std::shared_ptr<Media::PixelMap> & image,int32_t imageQuality)268 int32_t AbilityConnectionManager::SendImage(int32_t sessionId, const std::shared_ptr<Media::PixelMap>& image,
269     int32_t imageQuality)
270 {
271     HILOGI("called, sessionId is %{public}d", sessionId);
272     auto connectionSesion = GetAbilityConnectionSession(sessionId);
273     if (connectionSesion == nullptr) {
274         HILOGE("sessionId is invalid parameter");
275         return INVALID_PARAMETERS_ERR;
276     }
277 
278     return connectionSesion->SendImage(image, imageQuality);
279 }
280 
SendFile(int32_t sessionId,const std::vector<std::string> & sFiles,const std::vector<std::string> & dFiles)281 int32_t AbilityConnectionManager::SendFile(int32_t sessionId, const std::vector<std::string>& sFiles,
282     const std::vector<std::string>& dFiles)
283 {
284     HILOGI("called, sessionId is %{public}d", sessionId);
285     auto connectionSesion = GetAbilityConnectionSession(sessionId);
286     if (connectionSesion == nullptr) {
287         HILOGE("sessionId is invalid parameter");
288         return INVALID_PARAMETERS_ERR;
289     }
290 
291     return connectionSesion->SendFile(sFiles, dFiles);
292 }
293 
CreateStream(int32_t sessionId,const StreamParams & param,int32_t & streamId)294 int32_t AbilityConnectionManager::CreateStream(int32_t sessionId, const StreamParams& param, int32_t& streamId)
295 {
296     HILOGI("called, sessionId is %{public}d", sessionId);
297     auto connectionSesion = GetAbilityConnectionSession(sessionId);
298     if (connectionSesion == nullptr) {
299         HILOGE("sessionId is invalid parameter");
300         return INVALID_PARAMETERS_ERR;
301     }
302     int32_t ret = connectionSesion->CreateStream(streamId_, param);
303     if (ret != ERR_OK) {
304         return ret;
305     }
306     streamId = streamId_++;
307     std::unique_lock<std::shared_mutex> writeLock(streamMutex_);
308     streamMap_[streamId] = sessionId;
309     return ERR_OK;
310 }
311 
SetSurfaceId(int32_t streamId,const std::string & surfaceId,const SurfaceParams & param)312 int32_t AbilityConnectionManager::SetSurfaceId(int32_t streamId, const std::string& surfaceId,
313     const SurfaceParams& param)
314 {
315     HILOGI("called, streamId is %{public}d, surfaceId is %{public}s", streamId, surfaceId.c_str());
316     auto connectionSesion = GetAbilityConnectionSessionByStreamId(streamId);
317     if (connectionSesion == nullptr) {
318         HILOGE("streamId is invalid parameter");
319         return INVALID_PARAMETERS_ERR;
320     }
321 
322     return connectionSesion->SetSurfaceId(surfaceId, param);
323 }
324 
CheckStreamIsRegistered(int32_t sessionId)325 bool AbilityConnectionManager::CheckStreamIsRegistered(int32_t sessionId)
326 {
327     std::shared_lock<std::shared_mutex> readLock(streamMutex_);
328     for (auto iter = streamMap_.begin(); iter != streamMap_.end(); iter++) {
329         if (iter->second == sessionId) {
330             return true;
331         }
332     }
333     return false;
334 }
335 
GetSurfaceId(int32_t streamId,const SurfaceParams & param,std::string & surfaceId)336 int32_t AbilityConnectionManager::GetSurfaceId(int32_t streamId, const SurfaceParams& param, std::string& surfaceId)
337 {
338     HILOGI("called, streamId is %{public}d", streamId);
339     auto connectionSesion = GetAbilityConnectionSessionByStreamId(streamId);
340     if (connectionSesion == nullptr) {
341         HILOGE("streamId is invalid parameter");
342         return INVALID_PARAMETERS_ERR;
343     }
344 
345     return connectionSesion->GetSurfaceId(param, surfaceId);
346 }
347 
UpdateSurfaceParam(int32_t streamId,const SurfaceParams & param)348 int32_t AbilityConnectionManager::UpdateSurfaceParam(int32_t streamId, const SurfaceParams& param)
349 {
350     HILOGI("called, streamId is %{public}d", streamId);
351     auto connectionSesion = GetAbilityConnectionSessionByStreamId(streamId);
352     if (connectionSesion == nullptr) {
353         HILOGE("streamId is invalid parameter");
354         return INVALID_PARAMETERS_ERR;
355     }
356 
357     return connectionSesion->UpdateSurfaceParam(param);
358 }
359 
DestroyStream(int32_t streamId)360 int32_t AbilityConnectionManager::DestroyStream(int32_t streamId)
361 {
362     HILOGI("called, streamId is %{public}d", streamId);
363     auto connectionSesion = GetAbilityConnectionSessionByStreamId(streamId);
364     if (connectionSesion == nullptr) {
365         HILOGE("streamId is invalid parameter");
366         return INVALID_PARAMETERS_ERR;
367     }
368 
369     if (connectionSesion->DestroyStream() != ERR_OK) {
370         HILOGE("destroy stream failed.");
371         return INVALID_PARAMETERS_ERR;
372     }
373     std::unique_lock<std::shared_mutex> writeLock(streamMutex_);
374     streamMap_.erase(streamId);
375     return ERR_OK;
376 }
377 
StartStream(int32_t streamId)378 int32_t AbilityConnectionManager::StartStream(int32_t streamId)
379 {
380     HILOGI("called, streamId is %{public}d", streamId);
381     auto connectionSesion = GetAbilityConnectionSessionByStreamId(streamId);
382     if (connectionSesion == nullptr) {
383         HILOGE("streamId is invalid parameter");
384         return INVALID_PARAMETERS_ERR;
385     }
386 
387     return connectionSesion->StartStream(streamId);
388 }
389 
StopStream(int32_t streamId)390 int32_t AbilityConnectionManager::StopStream(int32_t streamId)
391 {
392     HILOGI("called, streamId is %{public}d", streamId);
393     auto connectionSesion = GetAbilityConnectionSessionByStreamId(streamId);
394     if (connectionSesion == nullptr) {
395         HILOGE("sessionId is invalid parameter");
396         return INVALID_PARAMETERS_ERR;
397     }
398 
399     return connectionSesion->StopStream(streamId);
400 }
401 
RegisterEventCallback(int32_t sessionId,const std::string & eventType,const std::shared_ptr<JsAbilityConnectionSessionListener> & listener)402 int32_t AbilityConnectionManager::RegisterEventCallback(int32_t sessionId, const std::string& eventType,
403     const std::shared_ptr<JsAbilityConnectionSessionListener>& listener)
404 {
405     HILOGI("called, sessionId is %{public}d", sessionId);
406     auto connectionSesion = GetAbilityConnectionSession(sessionId);
407     if (connectionSesion == nullptr) {
408         HILOGE("sessionId is invalid parameter");
409         return INVALID_PARAMETERS_ERR;
410     }
411 
412     return connectionSesion->RegisterEventCallback(eventType, listener);
413 }
414 
UnregisterEventCallback(int32_t sessionId,const std::string & eventType)415 int32_t AbilityConnectionManager::UnregisterEventCallback(int32_t sessionId, const std::string& eventType)
416 {
417     HILOGI("called, sessionId is %{public}d", sessionId);
418     auto connectionSesion = GetAbilityConnectionSession(sessionId);
419     if (connectionSesion == nullptr) {
420         HILOGE("sessionId is invalid parameter");
421         return INVALID_PARAMETERS_ERR;
422     }
423 
424     return connectionSesion->UnregisterEventCallback(eventType);
425 }
426 
RegisterEventCallback(int32_t sessionId,const std::shared_ptr<IAbilityConnectionSessionListener> & listener)427 int32_t AbilityConnectionManager::RegisterEventCallback(int32_t sessionId,
428     const std::shared_ptr<IAbilityConnectionSessionListener>& listener)
429 {
430     HILOGI("called, sessionId is %{public}d", sessionId);
431     auto connectionSesion = GetAbilityConnectionSession(sessionId);
432     if (connectionSesion == nullptr) {
433         HILOGE("sessionId is invalid parameter");
434         return INVALID_PARAMETERS_ERR;
435     }
436 
437     return connectionSesion->RegisterEventCallback(listener);
438 }
439 
UnregisterEventCallback(int32_t sessionId)440 int32_t AbilityConnectionManager::UnregisterEventCallback(int32_t sessionId)
441 {
442     HILOGI("called, sessionId is %{public}d", sessionId);
443     auto connectionSesion = GetAbilityConnectionSession(sessionId);
444     if (connectionSesion == nullptr) {
445         HILOGE("sessionId is invalid parameter");
446         return INVALID_PARAMETERS_ERR;
447     }
448 
449     return connectionSesion->UnregisterEventCallback();
450 }
451 
NotifyWifiOpen(int32_t sessionId)452 int32_t AbilityConnectionManager::NotifyWifiOpen(int32_t sessionId)
453 {
454     HILOGI("called, sessionId is %{public}d", sessionId);
455     auto connectionSesion = GetAbilityConnectionSession(sessionId);
456     if (connectionSesion == nullptr) {
457         HILOGE("sessionId is invalid parameter");
458         return INVALID_PARAMETERS_ERR;
459     }
460     return connectionSesion->ConnectStreamChannel();
461 }
462 
IsVaildPeerInfo(const PeerInfo & peerInfo)463 bool AbilityConnectionManager::IsVaildPeerInfo(const PeerInfo& peerInfo)
464 {
465     if (peerInfo.deviceId.empty() || peerInfo.bundleName.empty() || peerInfo.moduleName.empty() ||
466         peerInfo.abilityName.empty() || peerInfo.serverId.empty()) {
467         HILOGE("peerInfo is %{public}s", peerInfo.toString().c_str());
468         return false;
469     }
470 
471     return true;
472 }
473 
IsVaildConnectOption(const ConnectOption & opt)474 bool AbilityConnectionManager::IsVaildConnectOption(const ConnectOption& opt)
475 {
476     if (opt.needSendStream && opt.needReceiveStream) {
477         HILOGE("Streams cannot be sent and received at the same end.");
478         return false;
479     }
480     return true;
481 }
482 
GetServerSocketName(int32_t userId,int32_t pid,const std::string & bundle)483 std::string AbilityConnectionManager::GetServerSocketName(int32_t userId,
484     int32_t pid, const std::string& bundle)
485 {
486     std::string input = std::to_string(userId) + std::to_string(pid) + bundle;
487 
488     unsigned char hash[SHA256_DIGEST_LENGTH];
489     SHA256((const unsigned char*)input.c_str(), input.length(), hash);
490 
491     std::stringstream hashStr;
492     for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
493         hashStr << std::hex << std::setw(HEX_WIDTH) << std::setfill(FILL_CHAR) << (int)hash[i];
494     }
495 
496     std::string serverSocketName = hashStr.str().substr(0, SERVER_SOCKET_NAME_LENGTH);
497 
498     return serverSocketName;
499 }
500 
GetAbilityConnectionSession(const int32_t sessionId)501 std::shared_ptr<AbilityConnectionSession> AbilityConnectionManager::GetAbilityConnectionSession(const int32_t sessionId)
502 {
503     if (sessionId <= 0) {
504         HILOGE("invaild session id");
505         return nullptr;
506     }
507 
508     std::shared_lock<std::shared_mutex> readLock(sessionMutex_);
509     auto iter = sessionMap_.find(sessionId);
510     if (iter == sessionMap_.end()) {
511         HILOGE("no match session, sessionId is %{public}d", sessionId);
512         return nullptr;
513     }
514     return iter->second;
515 }
516 
GetAbilityConnectionSessionByStreamId(const int32_t streamId)517 std::shared_ptr<AbilityConnectionSession> AbilityConnectionManager::GetAbilityConnectionSessionByStreamId(
518     const int32_t streamId)
519 {
520     HILOGI("called. streamId is %{public}d", streamId);
521     int32_t sessionId = -1;
522     {
523         std::shared_lock<std::shared_mutex> readLock(streamMutex_);
524         sessionId = streamMap_[streamId];
525     }
526     return GetAbilityConnectionSession(sessionId);
527 }
528 
UpdateClientSession(const AbilityConnectionSessionInfo & sessionInfo,const int32_t sessionId)529 int32_t AbilityConnectionManager::UpdateClientSession(const AbilityConnectionSessionInfo& sessionInfo,
530     const int32_t sessionId)
531 {
532     std::lock_guard<std::mutex> lock(connectSessionMutex_);
533     if (clientSessionMap_.count(sessionInfo) > 0 || serverSessionMap_.count(sessionInfo) > 0) {
534         HILOGE("The same session is being connected. sessionId is %{public}d", sessionId);
535         return SAME_SESSION_IS_CONNECTING;
536     }
537     HILOGI("The current client session has not initiated a connection. sessionId is %{public}d", sessionId);
538     clientSessionMap_[sessionInfo] = sessionId;
539     return ERR_OK;
540 }
541 
UpdateServerSession(const AbilityConnectionSessionInfo & sessionInfo,const int32_t sessionId)542 int32_t AbilityConnectionManager::UpdateServerSession(const AbilityConnectionSessionInfo& sessionInfo,
543     const int32_t sessionId)
544 {
545     HILOGI("called. sessionId is %{public}d", sessionId);
546     std::lock_guard<std::mutex> lock(connectSessionMutex_);
547     if (serverSessionMap_.count(sessionInfo) > 0) {
548         HILOGE("The same server session is being connected.");
549         return SAME_SESSION_IS_CONNECTING;
550     }
551     auto iter = clientSessionMap_.find(sessionInfo);
552     if (iter == clientSessionMap_.end()) {
553         HILOGI("no same session is connecting.");
554         serverSessionMap_[sessionInfo] = sessionId;
555         return ERR_OK;
556     }
557 
558     if (GetSessionToken(sessionId) > GetSessionToken(iter->second)) {
559         HILOGI("select client session continue to connect.");
560         return SAME_SESSION_IS_CONNECTING;
561     }
562     HILOGI("select server session continue to connect.");
563     serverSessionMap_[sessionInfo] = sessionId;
564     return ERR_OK;
565 }
566 
DeleteConnectSession(const AbilityConnectionSessionInfo & sessionInfo,int32_t sessionId)567 int32_t AbilityConnectionManager::DeleteConnectSession(const AbilityConnectionSessionInfo& sessionInfo,
568     int32_t sessionId)
569 {
570     HILOGI("called. sessionId is %{public}d", sessionId);
571     std::lock_guard<std::mutex> lock(connectSessionMutex_);
572     auto clientIt = clientSessionMap_.find(sessionInfo);
573     if (clientIt != clientSessionMap_.end() && clientIt->second == sessionId) {
574         HILOGI("session removed from clientSessionMap_");
575         clientSessionMap_.erase(clientIt);
576         return ERR_OK;
577     }
578     auto serverIt = serverSessionMap_.find(sessionInfo);
579     if (serverIt != serverSessionMap_.end() && serverIt->second == sessionId) {
580         HILOGI("session removed from serverSessionMap_");
581         serverSessionMap_.erase(serverIt);
582         return ERR_OK;
583     }
584     HILOGI("The current session has not initiated a connection.");
585     return ERR_OK;
586 }
587 
GetSessionToken(int32_t sessionId)588 std::string AbilityConnectionManager::GetSessionToken(int32_t sessionId)
589 {
590     auto connectionSesion = GetAbilityConnectionSession(sessionId);
591     if (connectionSesion == nullptr) {
592         HILOGE("sessionId is invalid parameter");
593         return "";
594     }
595     std::string dmsServertoken = connectionSesion->GetServerToken();
596     HILOGI("sessionId is %{public}d, token is %{public}s", sessionId, GetAnonymStr(dmsServertoken).c_str());
597     return dmsServertoken;
598 }
599 
NotifyPeerVersion(int32_t sessionId,int32_t version)600 int32_t AbilityConnectionManager::NotifyPeerVersion(int32_t sessionId, int32_t version)
601 {
602     HILOGI("called, sessionId is %{public}d, peer version is %{public}d", sessionId, version);
603     auto connectionSesion = GetAbilityConnectionSession(sessionId);
604     if (connectionSesion == nullptr) {
605         HILOGE("sessionId is invalid parameter");
606         return INVALID_PARAMETERS_ERR;
607     }
608 
609     return connectionSesion->HandlePeerVersion(version);
610 }
611 }  // namespace DistributedCollab
612 }  // namespace OHOS