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, 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, 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
FfiOHOSFileFsTruncateByString(const char * file,int64_t len)653 int32_t FfiOHOSFileFsTruncateByString(const char* file, int64_t len)
654 {
655 LOGI("FS_TEST::FfiOHOSFileFsTruncateByString");
656 auto code = FileFsImpl::Truncate(file, len);
657 LOGI("FS_TEST::FfiOHOSFileFsTruncateByString success");
658 return code;
659 }
660
FfiOHOSFileFsTruncateByFd(int32_t file,int64_t len)661 int32_t FfiOHOSFileFsTruncateByFd(int32_t file, int64_t len)
662 {
663 LOGI("FS_TEST::FfiOHOSFileFsTruncateByfd");
664 auto code = FileFsImpl::Truncate(file, len);
665 LOGI("FS_TEST::FfiOHOSFileFsTruncateByfd success");
666 return code;
667 }
668
FfiOHOSFileFsReadLines(char * path,char * encoding)669 RetDataI64 FfiOHOSFileFsReadLines(char* path, char* encoding)
670 {
671 LOGI("FS_TEST::FfiOHOSFileFsReadLine");
672 RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
673 auto [state, nativeReaderIterator] = FileFsImpl::ReadLines(path, encoding);
674 ret.code = state;
675 if (nativeReaderIterator == nullptr) {
676 LOGI("FS_TEST::FfiOHOSFileFsReadLine error");
677 ret.data = 0;
678 return ret;
679 }
680 LOGI("FS_TEST::FfiOHOSFileFsReadLine success");
681 ret.data = nativeReaderIterator->GetID();
682 return ret;
683 }
684
FfiOHOSFileFsReaderIteratorNext(int64_t id)685 RetReaderIteratorResult FfiOHOSFileFsReaderIteratorNext(int64_t id)
686 {
687 LOGI("FS_TEST::FfiOHOSFileFsReaderIteratorNext");
688 RetReaderIteratorResult ret = { .code = ERR_INVALID_INSTANCE_CODE, .done = true, .data = nullptr };
689 auto instance = FFIData::GetData<ReadIteratorImpl>(id);
690 if (!instance) {
691 LOGE("[ImageSource] instance not exist %{public}" PRId64, id);
692 return ret;
693 }
694 auto [code, done, data] = instance->Next();
695 LOGI("FS_TEST::FfiOHOSFileFsReaderIteratorNext success");
696 ret.code = code;
697 ret.done = done;
698 ret.data = data;
699 return ret;
700 }
701
FfiOHOSFileListFile(const char * path,CListFileOptions options)702 RetDataCArrStringN FfiOHOSFileListFile(const char* path, CListFileOptions options)
703 {
704 LOGI("FS_TEST::FfiOHOSFileListFile start");
705 auto ret = ListFileImpl::ListFile(path, options);
706 if (ret.code != SUCCESS_CODE) {
707 ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
708 }
709 LOGI("FS_TEST::FfiOHOSFileListFile end");
710 return ret;
711 }
712
713
FfiOHOSFileFsLseek(int32_t fd,int64_t offset,int whence)714 RetDataI64 FfiOHOSFileFsLseek(int32_t fd, int64_t offset, int whence)
715 {
716 LOGI("FS_TEST::FfiOHOSFileFsLseek start");
717 auto ret = LseekImpl::Lseek(fd, offset, whence);
718 if (ret.code != SUCCESS_CODE) {
719 ret.code = OHOS::CJSystemapi::FileFs::GetErrorCode(ret.code);
720 }
721 LOGI("FS_TEST::FfiOHOSFileFsLseek success");
722 return ret;
723 }
724
FfiOHOSFileFsFdatasync(int32_t fd)725 int FfiOHOSFileFsFdatasync(int32_t fd)
726 {
727 LOGI("FS_TEST::FfiOHOSFileFsFdatasync start");
728 auto ret = FdatasyncImpl::Fdatasync(fd);
729 if (ret != SUCCESS_CODE) {
730 return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
731 }
732 LOGI("FS_TEST::FfiOHOSFileFsFdatasync success");
733 return ret;
734 }
735
FfiOHOSFileFsFsync(int32_t fd)736 int FfiOHOSFileFsFsync(int32_t fd)
737 {
738 LOGI("FS_TEST::FfiOHOSFileFsFsync start");
739 auto ret = FsyncImpl::Fsync(fd);
740 if (ret != SUCCESS_CODE) {
741 return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
742 }
743 LOGI("FS_TEST::FfiOHOSFileFsFsync success");
744 return ret;
745 }
746
FfiOHOSFileFsSymlink(const char * target,const char * srcPath)747 int FfiOHOSFileFsSymlink(const char* target, const char* srcPath)
748 {
749 LOGI("FS_TEST::FfiOHOSFileFsSymlink start");
750 auto ret = SymlinkImpl::Symlink(target, srcPath);
751 if (ret != SUCCESS_CODE) {
752 return OHOS::CJSystemapi::FileFs::GetErrorCode(ret);
753 }
754 LOGI("FS_TEST::FfiOHOSFileFsSymlink success");
755 return ret;
756 }
757
FfiOHOSFileFsReadText(char * path,int64_t offset,bool hasLen,int64_t len,char * encoding)758 RetDataCString FfiOHOSFileFsReadText(char* path, int64_t offset, bool hasLen, int64_t len, char* encoding)
759 {
760 LOGI("FS_TEST::FfiOHOSFileFsReadText start");
761 RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
762 auto [state, cString] = FileFsImpl::ReadText(path, offset, hasLen, len, encoding);
763 LOGI("FS_TEST::FfiOHOSFileFsReadText success");
764 ret.code = state;
765 ret.data = cString;
766 return ret;
767 }
768
FfiOHOSFileFsUtimes(char * path,double mtime)769 int32_t FfiOHOSFileFsUtimes(char* path, double mtime)
770 {
771 LOGI("FS_TEST::FfiOHOSFileFsUtimes start");
772 auto code = FileFsImpl::Utimes(path, mtime);
773 LOGI("FS_TEST::FfiOHOSFileFsUtimes success");
774 return code;
775 }
776
FfiOHOSFileFsCreateWatcher(char * path,uint32_t events,void (* callback)(CWatchEvent))777 RetDataI64 FfiOHOSFileFsCreateWatcher(char* path, uint32_t events, void (*callback)(CWatchEvent))
778 {
779 LOGI("FS_TEST::FfiOHOSFileFsCreateWatcher start");
780 RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
781 auto [state, nativeWatcher] = FileFsImpl::CreateWatcher(path, events, callback);
782 ret.code = state;
783 if (nativeWatcher == nullptr) {
784 LOGI("FS_TEST::FfiOHOSFileFsCreateRandomAccessFile error");
785 ret.data = 0;
786 return ret;
787 }
788 LOGI("FS_TEST::FfiOHOSFileFsCreateWatcher success");
789 ret.data = nativeWatcher->GetID();
790 return ret;
791 }
792
FfiOHOSFileFsWatcherStart(int64_t id)793 int32_t FfiOHOSFileFsWatcherStart(int64_t id)
794 {
795 LOGI("FS_TEST::FfiOHOSFileFsWatcherStart");
796 auto instance = FFIData::GetData<WatcherImpl>(id);
797 if (!instance) {
798 LOGE("FfiOHOSFileFsWatcherStart instance not exist %{public}" PRId64, id);
799 return ERR_INVALID_INSTANCE_CODE;
800 }
801 int32_t startCode = FileWatcherManager::GetInstance().StartNotify(instance->data_);
802 if (startCode != SUCCESS_CODE) {
803 return startCode;
804 }
805 FileWatcherManager::GetInstance().GetNotifyEvent(instance->data_);
806 LOGI("FfiOHOSFileFsWatcherStart success");
807 return SUCCESS_CODE;
808 }
809
FfiOHOSFileFsWatcherStop(int64_t id)810 int32_t FfiOHOSFileFsWatcherStop(int64_t id)
811 {
812 LOGI("FS_TEST::FfiOHOSFileFsWatcherStart");
813 auto instance = FFIData::GetData<WatcherImpl>(id);
814 if (!instance) {
815 LOGE("FfiOHOSFileFsWatcherStart instance not exist %{public}" PRId64, id);
816 return ERR_INVALID_INSTANCE_CODE;
817 }
818 LOGI("FS_TEST::FfiOHOSFileFsWatcherStart success");
819 return FileWatcherManager::GetInstance().StopNotify(instance->data_);
820 }
821 }
822 } // namespace FileFs
823 } // namespace CJSystemapi
824 } // namespace OHOS