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