1 /*
2  * Copyright (c) 2024 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 "file_fs_ffi.h"
17 #include "copy.h"
18 #include "copy_file.h"
19 #include "fdatasync.h"
20 #include "fsync.h"
21 #include "list_file.h"
22 #include "lseek.h"
23 #include "macro.h"
24 #include "mkdtemp.h"
25 #include "move_file.h"
26 #include "symlink.h"
27 #include "uni_error.h"
28 
29 using namespace OHOS::FFI;
30 
31 namespace OHOS {
32 namespace CJSystemapi {
33 namespace FileFs {
34 
35 extern "C" {
FfiOHOSFileFsCreateCopyOptions(int64_t callbackId, int64_t signalId)36 int64_t FfiOHOSFileFsCreateCopyOptions(int64_t callbackId, int64_t signalId)
37 {
38     LOGD("FS_TEST::FfiOHOSFileFsCreateCopyOptions");
39     auto instance = FFIData::Create<CopyInfo>(callbackId, signalId);
40     if (!instance) {
41         LOGE("Failed to create CopyImpl.");
42         return 0;
43     }
44     return instance->GetID();
45 }
46 
FfiOHOSFileFsCreateTaskSignal()47 int64_t FfiOHOSFileFsCreateTaskSignal()
48 {
49     LOGD("FS_TEST::FfiOHOSFileFsCreateTaskSignal");
50     auto instance = FFIData::Create<TaskSignalImpl>();
51     if (!instance || !instance->signalEntity || !instance->signalEntity->taskSignal_) {
52         LOGE("Failed to create TaskSignalImpl.");
53         return 0;
54     }
55     return instance->GetID();
56 }
57 
FfiOHOSFileFsTaskSignalCancel(int64_t id)58 int64_t FfiOHOSFileFsTaskSignalCancel(int64_t id)
59 {
60     LOGD("FS_TEST::FfiOHOSFileFsTaskSignalCancel");
61     auto instance = FFIData::GetData<TaskSignalImpl>(id);
62     if (!instance || !instance->signalEntity || !instance->signalEntity->taskSignal_) {
63         LOGE("Failed to create TaskSignalImpl.");
64         return ERR_INVALID_INSTANCE_CODE;
65     }
66     return instance->signalEntity->taskSignal_->Cancel();
67 }
68 
FfiOHOSFileFsCopy(const char* src, const char* dest, int64_t opt)69 void FfiOHOSFileFsCopy(const char* src, const char* dest, int64_t opt)
70 {
71     LOGD("FS_TEST::FfiOHOSFileFsCopy");
72     if (opt == 0) {
73         auto emptyInfo = FFIData::Create<CopyInfo>(0, 0);
74         if (!emptyInfo) {
75             LOGE("Failed to create empty CopyInfo");
76             return;
77         }
78         CopyImpl::Copy(src, dest, emptyInfo);
79         return;
80     }
81     auto instance = FFIData::GetData<CopyInfo>(opt);
82     if (!instance) {
83         LOGE("Failed to get CopyInfo");
84         return;
85     }
86     CopyImpl::Copy(src, dest, instance);
87 }
88 
FfiOHOSFileFsStatByID(int32_t file)89 RetDataI64 FfiOHOSFileFsStatByID(int32_t file)
90 {
91     LOGI("FS_TEST::FfiOHOSFileFsStatByID");
92     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
93     auto [state, nativeStat] = FileFsImpl::Stat(file);
94     if (nativeStat == nullptr) {
95         LOGI("FS_TEST::FfiOHOSFileFsStatByID error");
96         ret.code = state;
97         ret.data = 0;
98         return ret;
99     }
100     LOGI("FS_TEST::FfiOHOSFileFsStatByID success");
101     ret.code = state;
102     ret.data = nativeStat->GetID();
103     return ret;
104 }
105 
FfiOHOSFileFsStatByString(const char* file)106 RetDataI64 FfiOHOSFileFsStatByString(const char* file)
107 {
108     LOGI("FS_TEST::FfiOHOSFileFsStatByString");
109     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
110     auto [state, nativeStat] = FileFsImpl::Stat(file);
111     if (nativeStat == nullptr) {
112         LOGI("FS_TEST::FfiOHOSFileFsStatByString error");
113         ret.code = state;
114         ret.data = 0;
115         return ret;
116     }
117     LOGI("FS_TEST::FfiOHOSFileFsStatByString success");
118     ret.code = state;
119     ret.data = nativeStat->GetID();
120     return ret;
121 }
122 
FfiOHOSFileFsCreateStream(const char* path, const char* mode)123 RetDataI64 FfiOHOSFileFsCreateStream(const char* path, const char* mode)
124 {
125     LOGI("FS_TEST::FfiOHOSFileFsCreateStream");
126     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
127     auto [state, nativeStream] = FileFsImpl::CreateStream(path, mode);
128     ret.code = state;
129     if (nativeStream == nullptr) {
130         LOGI("FS_TEST::FfiOHOSFileFsCreateStream error");
131         ret.data = 0;
132         return ret;
133     }
134     LOGI("FS_TEST::FfiOHOSFileFsCreateStream success");
135     ret.data = nativeStream->GetID();
136     return ret;
137 }
138 
FfiOHOSFileFsFdopenStream(int32_t fd, const char* mode)139 RetDataI64 FfiOHOSFileFsFdopenStream(int32_t fd, const char* mode)
140 {
141     LOGI("FS_TEST::FfiOHOSFileFsFdopenStream");
142     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
143     auto [state, nativeStream] = FileFsImpl::FdopenStream(fd, mode);
144     ret.code = state;
145     if (nativeStream == nullptr) {
146         LOGI("FS_TEST::FfiOHOSFileFsFdopenStream error");
147         ret.data = 0;
148         return ret;
149     }
150     LOGI("FS_TEST::FfiOHOSFileFsFdopenStream success");
151     ret.data = nativeStream->GetID();
152     return ret;
153 }
154 
FfiOHOSFileFsLstat(const char* path)155 RetDataI64 FfiOHOSFileFsLstat(const char* path)
156 {
157     LOGI("FS_TEST::FfiOHOSFileFsLstat");
158     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
159     auto [state, nativeStat] = FileFsImpl::Lstat(path);
160     ret.code = state;
161     if (nativeStat == nullptr) {
162         LOGI("FS_TEST::FfiOHOSFileFsLstat error");
163         ret.data = 0;
164         return ret;
165     }
166     LOGI("FS_TEST::FfiOHOSFileFsLstat success");
167     ret.data = nativeStat->GetID();
168     return ret;
169 }
170 
FfiOHOSFileFsRead(int32_t fd, char* buffer, int64_t bufLen, size_t length, int64_t offset)171 RetDataI64 FfiOHOSFileFsRead(int32_t fd, char* buffer, int64_t bufLen, size_t length, int64_t offset)
172 {
173     LOGI("FS_TEST::FfiOHOSFileFsRead");
174     auto ret = FileFsImpl::Read(fd, buffer, bufLen, length, offset);
175     if (ret.code != SUCCESS_CODE) {
176         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
177         return ret;
178     }
179     LOGI("FS_TEST::FfiOHOSFileFsRead success");
180     return ret;
181 }
182 
FfiOHOSFileFsReadCur(int32_t fd, char* buffer, int64_t bufLen, size_t length)183 RetDataI64 FfiOHOSFileFsReadCur(int32_t fd, char* buffer, int64_t bufLen, size_t length)
184 {
185     LOGI("FS_TEST::FfiOHOSFileFsReadCur");
186     auto ret = FileFsImpl::ReadCur(fd, buffer, bufLen, length);
187     if (ret.code != SUCCESS_CODE) {
188         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
189         return ret;
190     }
191     LOGI("FS_TEST::FfiOHOSFileFsReadCur success");
192     return ret;
193 }
194 
FfiOHOSFileFsWrite(int32_t fd, char* buffer, size_t length, int64_t offset, const char* encode)195 RetDataI64 FfiOHOSFileFsWrite(int32_t fd, char* buffer, size_t length, int64_t offset, const char* encode)
196 {
197     LOGI("FS_TEST::FfiOHOSFileFsWrite");
198     auto ret = FileFsImpl::Write(fd, buffer, length, offset, encode);
199     if (ret.code != SUCCESS_CODE) {
200         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
201         return ret;
202     }
203     LOGI("FS_TEST::FfiOHOSFileFsWrite success");
204     return ret;
205 }
206 
FfiOHOSFileFsWriteCur(int32_t fd, char* buffer, size_t length, const char* encode)207 RetDataI64 FfiOHOSFileFsWriteCur(int32_t fd, char* buffer, size_t length, const char* encode)
208 {
209     LOGI("FS_TEST::FfiOHOSFileFsWriteCur");
210     auto ret = FileFsImpl::WriteCur(fd, buffer, length, encode);
211     if (ret.code != SUCCESS_CODE) {
212         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
213         return ret;
214     }
215     LOGI("FS_TEST::FfiOHOSFileFsWriteCur success");
216     return ret;
217 }
218 
FfiOHOSFileFsCreateRandomAccessFileByString(const char* file, int64_t mode)219 RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByString(const char* file, int64_t mode)
220 {
221     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString");
222     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
223     auto [state, nativeCreateRandomAccessFile] = FileFsImpl::CreateRandomAccessFileSync(file, mode);
224     ret.code = state;
225     if (nativeCreateRandomAccessFile == nullptr) {
226         LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString error");
227         ret.data = 0;
228         return ret;
229     }
230     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString success");
231     ret.data = nativeCreateRandomAccessFile->GetID();
232     return ret;
233 }
234 
FfiOHOSFileFsCreateRandomAccessFileByID(int64_t file, int64_t mode)235 RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByID(int64_t file, int64_t mode)
236 {
237     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByID");
238     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
239     auto instance = FFIData::GetData<FileEntity>(file);
240     auto [state, nativeCreateRandomAccessFile] = FileFsImpl::CreateRandomAccessFileSync(instance, mode);
241     ret.code = state;
242     if (nativeCreateRandomAccessFile == nullptr) {
243         LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByID error");
244         ret.data = 0;
245         return ret;
246     }
247     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByID success");
248     ret.data = nativeCreateRandomAccessFile->GetID();
249     return ret;
250 }
251 
FfiOHOSRandomAccessFileGetFd(int64_t id)252 int32_t FfiOHOSRandomAccessFileGetFd(int64_t id)
253 {
254     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFd");
255     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
256     if (!instance) {
257         LOGE("FfiOHOSRandomAccessFileGetFd instance not exist %{public}" PRId64, id);
258         return ERR_INVALID_INSTANCE_CODE;
259     }
260     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFd success");
261     return instance->GetFd();
262 }
263 
FfiOHOSRandomAccessFileGetFPointer(int64_t id)264 int64_t FfiOHOSRandomAccessFileGetFPointer(int64_t id)
265 {
266     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFPointer");
267     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
268     if (!instance) {
269         LOGE("FfiOHOSRandomAccessFileGetFPointer instance not exist %{public}" PRId64, id);
270         return ERR_INVALID_INSTANCE_CODE;
271     }
272     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFPointer success");
273     return instance->GetFPointer();
274 }
275 
FfiOHOSRandomAccessFileSetFilePointerSync(int64_t id, int64_t fd)276 void FfiOHOSRandomAccessFileSetFilePointerSync(int64_t id, int64_t fd)
277 {
278     LOGI("FS_TEST::FfiOHOSRandomAccessFileSetFilePointerSync");
279     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
280     if (!instance) {
281         LOGE("FfiOHOSRandomAccessFileSetFilePointerSync instance not exist %{public}" PRId64, id);
282         return;
283     }
284     LOGI("FS_TEST::FfiOHOSRandomAccessFileSetFilePointerSync success");
285     instance->SetFilePointerSync(fd);
286     return;
287 }
288 
FfiOHOSRandomAccessFileClose(int64_t id)289 void FfiOHOSRandomAccessFileClose(int64_t id)
290 {
291     LOGI("FS_TEST::FfiOHOSRandomAccessFileClose");
292     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
293     if (!instance) {
294         LOGE("FfiOHOSRandomAccessFileClose instance not exist %{public}" PRId64, id);
295         return;
296     }
297     LOGI("FS_TEST::FfiOHOSRandomAccessFileClose success");
298     return instance->CloseSync();
299 }
300 
FfiOHOSRandomAccessFileWrite(int64_t id, char* buf, size_t len, int64_t offset)301 RetDataI64 FfiOHOSRandomAccessFileWrite(int64_t id, char* buf, size_t len, int64_t offset)
302 {
303     LOGI("FS_TEST::FfiOHOSRandomAccessFileWriteByString");
304     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
305     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
306     if (!instance) {
307         LOGE("FfiOHOSRandomAccessFileWriteByString instance not exist %{public}" PRId64, id);
308         ret.code = ERR_INVALID_INSTANCE_CODE;
309         ret.data = 0;
310         return ret;
311     }
312     LOGI("FS_TEST::FfiOHOSRandomAccessFileWriteByString success");
313     auto [code, data] = instance->WriteSync(buf, len, offset);
314     ret.code = code;
315     ret.data = data;
316     return ret;
317 }
318 
FfiOHOSRandomAccessFileRead(int64_t id, char* buf, size_t len, int64_t offset)319 RetDataI64 FfiOHOSRandomAccessFileRead(int64_t id, char* buf, size_t len, int64_t offset)
320 {
321     LOGI("FS_TEST::FfiOHOSRandomAccessFileReadByArray");
322     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
323     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
324     if (!instance) {
325         LOGE("FfiOHOSRandomAccessFileReadByArray instance not exist %{public}" PRId64, id);
326         ret.code = ERR_INVALID_INSTANCE_CODE;
327         ret.data = 0;
328         return ret;
329     }
330     LOGI("FS_TEST::FfiOHOSRandomAccessFileReadByArray success");
331     auto [code, data] = instance->ReadSync(buf, len, offset);
332     ret.code = code;
333     ret.data = data;
334     return ret;
335 }
336 
FfiOHOSFileFsMkdir(const char* path, bool recursion, bool isTwoArgs)337 int32_t FfiOHOSFileFsMkdir(const char* path, bool recursion, bool isTwoArgs)
338 {
339     LOGI("FS_TEST::FfiOHOSFileFsMkdir");
340     auto code = FileFsImpl::Mkdir(path, recursion, isTwoArgs);
341     LOGI("FS_TEST::FfiOHOSFileFsMkdir success");
342     return code;
343 }
344 
FfiOHOSFileFsRmdir(const char* path)345 int32_t FfiOHOSFileFsRmdir(const char* path)
346 {
347     LOGI("FS_TEST::FfiOHOSFileFsRmdir");
348     auto code = FileFsImpl::Rmdir(path);
349     LOGI("FS_TEST::FfiOHOSFileFsRmdir success");
350     return code;
351 }
352 
FfiOHOSFileFsMoveDir(const char* src, const char* dest, int32_t mode)353 RetDataCArrConflictFiles FfiOHOSFileFsMoveDir(const char* src, const char* dest, int32_t mode)
354 {
355     LOGI("FS_TEST::FfiOHOSFileFsMovedir");
356     auto ret = FileFsImpl::MoveDir(src, dest, mode);
357     LOGI("FS_TEST::FfiOHOSFileFsMovedir success");
358     return ret;
359 }
360 
FfiOHOSFileFsRename(const char* oldFile, const char* newFile)361 int32_t FfiOHOSFileFsRename(const char* oldFile, const char* newFile)
362 {
363     LOGI("FS_TEST::FfiOHOSFileFsRename");
364     auto code = FileFsImpl::Rename(oldFile, newFile);
365     LOGI("FS_TEST::FfiOHOSFileFsRename success");
366     return code;
367 }
368 
FfiOHOSFileFsUnlink(const char* path)369 int32_t FfiOHOSFileFsUnlink(const char* path)
370 {
371     LOGI("FS_TEST::FfiOHOSFileFsUnlink");
372     auto code = FileFsImpl::Unlink(path);
373     LOGI("FS_TEST::FfiOHOSFileFsUnlink success");
374     return code;
375 }
376 
FfiOHOSFileFsCopyDir(const char* src, const char* dest, int mode)377 RetDataCArrConflictFiles FfiOHOSFileFsCopyDir(const char* src, const char* dest, int mode)
378 {
379     LOGI("FS_TEST::FfiOHOSFileFsCopyDir start");
380     auto ret = CopyDirImpl::CopyDir(src, dest, mode);
381     if (ret.code != SUCCESS_CODE) {
382         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
383     }
384     LOGI("FS_TEST::FfiOHOSFileFsCopyDir success");
385     return ret;
386 }
387 
FfiOHOSFileFsCopyFile(const char* src, const char* dest, int mode)388 int FfiOHOSFileFsCopyFile(const char* src, const char* dest, int mode)
389 {
390     LOGI("FS_TEST::FfiOHOSFileFsCopyFile start");
391     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
392     if (ret != SUCCESS_CODE) {
393         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
394     }
395     LOGI("FS_TEST::FfiOHOSFileFsCopyFile success");
396     return ret;
397 }
398 
FfiOHOSFileFsCopyFileSI(const char* src, int32_t dest, int mode)399 int FfiOHOSFileFsCopyFileSI(const char* src, int32_t dest, int mode)
400 {
401     LOGI("FS_TEST::FfiOHOSFileFsCopyFileSI start");
402     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
403     if (ret != SUCCESS_CODE) {
404         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
405     }
406     LOGI("FS_TEST::FfiOHOSFileFsCopyFileSI success");
407     return ret;
408 }
409 
FfiOHOSFileFsCopyFileIS(int32_t src, const char* dest, int mode)410 int FfiOHOSFileFsCopyFileIS(int32_t src, const char* dest, int mode)
411 {
412     LOGI("FS_TEST::FfiOHOSFileFsCopyFileIS start");
413     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
414     if (ret != SUCCESS_CODE) {
415         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
416     }
417     LOGI("FS_TEST::FfiOHOSFileFsCopyFileIS success");
418     return ret;
419 }
420 
FfiOHOSFileFsCopyFileII(int32_t src, int32_t dest, int mode)421 int FfiOHOSFileFsCopyFileII(int32_t src, int32_t dest, int mode)
422 {
423     LOGI("FS_TEST::FfiOHOSFileFsCopyFileII start");
424     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
425     if (ret != SUCCESS_CODE) {
426         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
427     }
428     LOGI("FS_TEST::FfiOHOSFileFsCopyFileII success");
429     return ret;
430 }
431 
FfiOHOSFileFsMoveFile(const char* src, const char* dest, int mode)432 int FfiOHOSFileFsMoveFile(const char* src, const char* dest, int mode)
433 {
434     LOGI("FS_TEST::FfiOHOSFileFsMoveFile start");
435     auto ret = MoveFileImpl::MoveFile(src, dest, mode);
436     if (ret != SUCCESS_CODE) {
437         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
438     }
439     LOGI("FS_TEST::FfiOHOSFileFsMoveFile success");
440     return ret;
441 }
442 
FfiOHOSFileFsMkdtemp(const char* prefix)443 RetDataCString FfiOHOSFileFsMkdtemp(const char* prefix)
444 {
445     LOGI("FS_TEST::FfiOHOSFileFsMkdtemp start");
446     auto ret = MkdtempImpl::Mkdtemp(prefix);
447     if (ret.code != SUCCESS_CODE) {
448         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
449     }
450     LOGI("FS_TEST::FfiOHOSFileFsMkdtemp end");
451     return ret;
452 }
453 
FfiOHOSFileFsAccess(const char* path)454 RetDataBool FfiOHOSFileFsAccess(const char* path)
455 {
456     LOGI("FS_TEST::FfiOHOSFileFsAccess");
457     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
458     auto [status, accessStatus] = FileFsImpl::Access(path);
459     ret.code = status;
460     if (status != SUCCESS_CODE) {
461         LOGI("FS_TEST::FfiOHOSFileFsAccess error");
462         ret.data = false;
463         return ret;
464     }
465     LOGI("FS_TEST::FfiOHOSFileFsAccess success");
466     ret.data = accessStatus;
467     return ret;
468 }
469 
FfiOHOSFileFsTruncateByString(const char* file, int64_t len)470 int32_t FfiOHOSFileFsTruncateByString(const char* file, int64_t len)
471 {
472     LOGI("FS_TEST::FfiOHOSFileFsTruncateByString");
473     auto code = FileFsImpl::Truncate(file, len);
474     LOGI("FS_TEST::FfiOHOSFileFsTruncateByString success");
475     return code;
476 }
477 
FfiOHOSFileFsTruncateByFd(int32_t file, int64_t len)478 int32_t FfiOHOSFileFsTruncateByFd(int32_t file, int64_t len)
479 {
480     LOGI("FS_TEST::FfiOHOSFileFsTruncateByfd");
481     auto code = FileFsImpl::Truncate(file, len);
482     LOGI("FS_TEST::FfiOHOSFileFsTruncateByfd success");
483     return code;
484 }
485 
FfiOHOSFileFsReadLines(char* path, char* encoding)486 RetDataI64 FfiOHOSFileFsReadLines(char* path, char* encoding)
487 {
488     LOGI("FS_TEST::FfiOHOSFileFsReadLine");
489     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
490     auto [state, nativeReaderIterator] = FileFsImpl::ReadLines(path, encoding);
491     ret.code = state;
492     if (nativeReaderIterator == nullptr) {
493         LOGI("FS_TEST::FfiOHOSFileFsReadLine error");
494         ret.data = 0;
495         return ret;
496     }
497     LOGI("FS_TEST::FfiOHOSFileFsReadLine success");
498     ret.data = nativeReaderIterator->GetID();
499     return ret;
500 }
501 
FfiOHOSFileFsReaderIteratorNext(int64_t id)502 RetReaderIteratorResult FfiOHOSFileFsReaderIteratorNext(int64_t id)
503 {
504     LOGI("FS_TEST::FfiOHOSFileFsReaderIteratorNext");
505     RetReaderIteratorResult ret = { .code = ERR_INVALID_INSTANCE_CODE, .done = true, .data = nullptr };
506     auto instance = FFIData::GetData<ReadIteratorImpl>(id);
507     if (!instance) {
508         LOGE("[ImageSource] instance not exist %{public}" PRId64, id);
509         return ret;
510     }
511     auto [code, done, data] = instance->Next();
512     LOGI("FS_TEST::FfiOHOSFileFsReaderIteratorNext success");
513     ret.code = code;
514     ret.done = done;
515     ret.data = data;
516     return ret;
517 }
518 
FfiOHOSFileListFile(const char* path, CListFileOptions options)519 RetDataCArrStringN FfiOHOSFileListFile(const char* path, CListFileOptions options)
520 {
521     LOGI("FS_TEST::FfiOHOSFileListFile start");
522     auto ret = ListFileImpl::ListFile(path, options);
523     if (ret.code != SUCCESS_CODE) {
524         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
525     }
526     LOGI("FS_TEST::FfiOHOSFileListFile end");
527     return ret;
528 }
529 
530 
FfiOHOSFileFsLseek(int32_t fd, int64_t offset, int whence)531 RetDataI64 FfiOHOSFileFsLseek(int32_t fd, int64_t offset, int whence)
532 {
533     LOGI("FS_TEST::FfiOHOSFileFsLseek start");
534     auto ret = LseekImpl::Lseek(fd, offset, whence);
535     if (ret.code != SUCCESS_CODE) {
536         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
537     }
538     LOGI("FS_TEST::FfiOHOSFileFsLseek success");
539     return ret;
540 }
541 
FfiOHOSFileFsFdatasync(int32_t fd)542 int FfiOHOSFileFsFdatasync(int32_t fd)
543 {
544     LOGI("FS_TEST::FfiOHOSFileFsFdatasync start");
545     auto ret = FdatasyncImpl::Fdatasync(fd);
546     if (ret != SUCCESS_CODE) {
547         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
548     }
549     LOGI("FS_TEST::FfiOHOSFileFsFdatasync success");
550     return ret;
551 }
552 
FfiOHOSFileFsFsync(int32_t fd)553 int FfiOHOSFileFsFsync(int32_t fd)
554 {
555     LOGI("FS_TEST::FfiOHOSFileFsFsync start");
556     auto ret = FsyncImpl::Fsync(fd);
557     if (ret != SUCCESS_CODE) {
558         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
559     }
560     LOGI("FS_TEST::FfiOHOSFileFsFsync success");
561     return ret;
562 }
563 
FfiOHOSFileFsSymlink(const char* target, const char* srcPath)564 int FfiOHOSFileFsSymlink(const char* target, const char* srcPath)
565 {
566     LOGI("FS_TEST::FfiOHOSFileFsSymlink start");
567     auto ret = SymlinkImpl::Symlink(target, srcPath);
568     if (ret != SUCCESS_CODE) {
569         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
570     }
571     LOGI("FS_TEST::FfiOHOSFileFsSymlink success");
572     return ret;
573 }
574 
FfiOHOSFileFsReadText(char* path, int64_t offset, bool hasLen, int64_t len, char* encoding)575 RetDataCString FfiOHOSFileFsReadText(char* path, int64_t offset, bool hasLen, int64_t len, char* encoding)
576 {
577     LOGI("FS_TEST::FfiOHOSFileFsReadText start");
578     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
579     auto [state, cString] = FileFsImpl::ReadText(path, offset, hasLen, len, encoding);
580     LOGI("FS_TEST::FfiOHOSFileFsReadText success");
581     ret.code = state;
582     ret.data = cString;
583     return ret;
584 }
585 
FfiOHOSFileFsUtimes(char* path, double mtime)586 int32_t FfiOHOSFileFsUtimes(char* path, double mtime)
587 {
588     LOGI("FS_TEST::FfiOHOSFileFsUtimes start");
589     auto code = FileFsImpl::Utimes(path, mtime);
590     LOGI("FS_TEST::FfiOHOSFileFsUtimes success");
591     return code;
592 }
593 
FfiOHOSFileFsCreateWatcher(char* path, uint32_t events, void (*callback)(CWatchEvent))594 RetDataI64 FfiOHOSFileFsCreateWatcher(char* path, uint32_t events, void (*callback)(CWatchEvent))
595 {
596     LOGI("FS_TEST::FfiOHOSFileFsCreateWatcher start");
597     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
598     auto [state, nativeWatcher] = FileFsImpl::CreateWatcher(path, events, callback);
599     ret.code = state;
600     if (nativeWatcher == nullptr) {
601         LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFile error");
602         ret.data = 0;
603         return ret;
604     }
605     LOGI("FS_TEST::FfiOHOSFileFsCreateWatcher success");
606     ret.data = nativeWatcher->GetID();
607     return ret;
608 }
609 
FfiOHOSFileFsWatcherStart(int64_t id)610 int32_t FfiOHOSFileFsWatcherStart(int64_t id)
611 {
612     LOGI("FS_TEST::FfiOHOSFileFsWatcherStart");
613     auto instance = FFIData::GetData<WatcherImpl>(id);
614     if (!instance) {
615         LOGE("FfiOHOSFileFsWatcherStart instance not exist %{public}" PRId64, id);
616         return ERR_INVALID_INSTANCE_CODE;
617     }
618     int32_t startCode = FileWatcherManager::GetInstance().StartNotify(instance->data_);
619     if (startCode != SUCCESS_CODE) {
620         return startCode;
621     }
622     FileWatcherManager::GetInstance().GetNotifyEvent(instance->data_);
623     LOGI("FfiOHOSFileFsWatcherStart success");
624     return SUCCESS_CODE;
625 }
626 
FfiOHOSFileFsWatcherStop(int64_t id)627 int32_t FfiOHOSFileFsWatcherStop(int64_t id)
628 {
629     LOGI("FS_TEST::FfiOHOSFileFsWatcherStart");
630     auto instance = FFIData::GetData<WatcherImpl>(id);
631     if (!instance) {
632         LOGE("FfiOHOSFileFsWatcherStart instance not exist %{public}" PRId64, id);
633         return ERR_INVALID_INSTANCE_CODE;
634     }
635     LOGI("FS_TEST::FfiOHOSFileFsWatcherStart success");
636     return FileWatcherManager::GetInstance().StopNotify(instance->data_);
637 }
638 }
639 } // namespace FileFs
640 } // namespace CJSystemapi
641 } // namespace OHOS