1 /*
2  * Copyright (c) 2020 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 "nativeapi_fs.h"
17 #include <securec.h>
18 #include <new>
19 #include "ability_env.h"
20 #include "js_async_work.h"
21 #include "nativeapi_common.h"
22 #include "nativeapi_fs_impl.h"
23 
24 namespace OHOS {
25 namespace ACELite {
26 namespace {
27 char g_uriFullPath[FILE_NAME_MAX_LEN + 1] = {0};
28 const unsigned int PREFIX_LEN = strlen(FILE_PREFIX);
29 
IsValidPath(const char * path)30 bool IsValidPath(const char* path)
31 {
32     if (path == nullptr) {
33         return false;
34     }
35 
36     size_t pathLen = strnlen(path, URI_NAME_MAX_LEN + 1);
37     if (pathLen > URI_NAME_MAX_LEN) {
38         return false;
39     }
40     if ((pathLen < PREFIX_LEN) || (strncmp(path, FILE_PREFIX, PREFIX_LEN) != 0)) {
41         return false;
42     }
43     if ((strstr(path, "/./") != nullptr) || (strstr(path, "/../") != nullptr)) {
44         return false;
45     }
46     if (strpbrk(path + PREFIX_LEN, "\"*+,:;<=>\?[]|\x7F")) {
47         return false;
48     }
49     return true;
50 }
51 
GetFullPath(const char * uri,char * fullPath,int len)52 int GetFullPath(const char* uri, char* fullPath, int len)
53 {
54     if (!IsValidPath(uri) || (fullPath == nullptr)) {
55         return ERROR_CODE_PARAM;
56     }
57     const char* dataPath = GetDataPath();
58     if (dataPath == nullptr) {
59         return ERROR_CODE_PARAM;
60     }
61     if (memset_s(fullPath, len, 0x0, len) != EOK) {
62         return ERROR_CODE_GENERAL;
63     }
64     if (sprintf_s(fullPath, len, "%s%s", dataPath, uri + PREFIX_LEN) < 0) {
65         return ERROR_CODE_GENERAL;
66     }
67     return NATIVE_SUCCESS;
68 }
69 
ExecuteAsyncWork(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum,AsyncWorkHandler ExecuteFunc,bool flag=false)70 JSIValue ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args,
71     uint8_t argsNum, AsyncWorkHandler ExecuteFunc, bool flag = false)
72 {
73     JSIValue undefValue = JSI::CreateUndefined();
74     if (!NativeapiCommon::IsValidJSIValue(args, argsNum)) {
75         return undefValue;
76     }
77     FuncParams* params = new(std::nothrow) FuncParams();
78     if (params == nullptr) {
79         return undefValue;
80     }
81     params->thisVal = JSI::AcquireValue(thisVal);
82     params->args = JSI::AcquireValue(args[0]);
83     params->flag = flag;
84     JsAsyncWork::DispatchAsyncWork(ExecuteFunc, reinterpret_cast<void *>(params));
85     return undefValue;
86 }
87 
ExecuteCopyFile(void * data)88 void ExecuteCopyFile(void* data)
89 {
90     FuncParams* params = reinterpret_cast<FuncParams *>(data);
91     if (params == nullptr) {
92         return;
93     }
94     JSIValue args = params->args;
95     JSIValue thisVal = params->thisVal;
96     char* src = JSI::GetStringProperty(args, FILE_SOURCE_URI);
97     char* dest = JSI::GetStringProperty(args, FILE_DESTINATION_URI);
98     char* destFullPath = nullptr;
99     JSIValue result = JSI::CreateUndefined();
100     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
101     JSI::ReleaseString(src);
102     if (ret != NATIVE_SUCCESS) {
103         NativeapiCommon::FailCallBack(thisVal, args, ret);
104         goto EXIT;
105     }
106     destFullPath = reinterpret_cast<char *>(malloc(FILE_NAME_MAX_LEN + 1));
107     if (destFullPath == nullptr) {
108         NativeapiCommon::FailCallBack(thisVal, args, ERROR_CODE_GENERAL);
109         goto EXIT;
110     }
111     ret = GetFullPath(dest, destFullPath, FILE_NAME_MAX_LEN + 1);
112     if (ret != NATIVE_SUCCESS) {
113         NativeapiCommon::FailCallBack(thisVal, args, ret);
114         goto EXIT;
115     }
116     ret = CopyFileImpl(g_uriFullPath, destFullPath);
117     if (ret != NATIVE_SUCCESS) {
118         NativeapiCommon::FailCallBack(thisVal, args, ret);
119         goto EXIT;
120     }
121     if (params->flag) {
122         ret = DeleteFileImpl(g_uriFullPath);
123     }
124     if (ret != NATIVE_SUCCESS) {
125         NativeapiCommon::FailCallBack(thisVal, args, ret);
126         goto EXIT;
127     }
128     result = JSI::CreateString(dest);
129     NativeapiCommon::SuccessCallBack(thisVal, args, result);
130 EXIT:
131     JSI::ReleaseString(dest);
132     free(destFullPath);
133     JSI::ReleaseValueList(args, thisVal, result, ARGS_END);
134     delete params;
135 }
136 
ExecuteDeleteAccess(void * data)137 void ExecuteDeleteAccess(void* data)
138 {
139     FuncParams* params = reinterpret_cast<FuncParams *>(data);
140     if (params == nullptr) {
141         return;
142     }
143     JSIValue args = params->args;
144     JSIValue thisVal = params->thisVal;
145     char* src = JSI::GetStringProperty(args, FILE_URI);
146     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
147     JSI::ReleaseString(src);
148     if (ret != NATIVE_SUCCESS) {
149         NativeapiCommon::FailCallBack(thisVal, args, ret);
150         goto EXIT;
151     }
152     if (params->flag) {
153         ret = DeleteFileImpl(g_uriFullPath);
154     } else {
155         ret = AccessImpl(g_uriFullPath);
156     }
157     if (ret != NATIVE_SUCCESS) {
158         NativeapiCommon::FailCallBack(thisVal, args, ret);
159         goto EXIT;
160     }
161     NativeapiCommon::SuccessCallBack(thisVal, args, JSI::CreateUndefined());
162 EXIT:
163     JSI::ReleaseValueList(args, thisVal, ARGS_END);
164     delete params;
165 }
166 
GetFileListInner(const char * path,const char * key,JSIValue & result)167 int GetFileListInner(const char* path, const char* key, JSIValue& result)
168 {
169     int fileNum = GetFileNum(g_uriFullPath);
170     if (fileNum <= 0) {
171         return fileNum;
172     }
173     FileMetaInfo* fileList = reinterpret_cast<FileMetaInfo *>(malloc(fileNum * sizeof(FileMetaInfo)));
174     if (fileList == nullptr) {
175         return ERROR_CODE_GENERAL;
176     }
177     if (memset_s(fileList, fileNum * sizeof(FileMetaInfo), 0x0, fileNum * sizeof(FileMetaInfo)) != EOK) {
178         free(fileList);
179         return ERROR_CODE_GENERAL;
180     }
181     int ret = GetFileListImpl(g_uriFullPath, fileList, fileNum);
182     if (ret != NATIVE_SUCCESS) {
183         free(fileList);
184         return ret;
185     }
186     JSIValue arrayValue = JSI::CreateArray(fileNum);
187     for (int i = 0; i < fileNum; i++) {
188         JSIValue tmp = JSI::CreateObject();
189         JSI::SetStringProperty(tmp, FILE_URI, fileList[i].fileName);
190         JSI::SetNumberProperty(tmp, FILE_LENGTH, fileList[i].fileSize);
191         JSI::SetNumberProperty(tmp, FILE_LAST_MODIFIED_TIME, fileList[i].fileMtime);
192         JSI::SetStringProperty(tmp, FILE_TYPE, TYPE_FILE);
193         if (S_ISDIR(fileList[i].fileMode)) {
194             JSI::SetStringProperty(tmp, FILE_TYPE, TYPE_DIR);
195         }
196         JSI::SetPropertyByIndex(arrayValue, i, tmp);
197         JSI::ReleaseValue(tmp);
198     }
199     free(fileList);
200     JSI::SetNamedProperty(result, key, arrayValue);
201     JSI::ReleaseValue(arrayValue);
202     return NATIVE_SUCCESS;
203 }
204 
ExecuteGetFileList(void * data)205 void ExecuteGetFileList(void* data)
206 {
207     FuncParams* params = reinterpret_cast<FuncParams *>(data);
208     if (params == nullptr) {
209         return;
210     }
211     JSIValue args = params->args;
212     JSIValue thisVal = params->thisVal;
213     char* uri = JSI::GetStringProperty(args, FILE_URI);
214     JSIValue result = JSI::CreateObject();
215     int ret = GetFullPath(uri, g_uriFullPath, sizeof(g_uriFullPath));
216     JSI::ReleaseString(uri);
217     if (ret != NATIVE_SUCCESS) {
218         NativeapiCommon::FailCallBack(thisVal, args, ret);
219         goto EXIT;
220     }
221     if (params->flag) {
222         ret = GetFileListInner(g_uriFullPath, FILE_LIST, result);
223     } else {
224         ret = GetFileListInner(g_uriFullPath, SUB_FILES, result);
225     }
226     if (ret != NATIVE_SUCCESS) {
227         NativeapiCommon::FailCallBack(thisVal, args, ret);
228         goto EXIT;
229     }
230     NativeapiCommon::SuccessCallBack(thisVal, args, result);
231 EXIT:
232     JSI::ReleaseValueList(args, thisVal, result, ARGS_END);
233     delete params;
234 }
235 
ExecuteGetFileInfo(void * data)236 void ExecuteGetFileInfo(void* data)
237 {
238     FuncParams* params = reinterpret_cast<FuncParams *>(data);
239     if (params == nullptr) {
240         return;
241     }
242     JSIValue args = params->args;
243     JSIValue thisVal = params->thisVal;
244     char* src = JSI::GetStringProperty(args, FILE_URI);
245     bool recursive = JSI::GetBooleanProperty(args, RECURSIVE);
246     struct stat info = {0};
247     JSIValue result = JSI::CreateObject();
248     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
249     if (ret != NATIVE_SUCCESS) {
250         NativeapiCommon::FailCallBack(thisVal, args, ret);
251         goto EXIT;
252     }
253     ret = StatImpl(g_uriFullPath, &info);
254     if (ret != NATIVE_SUCCESS) {
255         NativeapiCommon::FailCallBack(thisVal, args, ret);
256         goto EXIT;
257     }
258     if (recursive && (S_ISDIR(info.st_mode))) {
259         JSI::ReleaseString(src);
260         ExecuteGetFileList(data);
261         return;
262     }
263     JSI::SetStringProperty(result, FILE_URI, src);
264     JSI::SetNumberProperty(result, FILE_LENGTH, info.st_size);
265     JSI::SetNumberProperty(result, FILE_LAST_MODIFIED_TIME, info.st_mtime);
266     JSI::SetStringProperty(result, FILE_TYPE, TYPE_FILE);
267     if (S_ISDIR(info.st_mode)) {
268         JSI::SetStringProperty(result, FILE_TYPE, TYPE_DIR);
269     }
270     NativeapiCommon::SuccessCallBack(thisVal, args, result);
271 EXIT:
272     JSI::ReleaseString(src);
273     JSI::ReleaseValueList(args, thisVal, result, ARGS_END);
274     delete params;
275 }
276 
ExecuteWriteTextFile(void * data)277 void ExecuteWriteTextFile(void* data)
278 {
279     FuncParams* params = reinterpret_cast<FuncParams *>(data);
280     if (params == nullptr) {
281         return;
282     }
283     JSIValue args = params->args;
284     JSIValue thisVal = params->thisVal;
285     char* src = JSI::GetStringProperty(args, FILE_URI);
286     char* text = JSI::GetStringProperty(args, TEXT);
287     bool append = JSI::GetBooleanProperty(args, FILE_APPEND);
288     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
289     JSI::ReleaseString(src);
290     if ((text == nullptr) || (ret != NATIVE_SUCCESS)) {
291         NativeapiCommon::FailCallBack(thisVal, args, ERROR_CODE_PARAM);
292         goto EXIT;
293     }
294     ret = WriteTextFile(g_uriFullPath, text, strlen(text), append);
295     if (ret != NATIVE_SUCCESS) {
296         NativeapiCommon::FailCallBack(thisVal, args, ret);
297         goto EXIT;
298     }
299     NativeapiCommon::SuccessCallBack(thisVal, args, JSI::CreateUndefined());
300 EXIT:
301     JSI::ReleaseString(text);
302     JSI::ReleaseValueList(args, thisVal, ARGS_END);
303     delete params;
304 }
305 
ReadTextInner(const char * src,int position,int length,JSIValue & result)306 int ReadTextInner(const char* src, int position, int length, JSIValue& result)
307 {
308     if ((position < 0) || (length < 0)) {
309         return ERROR_CODE_PARAM;
310     }
311     if (length == 0) {
312         length = TEXT_MAX_READ_LEN;
313     }
314     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
315     if (ret != NATIVE_SUCCESS) {
316         return ret;
317     }
318     struct stat info = {0};
319     ret = StatImpl(g_uriFullPath, &info);
320     if (ret != NATIVE_SUCCESS) {
321         return ret;
322     }
323     size_t readLen = (info.st_size > length) ? length : info.st_size;
324     if (readLen > TEXT_MAX_READ_LEN) {
325         return ERROR_CODE_READ_TOO_LONG;
326     }
327     char* text = reinterpret_cast<char *>(malloc(readLen + 1));
328     if (text == nullptr) {
329         return ERROR_CODE_GENERAL;
330     }
331     size_t actualLen = 0;
332     ret = ReadFileImpl(g_uriFullPath, text, readLen, position, &actualLen);
333     if (ret != NATIVE_SUCCESS) {
334         free(text);
335         return ret;
336     }
337     text[actualLen] = '\0';
338     JSI::SetStringProperty(result, TEXT, text);
339     free(text);
340     return NATIVE_SUCCESS;
341 }
342 
ExecuteReadTextFile(void * data)343 void ExecuteReadTextFile(void* data)
344 {
345     FuncParams* params = reinterpret_cast<FuncParams *>(data);
346     if (params == nullptr) {
347         return;
348     }
349     JSIValue args = params->args;
350     JSIValue thisVal = params->thisVal;
351     char* src = JSI::GetStringProperty(args, FILE_URI);
352     double position = JSI::GetNumberProperty(args, FILE_POSITION);
353     double length = JSI::GetNumberProperty(args, FILE_LENGTH);
354     JSIValue result = JSI::CreateObject();
355     int ret = ReadTextInner(src, static_cast<int>(position), static_cast<int>(length), result);
356     JSI::ReleaseString(src);
357     if (ret == NATIVE_SUCCESS) {
358         NativeapiCommon::SuccessCallBack(thisVal, args, result);
359     } else {
360         NativeapiCommon::FailCallBack(thisVal, args, ret);
361     }
362     JSI::ReleaseValueList(args, thisVal, result, ARGS_END);
363     delete params;
364 }
365 
ExecuteDirFunc(void * data)366 void ExecuteDirFunc(void* data)
367 {
368     FuncParams* params = reinterpret_cast<FuncParams *>(data);
369     if (params == nullptr) {
370         return;
371     }
372     JSIValue args = params->args;
373     JSIValue thisVal = params->thisVal;
374     char* src = JSI::GetStringProperty(args, FILE_URI);
375     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
376     JSI::ReleaseString(src);
377     bool recursive = JSI::GetBooleanProperty(args, RECURSIVE);
378     if (ret != NATIVE_SUCCESS) {
379         NativeapiCommon::FailCallBack(thisVal, args, ret);
380         goto EXIT;
381     }
382     if (params->flag) {
383         ret = CreateDirImpl(g_uriFullPath, recursive);
384     } else {
385         ret = RemoveDirImpl(g_uriFullPath, recursive);
386     }
387     if (ret != NATIVE_SUCCESS) {
388         NativeapiCommon::FailCallBack(thisVal, args, ret);
389         goto EXIT;
390     }
391     NativeapiCommon::SuccessCallBack(thisVal, args, JSI::CreateUndefined());
392 EXIT:
393     JSI::ReleaseValueList(args, thisVal, ARGS_END);
394     delete params;
395 }
396 #if (JS_FWK_TYPEDARRAY == NATIVE_FEATURE_ON)
ReadArrayFileInner(const char * path,size_t len,unsigned int position,JSIValue & result)397 int ReadArrayFileInner(const char* path, size_t len, unsigned int position, JSIValue& result)
398 {
399     struct stat info = {0};
400     int ret = StatImpl(path, &info);
401     if (ret != NATIVE_SUCCESS) {
402         return ret;
403     }
404     void* text = malloc(info.st_size + 1);
405     if (text == nullptr) {
406         return ERROR_CODE_GENERAL;
407     }
408     size_t actualLen = 0;
409     ret = ReadFileImpl(path, text, len, static_cast<int>(position), &actualLen);
410     if (ret != NATIVE_SUCCESS) {
411         free(text);
412         return ret;
413     }
414     uint8_t* ptr = nullptr;
415     JSIValue arrayBuffer = JSI::CreateArrayBuffer(actualLen, ptr);
416     if (ptr == nullptr) {
417         free(text);
418         JSI::ReleaseValue(arrayBuffer);
419         return ERROR_CODE_GENERAL;
420     }
421     ret = memcpy_s(ptr, actualLen, text, actualLen);
422     free(text);
423     if (ret != EOK) {
424         JSI::ReleaseValue(arrayBuffer);
425         return ERROR_CODE_GENERAL;
426     }
427     JSIValue typedArray = JSI::CreateTypedArray(TypedArrayType::JSI_UINT8_ARRAY, actualLen, arrayBuffer, 0);
428     JSI::SetNamedProperty(result, FILE_BUFFER, typedArray);
429     JSI::ReleaseValueList(typedArray, arrayBuffer, ARGS_END);
430     return NATIVE_SUCCESS;
431 }
432 
ExecuteReadArrayFile(void * data)433 void ExecuteReadArrayFile(void* data)
434 {
435     FuncParams* params = reinterpret_cast<FuncParams *>(data);
436     if (params == nullptr) {
437         return;
438     }
439     JSIValue args = params->args;
440     JSIValue thisVal = params->thisVal;
441     char* src = JSI::GetStringProperty(args, FILE_URI);
442     double position = JSI::GetNumberProperty(args, FILE_POSITION);
443     double length = JSI::GetNumberProperty(args, FILE_LENGTH);
444     JSIValue result = JSI::CreateObject();
445     int ret = ERROR_CODE_PARAM;
446     if ((position < 0) || (length < 0)) {
447         JSI::ReleaseString(src);
448         NativeapiCommon::FailCallBack(thisVal, args, ret);
449         goto EXIT;
450     }
451     ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
452     JSI::ReleaseString(src);
453     if (ret != NATIVE_SUCCESS) {
454         NativeapiCommon::FailCallBack(thisVal, args, ret);
455         goto EXIT;
456     }
457     ret = ReadArrayFileInner(g_uriFullPath, static_cast<int>(length), static_cast<int>(position), result);
458     if (ret != NATIVE_SUCCESS) {
459         NativeapiCommon::FailCallBack(thisVal, args, ret);
460         goto EXIT;
461     }
462     NativeapiCommon::SuccessCallBack(thisVal, args, result);
463 EXIT:
464     JSI::ReleaseValueList(args, thisVal, result, ARGS_END);
465     delete params;
466 }
467 
ExecuteWriteArrayFile(void * data)468 void ExecuteWriteArrayFile(void* data)
469 {
470     FuncParams* params = reinterpret_cast<FuncParams *>(data);
471     if (params == nullptr) {
472         return;
473     }
474     JSIValue args = params->args;
475     JSIValue thisVal = params->thisVal;
476     char* src = JSI::GetStringProperty(args, FILE_URI);
477     int ret = GetFullPath(src, g_uriFullPath, sizeof(g_uriFullPath));
478     JSI::ReleaseString(src);
479     if (ret != NATIVE_SUCCESS) {
480         NativeapiCommon::FailCallBack(thisVal, args, ret);
481         JSI::ReleaseValueList(args, thisVal, ARGS_END);
482         delete params;
483         return;
484     }
485     JSIValue buffer = JSI::GetNamedProperty(args, FILE_BUFFER);
486     double position = JSI::GetNumberProperty(args, FILE_POSITION);
487     bool append = JSI::GetBooleanProperty(args, FILE_APPEND);
488     TypedArrayType type = TypedArrayType::JSI_INVALID_ARRAY;
489     size_t length = 0;
490     JSIValue arrayBuffer = JSI::CreateUndefined();
491     size_t byteOffset = 0;
492     uint8_t* arrayPtr = JSI::GetTypedArrayInfo(buffer, type, length, arrayBuffer, byteOffset);
493     ret = ERROR_CODE_PARAM;
494     if ((position < 0) || (arrayPtr == nullptr) || (type != TypedArrayType::JSI_UINT8_ARRAY)) {
495         JSI::ReleaseValueList(buffer, arrayBuffer, ARGS_END);
496         NativeapiCommon::FailCallBack(thisVal, args, ERROR_CODE_PARAM);
497         goto EXIT;
498     }
499     ret = WriteArrayFile(g_uriFullPath, arrayPtr, length, static_cast<int>(position), append);
500     JSI::ReleaseValueList(buffer, arrayBuffer, ARGS_END);
501     if (ret != NATIVE_SUCCESS) {
502         NativeapiCommon::FailCallBack(thisVal, args, ret);
503         goto EXIT;
504     }
505     NativeapiCommon::SuccessCallBack(thisVal, args, JSI::CreateUndefined());
506 EXIT:
507     JSI::ReleaseValueList(args, thisVal, ARGS_END);
508     delete params;
509 }
510 #endif
511 }
512 
InitNativeApiFs(JSIValue exports)513 void InitNativeApiFs(JSIValue exports)
514 {
515     JSI::SetModuleAPI(exports, "move", NativeapiFs::MoveFile);
516     JSI::SetModuleAPI(exports, "copy", NativeapiFs::CopyFile);
517     JSI::SetModuleAPI(exports, "delete", NativeapiFs::DeleteFile);
518     JSI::SetModuleAPI(exports, "list", NativeapiFs::GetFileList);
519     JSI::SetModuleAPI(exports, "get", NativeapiFs::GetFileInfo);
520     JSI::SetModuleAPI(exports, "readText", NativeapiFs::ReadTextFile);
521     JSI::SetModuleAPI(exports, "writeText", NativeapiFs::WriteTextFile);
522     JSI::SetModuleAPI(exports, "access", NativeapiFs::Access);
523     JSI::SetModuleAPI(exports, "mkdir", NativeapiFs::CreateDir);
524     JSI::SetModuleAPI(exports, "rmdir", NativeapiFs::RemoveDir);
525 
526 #if (JS_FWK_TYPEDARRAY == NATIVE_FEATURE_ON)
527     JSI::SetModuleAPI(exports, "readArrayBuffer", NativeapiFs::ReadArrayFile);
528     JSI::SetModuleAPI(exports, "writeArrayBuffer", NativeapiFs::WriteArrayFile);
529 #endif
530 }
531 
MoveFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)532 JSIValue NativeapiFs::MoveFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
533 {
534     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteCopyFile, true);
535 }
536 
CopyFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)537 JSIValue NativeapiFs::CopyFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
538 {
539     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteCopyFile);
540 }
541 
DeleteFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)542 JSIValue NativeapiFs::DeleteFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
543 {
544     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteDeleteAccess, true);
545 }
546 
GetFileList(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)547 JSIValue NativeapiFs::GetFileList(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
548 {
549     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteGetFileList, true);
550 }
551 
GetFileInfo(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)552 JSIValue NativeapiFs::GetFileInfo(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
553 {
554     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteGetFileInfo);
555 }
556 
WriteTextFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)557 JSIValue NativeapiFs::WriteTextFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
558 {
559     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteWriteTextFile);
560 }
561 
ReadTextFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)562 JSIValue NativeapiFs::ReadTextFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
563 {
564     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteReadTextFile);
565 }
566 
Access(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)567 JSIValue NativeapiFs::Access(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
568 {
569     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteDeleteAccess);
570 }
571 
CreateDir(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)572 JSIValue NativeapiFs::CreateDir(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
573 {
574     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteDirFunc, true);
575 }
576 
RemoveDir(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)577 JSIValue NativeapiFs::RemoveDir(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
578 {
579     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteDirFunc);
580 }
581 
582 #if (JS_FWK_TYPEDARRAY == NATIVE_FEATURE_ON)
ReadArrayFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)583 JSIValue NativeapiFs::ReadArrayFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
584 {
585     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteReadArrayFile);
586 }
587 
WriteArrayFile(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)588 JSIValue NativeapiFs::WriteArrayFile(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
589 {
590     return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteWriteArrayFile);
591 }
592 #endif
593 } // ACELite
594 } // OHOS
595