• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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_file_listener.h"
17 
18 #include <securec.h>
19 
20 #include "anonymizer.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_adapter_thread.h"
23 #include "softbus_def.h"
24 #include "softbus_errcode.h"
25 #include "softbus_utils.h"
26 #include "trans_log.h"
27 
28 static SoftBusList *g_fileListener = NULL;
29 
TransFileInit(void)30 int TransFileInit(void)
31 {
32     if (g_fileListener != NULL) {
33         TRANS_LOGI(TRANS_INIT, "file listener has init.");
34         return SOFTBUS_OK;
35     }
36     g_fileListener = CreateSoftBusList();
37     if (g_fileListener == NULL) {
38         TRANS_LOGE(TRANS_INIT, "create file listener list failed.");
39         return SOFTBUS_MALLOC_ERR;
40     }
41     return SOFTBUS_OK;
42 }
43 
TransFileDeinit(void)44 void TransFileDeinit(void)
45 {
46     if (g_fileListener == NULL) {
47         return;
48     }
49     if (SoftBusMutexLock(&(g_fileListener->lock)) != 0) {
50         TRANS_LOGE(TRANS_INIT, "file listener deinit lock failed");
51         return;
52     }
53     FileListener *fileNode = NULL;
54     FileListener *nextNode = NULL;
55     LIST_FOR_EACH_ENTRY_SAFE(fileNode, nextNode, &(g_fileListener->list), FileListener, node) {
56         ListDelete(&(fileNode->node));
57         SoftBusFree(fileNode);
58     }
59     (void)SoftBusMutexUnlock(&(g_fileListener->lock));
60     DestroySoftBusList(g_fileListener);
61     g_fileListener = NULL;
62 }
63 
TransSetFileReceiveListener(const char * sessionName,const IFileReceiveListener * recvListener,const char * rootDir)64 int32_t TransSetFileReceiveListener(const char *sessionName,
65     const IFileReceiveListener *recvListener, const char *rootDir)
66 {
67     if (g_fileListener == NULL) {
68         TRANS_LOGE(TRANS_INIT, "file listener hasn't init.");
69         return SOFTBUS_TRANS_FILE_LISTENER_NOT_INIT;
70     }
71     if (SoftBusMutexLock(&(g_fileListener->lock)) != 0) {
72         TRANS_LOGE(TRANS_FILE, "file receive listener lock failed");
73         return SOFTBUS_LOCK_ERR;
74     }
75     FileListener *fileNode = NULL;
76     bool exist = false;
77     LIST_FOR_EACH_ENTRY(fileNode, &(g_fileListener->list), FileListener, node) {
78         if (strcmp(fileNode->mySessionName, sessionName) == 0) {
79             exist = true;
80             break;
81         }
82     }
83     if (exist) {
84         if (strcpy_s(fileNode->rootDir, FILE_RECV_ROOT_DIR_SIZE_MAX, rootDir) != EOK ||
85             memcpy_s(&(fileNode->recvListener), sizeof(IFileReceiveListener),
86                 recvListener, sizeof(IFileReceiveListener)) != EOK) {
87             (void)SoftBusMutexUnlock(&(g_fileListener->lock));
88             TRANS_LOGE(TRANS_FILE, "update file receive listener failed");
89             return SOFTBUS_ERR;
90         }
91         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
92         TRANS_LOGI(TRANS_FILE, "update file receive listener success");
93         return SOFTBUS_OK;
94     }
95     fileNode = (FileListener *)SoftBusCalloc(sizeof(FileListener));
96     if (fileNode == NULL) {
97         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
98         TRANS_LOGE(TRANS_FILE, "file receive listener calloc failed");
99         return SOFTBUS_MALLOC_ERR;
100     }
101     if (strcpy_s(fileNode->mySessionName, SESSION_NAME_SIZE_MAX, sessionName) != EOK ||
102         strcpy_s(fileNode->rootDir, FILE_RECV_ROOT_DIR_SIZE_MAX, rootDir) != EOK ||
103         memcpy_s(&(fileNode->recvListener), sizeof(IFileReceiveListener),
104             recvListener, sizeof(IFileReceiveListener)) != EOK) {
105         TRANS_LOGE(TRANS_FILE, "file node copy failed.");
106         SoftBusFree(fileNode);
107         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
108         return SOFTBUS_ERR;
109     }
110     ListAdd(&(g_fileListener->list), &(fileNode->node));
111     TRANS_LOGI(TRANS_FILE, "add sessionName = %{public}s", sessionName);
112     (void)SoftBusMutexUnlock(&(g_fileListener->lock));
113     return SOFTBUS_OK;
114 }
115 
TransSetFileSendListener(const char * sessionName,const IFileSendListener * sendListener)116 int32_t TransSetFileSendListener(const char *sessionName, const IFileSendListener *sendListener)
117 {
118     if (g_fileListener == NULL) {
119         TRANS_LOGE(TRANS_FILE, "file listener hasn't init.");
120         return SOFTBUS_TRANS_FILE_LISTENER_NOT_INIT;
121     }
122     if (SoftBusMutexLock(&(g_fileListener->lock)) != 0) {
123         TRANS_LOGE(TRANS_FILE, "file send listener lock failed");
124         return SOFTBUS_LOCK_ERR;
125     }
126     FileListener *fileNode = NULL;
127     bool exist = false;
128     LIST_FOR_EACH_ENTRY(fileNode, &(g_fileListener->list), FileListener, node) {
129         if (strcmp(fileNode->mySessionName, sessionName) == 0) {
130             exist = true;
131             break;
132         }
133     }
134     if (exist) {
135         if (memcpy_s(&(fileNode->sendListener), sizeof(IFileSendListener),
136             sendListener, sizeof(IFileSendListener)) != EOK) {
137             (void)SoftBusMutexUnlock(&(g_fileListener->lock));
138             TRANS_LOGE(TRANS_FILE, "update file send listener failed");
139             return SOFTBUS_ERR;
140         }
141         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
142         TRANS_LOGE(TRANS_FILE, "update file send listener success");
143         return SOFTBUS_OK;
144     }
145     fileNode = (FileListener *)SoftBusCalloc(sizeof(FileListener));
146     if (fileNode == NULL) {
147         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
148         TRANS_LOGE(TRANS_FILE, "file send listener calloc failed");
149         return SOFTBUS_MALLOC_ERR;
150     }
151     if (strcpy_s(fileNode->mySessionName, SESSION_NAME_SIZE_MAX, sessionName) != EOK ||
152         memcpy_s(&(fileNode->sendListener), sizeof(IFileSendListener),
153             sendListener, sizeof(IFileSendListener)) != EOK) {
154         TRANS_LOGE(TRANS_FILE, "file node copy failed.");
155         SoftBusFree(fileNode);
156         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
157         return SOFTBUS_ERR;
158     }
159     ListAdd(&(g_fileListener->list), &(fileNode->node));
160     TRANS_LOGI(TRANS_FILE, "add sessionName = %{public}s", sessionName);
161     (void)SoftBusMutexUnlock(&(g_fileListener->lock));
162     return SOFTBUS_OK;
163 }
164 
TransAddNewSocketFileListener(const char * sessionName,SocketFileCallbackFunc fileCallback,bool isReceiver)165 static int32_t TransAddNewSocketFileListener(const char *sessionName, SocketFileCallbackFunc fileCallback,
166     bool isReceiver)
167 {
168     if (sessionName == NULL || fileCallback == NULL) {
169         TRANS_LOGE(TRANS_SDK, "invalid param.");
170         return SOFTBUS_INVALID_PARAM;
171     }
172     FileListener *listener = (FileListener *)SoftBusCalloc(sizeof(FileListener));
173     if (listener == NULL) {
174         TRANS_LOGE(TRANS_SDK, "file send listener calloc failed");
175         return SOFTBUS_MALLOC_ERR;
176     }
177     if (strcpy_s(listener->mySessionName, SESSION_NAME_SIZE_MAX, sessionName) != EOK) {
178         TRANS_LOGE(TRANS_SDK, "file node copy failed.");
179         SoftBusFree(listener);
180         return SOFTBUS_STRCPY_ERR;
181     }
182     if (isReceiver) {
183         listener->socketRecvCallback = fileCallback;
184     } else {
185         listener->socketSendCallback = fileCallback;
186     }
187     ListAdd(&(g_fileListener->list), &(listener->node));
188     return SOFTBUS_OK;
189 }
190 
TransSetSocketFileListener(const char * sessionName,SocketFileCallbackFunc fileCallback,bool isReceiver)191 int32_t TransSetSocketFileListener(const char *sessionName, SocketFileCallbackFunc fileCallback, bool isReceiver)
192 {
193     if (sessionName == NULL || fileCallback == NULL) {
194         TRANS_LOGE(TRANS_SDK, "[client] invalid param.");
195         return SOFTBUS_INVALID_PARAM;
196     }
197     if (g_fileListener == NULL) {
198         TRANS_LOGE(TRANS_FILE, "file listener hasn't init.");
199         return SOFTBUS_TRANS_FILE_LISTENER_NOT_INIT;
200     }
201     if (SoftBusMutexLock(&(g_fileListener->lock)) != 0) {
202         TRANS_LOGE(TRANS_SDK, "file delete lock failed");
203         return SOFTBUS_LOCK_ERR;
204     }
205 
206     FileListener *fileNode = NULL;
207     bool exist = false;
208     LIST_FOR_EACH_ENTRY(fileNode, &(g_fileListener->list), FileListener, node) {
209         if (strcmp(fileNode->mySessionName, sessionName) == 0) {
210             exist = true;
211             break;
212         }
213     }
214     if (exist) {
215         if (isReceiver) {
216             fileNode->socketRecvCallback = fileCallback;
217         } else {
218             fileNode->socketSendCallback = fileCallback;
219         }
220         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
221         TRANS_LOGI(TRANS_SDK, "update file callback of socket");
222         return SOFTBUS_OK;
223     }
224     int32_t ret = TransAddNewSocketFileListener(sessionName, fileCallback, isReceiver);
225     if (ret != SOFTBUS_OK) {
226         (void)SoftBusMutexUnlock(&(g_fileListener->lock));
227         TRANS_LOGE(TRANS_SDK, "failed to add new socket file listener");
228         return ret;
229     }
230     (void)SoftBusMutexUnlock(&(g_fileListener->lock));
231 
232     char *tmpName = NULL;
233     Anonymize(sessionName, &tmpName);
234     TRANS_LOGI(TRANS_SDK, "set socket file listener ok, sessionName=%{public}s, isReceiver=%{public}d",
235         tmpName, isReceiver);
236     AnonymizeFree(tmpName);
237     return SOFTBUS_OK;
238 }
239 
TransGetFileListener(const char * sessionName,FileListener * fileListener)240 int32_t TransGetFileListener(const char *sessionName, FileListener *fileListener)
241 {
242     if (g_fileListener == NULL) {
243         TRANS_LOGE(TRANS_FILE, "file listener hasn't init.");
244         return SOFTBUS_TRANS_FILE_LISTENER_NOT_INIT;
245     }
246     if (SoftBusMutexLock(&(g_fileListener->lock)) != 0) {
247         TRANS_LOGE(TRANS_FILE, "file get listener lock failed");
248         return SOFTBUS_LOCK_ERR;
249     }
250 
251     FileListener *fileNode = NULL;
252     LIST_FOR_EACH_ENTRY(fileNode, &(g_fileListener->list), FileListener, node) {
253         if (strcmp(fileNode->mySessionName, sessionName) == 0) {
254             if (memcpy_s(fileListener, sizeof(FileListener), fileNode, sizeof(FileListener)) != EOK) {
255                 TRANS_LOGE(TRANS_FILE, "memcpy_s failed.");
256                 (void)SoftBusMutexUnlock(&(g_fileListener->lock));
257                 return SOFTBUS_ERR;
258             }
259             (void)SoftBusMutexUnlock(&(g_fileListener->lock));
260             return SOFTBUS_OK;
261         }
262     }
263     (void)SoftBusMutexUnlock(&(g_fileListener->lock));
264     return SOFTBUS_ERR;
265 }
266 
TransDeleteFileListener(const char * sessionName)267 void TransDeleteFileListener(const char *sessionName)
268 {
269     if (sessionName == NULL) {
270         TRANS_LOGW(TRANS_FILE, "invalid param.");
271         return;
272     }
273     if (g_fileListener == NULL) {
274         TRANS_LOGE(TRANS_FILE, "file listener hasn't init.");
275         return;
276     }
277     if (SoftBusMutexLock(&(g_fileListener->lock)) != 0) {
278         TRANS_LOGE(TRANS_FILE, "file delete lock failed");
279         return;
280     }
281 
282     FileListener *fileNode = NULL;
283     LIST_FOR_EACH_ENTRY(fileNode, &(g_fileListener->list), FileListener, node) {
284         if (strcmp(fileNode->mySessionName, sessionName) == 0) {
285             ListDelete(&fileNode->node);
286             TRANS_LOGI(TRANS_FILE, "delete sessionName = %{public}s", sessionName);
287             SoftBusFree(fileNode);
288             break;
289         }
290     }
291     (void)SoftBusMutexUnlock(&(g_fileListener->lock));
292 }
293