• 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_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