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