• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "client_trans_session_manager.h"
17 
18 #include <securec.h>
19 
20 #include "client_bus_center_manager.h"
21 #include "client_trans_channel_manager.h"
22 #include "softbus_adapter_mem.h"
23 #include "softbus_app_info.h"
24 #include "softbus_def.h"
25 #include "softbus_errcode.h"
26 #include "softbus_log.h"
27 #include "softbus_utils.h"
28 #include "trans_server_proxy.h"
29 
30 static int32_t g_sessionIdNum = 0;
31 static int32_t g_sessionId = 1;
32 static SoftBusList *g_clientSessionServerList = NULL;
33 
34 typedef struct {
35     ListNode node;
36     int32_t sessionId;
37     int32_t channelId;
38     ChannelType channelType;
39     void (*OnSessionClosed)(int sessionId);
40 } DestroySessionInfo;
41 
CheckPermissionState(int32_t sessionId)42 int32_t CheckPermissionState(int32_t sessionId)
43 {
44     if (g_clientSessionServerList == NULL) {
45         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
46         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
47     }
48     ClientSessionServer *serverNode = NULL;
49     SessionInfo *sessionNode = NULL;
50     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
51         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
52         return SOFTBUS_LOCK_ERR;
53     }
54     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
55         if (IsListEmpty(&serverNode->sessionList)) {
56             continue;
57         }
58         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
59             if (sessionNode->sessionId == sessionId) {
60                 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
61                 return serverNode->permissionState ? SOFTBUS_OK : SOFTBUS_PERMISSION_DENIED;
62             }
63         }
64     }
65     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
66     return SOFTBUS_TRANS_INVALID_SESSION_ID;
67 }
68 
PermissionStateChange(const char * pkgName,int32_t state)69 void PermissionStateChange(const char *pkgName, int32_t state)
70 {
71     if (g_clientSessionServerList == NULL) {
72         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
73         return;
74     }
75     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
76         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
77         return;
78     }
79     ClientSessionServer *serverNode = NULL;
80     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
81         if ((strcmp(serverNode->pkgName, pkgName) == 0)) {
82             serverNode->permissionState = state > 0 ? true : false;
83             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "%s permission change, state = %d", pkgName, state);
84             break;
85         }
86     }
87     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
88 }
89 
TransClientInit(void)90 int TransClientInit(void)
91 {
92     g_clientSessionServerList = CreateSoftBusList();
93     if (g_clientSessionServerList == NULL) {
94         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "init list failed");
95         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
96     }
97 
98     if (TransServerProxyInit() != SOFTBUS_OK) {
99         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "init trans ipc proxy failed");
100         return SOFTBUS_ERR;
101     }
102 
103     if (ClientTransChannelInit() != SOFTBUS_OK) {
104         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "init trans channel failed");
105         return SOFTBUS_ERR;
106     }
107 
108     ClientTransRegLnnOffline();
109     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "init trans client success");
110     return SOFTBUS_OK;
111 }
112 
SessionIdIsAvailable(int32_t sessionId)113 static bool SessionIdIsAvailable(int32_t sessionId)
114 {
115     ClientSessionServer *serverNode = NULL;
116     SessionInfo *sessionNode = NULL;
117 
118     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
119         if (IsListEmpty(&serverNode->sessionList)) {
120             continue;
121         }
122         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
123             if (sessionNode->sessionId == sessionId) {
124                 return false;
125             }
126         }
127     }
128 
129     return true;
130 }
131 
GenerateSessionId(void)132 static int32_t GenerateSessionId(void)
133 {
134     if (g_sessionIdNum >= MAX_SESSION_ID) {
135         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "sessionid num cross the line error");
136         return INVALID_SESSION_ID;
137     }
138     int32_t cnt = MAX_SESSION_ID + 1;
139     int32_t id = INVALID_SESSION_ID;
140 
141     while (cnt) {
142         id = g_sessionId++;
143         if (g_sessionId < 0) {
144             g_sessionId = 1;
145         }
146         if (SessionIdIsAvailable(id)) {
147             g_sessionIdNum++;
148             return id;
149         }
150         cnt--;
151     }
152     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "generate id error");
153     return id;
154 }
155 
DestroySessionId(void)156 static void DestroySessionId(void)
157 {
158     if (g_sessionIdNum > 0) {
159         g_sessionIdNum--;
160     }
161     return;
162 }
163 
CreateDestroySessionNode(SessionInfo * sessionNode,const ClientSessionServer * server)164 static DestroySessionInfo *CreateDestroySessionNode(SessionInfo *sessionNode, const ClientSessionServer *server)
165 {
166     DestroySessionInfo *destroyNode = (DestroySessionInfo *)SoftBusMalloc(sizeof(DestroySessionInfo));
167     if (destroyNode == NULL) {
168         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "destroyList malloc fail.");
169         return NULL;
170     }
171     destroyNode->sessionId = sessionNode->sessionId;
172     destroyNode->channelId = sessionNode->channelId;
173     destroyNode->channelType = sessionNode->channelType;
174     destroyNode->OnSessionClosed = server->listener.session.OnSessionClosed;
175     return destroyNode;
176 }
177 
ClientDestroySession(const ListNode * destroyList)178 static void ClientDestroySession(const ListNode *destroyList)
179 {
180     if (IsListEmpty(destroyList)) {
181         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "destroyList is empty fail.");
182         return;
183     }
184     DestroySessionInfo *destroyNode = NULL;
185     DestroySessionInfo *destroyNodeNext = NULL;
186     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "DestroyClientSession start");
187     LIST_FOR_EACH_ENTRY_SAFE(destroyNode, destroyNodeNext, destroyList, DestroySessionInfo, node) {
188         int32_t id = destroyNode->sessionId;
189         (void)ClientTransCloseChannel(destroyNode->channelId, destroyNode->channelType);
190         if (destroyNode->OnSessionClosed != NULL) {
191             destroyNode->OnSessionClosed(id);
192         }
193         ListDelete(&(destroyNode->node));
194         SoftBusFree(destroyNode);
195     }
196     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "DestroyClientSession end");
197 }
198 
DestroyClientSessionServer(ClientSessionServer * server,ListNode * destroyList)199 static void DestroyClientSessionServer(ClientSessionServer *server, ListNode *destroyList)
200 {
201     if (server == NULL) {
202         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid param");
203         return;
204     }
205 
206     if (!IsListEmpty(&(server->sessionList))) {
207         SessionInfo *sessionNode = NULL;
208         SessionInfo *sessionNodeNext = NULL;
209         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, sessionNodeNext, &(server->sessionList), SessionInfo, node) {
210             DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, server);
211             if (destroyNode == NULL) {
212                 continue;
213             }
214             DestroySessionId();
215             ListDelete(&sessionNode->node);
216             ListAdd(destroyList, &(destroyNode->node));
217             SoftBusFree(sessionNode);
218         }
219     }
220 
221     ListDelete(&(server->node));
222     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "destroy session server [%s]", server->sessionName);
223     SoftBusFree(server);
224 }
225 
TransClientDeinit(void)226 void TransClientDeinit(void)
227 {
228     if (g_clientSessionServerList == NULL) {
229         return;
230     }
231     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
232         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
233         return;
234     }
235     ClientSessionServer *serverNode = NULL;
236     ClientSessionServer *serverNodeNext = NULL;
237     ListNode destroyList;
238     ListInit(&destroyList);
239     LIST_FOR_EACH_ENTRY_SAFE(serverNode, serverNodeNext, &(g_clientSessionServerList->list),
240         ClientSessionServer, node) {
241         DestroyClientSessionServer(serverNode, &destroyList);
242     }
243     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
244     ClientDestroySession(&destroyList);
245 
246     DestroySoftBusList(g_clientSessionServerList);
247     g_clientSessionServerList = NULL;
248     ClientTransChannelDeinit();
249     TransServerProxyDeInit();
250 }
251 
SessionServerIsExist(const char * sessionName)252 static bool SessionServerIsExist(const char *sessionName)
253 {
254     /* need get lock before */
255     ListNode *pos = NULL;
256     ListNode *tmp = NULL;
257     ClientSessionServer *node = NULL;
258     LIST_FOR_EACH_SAFE(pos, tmp, &g_clientSessionServerList->list) {
259         node = (ClientSessionServer *)pos;
260         if (strcmp(node->sessionName, sessionName) == 0) {
261             return true;
262         }
263     }
264     return false;
265 }
266 
GetNewSessionServer(SoftBusSecType type,const char * sessionName,const char * pkgName,const ISessionListener * listener)267 static ClientSessionServer *GetNewSessionServer(SoftBusSecType type, const char *sessionName,
268     const char *pkgName, const ISessionListener *listener)
269 {
270     ClientSessionServer *server = (ClientSessionServer *)SoftBusCalloc(sizeof(ClientSessionServer));
271     if (server == NULL) {
272         return NULL;
273     }
274     server->type = type;
275     if (strcpy_s(server->pkgName, sizeof(server->pkgName), pkgName) != EOK) {
276         goto EXIT_ERR;
277     }
278     if (strcpy_s(server->sessionName, sizeof(server->sessionName), sessionName) != EOK) {
279         goto EXIT_ERR;
280     }
281     if (memcpy_s(&server->listener.session, sizeof(ISessionListener), listener, sizeof(ISessionListener)) != EOK) {
282         goto EXIT_ERR;
283     }
284 
285     ListInit(&server->node);
286     ListInit(&server->sessionList);
287     return server;
288 EXIT_ERR:
289     if (server != NULL) {
290         SoftBusFree(server);
291     }
292     return NULL;
293 }
294 
ClientAddSessionServer(SoftBusSecType type,const char * pkgName,const char * sessionName,const ISessionListener * listener)295 int32_t ClientAddSessionServer(SoftBusSecType type, const char *pkgName, const char *sessionName,
296     const ISessionListener *listener)
297 {
298     if (pkgName == NULL || sessionName == NULL || listener == NULL) {
299         return SOFTBUS_INVALID_PARAM;
300     }
301 
302     if (g_clientSessionServerList == NULL) {
303         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
304         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
305     }
306     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
307         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
308         return SOFTBUS_LOCK_ERR;
309     }
310     if (SessionServerIsExist(sessionName)) {
311         (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
312         return SOFTBUS_SERVER_NAME_REPEATED;
313     }
314 
315     if (g_clientSessionServerList->cnt >= MAX_SESSION_SERVER_NUMBER) {
316         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
317         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "server num reach max");
318         return SOFTBUS_INVALID_NUM;
319     }
320 
321     ClientSessionServer *server = GetNewSessionServer(type, sessionName, pkgName, listener);
322     if (server == NULL) {
323         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
324         return SOFTBUS_MEM_ERR;
325     }
326     server->permissionState = true;
327     ListAdd(&g_clientSessionServerList->list, &server->node);
328     g_clientSessionServerList->cnt++;
329 
330     (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
331     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "session name [%s], pkg name [%s]",
332         server->sessionName, server->pkgName);
333     return SOFTBUS_OK;
334 }
335 
IsValidSessionParam(const SessionParam * param)336 static bool IsValidSessionParam(const SessionParam *param)
337 {
338     if ((param == NULL) ||
339         (param->sessionName == NULL) ||
340         (param->peerSessionName == NULL) ||
341         (param->peerDeviceId == NULL) ||
342         (param->groupId == NULL) ||
343         (param->attr == NULL)) {
344         return false;
345     }
346     return true;
347 }
348 
CreateNewSession(const SessionParam * param)349 static SessionInfo *CreateNewSession(const SessionParam *param)
350 {
351     SessionInfo *session = (SessionInfo*)SoftBusCalloc(sizeof(SessionInfo));
352     if (session == NULL) {
353         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "calloc failed");
354         return NULL;
355     }
356 
357     if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, param->peerSessionName) != EOK ||
358         strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, param->peerDeviceId) != EOK ||
359         strcpy_s(session->info.groupId, GROUP_ID_SIZE_MAX, param->groupId) != EOK) {
360         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "strcpy failed");
361         SoftBusFree(session);
362         return NULL;
363     }
364 
365     session->sessionId = INVALID_SESSION_ID;
366     session->channelId = INVALID_CHANNEL_ID;
367     session->channelType = CHANNEL_TYPE_BUTT;
368     session->isServer = false;
369     session->isEnable = false;
370     session->info.flag = param->attr->dataType;
371     session->isEncrypt = true;
372 
373     return session;
374 }
375 
GetExistSession(const SessionParam * param)376 static SessionInfo *GetExistSession(const SessionParam *param)
377 {
378     /* need get lock before */
379     ClientSessionServer *serverNode = NULL;
380     SessionInfo *sessionNode = NULL;
381     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
382         if ((strcmp(serverNode->sessionName, param->sessionName) != 0) || IsListEmpty(&serverNode->sessionList)) {
383             continue;
384         }
385         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
386             if (sessionNode->isServer ||
387                 (strcmp(sessionNode->info.peerSessionName, param->peerSessionName) != 0) ||
388                 (strcmp(sessionNode->info.peerDeviceId, param->peerDeviceId) != 0) ||
389                 (strcmp(sessionNode->info.groupId, param->groupId) != 0) ||
390                 (sessionNode->info.flag != param->attr->dataType)) {
391                 continue;
392             }
393             return sessionNode;
394         }
395     }
396     return NULL;
397 }
398 
GetSessionById(int32_t sessionId,ClientSessionServer ** server,SessionInfo ** session)399 static int32_t GetSessionById(int32_t sessionId, ClientSessionServer **server, SessionInfo **session)
400 {
401     /* need get lock before */
402     ClientSessionServer *serverNode = NULL;
403     SessionInfo *sessionNode = NULL;
404 
405     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
406         if (IsListEmpty(&serverNode->sessionList)) {
407             continue;
408         }
409         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
410             if (sessionNode->sessionId == sessionId) {
411                 *server = serverNode;
412                 *session = sessionNode;
413                 return SOFTBUS_OK;
414             }
415         }
416     }
417     return SOFTBUS_ERR;
418 }
419 
AddSession(const char * sessionName,SessionInfo * session)420 static int32_t AddSession(const char *sessionName, SessionInfo *session)
421 {
422     /* need get lock before */
423     session->sessionId = GenerateSessionId();
424     if (session->sessionId < 0) {
425         return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
426     }
427     ClientSessionServer *serverNode = NULL;
428     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
429         if (strcmp(serverNode->sessionName, sessionName) != 0) {
430             continue;
431         }
432         ListAdd(&serverNode->sessionList, &session->node);
433         return SOFTBUS_OK;
434     }
435     DestroySessionId();
436     return SOFTBUS_TRANS_SESSIONSERVER_NOT_CREATED;
437 }
438 
ClientAddNewSession(const char * sessionName,SessionInfo * session)439 int32_t ClientAddNewSession(const char *sessionName, SessionInfo *session)
440 {
441     if (session == NULL) {
442         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
443         return SOFTBUS_INVALID_PARAM;
444     }
445 
446     if (g_clientSessionServerList == NULL) {
447         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
448         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
449     }
450 
451     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
452         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
453         return SOFTBUS_LOCK_ERR;
454     }
455 
456     int32_t ret = AddSession(sessionName, session);
457     if (ret != SOFTBUS_OK) {
458         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
459         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "add session failed, ret [%d]", ret);
460         return ret;
461     }
462     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
463     return SOFTBUS_OK;
464 }
465 
ClientAddSession(const SessionParam * param,int32_t * sessionId,bool * isEnabled)466 int32_t ClientAddSession(const SessionParam *param, int32_t *sessionId, bool *isEnabled)
467 {
468     if (!IsValidSessionParam(param) || (sessionId == NULL) || (isEnabled == NULL)) {
469         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
470         return SOFTBUS_INVALID_PARAM;
471     }
472 
473     if (g_clientSessionServerList == NULL) {
474         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
475         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
476     }
477 
478     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
479         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
480         return SOFTBUS_LOCK_ERR;
481     }
482 
483     SessionInfo *session = GetExistSession(param);
484     if (session != NULL) {
485         *sessionId = session->sessionId;
486         *isEnabled = session->isEnable;
487         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
488         return SOFTBUS_TRANS_SESSION_REPEATED;
489     }
490 
491     session = CreateNewSession(param);
492     if (session == NULL) {
493         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
494         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "create session failed");
495         return SOFTBUS_TRANS_SESSION_CREATE_FAILED;
496     }
497 
498     int32_t ret = AddSession(param->sessionName, session);
499     if (ret != SOFTBUS_OK) {
500         SoftBusFree(session);
501         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
502         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Add Session failed, ret [%d]", ret);
503         return ret;
504     }
505 
506     *sessionId = session->sessionId;
507     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
508     return SOFTBUS_OK;
509 }
510 
CreateNonEncryptSessionInfo(const char * sessionName)511 static SessionInfo *CreateNonEncryptSessionInfo(const char *sessionName)
512 {
513     if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
514         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
515         return NULL;
516     }
517     SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
518     if (session == NULL) {
519         return NULL;
520     }
521     session->channelType = CHANNEL_TYPE_AUTH;
522     session->isEncrypt = false;
523     if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, sessionName) != EOK) {
524         SoftBusFree(session);
525         return NULL;
526     }
527     return session;
528 }
529 
ClientAddAuthSession(const char * sessionName,int32_t * sessionId)530 int32_t ClientAddAuthSession(const char *sessionName, int32_t *sessionId)
531 {
532     if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) || (sessionId == NULL)) {
533         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
534         return SOFTBUS_INVALID_PARAM;
535     }
536     if (g_clientSessionServerList == NULL) {
537         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
538         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
539     }
540     SessionInfo *session = CreateNonEncryptSessionInfo(sessionName);
541     if (session == NULL) {
542         return SOFTBUS_MALLOC_ERR;
543     }
544     int32_t ret = ClientAddNewSession(sessionName, session);
545     if (ret != SOFTBUS_OK) {
546         SoftBusFree(session);
547         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client add new session failed, ret=%d.", ret);
548         return ret;
549     }
550     *sessionId = session->sessionId;
551     return SOFTBUS_OK;
552 }
553 
ClientDeleteSessionServer(SoftBusSecType type,const char * sessionName)554 int32_t ClientDeleteSessionServer(SoftBusSecType type, const char *sessionName)
555 {
556     if ((type == SEC_TYPE_UNKNOWN) || (sessionName == NULL)) {
557         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
558         return SOFTBUS_INVALID_PARAM;
559     }
560 
561     if (g_clientSessionServerList == NULL) {
562         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
563         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
564     }
565 
566     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
567         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
568         return SOFTBUS_LOCK_ERR;
569     }
570 
571     ClientSessionServer *serverNode = NULL;
572     ListNode destroyList;
573     ListInit(&destroyList);
574     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
575         if ((strcmp(serverNode->sessionName, sessionName) == 0) && (serverNode->type == type)) {
576             DestroyClientSessionServer(serverNode, &destroyList);
577             g_clientSessionServerList->cnt--;
578             break;
579         }
580     }
581     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
582     (void)ClientDestroySession(&destroyList);
583     return SOFTBUS_OK;
584 }
585 
ClientDeleteSession(int32_t sessionId)586 int32_t ClientDeleteSession(int32_t sessionId)
587 {
588     if (sessionId < 0) {
589         return SOFTBUS_ERR;
590     }
591 
592     if (g_clientSessionServerList == NULL) {
593         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
594         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
595     }
596 
597     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
598         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
599         return SOFTBUS_LOCK_ERR;
600     }
601 
602     ClientSessionServer *serverNode = NULL;
603     SessionInfo *sessionNode = NULL;
604 
605     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
606         if (IsListEmpty(&serverNode->sessionList)) {
607             continue;
608         }
609         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
610             if (sessionNode->sessionId != sessionId) {
611                 continue;
612             }
613             ListDelete(&(sessionNode->node));
614             DestroySessionId();
615             SoftBusFree(sessionNode);
616             (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
617             return SOFTBUS_OK;
618         }
619     }
620 
621     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
622     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
623     return SOFTBUS_ERR;
624 }
625 
ClientGetSessionDataById(int32_t sessionId,char * data,uint16_t len,SessionKey key)626 int32_t ClientGetSessionDataById(int32_t sessionId, char *data, uint16_t len, SessionKey key)
627 {
628     if ((sessionId < 0) || (data == NULL) || (len == 0)) {
629         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
630         return SOFTBUS_INVALID_PARAM;
631     }
632 
633     if (g_clientSessionServerList == NULL) {
634         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
635         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
636     }
637 
638     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
639         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
640         return SOFTBUS_LOCK_ERR;
641     }
642 
643     ClientSessionServer *serverNode = NULL;
644     SessionInfo *sessionNode = NULL;
645     int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
646     if (ret != SOFTBUS_OK) {
647         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
648         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s: sid[%d] not found", __func__, sessionId);
649         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
650     }
651 
652     switch (key) {
653         case KEY_SESSION_NAME:
654             ret = strcpy_s(data, len, serverNode->sessionName);
655             break;
656         case KEY_PEER_SESSION_NAME:
657             ret = strcpy_s(data, len, sessionNode->info.peerSessionName);
658             break;
659         case KEY_PEER_DEVICE_ID:
660             ret = strcpy_s(data, len, sessionNode->info.peerDeviceId);
661             break;
662         case KEY_PKG_NAME:
663             ret = strcpy_s(data, len, serverNode->pkgName);
664             break;
665         default:
666             (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
667             return SOFTBUS_ERR;
668     }
669 
670     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
671     if (ret != EOK) {
672         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "copy data failed");
673         return SOFTBUS_ERR;
674     }
675     return SOFTBUS_OK;
676 }
677 
ClientGetSessionIntegerDataById(int32_t sessionId,int * data,SessionKey key)678 int32_t ClientGetSessionIntegerDataById(int32_t sessionId, int *data, SessionKey key)
679 {
680     if ((sessionId < 0) || (data == NULL)) {
681         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
682         return SOFTBUS_INVALID_PARAM;
683     }
684 
685     if (g_clientSessionServerList == NULL) {
686         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
687         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
688     }
689 
690     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
691         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
692         return SOFTBUS_LOCK_ERR;
693     }
694 
695     ClientSessionServer *serverNode = NULL;
696     SessionInfo *sessionNode = NULL;
697     int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
698     if (ret != SOFTBUS_OK) {
699         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
700         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
701         return SOFTBUS_ERR;
702     }
703     switch (key) {
704         case KEY_IS_SERVER:
705             *data = sessionNode->isServer;
706             break;
707         case KEY_PEER_PID:
708             *data = sessionNode->peerPid;
709             break;
710         case KEY_PEER_UID:
711             *data = sessionNode->peerUid;
712             break;
713         default:
714             (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
715             return SOFTBUS_ERR;
716     }
717 
718     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
719     if (ret != EOK) {
720         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "copy data failed");
721         return SOFTBUS_ERR;
722     }
723     return SOFTBUS_OK;
724 }
725 
ClientGetChannelBySessionId(int32_t sessionId,int32_t * channelId,int32_t * type,bool * isEnable)726 int32_t ClientGetChannelBySessionId(int32_t sessionId, int32_t *channelId, int32_t *type, bool *isEnable)
727 {
728     if (sessionId < 0) {
729         return SOFTBUS_INVALID_PARAM;
730     }
731     if (g_clientSessionServerList == NULL) {
732         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
733         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
734     }
735     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
736         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
737         return SOFTBUS_LOCK_ERR;
738     }
739 
740     ClientSessionServer *serverNode = NULL;
741     SessionInfo *sessionNode = NULL;
742     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
743         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
744         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
745         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
746     }
747 
748     if (channelId != NULL) {
749         *channelId = sessionNode->channelId;
750     }
751     if (type != NULL) {
752         *type = sessionNode->channelType;
753     }
754     if (isEnable != NULL) {
755         *isEnable = sessionNode->isEnable;
756     }
757     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
758     return SOFTBUS_OK;
759 }
760 
ClientGetChannelBusinessTypeBySessionId(int32_t sessionId,int32_t * businessType)761 int32_t ClientGetChannelBusinessTypeBySessionId(int32_t sessionId, int32_t *businessType)
762 {
763     if ((sessionId < 0) || (businessType == NULL)) {
764         return SOFTBUS_INVALID_PARAM;
765     }
766     if (g_clientSessionServerList == NULL) {
767         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
768         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
769     }
770     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
771         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
772         return SOFTBUS_LOCK_ERR;
773     }
774 
775     ClientSessionServer *serverNode = NULL;
776     SessionInfo *sessionNode = NULL;
777     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
778         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
779         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
780         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
781     }
782 
783     *businessType = sessionNode->businessType;
784 
785     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
786     return SOFTBUS_OK;
787 }
788 
789 
ClientSetChannelBySessionId(int32_t sessionId,TransInfo * transInfo)790 int32_t ClientSetChannelBySessionId(int32_t sessionId, TransInfo *transInfo)
791 {
792     if ((sessionId < 0) || (transInfo->channelId < 0)) {
793         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
794         return SOFTBUS_INVALID_PARAM;
795     }
796 
797     if (g_clientSessionServerList == NULL) {
798         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
799         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
800     }
801 
802     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
803         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
804         return SOFTBUS_LOCK_ERR;
805     }
806 
807     ClientSessionServer *serverNode = NULL;
808     SessionInfo *sessionNode = NULL;
809 
810     int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
811     if (ret != SOFTBUS_OK) {
812         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
813         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
814         return SOFTBUS_ERR;
815     }
816     sessionNode->channelId = transInfo->channelId;
817     sessionNode->channelType = (ChannelType)transInfo->channelType;
818 
819     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
820     return SOFTBUS_OK;
821 }
822 
GetEncryptByChannelId(int32_t channelId,int32_t channelType,int32_t * data)823 int32_t GetEncryptByChannelId(int32_t channelId, int32_t channelType, int32_t *data)
824 {
825     if ((channelId < 0) || (data == NULL)) {
826         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
827         return SOFTBUS_INVALID_PARAM;
828     }
829 
830     if (g_clientSessionServerList == NULL) {
831         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
832         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
833     }
834 
835     ClientSessionServer *serverNode = NULL;
836     SessionInfo *sessionNode = NULL;
837 
838     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
839         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
840         return SOFTBUS_LOCK_ERR;
841     }
842 
843     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
844         if (IsListEmpty(&serverNode->sessionList)) {
845             continue;
846         }
847 
848         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
849             if (sessionNode->channelId == channelId && (int32_t)sessionNode->channelType == channelType) {
850                 *data = (int32_t)sessionNode->isEncrypt;
851                 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
852                 return SOFTBUS_OK;
853             }
854         }
855     }
856 
857     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
858     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not found session with channelId [%d]", channelId);
859     return SOFTBUS_ERR;
860 }
861 
ClientGetSessionIdByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId)862 int32_t ClientGetSessionIdByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId)
863 {
864     if ((channelId < 0) || (sessionId == NULL)) {
865         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
866         return SOFTBUS_INVALID_PARAM;
867     }
868 
869     if (g_clientSessionServerList == NULL) {
870         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
871         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
872     }
873 
874     ClientSessionServer *serverNode = NULL;
875     SessionInfo *sessionNode = NULL;
876 
877     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
878         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
879         return SOFTBUS_LOCK_ERR;
880     }
881 
882     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
883         if (IsListEmpty(&serverNode->sessionList)) {
884             continue;
885         }
886 
887         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
888             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
889                 *sessionId = sessionNode->sessionId;
890                 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
891                 return SOFTBUS_OK;
892             }
893         }
894     }
895 
896     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
897     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not found session with channelId [%d]", channelId);
898     return SOFTBUS_ERR;
899 }
900 
ClientEnableSessionByChannelId(const ChannelInfo * channel,int32_t * sessionId)901 int32_t ClientEnableSessionByChannelId(const ChannelInfo *channel, int32_t *sessionId)
902 {
903     if ((channel == NULL) || (sessionId == NULL)) {
904         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
905         return SOFTBUS_INVALID_PARAM;
906     }
907 
908     if (g_clientSessionServerList == NULL) {
909         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
910         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
911     }
912 
913     ClientSessionServer *serverNode = NULL;
914     SessionInfo *sessionNode = NULL;
915 
916     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
917         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
918         return SOFTBUS_LOCK_ERR;
919     }
920 
921     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
922         if (IsListEmpty(&serverNode->sessionList)) {
923             continue;
924         }
925 
926         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
927             if ((sessionNode->channelId == channel->channelId) &&
928                 (sessionNode->channelType == (ChannelType)(channel->channelType))) {
929                 sessionNode->peerPid = channel->peerPid;
930                 sessionNode->peerUid = channel->peerUid;
931                 sessionNode->isServer = channel->isServer;
932                 sessionNode->isEnable = true;
933                 sessionNode->routeType = channel->routeType;
934                 sessionNode->businessType = channel->businessType;
935                 sessionNode->fileEncrypt = channel->encrypt;
936                 sessionNode->algorithm = channel->algorithm;
937                 sessionNode->crc = channel->crc;
938                 *sessionId = sessionNode->sessionId;
939                 if (channel->channelType == CHANNEL_TYPE_AUTH || !sessionNode->isEncrypt) {
940                     if (memcpy_s(sessionNode->info.peerDeviceId, DEVICE_ID_SIZE_MAX,
941                             channel->peerDeviceId, DEVICE_ID_SIZE_MAX) != EOK) {
942                         (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
943                         return SOFTBUS_MEM_ERR;
944                     }
945                 }
946                 (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
947                 return SOFTBUS_OK;
948             }
949         }
950     }
951 
952     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
953     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not found session with channelId [%d], channelType [%d]",
954         channel->channelId, channel->channelType);
955     return SOFTBUS_ERR;
956 }
957 
ClientGetSessionCallbackById(int32_t sessionId,ISessionListener * callback)958 int32_t ClientGetSessionCallbackById(int32_t sessionId, ISessionListener *callback)
959 {
960     if (sessionId < 0 || callback == NULL) {
961         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
962         return SOFTBUS_INVALID_PARAM;
963     }
964 
965     if (g_clientSessionServerList == NULL) {
966         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
967         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
968     }
969 
970     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
971         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
972         return SOFTBUS_LOCK_ERR;
973     }
974 
975     ClientSessionServer *serverNode = NULL;
976     SessionInfo *sessionNode = NULL;
977     int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
978     if (ret != SOFTBUS_OK) {
979         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
980         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
981         return SOFTBUS_ERR;
982     }
983 
984     ret = memcpy_s(callback, sizeof(ISessionListener), &serverNode->listener.session, sizeof(ISessionListener));
985 
986     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
987     if (ret != EOK) {
988         return SOFTBUS_ERR;
989     }
990     return SOFTBUS_OK;
991 }
992 
ClientGetSessionCallbackByName(const char * sessionName,ISessionListener * callback)993 int32_t ClientGetSessionCallbackByName(const char *sessionName, ISessionListener *callback)
994 {
995     if (sessionName == NULL || callback == NULL) {
996         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
997         return SOFTBUS_INVALID_PARAM;
998     }
999 
1000     if (g_clientSessionServerList == NULL) {
1001         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1002         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
1003     }
1004 
1005     ClientSessionServer *serverNode = NULL;
1006 
1007     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1008         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1009         return SOFTBUS_LOCK_ERR;
1010     }
1011 
1012     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1013         if (strcmp(serverNode->sessionName, sessionName) != 0) {
1014             continue;
1015         }
1016 
1017         int32_t ret = memcpy_s(callback, sizeof(ISessionListener),
1018                                &serverNode->listener.session, sizeof(ISessionListener));
1019         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1020         if (ret != EOK) {
1021             return SOFTBUS_ERR;
1022         }
1023         return SOFTBUS_OK;
1024     }
1025 
1026     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1027     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
1028     return SOFTBUS_ERR;
1029 }
1030 
ClientGetSessionSide(int32_t sessionId)1031 int32_t ClientGetSessionSide(int32_t sessionId)
1032 {
1033     if (g_clientSessionServerList == NULL) {
1034         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1035         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
1036     }
1037 
1038     int32_t side = -1;
1039     ClientSessionServer *serverNode = NULL;
1040     SessionInfo *sessionNode = NULL;
1041 
1042     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1043         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1044         return SOFTBUS_LOCK_ERR;
1045     }
1046 
1047     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1048         if (IsListEmpty(&serverNode->sessionList)) {
1049             continue;
1050         }
1051         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1052             if (sessionNode->sessionId != sessionId) {
1053                 continue;
1054             }
1055             side = sessionNode->isServer ? IS_SERVER : IS_CLIENT;
1056             (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1057             return side;
1058         }
1059     }
1060     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1061     return side;
1062 }
1063 
DestroyClientSessionByNetworkId(const ClientSessionServer * server,const char * networkId,int32_t routeType,ListNode * destroyList)1064 static void DestroyClientSessionByNetworkId(const ClientSessionServer *server,
1065     const char *networkId, int32_t routeType, ListNode *destroyList)
1066 {
1067     SessionInfo *sessionNode = NULL;
1068     SessionInfo *sessionNodeNext = NULL;
1069 
1070     LIST_FOR_EACH_ENTRY_SAFE(sessionNode, sessionNodeNext, &(server->sessionList), SessionInfo, node) {
1071         if (strcmp(sessionNode->info.peerDeviceId, networkId) != 0) {
1072             continue;
1073         }
1074         if (routeType != ROUTE_TYPE_ALL && sessionNode->routeType != routeType) {
1075             continue;
1076         }
1077 
1078         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "DestroyClientSessionByNetworkId info={%d, %d, %d}",
1079             sessionNode->channelId, sessionNode->channelType, sessionNode->routeType);
1080         DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, server);
1081         if (destroyNode == NULL) {
1082             continue;
1083         }
1084         DestroySessionId();
1085         ListDelete(&sessionNode->node);
1086         ListAdd(destroyList, &(destroyNode->node));
1087         SoftBusFree(sessionNode);
1088     }
1089 }
1090 
ClientTransLnnOfflineProc(NodeBasicInfo * info)1091 static void ClientTransLnnOfflineProc(NodeBasicInfo *info)
1092 {
1093     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "device offline callback enter.");
1094     if (info == NULL) {
1095         return;
1096     }
1097     if (g_clientSessionServerList == NULL) {
1098         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1099         return;
1100     }
1101 
1102     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1103         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1104         return;
1105     }
1106 
1107     ClientSessionServer *serverNode = NULL;
1108     ListNode destroyList;
1109     ListInit(&destroyList);
1110     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1111         DestroyClientSessionByNetworkId(serverNode, info->networkId, ROUTE_TYPE_ALL, &destroyList);
1112     }
1113     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1114     (void)ClientDestroySession(&destroyList);
1115     return;
1116 }
1117 
1118 static INodeStateCb g_transLnnCb = {
1119     .events = EVENT_NODE_STATE_OFFLINE,
1120     .onNodeOffline = ClientTransLnnOfflineProc,
1121 };
1122 
ReCreateSessionServerToServer(void)1123 int32_t ReCreateSessionServerToServer(void)
1124 {
1125     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ReCreateSessionServerToServer");
1126     if (g_clientSessionServerList == NULL) {
1127         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1128         return SOFTBUS_ERR;
1129     }
1130     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1131         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1132         return SOFTBUS_LOCK_ERR;
1133     }
1134 
1135     ClientSessionServer *serverNode = NULL;
1136     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1137         int32_t ret = ServerIpcCreateSessionServer(serverNode->pkgName, serverNode->sessionName);
1138         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "session name [%s], pkg name [%s], ret [%d]",
1139             serverNode->sessionName, serverNode->pkgName, ret);
1140     }
1141 
1142     (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
1143     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ReCreateSessionServerToServer ok");
1144     return SOFTBUS_OK;
1145 }
1146 
1147 
ClientTransRegLnnOffline(void)1148 void ClientTransRegLnnOffline(void)
1149 {
1150     int32_t ret;
1151     ret = RegNodeDeviceStateCbInner("trans", &g_transLnnCb);
1152     if (ret != SOFTBUS_OK) {
1153         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "reg lnn offline fail");
1154     }
1155 }
1156 
ClientTransOnLinkDown(const char * networkId,int32_t routeType)1157 void ClientTransOnLinkDown(const char *networkId, int32_t routeType)
1158 {
1159     if (networkId == NULL || g_clientSessionServerList == NULL) {
1160         return;
1161     }
1162     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ClientTransOnLinkDown: routeType=%d", routeType);
1163 
1164     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1165         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1166         return;
1167     }
1168     ClientSessionServer *serverNode = NULL;
1169     ListNode destroyList;
1170     ListInit(&destroyList);
1171     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1172         DestroyClientSessionByNetworkId(serverNode, networkId, routeType, &destroyList);
1173     }
1174     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1175     (void)ClientDestroySession(&destroyList);
1176     return;
1177 }
1178 
ClientGrantPermission(int uid,int pid,const char * busName)1179 int32_t ClientGrantPermission(int uid, int pid, const char *busName)
1180 {
1181     if (uid < 0 || pid < 0 || busName == NULL) {
1182         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid parameter");
1183         return SOFTBUS_ERR;
1184     }
1185     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ClientGrantPermission: sessionName=%s", busName);
1186 
1187     int32_t ret = ServerIpcGrantPermission(uid, pid, busName);
1188     if (ret != SOFTBUS_OK) {
1189         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "server grant permission failed, ret=%d", ret);
1190     }
1191     return ret;
1192 }
1193 
ClientRemovePermission(const char * busName)1194 int32_t ClientRemovePermission(const char *busName)
1195 {
1196     if (busName == NULL) {
1197         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "invalid parameter");
1198         return SOFTBUS_ERR;
1199     }
1200     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ClientRemovePermission: sessionName=%s", busName);
1201 
1202     int32_t ret = ServerIpcRemovePermission(busName);
1203     if (ret != SOFTBUS_OK) {
1204         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "server remove permission failed, ret=%d", ret);
1205     }
1206     return ret;
1207 }
1208 
ClientGetFileConfigInfoById(int32_t sessionId,int32_t * fileEncrypt,int32_t * algorithm,int32_t * crc)1209 int32_t ClientGetFileConfigInfoById(int32_t sessionId, int32_t *fileEncrypt, int32_t *algorithm, int32_t *crc)
1210 {
1211     if (sessionId < 0 || fileEncrypt == NULL || algorithm == NULL || crc == NULL) {
1212         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
1213         return SOFTBUS_INVALID_PARAM;
1214     }
1215 
1216     if (g_clientSessionServerList == NULL) {
1217         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
1218         return SOFTBUS_ERR;
1219     }
1220 
1221     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != 0) {
1222         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock failed");
1223         return SOFTBUS_LOCK_ERR;
1224     }
1225 
1226     ClientSessionServer *serverNode = NULL;
1227     SessionInfo *sessionNode = NULL;
1228     int32_t ret = GetSessionById(sessionId, &serverNode, &sessionNode);
1229     if (ret != SOFTBUS_OK) {
1230         (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1231         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "%s:not found", __func__);
1232         return SOFTBUS_NOT_FIND;
1233     }
1234     *fileEncrypt = sessionNode->fileEncrypt;
1235     *algorithm = sessionNode->algorithm;
1236     *crc = sessionNode->crc;
1237     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
1238     return SOFTBUS_OK;
1239 }
1240 
ClientCleanAllSessionWhenServerDeath(void)1241 void ClientCleanAllSessionWhenServerDeath(void)
1242 {
1243     if (g_clientSessionServerList == NULL) {
1244         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client session server list not init.");
1245         return;
1246     }
1247     uint32_t destroyCnt = 0;
1248     ListNode destroyList;
1249     ListInit(&destroyList);
1250     if (SoftBusMutexLock(&(g_clientSessionServerList->lock)) != SOFTBUS_OK) {
1251         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client get session server list lock failed.");
1252         return;
1253     }
1254     ClientSessionServer *serverNode = NULL;
1255     SessionInfo *sessionNode = NULL;
1256     SessionInfo *nextSessionNode = NULL;
1257     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1258         if (IsListEmpty(&serverNode->sessionList)) {
1259             continue;
1260         }
1261         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
1262             DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, serverNode);
1263             if (destroyNode == NULL) {
1264                 continue;
1265             }
1266             ListAdd(&destroyList, &(destroyNode->node));
1267             DestroySessionId();
1268             ListDelete(&sessionNode->node);
1269             SoftBusFree(sessionNode);
1270             ++destroyCnt;
1271         }
1272     }
1273     (void)SoftBusMutexUnlock(&g_clientSessionServerList->lock);
1274     (void)ClientDestroySession(&destroyList);
1275     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "client destroy session cnt[%d].", destroyCnt);
1276 }
1277