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_callback.h"
17
18 #include <securec.h>
19
20 #include "client_trans_proxy_manager.h"
21 #include "client_trans_session_manager.h"
22 #include "softbus_adapter_mem.h"
23 #include "softbus_def.h"
24 #include "softbus_errcode.h"
25 #include "softbus_log.h"
26
27 static IClientSessionCallBack g_sessionCb;
28
AcceptSessionAsServer(const char * sessionName,const ChannelInfo * channel,uint32_t flag,int32_t * sessionId)29 static int32_t AcceptSessionAsServer(const char *sessionName, const ChannelInfo *channel, uint32_t flag,
30 int32_t *sessionId)
31 {
32 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "AcceptSessionAsServer");
33 SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
34 if (session == NULL) {
35 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc failed");
36 return SOFTBUS_MALLOC_ERR;
37 }
38
39 session->channelId = channel->channelId;
40 session->channelType = (ChannelType)channel->channelType;
41 session->peerPid = channel->peerPid;
42 session->peerUid = channel->peerUid;
43 session->isServer = channel->isServer;
44 session->isEnable = true;
45 session->info.flag = (int32_t)flag;
46 session->isEncrypt = channel->isEncrypt;
47 session->businessType = channel->businessType;
48 session->routeType = channel->routeType;
49 session->fileEncrypt = channel->fileEncrypt;
50 session->algorithm = channel->algorithm;
51 session->crc = channel->crc;
52 session->dataConfig = channel->dataConfig;
53 if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, channel->peerSessionName) != EOK ||
54 strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, channel->peerDeviceId) != EOK ||
55 strcpy_s(session->info.groupId, GROUP_ID_SIZE_MAX, channel->groupId) != EOK) {
56 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client add peer session name, device id, group id failed");
57 SoftBusFree(session);
58 return SOFTBUS_MEM_ERR;
59 }
60
61 int32_t ret = ClientAddNewSession(sessionName, session);
62 if (ret != SOFTBUS_OK) {
63 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client add session failed");
64 SoftBusFree(session);
65 return SOFTBUS_ERR;
66 }
67 *sessionId = session->sessionId;
68 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "AcceptSessionAsServer ok");
69 return SOFTBUS_OK;
70 }
71
GetSessionCallbackByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,ISessionListener * listener)72 static int32_t GetSessionCallbackByChannelId(int32_t channelId, int32_t channelType,
73 int32_t *sessionId, ISessionListener *listener)
74 {
75 if ((channelId < 0) || (sessionId == NULL) || (listener == NULL)) {
76 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
77 return SOFTBUS_INVALID_PARAM;
78 }
79 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId);
80 if (ret != SOFTBUS_OK) {
81 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get sessionId failed, channelId [%d]", channelId);
82 return SOFTBUS_ERR;
83 }
84 ret = ClientGetSessionCallbackById(*sessionId, listener);
85 if (ret != SOFTBUS_OK) {
86 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get session listener failed");
87 return SOFTBUS_ERR;
88 }
89 return SOFTBUS_OK;
90 }
91
TransOnSessionOpened(const char * sessionName,const ChannelInfo * channel,SessionType flag)92 NO_SANITIZE("cfi") int32_t TransOnSessionOpened(const char *sessionName, const ChannelInfo *channel, SessionType flag)
93 {
94 if ((sessionName == NULL) || (channel == NULL)) {
95 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid param");
96 return SOFTBUS_INVALID_PARAM;
97 }
98 char *anonyOut = NULL;
99 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
100 "TransOnSessionOpened: sessionName=%s, flag=%d, isServer=%d, type=%d, crc=%d",
101 AnonyDevId(&anonyOut, sessionName), flag, channel->isServer, channel->routeType, channel->crc);
102 SoftBusFree(anonyOut);
103
104 ISessionListener listener = {0};
105 int32_t ret = ClientGetSessionCallbackByName(sessionName, &listener);
106 if (ret != SOFTBUS_OK) {
107 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get session listener failed");
108 return SOFTBUS_ERR;
109 }
110
111 int32_t sessionId = INVALID_SESSION_ID;
112 if (channel->isServer) {
113 ret = AcceptSessionAsServer(sessionName, channel, flag, &sessionId);
114 } else {
115 ret = ClientEnableSessionByChannelId(channel, &sessionId);
116 }
117
118 if (ret != SOFTBUS_OK) {
119 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "accept session failed");
120 return SOFTBUS_ERR;
121 }
122
123 if ((listener.OnSessionOpened == NULL) || (listener.OnSessionOpened(sessionId, SOFTBUS_OK) != SOFTBUS_OK)) {
124 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OnSessionOpened failed");
125 (void)ClientDeleteSession(sessionId);
126 return SOFTBUS_ERR;
127 }
128 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnSessionOpened ok");
129 return SOFTBUS_OK;
130 }
131
TransOnSessionOpenFailed(int32_t channelId,int32_t channelType,int32_t errCode)132 NO_SANITIZE("cfi") int32_t TransOnSessionOpenFailed(int32_t channelId, int32_t channelType, int32_t errCode)
133 {
134 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnSessionOpenFailed: channelId=%d, channelType=%d",
135 channelId, channelType);
136 int32_t sessionId = INVALID_SESSION_ID;
137 ISessionListener listener = {0};
138 (void)GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
139
140 if (listener.OnSessionOpened != NULL) {
141 (void)listener.OnSessionOpened(sessionId, errCode);
142 }
143
144 (void)ClientDeleteSession(sessionId);
145 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnSessionOpenFailed ok");
146 return SOFTBUS_OK;
147 }
148
TransOnSessionClosed(int32_t channelId,int32_t channelType)149 NO_SANITIZE("cfi") int32_t TransOnSessionClosed(int32_t channelId, int32_t channelType)
150 {
151 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnSessionClosed: channelId=%d, channelType=%d",
152 channelId, channelType);
153 int32_t sessionId = INVALID_SESSION_ID;
154 ISessionListener listener = {0};
155 int32_t ret;
156 (void)GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
157
158 if (listener.OnSessionClosed != NULL) {
159 listener.OnSessionClosed(sessionId);
160 }
161
162 ret = ClientDeleteSession(sessionId);
163 if (ret != SOFTBUS_OK) {
164 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "client delete session failed");
165 return SOFTBUS_ERR;
166 }
167 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnSessionClosed ok");
168 return SOFTBUS_OK;
169 }
170
ProcessReceivedFileData(int32_t sessionId,int32_t channelId,const char * data,uint32_t len,SessionPktType type)171 static int32_t ProcessReceivedFileData(int32_t sessionId, int32_t channelId, const char *data, uint32_t len,
172 SessionPktType type)
173 {
174 char sessionName[SESSION_NAME_SIZE_MAX] = {0};
175 if (ClientGetSessionDataById(sessionId, sessionName, SESSION_NAME_SIZE_MAX, KEY_SESSION_NAME)
176 != SOFTBUS_OK) {
177 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get session name failed");
178 return SOFTBUS_ERR;
179 }
180
181 if (ProcessFileFrameData(sessionId, channelId, data, len, type) != SOFTBUS_OK) {
182 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "process fileframe data failed");
183 return SOFTBUS_ERR;
184 }
185 return SOFTBUS_OK;
186 }
187
TransOnDataReceived(int32_t channelId,int32_t channelType,const void * data,uint32_t len,SessionPktType type)188 NO_SANITIZE("cfi") int32_t TransOnDataReceived(int32_t channelId, int32_t channelType,
189 const void *data, uint32_t len, SessionPktType type)
190 {
191 int32_t sessionId;
192 ISessionListener listener = {0};
193 int32_t ret = GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
194 if (ret != SOFTBUS_OK) {
195 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get session callback failed");
196 return ret;
197 }
198
199 switch (type) {
200 case TRANS_SESSION_BYTES:
201 if (listener.OnBytesReceived != NULL) {
202 listener.OnBytesReceived(sessionId, data, len);
203 }
204 break;
205 case TRANS_SESSION_MESSAGE:
206 if (listener.OnMessageReceived != NULL) {
207 listener.OnMessageReceived(sessionId, data, len);
208 }
209 break;
210 case TRANS_SESSION_FILE_FIRST_FRAME:
211 case TRANS_SESSION_FILE_ONGOINE_FRAME:
212 case TRANS_SESSION_FILE_LAST_FRAME:
213 case TRANS_SESSION_FILE_ONLYONE_FRAME:
214 case TRANS_SESSION_FILE_ALLFILE_SENT:
215 case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
216 case TRANS_SESSION_FILE_RESULT_FRAME:
217 case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
218 case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
219 if (channelType == CHANNEL_TYPE_PROXY) {
220 return ProcessReceivedFileData(sessionId, channelId, (char*)data, len, type);
221 }
222 break;
223 default:
224 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "unknown session type");
225 return SOFTBUS_ERR;
226 }
227
228 return SOFTBUS_OK;
229 }
230
TransOnOnStreamRecevied(int32_t channelId,int32_t channelType,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)231 NO_SANITIZE("cfi") int32_t TransOnOnStreamRecevied(int32_t channelId, int32_t channelType,
232 const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
233 {
234 int32_t sessionId;
235 ISessionListener listener = {0};
236 int32_t ret = GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
237 if (ret != SOFTBUS_OK) {
238 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get session callback failed");
239 return ret;
240 }
241 if (listener.OnStreamReceived == NULL) {
242 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "listener OnStreamReceived is NULL");
243 return SOFTBUS_ERR;
244 }
245 listener.OnStreamReceived(sessionId, data, ext, param);
246 return SOFTBUS_OK;
247 }
248
TransOnQosEvent(int32_t channelId,int32_t channelType,int32_t eventId,int32_t tvCount,const QosTv * tvList)249 NO_SANITIZE("cfi") int32_t TransOnQosEvent(int32_t channelId, int32_t channelType, int32_t eventId, int32_t tvCount,
250 const QosTv *tvList)
251 {
252 int32_t sessionId;
253 ISessionListener listener = {0};
254 int32_t ret = GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
255 if (ret != SOFTBUS_OK) {
256 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get session callback failed");
257 return ret;
258 }
259 if (listener.OnQosEvent == NULL) {
260 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "listener OnQosEvent is NULL");
261 return SOFTBUS_ERR;
262 }
263 listener.OnQosEvent(sessionId, eventId, tvCount, tvList);
264 return SOFTBUS_OK;
265 }
266
GetClientSessionCb(void)267 IClientSessionCallBack *GetClientSessionCb(void)
268 {
269 g_sessionCb.OnSessionOpened = TransOnSessionOpened;
270 g_sessionCb.OnSessionClosed = TransOnSessionClosed;
271 g_sessionCb.OnSessionOpenFailed = TransOnSessionOpenFailed;
272 g_sessionCb.OnDataReceived = TransOnDataReceived;
273 g_sessionCb.OnStreamReceived = TransOnOnStreamRecevied;
274 g_sessionCb.OnGetSessionId = ClientGetSessionIdByChannelId;
275 g_sessionCb.OnQosEvent = TransOnQosEvent;
276 return &g_sessionCb;
277 }
278