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