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_message_service.h"
17
18 #include "client_trans_channel_manager.h"
19 #include "client_trans_file.h"
20 #include "client_trans_file_listener.h"
21 #include "client_trans_session_manager.h"
22 #include "client_trans_session_service.h"
23 #include "client_trans_socket_manager.h"
24 #include "client_trans_statistics.h"
25 #include "g_enhance_sdk_func.h"
26 #include "softbus_def.h"
27 #include "softbus_error_code.h"
28 #include "softbus_feature_config.h"
29 #include "softbus_adapter_mem.h"
30 #include "trans_log.h"
31
32 #define OH_OS_TYPE 10
33
CheckSendLenForBooster(unsigned int len)34 int32_t CheckSendLenForBooster(unsigned int len)
35 {
36 uint32_t dataConfig = INVALID_DATA_CONFIG;
37 int32_t ret = SoftbusGetConfig(SOFTBUS_INT_MAX_BYTES_LENGTH, (unsigned char *)&dataConfig, sizeof(dataConfig));
38 if (ret != SOFTBUS_OK) {
39 TRANS_LOGE(TRANS_SDK, "get config failed");
40 return SOFTBUS_GET_CONFIG_VAL_ERR;
41 }
42 if (len > dataConfig) {
43 TRANS_LOGE(TRANS_SDK, "send data over limit.len=%{public}u", len);
44 return SOFTBUS_TRANS_SEND_LEN_BEYOND_LIMIT;
45 }
46 return SOFTBUS_OK;
47 }
48
CheckSendLen(int32_t channelId,int32_t channelType,unsigned int len,int32_t businessType)49 int CheckSendLen(int32_t channelId, int32_t channelType, unsigned int len, int32_t businessType)
50 {
51 uint32_t dataConfig = INVALID_DATA_CONFIG;
52 if (ClientGetDataConfigByChannelId(channelId, channelType, &dataConfig) != SOFTBUS_OK) {
53 TRANS_LOGE(TRANS_SDK, "get config failed.");
54 return SOFTBUS_GET_CONFIG_VAL_ERR;
55 }
56 if (dataConfig == 0) {
57 ConfigType configType = (ConfigType)GetDefaultConfigType(channelType, businessType);
58 if (configType == SOFTBUS_CONFIG_TYPE_MAX) {
59 TRANS_LOGE(TRANS_SDK, "Invalid channelType=%{public}d, businessType=%{public}d",
60 channelType, businessType);
61 return SOFTBUS_INVALID_PARAM;
62 }
63 if (SoftbusGetConfig(configType, (unsigned char *)&dataConfig, sizeof(dataConfig)) != SOFTBUS_OK) {
64 TRANS_LOGE(TRANS_SDK, "get config failed, configType=%{public}d.", configType);
65 return SOFTBUS_GET_CONFIG_VAL_ERR;
66 }
67 }
68 TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, sendDataLen=%{public}u, maxDataLen=%{public}u",
69 channelId, len, dataConfig);
70 if (len > dataConfig) {
71 TRANS_LOGE(TRANS_SDK, "send data over limit.len=%{public}u", len);
72 return SOFTBUS_TRANS_SEND_LEN_BEYOND_LIMIT;
73 }
74
75 return SOFTBUS_OK;
76 }
77
CheckBusinessTypeAndOsTypeBySessionId(int32_t sessionId,int32_t channelId,int32_t channelType,uint32_t len)78 static int32_t CheckBusinessTypeAndOsTypeBySessionId(int32_t sessionId, int32_t channelId, int32_t channelType,
79 uint32_t len)
80 {
81 int32_t businessType = BUSINESS_TYPE_BUTT;
82 int32_t osType = OH_OS_TYPE;
83 int32_t ret = ClientGetChannelBusinessTypeBySessionId(sessionId, &businessType);
84 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
85 TRANS_BYTES, "ClientGetChannelBusinessTypeBySessionId fail, sessionId=%{public}d", sessionId);
86 ret = ClientGetChannelOsTypeBySessionId(sessionId, &osType);
87 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
88 TRANS_BYTES, "ClientGetChannelOsTypeBySessionId fail, sessionId=%{public}d", sessionId);
89
90 if ((osType == OH_OS_TYPE) && (businessType != BUSINESS_TYPE_BYTE) && (businessType != BUSINESS_TYPE_NOT_CARE) &&
91 (channelType != CHANNEL_TYPE_AUTH)) {
92 TRANS_LOGE(TRANS_BYTES,
93 "BusinessType no match, businessType=%{public}d, sessionId=%{public}d", businessType, sessionId);
94 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
95 }
96 bool isD2D = false;
97 ClientCheckIsD2DBySessionId(sessionId, &isD2D);
98 if (isD2D && (businessType != BUSINESS_TYPE_D2D_VOICE)) {
99 TRANS_LOGE(TRANS_BYTES,
100 "businessType no match d2d, businessType=%{public}d, sessionId=%{public}d", businessType, sessionId);
101 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
102 }
103 if (osType != OH_OS_TYPE && businessType == BUSINESS_TYPE_MESSAGE) {
104 ret = CheckSendLenForBooster(len);
105 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
106 TRANS_BYTES, "CheckSendLenForBooster fail, len=%{public}u, sessionId=%{public}d", len, sessionId);
107 } else {
108 ret = CheckSendLen(channelId, channelType, len, BUSINESS_TYPE_BYTE);
109 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
110 TRANS_BYTES, "CheckSendLen fail, len=%{public}u, sessionId=%{public}d", len, sessionId);
111 }
112 return SOFTBUS_OK;
113 }
114
SendBytes(int sessionId,const void * data,unsigned int len)115 int SendBytes(int sessionId, const void *data, unsigned int len)
116 {
117 if (data == NULL || len == 0) {
118 TRANS_LOGW(TRANS_BYTES, "Invalid param");
119 return SOFTBUS_INVALID_PARAM;
120 }
121
122 int ret = CheckPermissionState(sessionId);
123 if (ret != SOFTBUS_OK) {
124 TRANS_LOGE(TRANS_BYTES,
125 "SendBytes no permission, sessionId=%{public}d, len=%{public}u, ret=%{public}d", sessionId, len, ret);
126 return ret;
127 }
128
129 int32_t channelId = INVALID_CHANNEL_ID;
130 int32_t channelType = CHANNEL_TYPE_BUTT;
131 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
132 ret = ClientGetChannelBySessionId(sessionId, &channelId, &channelType, &enableStatus);
133 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
134 TRANS_BYTES, "ClientGetChannelBySessionId fail, sessionId=%{public}d", sessionId);
135
136 ret = CheckBusinessTypeAndOsTypeBySessionId(sessionId, channelId, channelType, len);
137 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
138 TRANS_BYTES, "CheckBusinessTypeAndOsTypeBySessionId fail, sessionId=%{public}d", sessionId);
139 if (enableStatus != ENABLE_STATUS_SUCCESS) {
140 TRANS_LOGE(TRANS_BYTES,
141 "Enable status fail, len=%{public}u, sessionId=%{public}d", len, sessionId);
142 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
143 }
144 (void)ClientResetIdleTimeoutById(sessionId);
145 UpdateChannelStatistics(sessionId, len);
146 return ClientTransChannelSendBytes(channelId, channelType, data, len);
147 }
148
CheckAsyncSendBytesFunc(int32_t channelId,int32_t channelType)149 static int32_t CheckAsyncSendBytesFunc(int32_t channelId, int32_t channelType)
150 {
151 bool supportTlv = false;
152 bool needAck = false;
153 int32_t ret = GetSupportTlvAndNeedAckById(channelId, channelType, &supportTlv, &needAck);
154 if (ret != SOFTBUS_OK) {
155 TRANS_LOGE(TRANS_BYTES, "GetSupportTlvAndNeedAckById fail, channelId=%{public}d", channelId);
156 return ret;
157 }
158 if (!supportTlv || !needAck) {
159 TRANS_LOGE(TRANS_BYTES, "supportTlv or needAck is false, not support async sendbytes, channelId=%{public}d",
160 channelId);
161 return SOFTBUS_TRANS_NOT_SUPPORT_ASYNC_SEND_BYTES;
162 }
163 return SOFTBUS_OK;
164 }
165
SendBytesAsync(int32_t socket,uint32_t dataSeq,const void * data,uint32_t len)166 int32_t SendBytesAsync(int32_t socket, uint32_t dataSeq, const void *data, uint32_t len)
167 {
168 if (data == NULL || dataSeq <= 0 || len == 0) {
169 TRANS_LOGE(TRANS_BYTES, "Invalid param");
170 return SOFTBUS_INVALID_PARAM;
171 }
172 int ret = CheckPermissionState(socket);
173 if (ret != SOFTBUS_OK) {
174 TRANS_LOGE(TRANS_BYTES,
175 "no permission, socket=%{public}d, len=%{public}u, ret=%{public}d", socket, len, ret);
176 return ret;
177 }
178
179 int32_t channelId = INVALID_CHANNEL_ID;
180 int32_t channelType = CHANNEL_TYPE_BUTT;
181 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
182 ret = ClientGetChannelBySessionId(socket, &channelId, &channelType, &enableStatus);
183 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
184 TRANS_BYTES, "ClientGetChannelBySessionId fail, socket=%{public}d", socket);
185 ret = CheckAsyncSendBytesFunc(channelId, channelType);
186 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
187 TRANS_BYTES, "checkAsyncSendByts fail, socket=%{public}d", socket);
188 ret = CheckBusinessTypeAndOsTypeBySessionId(socket, channelId, channelType, len);
189 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
190 TRANS_BYTES, "CheckBusinessTypeAndOsTypeBySessionId fail, socket=%{public}d", socket);
191 if (enableStatus != ENABLE_STATUS_SUCCESS) {
192 TRANS_LOGE(TRANS_BYTES,
193 "session is not enable, len=%{public}u, socket=%{public}d", len, socket);
194 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
195 }
196 (void)ClientResetIdleTimeoutById(socket);
197 UpdateChannelStatistics(socket, len);
198 return ClientTransChannelAsyncSendBytes(channelId, channelType, data, len, dataSeq);
199 }
200
CheckBusinessTypeBySessionId(int32_t sessionId,int32_t channelId,int32_t channelType,uint32_t len)201 static int32_t CheckBusinessTypeBySessionId(int32_t sessionId, int32_t channelId, int32_t channelType, uint32_t len)
202 {
203 int32_t businessType = BUSINESS_TYPE_BUTT;
204 int32_t ret = ClientGetChannelBusinessTypeBySessionId(sessionId, &businessType);
205 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_BYTES,
206 "ClientGetChannelBusinessTypeBySessionId fail, sessionId=%{public}d", sessionId);
207 if (businessType != BUSINESS_TYPE_D2D_MESSAGE) {
208 TRANS_LOGE(TRANS_BYTES, "BusinessType no match, businessType=%{public}d, sessionId=%{public}d", businessType,
209 sessionId);
210 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
211 }
212 return SOFTBUS_OK;
213 }
214
SendMessageAsync(int32_t socket,uint16_t dataSeq,const void * data,uint32_t len)215 int32_t SendMessageAsync(int32_t socket, uint16_t dataSeq, const void *data, uint32_t len)
216 {
217 if (data == NULL || dataSeq <= 0 || len == 0) {
218 TRANS_LOGE(TRANS_BYTES, "Invalid param");
219 return SOFTBUS_INVALID_PARAM;
220 }
221 int ret = CheckPermissionState(socket);
222 if (ret != SOFTBUS_OK) {
223 TRANS_LOGE(TRANS_BYTES,
224 "no permission, socket=%{public}d, len=%{public}u, ret=%{public}d", socket, len, ret);
225 return ret;
226 }
227
228 int32_t channelId = INVALID_CHANNEL_ID;
229 int32_t channelType = CHANNEL_TYPE_BUTT;
230 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
231 ret = ClientGetChannelBySessionId(socket, &channelId, &channelType, &enableStatus);
232 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
233 TRANS_BYTES, "ClientGetChannelBySessionId fail, socket=%{public}d", socket);
234 ret = CheckBusinessTypeBySessionId(socket, channelId, channelType, len);
235 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
236 TRANS_BYTES, "CheckBusinessTypeAndOsTypeBySessionId fail, socket=%{public}d", socket);
237 ret = CheckSendLen(channelId, channelType, len, BUSINESS_TYPE_MESSAGE);
238 if (ret != SOFTBUS_OK) {
239 return ret;
240 }
241 if (enableStatus != ENABLE_STATUS_SUCCESS) {
242 TRANS_LOGE(TRANS_BYTES,
243 "session is not enable, len=%{public}u, socket=%{public}d", len, socket);
244 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
245 }
246 (void)ClientResetIdleTimeoutById(socket);
247 UpdateChannelStatistics(socket, len);
248 return ClientTransChannelAsyncSendMessage(channelId, channelType, data, len, dataSeq);
249 }
250
SendMessage(int sessionId,const void * data,unsigned int len)251 int SendMessage(int sessionId, const void *data, unsigned int len)
252 {
253 TRANS_LOGI(TRANS_MSG, "sessionId=%{public}d, len=%{public}d", sessionId, len);
254 if (data == NULL || len == 0) {
255 TRANS_LOGW(TRANS_MSG, "Invalid param");
256 return SOFTBUS_INVALID_PARAM;
257 }
258 int ret = CheckPermissionState(sessionId);
259 if (ret != SOFTBUS_OK) {
260 TRANS_LOGE(TRANS_MSG, "SendMessage no permission, ret=%{public}d", ret);
261 return ret;
262 }
263
264 int32_t channelId = INVALID_CHANNEL_ID;
265 int32_t channelType = CHANNEL_TYPE_BUTT;
266 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
267 if (ClientGetChannelBySessionId(sessionId, &channelId, &channelType, &enableStatus) != SOFTBUS_OK) {
268 return SOFTBUS_TRANS_INVALID_SESSION_ID;
269 }
270
271 int32_t businessType = BUSINESS_TYPE_BUTT;
272 if (ClientGetChannelBusinessTypeBySessionId(sessionId, &businessType) != SOFTBUS_OK) {
273 return SOFTBUS_TRANS_INVALID_SESSION_ID;
274 }
275 if ((businessType != BUSINESS_TYPE_MESSAGE) && (businessType != BUSINESS_TYPE_NOT_CARE) &&
276 (channelType != CHANNEL_TYPE_AUTH)) {
277 TRANS_LOGE(TRANS_MSG, "BusinessType no match, businessType=%{public}d", businessType);
278 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
279 }
280
281 int checkRet = CheckSendLen(channelId, channelType, len, BUSINESS_TYPE_MESSAGE);
282 if (checkRet != SOFTBUS_OK) {
283 return checkRet;
284 }
285
286 if (enableStatus != ENABLE_STATUS_SUCCESS) {
287 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
288 }
289 (void)ClientResetIdleTimeoutById(sessionId);
290 UpdateChannelStatistics(sessionId, len);
291 return ClientTransChannelSendMessage(channelId, channelType, data, len);
292 }
293
SendStream(int sessionId,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)294 int SendStream(int sessionId, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
295 {
296 if ((data == NULL) || (ext == NULL) || (param == NULL)) {
297 TRANS_LOGW(TRANS_STREAM, "Invalid param");
298 return SOFTBUS_INVALID_PARAM;
299 }
300 int ret = CheckPermissionState(sessionId);
301 if (ret != SOFTBUS_OK) {
302 TRANS_LOGE(TRANS_STREAM, "SendStream no permission, ret=%{public}d", ret);
303 return ret;
304 }
305
306 int32_t channelId = INVALID_CHANNEL_ID;
307 int32_t type = CHANNEL_TYPE_BUTT;
308 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
309 if (ClientGetChannelBySessionId(sessionId, &channelId, &type, &enableStatus) != SOFTBUS_OK) {
310 return SOFTBUS_TRANS_INVALID_SESSION_ID;
311 }
312 if (type != CHANNEL_TYPE_UDP) {
313 return SOFTBUS_TRANS_STREAM_ONLY_UDP_CHANNEL;
314 }
315
316 int32_t businessType = BUSINESS_TYPE_BUTT;
317 if (ClientGetChannelBusinessTypeBySessionId(sessionId, &businessType) != SOFTBUS_OK) {
318 return SOFTBUS_TRANS_INVALID_SESSION_ID;
319 }
320 if ((businessType != BUSINESS_TYPE_STREAM) && (businessType != BUSINESS_TYPE_NOT_CARE)) {
321 TRANS_LOGE(TRANS_STREAM, "BusinessType no match, businessType=%{public}d", businessType);
322 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
323 }
324
325 if (enableStatus != ENABLE_STATUS_SUCCESS) {
326 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
327 }
328 (void)ClientResetIdleTimeoutById(sessionId);
329 UpdateChannelStatistics(sessionId, data->bufLen);
330 return ClientTransChannelSendStream(channelId, type, data, ext, param);
331 }
332
ClientCheckFuncPointer(void * func)333 static int32_t ClientCheckFuncPointer(void *func)
334 {
335 if (func == NULL) {
336 TRANS_LOGE(TRANS_FILE, "enhance func not register");
337 return SOFTBUS_FUNC_NOT_REGISTER;
338 }
339 return SOFTBUS_OK;
340 }
341
CheckFileSchemaPacked(int32_t sessionId,FileSchemaListener * fileSchemaListener)342 static int32_t CheckFileSchemaPacked(int32_t sessionId, FileSchemaListener *fileSchemaListener)
343 {
344 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
345 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->checkFileSchema) != SOFTBUS_OK) {
346 return SOFTBUS_OK;
347 }
348 return pfnClientEnhanceFuncList->checkFileSchema(sessionId, fileSchemaListener);
349 }
350
SetSchemaCallbackPacked(FileSchema fileSchema,const char * sFileList[],uint32_t fileCnt)351 static int32_t SetSchemaCallbackPacked(FileSchema fileSchema, const char *sFileList[], uint32_t fileCnt)
352 {
353 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
354 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->setSchemaCallback) != SOFTBUS_OK) {
355 return SOFTBUS_OK;
356 }
357 return pfnClientEnhanceFuncList->setSchemaCallback(fileSchema, sFileList, fileCnt);
358 }
359
SendFile(int sessionId,const char * sFileList[],const char * dFileList[],uint32_t fileCnt)360 int SendFile(int sessionId, const char *sFileList[], const char *dFileList[], uint32_t fileCnt)
361 {
362 if ((sFileList == NULL) || (fileCnt == 0)) {
363 TRANS_LOGW(TRANS_FILE, "Invalid param");
364 return SOFTBUS_INVALID_PARAM;
365 }
366 int ret = CheckPermissionState(sessionId);
367 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret,
368 TRANS_FILE, "SendFile no permission, sessionId=%{public}d, ret=%{public}d", sessionId, ret);
369
370 FileSchemaListener *fileSchemaListener = (FileSchemaListener*)SoftBusCalloc(sizeof(FileSchemaListener));
371 if (fileSchemaListener == NULL) {
372 return SOFTBUS_MALLOC_ERR;
373 }
374 if (CheckFileSchemaPacked(sessionId, fileSchemaListener) == SOFTBUS_OK) {
375 ret = SetSchemaCallbackPacked(fileSchemaListener->schema, sFileList, fileCnt);
376 if (ret != SOFTBUS_OK) {
377 TRANS_LOGE(TRANS_FILE, "set schema callback failed, sessionId=%{public}d, ret=%{public}d", sessionId, ret);
378 SoftBusFree(fileSchemaListener);
379 return ret;
380 }
381 }
382
383 int32_t channelId = INVALID_CHANNEL_ID;
384 int32_t type = CHANNEL_TYPE_BUTT;
385 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
386 if (ClientGetChannelBySessionId(sessionId, &channelId, &type, &enableStatus) != SOFTBUS_OK) {
387 TRANS_LOGE(TRANS_FILE, "ClientGetChannelBySessionId failed, sessionId=%{public}d", sessionId);
388 SoftBusFree(fileSchemaListener);
389 return SOFTBUS_TRANS_INVALID_SESSION_ID;
390 }
391
392 int32_t businessType = BUSINESS_TYPE_BUTT;
393 if (ClientGetChannelBusinessTypeBySessionId(sessionId, &businessType) != SOFTBUS_OK) {
394 TRANS_LOGE(TRANS_FILE, "ClientGetChannelBusinessTypeBySessionId failed, sessionId=%{public}d", sessionId);
395 SoftBusFree(fileSchemaListener);
396 return SOFTBUS_TRANS_INVALID_SESSION_ID;
397 }
398 if ((businessType != BUSINESS_TYPE_FILE) && (businessType != BUSINESS_TYPE_NOT_CARE)) {
399 TRANS_LOGE(TRANS_FILE,
400 "BusinessType no match, sessionId=%{public}d, businessType=%{public}d", sessionId, businessType);
401 SoftBusFree(fileSchemaListener);
402 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
403 }
404
405 if (enableStatus != ENABLE_STATUS_SUCCESS) {
406 TRANS_LOGE(TRANS_FILE, "Enable status failed, sessionId=%{public}d", sessionId);
407 SoftBusFree(fileSchemaListener);
408 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
409 }
410 SoftBusFree(fileSchemaListener);
411 (void)ClientResetIdleTimeoutById(sessionId);
412 return ClientTransChannelSendFile(channelId, type, sFileList, dFileList, fileCnt);
413 }
414