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