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