• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 "js_native_api.h"
22 #include "js_native_api_types.h"
23 #include "list_file.h"
24 #include "lseek.h"
25 #include "macro.h"
26 #include "mkdtemp.h"
27 #include "move_file.h"
28 #include "symlink.h"
29 #include "uni_error.h"
30 
31 #include "stream_n_exporter.h"
32 #include "randomaccessfile_n_exporter.h"
33 
34 using namespace OHOS::FFI;
35 
36 namespace OHOS {
37 namespace CJSystemapi {
38 namespace FileFs {
39 
InstantiateStream(napi_env env,std::unique_ptr<FILE,decltype(& fclose) > fp)40 static napi_value InstantiateStream(napi_env env, std::unique_ptr<FILE, decltype(&fclose)> fp)
41 {
42     napi_value objStream = FileManagement::LibN::NClass::InstantiateClass(
43         env,
44         OHOS::FileManagement::ModuleFileIO::StreamNExporter::className_,
45         {});
46     if (!objStream) {
47         LOGE("[Stream]: INNER BUG. Cannot instantiate stream");
48         return nullptr;
49     }
50 
51     auto streamEntity = FileManagement::LibN::NClass::GetEntityOf<StreamEntity>(env, objStream);
52     if (!streamEntity) {
53         LOGE("[Stream]: Cannot instantiate stream because of void entity");
54         return nullptr;
55     }
56 
57     streamEntity->fp.swap(fp);
58     return objStream;
59 }
60 
61 extern "C" {
FfiCreateStreamFromNapi(napi_env env,napi_value stream)62 int64_t FfiCreateStreamFromNapi(napi_env env, napi_value stream)
63 {
64     if (env == nullptr || stream == nullptr) {
65         LOGE("[Stream]: parameter nullptr!");
66         return ERR_INVALID_INSTANCE_CODE;
67     }
68 
69     napi_valuetype type = napi_undefined;
70     if (napi_typeof(env, stream, &type) != napi_ok || type != napi_object) {
71         LOGE("[Stream]: parameter napi value type is not object!");
72         return ERR_INVALID_INSTANCE_CODE;
73     }
74 
75     auto streamEntity = FileManagement::LibN::NClass::GetEntityOf<StreamEntity>(env, stream);
76     if (!streamEntity) {
77         LOGE("[Stream]: Cannot instantiate stream because of void entity");
78         return ERR_INVALID_INSTANCE_CODE;
79     }
80     auto streamImpl = FFIData::Create<StreamImpl>(std::move(streamEntity->fp));
81     if (streamImpl == nullptr) {
82         LOGE("[Stream]: Create ffidata failed.");
83         return ERR_INVALID_INSTANCE_CODE;
84     }
85 
86     return streamImpl->GetID();
87 }
88 
FfiConvertStream2Napi(napi_env env,int64_t id)89 napi_value FfiConvertStream2Napi(napi_env env, int64_t id)
90 {
91     napi_value undefined = nullptr;
92     napi_get_undefined(env, &undefined);
93     auto instance = FFIData::GetData<StreamImpl>(id);
94     if (instance == nullptr) {
95         LOGE("[Stream]: instance not exist %{public}" PRId64, id);
96         return undefined;
97     }
98 
99     std::vector<napi_property_descriptor> props = {
100         FileManagement::LibN::NVal::DeclareNapiFunction("writeSync",
101             OHOS::FileManagement::ModuleFileIO::StreamNExporter::WriteSync),
102         FileManagement::LibN::NVal::DeclareNapiFunction("flush",
103             OHOS::FileManagement::ModuleFileIO::StreamNExporter::Flush),
104         FileManagement::LibN::NVal::DeclareNapiFunction("flushSync",
105             OHOS::FileManagement::ModuleFileIO::StreamNExporter::FlushSync),
106         FileManagement::LibN::NVal::DeclareNapiFunction("resdSync",
107             OHOS::FileManagement::ModuleFileIO::StreamNExporter::ReadSync),
108         FileManagement::LibN::NVal::DeclareNapiFunction("closeSync",
109             OHOS::FileManagement::ModuleFileIO::StreamNExporter::CloseSync),
110         FileManagement::LibN::NVal::DeclareNapiFunction("write",
111             OHOS::FileManagement::ModuleFileIO::StreamNExporter::Write),
112         FileManagement::LibN::NVal::DeclareNapiFunction("read",
113             OHOS::FileManagement::ModuleFileIO::StreamNExporter::Read),
114         FileManagement::LibN::NVal::DeclareNapiFunction("close",
115             OHOS::FileManagement::ModuleFileIO::StreamNExporter::Close),
116         FileManagement::LibN::NVal::DeclareNapiFunction("seek",
117             OHOS::FileManagement::ModuleFileIO::StreamNExporter::Seek),
118     };
119 
120     bool succ = false;
121     napi_value cls = nullptr;
122     std::tie(succ, cls) = FileManagement::LibN::NClass::DefineClass(
123         env,
124         OHOS::FileManagement::ModuleFileIO::StreamNExporter::className_,
125         OHOS::FileManagement::ModuleFileIO::StreamNExporter::Constructor,
126         move(props));
127 
128     if (!succ) {
129         LOGE("INNER BUG. Failed to save class");
130         return undefined;
131     }
132 
133     napi_value result = InstantiateStream(env, instance->GetRealFp());
134     napi_valuetype type = napi_undefined;
135     if (napi_typeof(env, result, &type) != napi_ok || type == napi_undefined) {
136         LOGE("[Stream]: create napiobj failed.");
137         return undefined;
138     }
139     return result;
140 }
141 
FfiOHOSFileFsCreateCopyOptions(int64_t callbackId,int64_t signalId)142 int64_t FfiOHOSFileFsCreateCopyOptions(int64_t callbackId, int64_t signalId)
143 {
144     LOGD("FS_TEST::FfiOHOSFileFsCreateCopyOptions");
145     auto instance = FFIData::Create<CopyInfo>(callbackId, signalId);
146     if (!instance) {
147         LOGE("Failed to create CopyImpl.");
148         return 0;
149     }
150     return instance->GetID();
151 }
152 
FfiOHOSFileFsCreateTaskSignal()153 int64_t FfiOHOSFileFsCreateTaskSignal()
154 {
155     LOGD("FS_TEST::FfiOHOSFileFsCreateTaskSignal");
156     auto instance = FFIData::Create<TaskSignalImpl>();
157     if (!instance || !instance->signalEntity || !instance->signalEntity->taskSignal_) {
158         LOGE("Failed to create TaskSignalImpl.");
159         return 0;
160     }
161     return instance->GetID();
162 }
163 
FfiOHOSFileFsTaskSignalCancel(int64_t id)164 int64_t FfiOHOSFileFsTaskSignalCancel(int64_t id)
165 {
166     LOGD("FS_TEST::FfiOHOSFileFsTaskSignalCancel");
167     auto instance = FFIData::GetData<TaskSignalImpl>(id);
168     if (!instance || !instance->signalEntity || !instance->signalEntity->taskSignal_) {
169         LOGE("Failed to create TaskSignalImpl.");
170         return ERR_INVALID_INSTANCE_CODE;
171     }
172     return instance->signalEntity->taskSignal_->Cancel();
173 }
174 
FfiOHOSFileFsCopy(const char * src,const char * dest,int64_t opt)175 void FfiOHOSFileFsCopy(const char* src, const char* dest, int64_t opt)
176 {
177     LOGD("FS_TEST::FfiOHOSFileFsCopy");
178     if (opt == 0) {
179         auto emptyInfo = FFIData::Create<CopyInfo>(0, 0);
180         if (!emptyInfo) {
181             LOGE("Failed to create empty CopyInfo");
182             return;
183         }
184         CopyImpl::Copy(src, dest, emptyInfo);
185         return;
186     }
187     auto instance = FFIData::GetData<CopyInfo>(opt);
188     if (!instance) {
189         LOGE("Failed to get CopyInfo");
190         return;
191     }
192     CopyImpl::Copy(src, dest, instance);
193 }
194 
FfiOHOSFileFsStatByID(int32_t file)195 RetDataI64 FfiOHOSFileFsStatByID(int32_t file)
196 {
197     LOGI("FS_TEST::FfiOHOSFileFsStatByID");
198     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
199     auto [state, nativeStat] = FileFsImpl::Stat(file);
200     if (nativeStat == nullptr) {
201         LOGI("FS_TEST::FfiOHOSFileFsStatByID error");
202         ret.code = state;
203         ret.data = 0;
204         return ret;
205     }
206     LOGI("FS_TEST::FfiOHOSFileFsStatByID success");
207     ret.code = state;
208     ret.data = nativeStat->GetID();
209     return ret;
210 }
211 
FfiOHOSFileFsStatByString(const char * file)212 RetDataI64 FfiOHOSFileFsStatByString(const char* file)
213 {
214     LOGI("FS_TEST::FfiOHOSFileFsStatByString");
215     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
216     auto [state, nativeStat] = FileFsImpl::Stat(file);
217     if (nativeStat == nullptr) {
218         LOGI("FS_TEST::FfiOHOSFileFsStatByString error");
219         ret.code = state;
220         ret.data = 0;
221         return ret;
222     }
223     LOGI("FS_TEST::FfiOHOSFileFsStatByString success");
224     ret.code = state;
225     ret.data = nativeStat->GetID();
226     return ret;
227 }
228 
FfiOHOSFileFsCreateStream(const char * path,const char * mode)229 RetDataI64 FfiOHOSFileFsCreateStream(const char* path, const char* mode)
230 {
231     LOGI("FS_TEST::FfiOHOSFileFsCreateStream");
232     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
233     auto [state, nativeStream] = FileFsImpl::CreateStream(path, mode);
234     ret.code = state;
235     if (nativeStream == nullptr) {
236         LOGI("FS_TEST::FfiOHOSFileFsCreateStream error");
237         ret.data = 0;
238         return ret;
239     }
240     LOGI("FS_TEST::FfiOHOSFileFsCreateStream success");
241     ret.data = nativeStream->GetID();
242     return ret;
243 }
244 
FfiOHOSFileFsFdopenStream(int32_t fd,const char * mode)245 RetDataI64 FfiOHOSFileFsFdopenStream(int32_t fd, const char* mode)
246 {
247     LOGI("FS_TEST::FfiOHOSFileFsFdopenStream");
248     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
249     auto [state, nativeStream] = FileFsImpl::FdopenStream(fd, mode);
250     ret.code = state;
251     if (nativeStream == nullptr) {
252         LOGI("FS_TEST::FfiOHOSFileFsFdopenStream error");
253         ret.data = 0;
254         return ret;
255     }
256     LOGI("FS_TEST::FfiOHOSFileFsFdopenStream success");
257     ret.data = nativeStream->GetID();
258     return ret;
259 }
260 
FfiOHOSFileFsLstat(const char * path)261 RetDataI64 FfiOHOSFileFsLstat(const char* path)
262 {
263     LOGI("FS_TEST::FfiOHOSFileFsLstat");
264     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
265     auto [state, nativeStat] = FileFsImpl::Lstat(path);
266     ret.code = state;
267     if (nativeStat == nullptr) {
268         LOGI("FS_TEST::FfiOHOSFileFsLstat error");
269         ret.data = 0;
270         return ret;
271     }
272     LOGI("FS_TEST::FfiOHOSFileFsLstat success");
273     ret.data = nativeStat->GetID();
274     return ret;
275 }
276 
FfiOHOSFileFsRead(int32_t fd,char * buffer,int64_t bufLen,size_t length,int64_t offset)277 RetDataI64 FfiOHOSFileFsRead(int32_t fd, char* buffer, int64_t bufLen, size_t length, int64_t offset)
278 {
279     LOGI("FS_TEST::FfiOHOSFileFsRead");
280     auto ret = FileFsImpl::Read(fd, buffer, bufLen, length, offset);
281     if (ret.code != SUCCESS_CODE) {
282         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
283         return ret;
284     }
285     LOGI("FS_TEST::FfiOHOSFileFsRead success");
286     return ret;
287 }
288 
FfiOHOSFileFsReadCur(int32_t fd,char * buffer,int64_t bufLen,size_t length)289 RetDataI64 FfiOHOSFileFsReadCur(int32_t fd, char* buffer, int64_t bufLen, size_t length)
290 {
291     LOGI("FS_TEST::FfiOHOSFileFsReadCur");
292     auto ret = FileFsImpl::ReadCur(fd, buffer, bufLen, length);
293     if (ret.code != SUCCESS_CODE) {
294         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
295         return ret;
296     }
297     LOGI("FS_TEST::FfiOHOSFileFsReadCur success");
298     return ret;
299 }
300 
FfiOHOSFileFsWrite(int32_t fd,char * buffer,size_t length,int64_t offset,const char * encode)301 RetDataI64 FfiOHOSFileFsWrite(int32_t fd, char* buffer, size_t length, int64_t offset, const char* encode)
302 {
303     LOGI("FS_TEST::FfiOHOSFileFsWrite");
304     auto ret = FileFsImpl::Write(fd, reinterpret_cast<void *>(buffer), length, offset, encode);
305     if (ret.code != SUCCESS_CODE) {
306         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
307         return ret;
308     }
309     LOGI("FS_TEST::FfiOHOSFileFsWrite success");
310     return ret;
311 }
312 
FfiOHOSFileFsWriteCur(int32_t fd,char * buffer,size_t length,const char * encode)313 RetDataI64 FfiOHOSFileFsWriteCur(int32_t fd, char* buffer, size_t length, const char* encode)
314 {
315     LOGI("FS_TEST::FfiOHOSFileFsWriteCur");
316     auto ret = FileFsImpl::WriteCur(fd, reinterpret_cast<void *>(buffer), length, encode);
317     if (ret.code != SUCCESS_CODE) {
318         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
319         return ret;
320     }
321     LOGI("FS_TEST::FfiOHOSFileFsWriteCur success");
322     return ret;
323 }
324 
FfiOHOSFileFsCreateRandomAccessFileByString(const char * file,int64_t mode)325 RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByString(const char* file, int64_t mode)
326 {
327     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString");
328     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
329     auto [state, nativeCreateRandomAccessFile] = FileFsImpl::CreateRandomAccessFileSync(file, mode);
330     ret.code = state;
331     if (nativeCreateRandomAccessFile == nullptr) {
332         LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString error");
333         ret.data = 0;
334         return ret;
335     }
336     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByString success");
337     ret.data = nativeCreateRandomAccessFile->GetID();
338     return ret;
339 }
340 
FfiOHOSFileFsCreateRandomAccessFileByID(int64_t file,int64_t mode)341 RetDataI64 FfiOHOSFileFsCreateRandomAccessFileByID(int64_t file, int64_t mode)
342 {
343     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByID");
344     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
345     auto instance = FFIData::GetData<FileEntity>(file);
346     auto [state, nativeCreateRandomAccessFile] = FileFsImpl::CreateRandomAccessFileSync(instance, mode);
347     ret.code = state;
348     if (nativeCreateRandomAccessFile == nullptr) {
349         LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByID error");
350         ret.data = 0;
351         return ret;
352     }
353     LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFileByID success");
354     ret.data = nativeCreateRandomAccessFile->GetID();
355     return ret;
356 }
357 
FfiOHOSRandomAccessFileGetFd(int64_t id)358 int32_t FfiOHOSRandomAccessFileGetFd(int64_t id)
359 {
360     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFd");
361     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
362     if (!instance) {
363         LOGE("FfiOHOSRandomAccessFileGetFd instance not exist %{public}" PRId64, id);
364         return ERR_INVALID_INSTANCE_CODE;
365     }
366     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFd success");
367     return instance->GetFd();
368 }
369 
FfiOHOSRandomAccessFileGetFPointer(int64_t id)370 int64_t FfiOHOSRandomAccessFileGetFPointer(int64_t id)
371 {
372     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFPointer");
373     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
374     if (!instance) {
375         LOGE("FfiOHOSRandomAccessFileGetFPointer instance not exist %{public}" PRId64, id);
376         return ERR_INVALID_INSTANCE_CODE;
377     }
378     LOGI("FS_TEST::FfiOHOSRandomAccessFileGetFPointer success");
379     return instance->GetFPointer();
380 }
381 
FfiOHOSRandomAccessFileSetFilePointerSync(int64_t id,int64_t fd)382 void FfiOHOSRandomAccessFileSetFilePointerSync(int64_t id, int64_t fd)
383 {
384     LOGI("FS_TEST::FfiOHOSRandomAccessFileSetFilePointerSync");
385     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
386     if (!instance) {
387         LOGE("FfiOHOSRandomAccessFileSetFilePointerSync instance not exist %{public}" PRId64, id);
388         return;
389     }
390     LOGI("FS_TEST::FfiOHOSRandomAccessFileSetFilePointerSync success");
391     instance->SetFilePointerSync(fd);
392     return;
393 }
394 
FfiOHOSRandomAccessFileClose(int64_t id)395 void FfiOHOSRandomAccessFileClose(int64_t id)
396 {
397     LOGI("FS_TEST::FfiOHOSRandomAccessFileClose");
398     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
399     if (!instance) {
400         LOGE("FfiOHOSRandomAccessFileClose instance not exist %{public}" PRId64, id);
401         return;
402     }
403     LOGI("FS_TEST::FfiOHOSRandomAccessFileClose success");
404     return instance->CloseSync();
405 }
406 
FfiOHOSRandomAccessFileWrite(int64_t id,char * buf,size_t len,int64_t offset)407 RetDataI64 FfiOHOSRandomAccessFileWrite(int64_t id, char* buf, size_t len, int64_t offset)
408 {
409     LOGI("FS_TEST::FfiOHOSRandomAccessFileWriteByString");
410     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
411     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
412     if (!instance) {
413         LOGE("FfiOHOSRandomAccessFileWriteByString instance not exist %{public}" PRId64, id);
414         ret.code = ERR_INVALID_INSTANCE_CODE;
415         ret.data = 0;
416         return ret;
417     }
418     LOGI("FS_TEST::FfiOHOSRandomAccessFileWriteByString success");
419     auto [code, data] = instance->WriteSync(buf, len, offset);
420     ret.code = code;
421     ret.data = data;
422     return ret;
423 }
424 
FfiOHOSRandomAccessFileRead(int64_t id,char * buf,size_t len,int64_t offset)425 RetDataI64 FfiOHOSRandomAccessFileRead(int64_t id, char* buf, size_t len, int64_t offset)
426 {
427     LOGI("FS_TEST::FfiOHOSRandomAccessFileReadByArray");
428     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
429     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
430     if (!instance) {
431         LOGE("FfiOHOSRandomAccessFileReadByArray instance not exist %{public}" PRId64, id);
432         ret.code = ERR_INVALID_INSTANCE_CODE;
433         ret.data = 0;
434         return ret;
435     }
436     LOGI("FS_TEST::FfiOHOSRandomAccessFileReadByArray success");
437     auto [code, data] = instance->ReadSync(buf, len, offset);
438     ret.code = code;
439     ret.data = data;
440     return ret;
441 }
442 
FfiConvertRandomAccessFile2Napi(napi_env env,int64_t id)443 napi_value FfiConvertRandomAccessFile2Napi(napi_env env, int64_t id)
444 {
445     napi_value undefined = nullptr;
446     napi_get_undefined(env, &undefined);
447 
448     auto instance = FFIData::GetData<RandomAccessFileImpl>(id);
449     if (instance == nullptr || instance->GetEntity() == nullptr) {
450         LOGE("FfiConvertRandomAccessFile2Napi instance not exist %{public}" PRId64, id);
451         return undefined;
452     }
453 
454     napi_value objRAF = FileManagement::LibN::NClass::InstantiateClass(
455         env,
456         OHOS::FileManagement::ModuleFileIO::RandomAccessFileNExporter::className_,
457         {});
458     if (!env || !objRAF) {
459         LOGE("Empty input: env %d, obj %d", env == nullptr, objRAF == nullptr);
460         return undefined;
461     }
462 
463     OHOS::FileManagement::ModuleFileIO::RandomAccessFileEntity *rafEntity = nullptr;
464     napi_status status = napi_unwrap(env, objRAF, reinterpret_cast<void **>(&rafEntity));
465     if (status != napi_ok) {
466         LOGE("Cannot unwrap for pointer: %d", status);
467         return undefined;
468     }
469     if (!rafEntity) {
470         LOGE("Cannot instantiate randomaccessfile because of void entity");
471         return undefined;
472     }
473 
474     rafEntity->fd.swap(instance->GetEntity()->fd);
475     rafEntity->filePointer = instance->GetEntity()->filePointer;
476     rafEntity->start = instance->GetEntity()->start;
477     rafEntity->end = instance->GetEntity()->end;
478 
479     napi_valuetype type;
480     status = napi_typeof(env, objRAF, &type);
481     if (status != napi_ok || type == napi_undefined) {
482         LOGE("[RandomAccessFile]: create napiobj failed");
483         return undefined;
484     }
485 
486     return objRAF;
487 }
488 
FfiCreateRandomAccessFileFromNapi(napi_env env,napi_value objRAF)489 int64_t FfiCreateRandomAccessFileFromNapi(napi_env env, napi_value objRAF)
490 {
491     if (env == nullptr || objRAF == nullptr) {
492         LOGE("[RandomAccessFile]: parameter is nullptr");
493         return ERR_INVALID_INSTANCE_CODE;
494     }
495 
496     napi_valuetype type = napi_undefined;
497 
498     if (napi_typeof(env, objRAF, &type) != napi_ok || type != napi_object) {
499         LOGE("[RandomAccessFile]: parameter is not object");
500         return ERR_INVALID_INSTANCE_CODE;
501     }
502 
503     std::shared_ptr<OHOS::FileManagement::ModuleFileIO::RandomAccessFileEntity>* entity = nullptr;
504     napi_status status = napi_unwrap(env, objRAF, reinterpret_cast<void **>(&entity));
505     if (status != napi_ok || entity == nullptr) {
506         LOGE("Cannot unwrap for pointer: %d", status);
507         return ERR_INVALID_INSTANCE_CODE;
508     }
509 
510     auto native = FFIData::Create<RandomAccessFileImpl>(*entity);
511 
512     if (native == nullptr) {
513         LOGE("[RandomAccessFile]: Create ffidata failed");
514         return ERR_INVALID_INSTANCE_CODE;
515     }
516 
517     return native->GetID();
518 }
519 
FfiOHOSFileFsMkdir(const char * path,bool recursion,bool isTwoArgs)520 int32_t FfiOHOSFileFsMkdir(const char* path, bool recursion, bool isTwoArgs)
521 {
522     LOGI("FS_TEST::FfiOHOSFileFsMkdir");
523     auto code = FileFsImpl::Mkdir(path, recursion, isTwoArgs);
524     LOGI("FS_TEST::FfiOHOSFileFsMkdir success");
525     return code;
526 }
527 
FfiOHOSFileFsRmdir(const char * path)528 int32_t FfiOHOSFileFsRmdir(const char* path)
529 {
530     LOGI("FS_TEST::FfiOHOSFileFsRmdir");
531     auto code = FileFsImpl::Rmdir(path);
532     LOGI("FS_TEST::FfiOHOSFileFsRmdir success");
533     return code;
534 }
535 
FfiOHOSFileFsMoveDir(const char * src,const char * dest,int32_t mode)536 RetDataCArrConflictFiles FfiOHOSFileFsMoveDir(const char* src, const char* dest, int32_t mode)
537 {
538     LOGI("FS_TEST::FfiOHOSFileFsMovedir");
539     auto ret = FileFsImpl::MoveDir(src, dest, mode);
540     LOGI("FS_TEST::FfiOHOSFileFsMovedir success");
541     return ret;
542 }
543 
FfiOHOSFileFsRename(const char * oldFile,const char * newFile)544 int32_t FfiOHOSFileFsRename(const char* oldFile, const char* newFile)
545 {
546     LOGI("FS_TEST::FfiOHOSFileFsRename");
547     auto code = FileFsImpl::Rename(oldFile, newFile);
548     LOGI("FS_TEST::FfiOHOSFileFsRename success");
549     return code;
550 }
551 
FfiOHOSFileFsUnlink(const char * path)552 int32_t FfiOHOSFileFsUnlink(const char* path)
553 {
554     LOGI("FS_TEST::FfiOHOSFileFsUnlink");
555     auto code = FileFsImpl::Unlink(path);
556     LOGI("FS_TEST::FfiOHOSFileFsUnlink success");
557     return code;
558 }
559 
FfiOHOSFileFsCopyDir(const char * src,const char * dest,int mode)560 RetDataCArrConflictFiles FfiOHOSFileFsCopyDir(const char* src, const char* dest, int mode)
561 {
562     LOGI("FS_TEST::FfiOHOSFileFsCopyDir start");
563     auto ret = CopyDirImpl::CopyDir(src, dest, mode);
564     if (ret.code != SUCCESS_CODE) {
565         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
566     }
567     LOGI("FS_TEST::FfiOHOSFileFsCopyDir success");
568     return ret;
569 }
570 
FfiOHOSFileFsCopyFile(const char * src,const char * dest,int mode)571 int FfiOHOSFileFsCopyFile(const char* src, const char* dest, int mode)
572 {
573     LOGI("FS_TEST::FfiOHOSFileFsCopyFile start");
574     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
575     if (ret != SUCCESS_CODE) {
576         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
577     }
578     LOGI("FS_TEST::FfiOHOSFileFsCopyFile success");
579     return ret;
580 }
581 
FfiOHOSFileFsCopyFileSI(const char * src,int32_t dest,int mode)582 int FfiOHOSFileFsCopyFileSI(const char* src, int32_t dest, int mode)
583 {
584     LOGI("FS_TEST::FfiOHOSFileFsCopyFileSI start");
585     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
586     if (ret != SUCCESS_CODE) {
587         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
588     }
589     LOGI("FS_TEST::FfiOHOSFileFsCopyFileSI success");
590     return ret;
591 }
592 
FfiOHOSFileFsCopyFileIS(int32_t src,const char * dest,int mode)593 int FfiOHOSFileFsCopyFileIS(int32_t src, const char* dest, int mode)
594 {
595     LOGI("FS_TEST::FfiOHOSFileFsCopyFileIS start");
596     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
597     if (ret != SUCCESS_CODE) {
598         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
599     }
600     LOGI("FS_TEST::FfiOHOSFileFsCopyFileIS success");
601     return ret;
602 }
603 
FfiOHOSFileFsCopyFileII(int32_t src,int32_t dest,int mode)604 int FfiOHOSFileFsCopyFileII(int32_t src, int32_t dest, int mode)
605 {
606     LOGI("FS_TEST::FfiOHOSFileFsCopyFileII start");
607     auto ret = CopyFileImpl::CopyFile(src, dest, mode);
608     if (ret != SUCCESS_CODE) {
609         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
610     }
611     LOGI("FS_TEST::FfiOHOSFileFsCopyFileII success");
612     return ret;
613 }
614 
FfiOHOSFileFsMoveFile(const char * src,const char * dest,int mode)615 int FfiOHOSFileFsMoveFile(const char* src, const char* dest, int mode)
616 {
617     LOGI("FS_TEST::FfiOHOSFileFsMoveFile start");
618     auto ret = MoveFileImpl::MoveFile(src, dest, mode);
619     if (ret != SUCCESS_CODE) {
620         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
621     }
622     LOGI("FS_TEST::FfiOHOSFileFsMoveFile success");
623     return ret;
624 }
625 
FfiOHOSFileFsMkdtemp(const char * prefix)626 RetDataCString FfiOHOSFileFsMkdtemp(const char* prefix)
627 {
628     LOGI("FS_TEST::FfiOHOSFileFsMkdtemp start");
629     auto ret = MkdtempImpl::Mkdtemp(prefix);
630     if (ret.code != SUCCESS_CODE) {
631         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
632     }
633     LOGI("FS_TEST::FfiOHOSFileFsMkdtemp end");
634     return ret;
635 }
636 
FfiOHOSFileFsAccess(const char * path)637 RetDataBool FfiOHOSFileFsAccess(const char* path)
638 {
639     LOGI("FS_TEST::FfiOHOSFileFsAccess");
640     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
641     auto [status, accessStatus] = FileFsImpl::Access(path);
642     ret.code = status;
643     if (status != SUCCESS_CODE) {
644         LOGI("FS_TEST::FfiOHOSFileFsAccess error");
645         ret.data = false;
646         return ret;
647     }
648     LOGI("FS_TEST::FfiOHOSFileFsAccess success");
649     ret.data = accessStatus;
650     return ret;
651 }
652 
FfiOHOSFileFsAccessExt(const char * path,int32_t mode,int32_t flag)653 RetDataBool FfiOHOSFileFsAccessExt(const char* path, int32_t mode, int32_t flag)
654 {
655     LOGI("FS_TEST::FfiOHOSFileFsAccessExt");
656     RetDataBool ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
657     auto [status, accessStatus] = FileFsImpl::Access(path, mode, flag);
658     ret.code = status;
659     if (status != SUCCESS_CODE) {
660         LOGI("FS_TEST::FfiOHOSFileFsAccessExt error");
661         ret.data = false;
662         return ret;
663     }
664     LOGI("FS_TEST::FfiOHOSFileFsAccessExt success");
665     ret.data = accessStatus;
666     return ret;
667 }
668 
FfiOHOSFileFsTruncateByString(const char * file,int64_t len)669 int32_t FfiOHOSFileFsTruncateByString(const char* file, int64_t len)
670 {
671     LOGI("FS_TEST::FfiOHOSFileFsTruncateByString");
672     auto code = FileFsImpl::Truncate(file, len);
673     LOGI("FS_TEST::FfiOHOSFileFsTruncateByString success");
674     return code;
675 }
676 
FfiOHOSFileFsTruncateByFd(int32_t file,int64_t len)677 int32_t FfiOHOSFileFsTruncateByFd(int32_t file, int64_t len)
678 {
679     LOGI("FS_TEST::FfiOHOSFileFsTruncateByfd");
680     auto code = FileFsImpl::Truncate(file, len);
681     LOGI("FS_TEST::FfiOHOSFileFsTruncateByfd success");
682     return code;
683 }
684 
FfiOHOSFileFsReadLines(char * path,char * encoding)685 RetDataI64 FfiOHOSFileFsReadLines(char* path, char* encoding)
686 {
687     LOGI("FS_TEST::FfiOHOSFileFsReadLine");
688     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
689     auto [state, nativeReaderIterator] = FileFsImpl::ReadLines(path, encoding);
690     ret.code = state;
691     if (nativeReaderIterator == nullptr) {
692         LOGI("FS_TEST::FfiOHOSFileFsReadLine error");
693         ret.data = 0;
694         return ret;
695     }
696     LOGI("FS_TEST::FfiOHOSFileFsReadLine success");
697     ret.data = nativeReaderIterator->GetID();
698     return ret;
699 }
700 
FfiOHOSFileFsReaderIteratorNext(int64_t id)701 RetReaderIteratorResult FfiOHOSFileFsReaderIteratorNext(int64_t id)
702 {
703     LOGI("FS_TEST::FfiOHOSFileFsReaderIteratorNext");
704     RetReaderIteratorResult ret = { .code = ERR_INVALID_INSTANCE_CODE, .done = true, .data = nullptr };
705     auto instance = FFIData::GetData<ReadIteratorImpl>(id);
706     if (!instance) {
707         LOGE("[ImageSource] instance not exist %{public}" PRId64, id);
708         return ret;
709     }
710     auto [code, done, data] = instance->Next();
711     LOGI("FS_TEST::FfiOHOSFileFsReaderIteratorNext success");
712     ret.code = code;
713     ret.done = done;
714     ret.data = data;
715     return ret;
716 }
717 
FfiOHOSFileListFile(const char * path,CListFileOptions options)718 RetDataCArrStringN FfiOHOSFileListFile(const char* path, CListFileOptions options)
719 {
720     LOGI("FS_TEST::FfiOHOSFileListFile start");
721     auto ret = ListFileImpl::ListFile(path, options);
722     if (ret.code != SUCCESS_CODE) {
723         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
724     }
725     LOGI("FS_TEST::FfiOHOSFileListFile end");
726     return ret;
727 }
728 
729 
FfiOHOSFileFsLseek(int32_t fd,int64_t offset,int whence)730 RetDataI64 FfiOHOSFileFsLseek(int32_t fd, int64_t offset, int whence)
731 {
732     LOGI("FS_TEST::FfiOHOSFileFsLseek start");
733     auto ret = LseekImpl::Lseek(fd, offset, whence);
734     if (ret.code != SUCCESS_CODE) {
735         ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
736     }
737     LOGI("FS_TEST::FfiOHOSFileFsLseek success");
738     return ret;
739 }
740 
FfiOHOSFileFsFdatasync(int32_t fd)741 int FfiOHOSFileFsFdatasync(int32_t fd)
742 {
743     LOGI("FS_TEST::FfiOHOSFileFsFdatasync start");
744     auto ret = FdatasyncImpl::Fdatasync(fd);
745     if (ret != SUCCESS_CODE) {
746         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
747     }
748     LOGI("FS_TEST::FfiOHOSFileFsFdatasync success");
749     return ret;
750 }
751 
FfiOHOSFileFsFsync(int32_t fd)752 int FfiOHOSFileFsFsync(int32_t fd)
753 {
754     LOGI("FS_TEST::FfiOHOSFileFsFsync start");
755     auto ret = FsyncImpl::Fsync(fd);
756     if (ret != SUCCESS_CODE) {
757         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
758     }
759     LOGI("FS_TEST::FfiOHOSFileFsFsync success");
760     return ret;
761 }
762 
FfiOHOSFileFsSymlink(const char * target,const char * srcPath)763 int FfiOHOSFileFsSymlink(const char* target, const char* srcPath)
764 {
765     LOGI("FS_TEST::FfiOHOSFileFsSymlink start");
766     auto ret = SymlinkImpl::Symlink(target, srcPath);
767     if (ret != SUCCESS_CODE) {
768         return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
769     }
770     LOGI("FS_TEST::FfiOHOSFileFsSymlink success");
771     return ret;
772 }
773 
FfiOHOSFileFsReadText(char * path,int64_t offset,bool hasLen,int64_t len,char * encoding)774 RetDataCString FfiOHOSFileFsReadText(char* path, int64_t offset, bool hasLen, int64_t len, char* encoding)
775 {
776     LOGI("FS_TEST::FfiOHOSFileFsReadText start");
777     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
778     auto [state, cString] = FileFsImpl::ReadText(path, offset, hasLen, len, encoding);
779     LOGI("FS_TEST::FfiOHOSFileFsReadText success");
780     ret.code = state;
781     ret.data = cString;
782     return ret;
783 }
784 
FfiOHOSFileFsUtimes(char * path,double mtime)785 int32_t FfiOHOSFileFsUtimes(char* path, double mtime)
786 {
787     LOGI("FS_TEST::FfiOHOSFileFsUtimes start");
788     auto code = FileFsImpl::Utimes(path, mtime);
789     LOGI("FS_TEST::FfiOHOSFileFsUtimes success");
790     return code;
791 }
792 
FfiOHOSFileFsCreateWatcher(char * path,uint32_t events,void (* callback)(CWatchEvent))793 RetDataI64 FfiOHOSFileFsCreateWatcher(char* path, uint32_t events, void (*callback)(CWatchEvent))
794 {
795     LOGI("FS_TEST::FfiOHOSFileFsCreateWatcher start");
796     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
797     auto [state, nativeWatcher] = FileFsImpl::CreateWatcher(path, events, callback);
798     ret.code = state;
799     if (nativeWatcher == nullptr) {
800         LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFile error");
801         ret.data = 0;
802         return ret;
803     }
804     LOGI("FS_TEST::FfiOHOSFileFsCreateWatcher success");
805     ret.data = nativeWatcher->GetID();
806     return ret;
807 }
808 
FfiOHOSFileFsWatcherStart(int64_t id)809 int32_t FfiOHOSFileFsWatcherStart(int64_t id)
810 {
811     LOGI("FS_TEST::FfiOHOSFileFsWatcherStart");
812     auto instance = FFIData::GetData<WatcherImpl>(id);
813     if (!instance) {
814         LOGE("FfiOHOSFileFsWatcherStart instance not exist %{public}" PRId64, id);
815         return ERR_INVALID_INSTANCE_CODE;
816     }
817     int32_t startCode = FileWatcherManager::GetInstance().StartNotify(instance->data_);
818     if (startCode != SUCCESS_CODE) {
819         return startCode;
820     }
821     FileWatcherManager::GetInstance().GetNotifyEvent(instance->data_);
822     LOGI("FfiOHOSFileFsWatcherStart success");
823     return SUCCESS_CODE;
824 }
825 
FfiOHOSFileFsWatcherStop(int64_t id)826 int32_t FfiOHOSFileFsWatcherStop(int64_t id)
827 {
828     LOGI("FS_TEST::FfiOHOSFileFsWatcherStart");
829     auto instance = FFIData::GetData<WatcherImpl>(id);
830     if (!instance) {
831         LOGE("FfiOHOSFileFsWatcherStart instance not exist %{public}" PRId64, id);
832         return ERR_INVALID_INSTANCE_CODE;
833     }
834     LOGI("FS_TEST::FfiOHOSFileFsWatcherStart success");
835     return FileWatcherManager::GetInstance().StopNotify(instance->data_);
836 }
837 }
838 } // namespace FileFs
839 } // namespace CJSystemapi
840 } // namespace OHOS