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