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