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