• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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_callback.h"
17 
18 #include <securec.h>
19 #include <unistd.h>
20 
21 #include "anonymizer.h"
22 #include "client_trans_proxy_manager.h"
23 #include "client_trans_session_manager.h"
24 #include "client_trans_socket_manager.h"
25 #include "client_trans_udp_manager.h"
26 #include "softbus_adapter_mem.h"
27 #include "softbus_def.h"
28 #include "softbus_error_code.h"
29 #include "trans_log.h"
30 
31 #define RETRY_GET_INFO_TIMES_MS 300
32 
33 static IClientSessionCallBack g_sessionCb;
34 
AcceptSessionAsServer(const char * sessionName,const ChannelInfo * channel,uint32_t flag,int32_t * sessionId)35 static int32_t AcceptSessionAsServer(const char *sessionName, const ChannelInfo *channel, uint32_t flag,
36     int32_t *sessionId)
37 {
38     TRANS_LOGD(TRANS_SDK, "enter.");
39     SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
40     if (session == NULL) {
41         TRANS_LOGE(TRANS_SDK, "malloc failed");
42         return SOFTBUS_MALLOC_ERR;
43     }
44 
45     session->channelId = channel->channelId;
46     session->channelType = (ChannelType)channel->channelType;
47     session->peerPid = channel->peerPid;
48     session->peerUid = channel->peerUid;
49     session->isServer = channel->isServer;
50     session->enableStatus = ENABLE_STATUS_SUCCESS;
51     session->info.flag = (int32_t)flag;
52     session->isEncrypt = channel->isEncrypt;
53     session->businessType = channel->businessType;
54     session->routeType = channel->routeType;
55     session->fileEncrypt = channel->fileEncrypt;
56     session->algorithm = channel->algorithm;
57     session->crc = channel->crc;
58     session->dataConfig = channel->dataConfig;
59     session->isAsync = false;
60     session->osType = channel->osType;
61     session->lifecycle.sessionState = SESSION_STATE_CALLBACK_FINISHED;
62     session->isSupportTlv = channel->isSupportTlv;
63     if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, channel->peerSessionName) != EOK ||
64         strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, channel->peerDeviceId) != EOK ||
65         strcpy_s(session->info.groupId, GROUP_ID_SIZE_MAX, channel->groupId) != EOK) {
66         TRANS_LOGE(TRANS_SDK, "client or peer session name, device id, group id failed");
67         SoftBusFree(session);
68         return SOFTBUS_STRCPY_ERR;
69     }
70 
71     int32_t ret = ClientAddNewSession(sessionName, session);
72     if (ret != SOFTBUS_OK) {
73         TRANS_LOGE(TRANS_SDK, "client add session failed, ret=%{public}d", ret);
74         SoftBusFree(session);
75         return ret;
76     }
77     *sessionId = session->sessionId;
78     TRANS_LOGD(TRANS_SDK, "ok");
79     return SOFTBUS_OK;
80 }
81 
GetSessionCallbackByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,ISessionListener * listener)82 static int32_t GetSessionCallbackByChannelId(int32_t channelId, int32_t channelType,
83     int32_t *sessionId, ISessionListener *listener)
84 {
85     if ((channelId < 0) || (sessionId == NULL) || (listener == NULL)) {
86         TRANS_LOGW(TRANS_SDK, "Invalid param");
87         return SOFTBUS_INVALID_PARAM;
88     }
89     int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, false);
90     if (ret != SOFTBUS_OK) {
91         TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
92         return ret;
93     }
94     ret = ClientGetSessionCallbackById(*sessionId, listener);
95     if (ret != SOFTBUS_OK) {
96         TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
97         return ret;
98     }
99     return SOFTBUS_OK;
100 }
101 
GetSocketCallbackAdapterByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,SessionListenerAdapter * sessionCallback,bool * isServer)102 static int32_t GetSocketCallbackAdapterByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId,
103     SessionListenerAdapter *sessionCallback, bool *isServer)
104 {
105     if ((channelId < 0) || (sessionId == NULL) ||
106         (sessionCallback == NULL) || (isServer == NULL)) {
107         TRANS_LOGE(TRANS_SDK, "Invalid param");
108         return SOFTBUS_INVALID_PARAM;
109     }
110 
111     int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, false);
112     if (ret != SOFTBUS_OK) {
113         TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
114         return ret;
115     }
116     ret = ClientGetSessionCallbackAdapterById(*sessionId, sessionCallback, isServer);
117     if (ret != SOFTBUS_OK) {
118         TRANS_LOGE(TRANS_SDK, "get socket callback failed, channelId=%{public}d,"
119             "ret=%{public}d", channelId, ret);
120         return ret;
121     }
122     return SOFTBUS_OK;
123 }
124 
GetSocketCallbackAdapterByUdpChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,SessionListenerAdapter * sessionCallback,bool * isServer)125 static int32_t GetSocketCallbackAdapterByUdpChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId,
126     SessionListenerAdapter *sessionCallback, bool *isServer)
127 {
128     if ((channelId < 0) || (sessionId == NULL) ||
129         (sessionCallback == NULL) || (isServer == NULL)) {
130         TRANS_LOGE(TRANS_SDK, "Invalid param");
131         return SOFTBUS_INVALID_PARAM;
132     }
133 
134     int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, true);
135     if (ret != SOFTBUS_OK) {
136         TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
137         return ret;
138     }
139     ret = ClientGetSessionCallbackAdapterById(*sessionId, sessionCallback, isServer);
140     if (ret != SOFTBUS_OK) {
141         TRANS_LOGE(TRANS_SDK, "get socket callback failed, ret=%{public}d", ret);
142         return ret;
143     }
144     return SOFTBUS_OK;
145 }
146 
TransOnBindSuccess(int32_t sessionId,const ISocketListener * socketCallback)147 NO_SANITIZE("cfi") static int32_t TransOnBindSuccess(int32_t sessionId, const ISocketListener *socketCallback)
148 {
149     if (socketCallback == NULL || socketCallback->OnBind == NULL) {
150         TRANS_LOGE(TRANS_SDK, "Invalid OnBind callback function");
151         return SOFTBUS_INVALID_PARAM;
152     }
153 
154     PeerSocketInfo info;
155     int32_t ret = ClientGetPeerSocketInfoById(sessionId, &info);
156     if (ret != SOFTBUS_OK) {
157         TRANS_LOGE(TRANS_SDK, "Get peer socket info failed, ret=%{public}d", ret);
158         return ret;
159     }
160 
161     (void)socketCallback->OnBind(sessionId, info);
162     return SOFTBUS_OK;
163 }
164 
165 NO_SANITIZE("cfi")
TransOnBindFailed(int32_t sessionId,const ISocketListener * socketCallback,int32_t errCode)166 static int32_t TransOnBindFailed(int32_t sessionId, const ISocketListener *socketCallback, int32_t errCode)
167 {
168     (void)ClientHandleBindWaitTimer(sessionId, 0, TIMER_ACTION_STOP);
169     bool isAsync = true;
170     int32_t ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
171     if (ret != SOFTBUS_OK) {
172         TRANS_LOGE(TRANS_SDK, "get is async type failed, sessionId=%{public}d, ret=%{public}d", sessionId, ret);
173         return ret;
174     }
175     if (!isAsync) {
176         (void)ClientSignalSyncBind(sessionId, errCode);
177         return SOFTBUS_OK;
178     }
179     if (socketCallback == NULL || socketCallback->OnError == NULL) {
180         TRANS_LOGE(TRANS_SDK, "Invalid OnBind callback function");
181         return SOFTBUS_INVALID_PARAM;
182     }
183 
184     SocketLifecycleData lifecycle;
185     (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
186     ret = GetSocketLifecycleAndSessionNameBySessionId(sessionId, NULL, &lifecycle);
187     (void)SetSessionStateBySessionId(sessionId, SESSION_STATE_INIT, 0);
188     if (ret == SOFTBUS_OK && lifecycle.sessionState == SESSION_STATE_CANCELLING) {
189         TRANS_LOGW(TRANS_SDK, "socket is cancelling, no need call back, socket=%{public}d, bindErrCode=%{public}d",
190             sessionId, lifecycle.bindErrCode);
191         return lifecycle.bindErrCode;
192     }
193 
194     (void)socketCallback->OnError(sessionId, errCode);
195     TRANS_LOGI(TRANS_SDK, "OnError success, client socket=%{public}d", sessionId);
196     return SOFTBUS_OK;
197 }
198 
HandleAsyncBindSuccess(int32_t sessionId,const ISocketListener * socketClient,const SocketLifecycleData * lifecycle)199 static int32_t HandleAsyncBindSuccess(
200     int32_t sessionId, const ISocketListener *socketClient, const SocketLifecycleData *lifecycle)
201 {
202     int32_t ret = ClientHandleBindWaitTimer(sessionId, 0, TIMER_ACTION_STOP);
203     if (ret != SOFTBUS_OK) {
204         TRANS_LOGE(TRANS_SDK, "stop bind wait timer failed, ret=%{public}d", ret);
205         return ret;
206     }
207     if (lifecycle->sessionState == SESSION_STATE_CANCELLING) {
208         TRANS_LOGW(TRANS_SDK, "session is cancelling, no need call back");
209         return SOFTBUS_OK;
210     }
211     ret = SetSessionStateBySessionId(sessionId, SESSION_STATE_CALLBACK_FINISHED, 0);
212     if (ret != SOFTBUS_OK) {
213         TRANS_LOGE(TRANS_SDK, "set session state failed, ret=%{public}d", ret);
214         return ret;
215     }
216 
217     return TransOnBindSuccess(sessionId, socketClient);
218 }
219 
TransOnNegotiate(int32_t socket,const ISocketListener * socketCallback)220 NO_SANITIZE("cfi") static int32_t TransOnNegotiate(int32_t socket, const ISocketListener *socketCallback)
221 {
222     if (socketCallback == NULL) {
223         TRANS_LOGE(TRANS_SDK, "Invalid socketCallback socket=%{public}d", socket);
224         return SOFTBUS_INVALID_PARAM;
225     }
226 
227     if (socketCallback->OnNegotiate == NULL) {
228         TRANS_LOGW(TRANS_SDK, "no OnNegotiate callback function socket=%{public}d", socket);
229         return SOFTBUS_OK;
230     }
231 
232     PeerSocketInfo info = {0};
233     int32_t ret = ClientGetPeerSocketInfoById(socket, &info);
234     if (ret != SOFTBUS_OK) {
235         TRANS_LOGE(TRANS_SDK, "Get peer socket info failed, ret=%{public}d, socket=%{public}d", ret, socket);
236         return ret;
237     }
238 
239     if (!socketCallback->OnNegotiate(socket, info)) {
240         TRANS_LOGW(TRANS_SDK, "The negotiate rejected the socket=%{public}d", socket);
241         return SOFTBUS_TRANS_NEGOTIATE_REJECTED;
242     }
243 
244     return SOFTBUS_OK;
245 }
246 
HandleServerOnNegotiate(int32_t socket,const ISocketListener * socketServer)247 static int32_t HandleServerOnNegotiate(int32_t socket, const ISocketListener *socketServer)
248 {
249     int32_t ret = TransOnNegotiate(socket, socketServer);
250     if (ret != SOFTBUS_OK) {
251         TRANS_LOGE(TRANS_SDK, "OnBind failed, ret=%{public}d", ret);
252         (void)ClientDeleteSocketSession(socket);
253         return ret;
254     }
255     return SOFTBUS_OK;
256 }
257 
HandleCacheQosEvent(int32_t socket,SessionListenerAdapter sessionCallback,bool isServer)258 static int32_t HandleCacheQosEvent(int32_t socket, SessionListenerAdapter sessionCallback, bool isServer)
259 {
260     if (isServer) {
261         TRANS_LOGD(TRANS_SDK, "server side no need to handle cache qos event");
262         return SOFTBUS_OK;
263     }
264     if (sessionCallback.socketClient.OnQos == NULL) {
265         TRANS_LOGD(TRANS_SDK, "no OnQos callback function socket=%{public}d", socket);
266         return SOFTBUS_OK;
267     }
268     CachedQosEvent cachedQosEvent;
269     (void)memset_s(&cachedQosEvent, sizeof(CachedQosEvent), 0, sizeof(CachedQosEvent));
270     int32_t ret = ClientGetCachedQosEventBySocket(socket, &cachedQosEvent);
271     if (ret != SOFTBUS_OK) {
272         TRANS_LOGE(TRANS_SDK, "get cached qos event failed, ret=%{public}d", ret);
273         return ret;
274     }
275     if (cachedQosEvent.count > 0) {
276         TRANS_LOGI(TRANS_SDK, "trigger OnQos callback, socket=%{public}d", socket);
277         sessionCallback.socketClient.OnQos(
278             socket, cachedQosEvent.event, (const QosTV *)cachedQosEvent.qos, cachedQosEvent.count);
279     }
280     return SOFTBUS_OK;
281 }
282 
HandleSyncBindSuccess(int32_t sessionId,const SocketLifecycleData * lifecycle)283 static int32_t HandleSyncBindSuccess(int32_t sessionId, const SocketLifecycleData *lifecycle)
284 {
285     if (lifecycle->sessionState == SESSION_STATE_CANCELLING) {
286         TRANS_LOGW(
287             TRANS_SDK, "socket=%{public}d is cancelling, bindErrCode=%{public}d", sessionId, lifecycle->bindErrCode);
288         return SOFTBUS_OK;
289     }
290 
291     int32_t ret = ClientSignalSyncBind(sessionId, 0);
292     if (ret != SOFTBUS_OK) {
293         TRANS_LOGE(TRANS_SDK, "sync signal bind failed, ret=%{public}d, socket=%{public}d", ret, sessionId);
294         return ret;
295     }
296     return SOFTBUS_OK;
297 }
298 
HandleOnBindSuccess(int32_t sessionId,SessionListenerAdapter sessionCallback,bool isServer)299 static int32_t HandleOnBindSuccess(int32_t sessionId, SessionListenerAdapter sessionCallback, bool isServer)
300 {
301     // async bind call back client and server, sync bind only call back server.
302     bool isAsync = true;
303     int32_t ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
304     if (ret != SOFTBUS_OK) {
305         TRANS_LOGE(TRANS_SDK, "Get is async type failed");
306         return ret;
307     }
308 
309     SocketLifecycleData lifecycle;
310     (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
311     ret = GetSocketLifecycleAndSessionNameBySessionId(sessionId, NULL, &lifecycle);
312     if (ret != SOFTBUS_OK) {
313         TRANS_LOGE(TRANS_SDK, "Get session lifecycle failed, ret=%{public}d", ret);
314         return ret;
315     }
316 
317     if (isServer) {
318         return HandleServerOnNegotiate(sessionId, &sessionCallback.socketServer);
319     } else if (isAsync) {
320         ret = HandleAsyncBindSuccess(sessionId, &sessionCallback.socketClient, &lifecycle);
321         (void)HandleCacheQosEvent(sessionId, sessionCallback, isServer);
322         return ret;
323     } else { // sync bind
324         ret = HandleSyncBindSuccess(sessionId, &lifecycle);
325         (void)HandleCacheQosEvent(sessionId, sessionCallback, isServer);
326         return ret;
327     }
328 
329     return SOFTBUS_OK;
330 }
331 
AnonymizeLogTransOnSessionOpenedInfo(const char * sessionName,const ChannelInfo * channel,SessionType flag)332 static void AnonymizeLogTransOnSessionOpenedInfo(const char *sessionName, const ChannelInfo *channel, SessionType flag)
333 {
334     char *tmpName = NULL;
335     Anonymize(sessionName, &tmpName);
336     TRANS_LOGI(TRANS_SDK,
337         "TransOnSessionOpened: sessionName=%{public}s, channelId=%{public}d, channelType=%{public}d, flag=%{public}d,"
338         "isServer=%{public}d, type=%{public}d, crc=%{public}d", AnonymizeWrapper(tmpName), channel->channelId,
339         channel->channelType, flag, channel->isServer, channel->routeType, channel->crc);
340     AnonymizeFree(tmpName);
341 }
342 
TransOnSessionOpened(const char * sessionName,const ChannelInfo * channel,SessionType flag)343 NO_SANITIZE("cfi") int32_t TransOnSessionOpened(const char *sessionName, const ChannelInfo *channel, SessionType flag)
344 {
345     if ((sessionName == NULL) || (channel == NULL)) {
346         TRANS_LOGW(TRANS_SDK, "Invalid param");
347         return SOFTBUS_INVALID_PARAM;
348     }
349     AnonymizeLogTransOnSessionOpenedInfo(sessionName, channel, flag);
350     SessionListenerAdapter sessionCallback;
351     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
352     int32_t ret = ClientGetSessionCallbackAdapterByName(sessionName, &sessionCallback);
353     if (ret != SOFTBUS_OK) {
354         TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
355         return ret;
356     }
357 
358     int32_t sessionId = INVALID_SESSION_ID;
359     if (channel->isServer) {
360         ret = AcceptSessionAsServer(sessionName, channel, flag, &sessionId);
361     } else {
362         ret = ClientEnableSessionByChannelId(channel, &sessionId);
363         if (ret == SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND) {
364             SoftBusSleepMs(RETRY_GET_INFO_TIMES_MS); // avoid set channel info later than sesssion opened callback
365             ret = ClientEnableSessionByChannelId(channel, &sessionId);
366         }
367     }
368 
369     if (ret != SOFTBUS_OK) {
370         TRANS_LOGE(TRANS_SDK, "accept session failed, ret=%{public}d", ret);
371         return ret;
372     }
373     if (channel->channelType == CHANNEL_TYPE_UDP) {
374         TransSetUdpChanelSessionId(channel->channelId, sessionId);
375     }
376     if (sessionCallback.isSocketListener) {
377         ret = HandleOnBindSuccess(sessionId, sessionCallback, channel->isServer);
378         return ret;
379     }
380     TRANS_LOGD(TRANS_SDK, "trigger session open callback");
381     if ((sessionCallback.session.OnSessionOpened == NULL) ||
382         (sessionCallback.session.OnSessionOpened(sessionId, SOFTBUS_OK) != SOFTBUS_OK)) {
383         TRANS_LOGE(TRANS_SDK, "OnSessionOpened failed");
384         (void)ClientDeleteSession(sessionId);
385         return SOFTBUS_TRANS_ON_SESSION_OPENED_FAILED;
386     }
387     TRANS_LOGI(TRANS_SDK, "ok, sessionId=%{public}d", sessionId);
388     return SOFTBUS_OK;
389 }
390 
TransOnSessionOpenFailed(int32_t channelId,int32_t channelType,int32_t errCode)391 NO_SANITIZE("cfi") int32_t TransOnSessionOpenFailed(int32_t channelId, int32_t channelType, int32_t errCode)
392 {
393     int32_t sessionId = INVALID_SESSION_ID;
394     SessionListenerAdapter sessionCallback;
395     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
396     if (channelType == CHANNEL_TYPE_UNDEFINED) {
397         sessionId = channelId;
398         (void)ClientSetEnableStatusBySocket(sessionId, ENABLE_STATUS_FAILED);
399         // only client async bind failed call
400         bool tmpIsServer = false;
401         ClientGetSessionCallbackAdapterById(sessionId, &sessionCallback, &tmpIsServer);
402         (void)TransOnBindFailed(sessionId, &sessionCallback.socketClient, errCode);
403         return SOFTBUS_OK;
404     }
405     TRANS_LOGI(TRANS_SDK, "trigger session open failed callback, channelId=%{public}d, channelType=%{public}d",
406         channelId, channelType);
407     bool isServer = false;
408     int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
409     if (ret != SOFTBUS_OK) {
410         TRANS_LOGE(TRANS_SDK, "Get Socket Callback Adapter failed, ret=%{public}d", ret);
411         return ret;
412     }
413     if (sessionCallback.isSocketListener) {
414         (void)ClientSetEnableStatusBySocket(sessionId, ENABLE_STATUS_FAILED);
415         bool isAsync = true;
416         int ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
417         if (ret != SOFTBUS_OK) {
418             TRANS_LOGE(TRANS_SDK, "get is async type failed, ret=%{public}d", ret);
419             return ret;
420         }
421 
422         if (isServer) {
423             (void)ClientDeleteSocketSession(sessionId);
424         } else if (isAsync) {
425             (void)TransOnBindFailed(sessionId, &sessionCallback.socketClient, errCode);
426         } else { // sync bind
427             (void)ClientSignalSyncBind(sessionId, errCode);
428         }
429 
430         TRANS_LOGI(TRANS_SDK, "ok, sessionid=%{public}d", sessionId);
431         return SOFTBUS_OK;
432     }
433     if (sessionCallback.session.OnSessionOpened != NULL) {
434         (void)sessionCallback.session.OnSessionOpened(sessionId, errCode);
435     }
436     (void)ClientDeleteSession(sessionId);
437     TRANS_LOGI(TRANS_SDK, "ok, sessionid=%{public}d", sessionId);
438     return SOFTBUS_OK;
439 }
440 
TransOnSessionClosed(int32_t channelId,int32_t channelType,ShutdownReason reason)441 NO_SANITIZE("cfi") int32_t TransOnSessionClosed(int32_t channelId, int32_t channelType, ShutdownReason reason)
442 {
443     TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
444     int32_t sessionId = INVALID_SESSION_ID;
445     int32_t ret = SOFTBUS_NO_INIT;
446     SessionListenerAdapter sessionCallback;
447     SessionEnableStatus enableStatus;
448     bool isServer = false;
449     bool isUdpType = (channelType == CHANNEL_TYPE_UDP ? true : false);
450     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
451     if (isUdpType) {
452         (void)GetSocketCallbackAdapterByUdpChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
453     } else {
454         (void)GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
455     }
456 
457     (void)ClientGetChannelBySessionId(sessionId, NULL, NULL, &enableStatus);
458     TRANS_LOGI(TRANS_SDK, "trigger session close callback");
459     if (sessionCallback.isSocketListener && enableStatus == ENABLE_STATUS_SUCCESS) {
460         ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
461         if (listener->OnShutdown != NULL) {
462             listener->OnShutdown(sessionId, reason);
463         }
464         ret = ClientDeleteSocketSession(sessionId);
465     } else if (sessionCallback.session.OnSessionClosed != NULL) {
466         sessionCallback.session.OnSessionClosed(sessionId);
467         ret = ClientDeleteSession(sessionId);
468     }
469 
470     if (ret != SOFTBUS_OK) {
471         TRANS_LOGE(TRANS_SDK, "client delete session failed");
472         return ret;
473     }
474     TRANS_LOGI(TRANS_SDK, "ok, sessionId=%{public}d", sessionId);
475     return SOFTBUS_OK;
476 }
477 
ProcessReceivedFileData(int32_t sessionId,int32_t channelId,const char * data,uint32_t len,SessionPktType type)478 static int32_t ProcessReceivedFileData(int32_t sessionId, int32_t channelId, const char *data, uint32_t len,
479     SessionPktType type)
480 {
481     char sessionName[SESSION_NAME_SIZE_MAX] = { 0 };
482     int32_t ret = ClientGetSessionDataById(sessionId, sessionName, SESSION_NAME_SIZE_MAX, KEY_SESSION_NAME);
483     if (ret != SOFTBUS_OK) {
484         TRANS_LOGE(TRANS_FILE, "get sessionName by sessionId=%{public}d failed, ret=%{public}d", sessionId, ret);
485         return ret;
486     }
487 
488     ret = ProcessFileFrameData(sessionId, channelId, data, len, type);
489     if (ret != SOFTBUS_OK) {
490         TRANS_LOGE(TRANS_FILE, "process file frame data failed, ret=%{public}d", ret);
491         return ret;
492     }
493     return SOFTBUS_OK;
494 }
495 
TransOnDataReceived(int32_t channelId,int32_t channelType,const void * data,uint32_t len,SessionPktType type)496 NO_SANITIZE("cfi") int32_t TransOnDataReceived(int32_t channelId, int32_t channelType,
497     const void *data, uint32_t len, SessionPktType type)
498 {
499     int32_t sessionId;
500     SessionListenerAdapter sessionCallback;
501     bool isServer = false;
502     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
503     int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
504     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get session callback failed");
505     (void)ClientResetIdleTimeoutById(sessionId);
506     ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
507     switch (type) {
508         case TRANS_SESSION_BYTES:
509             if (sessionCallback.isSocketListener) {
510                 if (listener->OnBytes != NULL) {
511                     listener->OnBytes(sessionId, data, len);
512                 }
513             } else if (sessionCallback.session.OnBytesReceived != NULL) {
514                 sessionCallback.session.OnBytesReceived(sessionId, data, len);
515             }
516             break;
517         case TRANS_SESSION_MESSAGE:
518             if (sessionCallback.isSocketListener) {
519                 if (listener->OnMessage != NULL) {
520                     listener->OnMessage(sessionId, data, len);
521                 }
522             } else if (sessionCallback.session.OnMessageReceived != NULL) {
523                 sessionCallback.session.OnMessageReceived(sessionId, data, len);
524             }
525             break;
526         case TRANS_SESSION_FILE_FIRST_FRAME:
527         case TRANS_SESSION_FILE_ONGOINE_FRAME:
528         case TRANS_SESSION_FILE_LAST_FRAME:
529         case TRANS_SESSION_FILE_ONLYONE_FRAME:
530         case TRANS_SESSION_FILE_ALLFILE_SENT:
531         case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
532         case TRANS_SESSION_FILE_RESULT_FRAME:
533         case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
534         case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
535             if (channelType == CHANNEL_TYPE_PROXY) {
536                 return ProcessReceivedFileData(sessionId, channelId, (char *)data, len, type);
537             }
538             break;
539         default:
540             TRANS_LOGE(TRANS_FILE, "revc unknown session type = %{public}d", type);
541             return SOFTBUS_TRANS_INVALID_SESSION_TYPE;
542     }
543 
544     return SOFTBUS_OK;
545 }
546 
TransOnOnStreamRecevied(int32_t channelId,int32_t channelType,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)547 NO_SANITIZE("cfi") int32_t TransOnOnStreamRecevied(int32_t channelId, int32_t channelType,
548     const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
549 {
550     int32_t sessionId;
551     SessionListenerAdapter sessionCallback;
552     bool isServer = false;
553     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
554     int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
555     if (ret != SOFTBUS_OK) {
556         TRANS_LOGE(TRANS_STREAM, "get session callback failed");
557         return ret;
558     }
559 
560     (void)ClientResetIdleTimeoutById(sessionId);
561     if (sessionCallback.isSocketListener) {
562         ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
563         if (listener->OnStream != NULL) {
564             listener->OnStream(sessionId, data, ext, param);
565         }
566         return SOFTBUS_OK;
567     }
568 
569     if (sessionCallback.session.OnStreamReceived == NULL) {
570         TRANS_LOGE(TRANS_STREAM, "listener OnStreamReceived is NULL");
571         return SOFTBUS_NO_INIT;
572     }
573 
574     sessionCallback.session.OnStreamReceived(sessionId, data, ext, param);
575     return SOFTBUS_OK;
576 }
577 
TransOnQosEvent(int32_t channelId,int32_t channelType,int32_t eventId,int32_t tvCount,const QosTv * tvList)578 NO_SANITIZE("cfi") int32_t TransOnQosEvent(int32_t channelId, int32_t channelType, int32_t eventId,
579     int32_t tvCount, const QosTv *tvList)
580 {
581     int32_t sessionId;
582     ISessionListener listener = {0};
583     int32_t ret = GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
584     if (ret != SOFTBUS_OK) {
585         TRANS_LOGE(TRANS_QOS, "get session callback failed");
586         return ret;
587     }
588     if (listener.OnQosEvent == NULL) {
589         TRANS_LOGE(TRANS_QOS, "listener OnQosEvent is NULL, channelId=%{public}d, sessionId=%{public}d",
590                    channelId, sessionId);
591         return SOFTBUS_NO_INIT;
592     }
593     listener.OnQosEvent(sessionId, eventId, tvCount, tvList);
594     return SOFTBUS_OK;
595 }
596 
ClientTransOnChannelBind(int32_t channelId,int32_t channelType)597 int32_t ClientTransOnChannelBind(int32_t channelId, int32_t channelType)
598 {
599     TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
600     int32_t socket = INVALID_SESSION_ID;
601     SessionListenerAdapter sessionCallback;
602     bool isServer = false;
603     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
604     int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &socket, &sessionCallback, &isServer);
605     if (ret != SOFTBUS_OK) {
606         TRANS_LOGE(TRANS_SDK, "get session callback failed channelId=%{public}d", channelId);
607         return ret;
608     }
609 
610     if (!sessionCallback.isSocketListener) {
611         TRANS_LOGW(TRANS_SDK, "QoS recv session callback channelId=%{public}d", channelId);
612         return SOFTBUS_NOT_NEED_UPDATE;
613     }
614 
615     if (!isServer) {
616         TRANS_LOGW(TRANS_SDK, "only server need OnChannelBind channelId=%{public}d", channelId);
617         return SOFTBUS_NOT_NEED_UPDATE;
618     }
619 
620     ISocketListener *listener = &sessionCallback.socketServer;
621     ret = TransOnBindSuccess(socket, listener);
622     if (ret != SOFTBUS_OK) {
623         TRANS_LOGE(TRANS_SDK, "client on bind failed channelId=%{public}d", channelId);
624         return ret;
625     }
626     TRANS_LOGI(TRANS_SDK, "ok, channelId=%{public}d", channelId);
627     return SOFTBUS_OK;
628 }
629 
ClientTransIfChannelForSocket(const char * sessionName,bool * isSocket)630 int32_t ClientTransIfChannelForSocket(const char *sessionName, bool *isSocket)
631 {
632     if (sessionName == NULL || isSocket == NULL) {
633         TRANS_LOGE(TRANS_SDK, "sessionName or isSocket is NULL");
634         return SOFTBUS_INVALID_PARAM;
635     }
636 
637     SessionListenerAdapter sessionCallback;
638     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
639     int32_t ret = ClientGetSessionCallbackAdapterByName(sessionName, &sessionCallback);
640     if (ret != SOFTBUS_OK) {
641         char *tmpName = NULL;
642         Anonymize(sessionName, &tmpName);
643         TRANS_LOGE(TRANS_SDK, "get session callback failed, sessionName=%{public}s", AnonymizeWrapper(tmpName));
644         AnonymizeFree(tmpName);
645         return ret;
646     }
647 
648     *isSocket = sessionCallback.isSocketListener;
649     return SOFTBUS_OK;
650 }
651 
ClientTransOnQos(int32_t channelId,int32_t channelType,QoSEvent event,const QosTV * qos,uint32_t count)652 int32_t ClientTransOnQos(int32_t channelId, int32_t channelType, QoSEvent event, const QosTV *qos, uint32_t count)
653 {
654     if (qos == NULL) {
655         TRANS_LOGE(TRANS_SDK, "qos is NULL");
656         return SOFTBUS_INVALID_PARAM;
657     }
658     int32_t socket = INVALID_SESSION_ID;
659     SessionListenerAdapter sessionCallback;
660     bool isServer = false;
661     (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
662     int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &socket, &sessionCallback, &isServer);
663     if (ret != SOFTBUS_OK) {
664         TRANS_LOGE(TRANS_SDK, "get session callback failed channelId=%{public}d", channelId);
665         return ret;
666     }
667     if (isServer) {
668         TRANS_LOGI(TRANS_SDK, "not report qos event on server side");
669         return SOFTBUS_OK;
670     }
671     if (!sessionCallback.isSocketListener) {
672         TRANS_LOGI(TRANS_SDK, "not report qos event on non-socket session");
673         return SOFTBUS_OK;
674     }
675     if (sessionCallback.socketClient.OnQos == NULL) {
676         TRANS_LOGD(TRANS_SDK, "listener OnQos is NULL, sessionId=%{public}d", socket);
677         return SOFTBUS_OK;
678     }
679     ret = ClientCacheQosEvent(socket, event, qos, count);
680     if (ret != SOFTBUS_OK && ret != SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT) {
681         TRANS_LOGE(TRANS_SDK, "cache qos event failed, ret=%{public}d", ret);
682         return ret;
683     } else if (ret == SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT) {
684         sessionCallback.socketClient.OnQos(socket, event, qos, count);
685         TRANS_LOGI(TRANS_SDK, "report qos event to client socket=%{public}d, event=%{public}d", socket, event);
686     }
687     return SOFTBUS_OK;
688 }
689 
GetClientSessionCb(void)690 IClientSessionCallBack *GetClientSessionCb(void)
691 {
692     g_sessionCb.OnSessionOpened = TransOnSessionOpened;
693     g_sessionCb.OnSessionClosed = TransOnSessionClosed;
694     g_sessionCb.OnSessionOpenFailed = TransOnSessionOpenFailed;
695     g_sessionCb.OnDataReceived = TransOnDataReceived;
696     g_sessionCb.OnStreamReceived = TransOnOnStreamRecevied;
697     g_sessionCb.OnGetSessionId = ClientGetSessionIdByChannelId;
698     g_sessionCb.OnQosEvent = TransOnQosEvent;
699     g_sessionCb.OnIdleTimeoutReset = ClientResetIdleTimeoutById;
700     g_sessionCb.OnRawStreamEncryptDefOptGet = ClientRawStreamEncryptDefOptGet;
701     g_sessionCb.OnRawStreamEncryptOptGet = ClientRawStreamEncryptOptGet;
702     g_sessionCb.OnChannelBind = ClientTransOnChannelBind;
703     g_sessionCb.IfChannelForSocket = ClientTransIfChannelForSocket;
704     g_sessionCb.OnQos = ClientTransOnQos;
705     return &g_sessionCb;
706 }
707