• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "js_file_access_ext_ability.h"
17 
18 #include "ability_info.h"
19 #include "accesstoken_kit.h"
20 #include "extension_context.h"
21 #include "file_access_ext_stub_impl.h"
22 #include "file_access_extension_info.h"
23 #include "file_access_framework_errno.h"
24 #include "hilog_wrapper.h"
25 #include "hitrace_meter.h"
26 #include "ipc_skeleton.h"
27 #include "js_runtime.h"
28 #include "js_runtime_utils.h"
29 #include "napi/native_api.h"
30 #include "napi/native_node_api.h"
31 #include "napi_common_util.h"
32 #include "napi_common_want.h"
33 #include "napi_remote_object.h"
34 
35 namespace OHOS {
36 namespace FileAccessFwk {
37 namespace {
38     constexpr size_t ARGC_ZERO = 0;
39     constexpr size_t ARGC_ONE = 1;
40     constexpr size_t ARGC_TWO = 2;
41     constexpr size_t ARGC_THREE = 3;
42     constexpr size_t ARGC_FOUR = 4;
43     constexpr size_t MAX_ARG_COUNT = 5;
44 }
45 
46 using namespace OHOS::AppExecFwk;
47 using namespace OHOS::AbilityRuntime;
48 using OHOS::Security::AccessToken::AccessTokenKit;
49 
Create(const std::unique_ptr<Runtime> & runtime)50 JsFileAccessExtAbility* JsFileAccessExtAbility::Create(const std::unique_ptr<Runtime> &runtime)
51 {
52     return new JsFileAccessExtAbility(static_cast<JsRuntime&>(*runtime));
53 }
54 
JsFileAccessExtAbility(JsRuntime & jsRuntime)55 JsFileAccessExtAbility::JsFileAccessExtAbility(JsRuntime &jsRuntime) : jsRuntime_(jsRuntime) {}
56 
~JsFileAccessExtAbility()57 JsFileAccessExtAbility::~JsFileAccessExtAbility()
58 {
59     jsRuntime_.FreeNativeReference(std::move(jsObj_));
60 }
61 
Init(const std::shared_ptr<AbilityLocalRecord> & record,const std::shared_ptr<OHOSApplication> & application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)62 void JsFileAccessExtAbility::Init(const std::shared_ptr<AbilityLocalRecord> &record,
63     const std::shared_ptr<OHOSApplication> &application, std::shared_ptr<AbilityHandler> &handler,
64     const sptr<IRemoteObject> &token)
65 {
66     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Init");
67     FileAccessExtAbility::Init(record, application, handler, token);
68     std::string srcPath = "";
69     GetSrcPath(srcPath);
70     if (srcPath.empty()) {
71         HILOG_ERROR("Failed to get srcPath");
72         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
73         return;
74     }
75 
76     std::string moduleName(Extension::abilityInfo_->moduleName);
77     moduleName.append("::").append(abilityInfo_->name);
78     HandleScope handleScope(jsRuntime_);
79 
80     jsObj_ = jsRuntime_.LoadModule(moduleName, srcPath, abilityInfo_->hapPath);
81     if (jsObj_ == nullptr) {
82         HILOG_ERROR("Failed to get jsObj_");
83         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
84         return;
85     }
86 
87     NativeObject* obj = ConvertNativeValueTo<NativeObject>(jsObj_->Get());
88     if (obj == nullptr) {
89         HILOG_ERROR("Failed to get JsFileAccessExtAbility object");
90         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
91         return;
92     }
93 
94     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
95 }
96 
FuncCallback(NativeEngine * engine,NativeCallbackInfo * info)97 NativeValue* JsFileAccessExtAbility::FuncCallback(NativeEngine* engine, NativeCallbackInfo* info)
98 {
99     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "FuncCallback");
100     if (engine == nullptr) {
101         HILOG_ERROR("NativeEngine pointer is null.");
102         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
103         return nullptr;
104     }
105 
106     if (info == nullptr) {
107         HILOG_ERROR("invalid param.");
108         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
109         return engine->CreateUndefined();
110     }
111 
112     if (info->argc != ARGC_THREE) {
113         HILOG_ERROR("invalid args.");
114         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
115         return engine->CreateUndefined();
116     }
117 
118     int32_t deviceType = UnwrapInt32FromJS(reinterpret_cast<napi_env>(engine),
119         reinterpret_cast<napi_value>(info->argv[ARGC_ZERO]));
120     int32_t notifyType = UnwrapInt32FromJS(reinterpret_cast<napi_env>(engine),
121         reinterpret_cast<napi_value>(info->argv[ARGC_ONE]));
122     std::string uri = UnwrapStringFromJS(reinterpret_cast<napi_env>(engine),
123         reinterpret_cast<napi_value>(info->argv[ARGC_TWO]));
124 
125     if (info->functionInfo == nullptr || info->functionInfo->data == nullptr) {
126         HILOG_ERROR("invalid object.");
127         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
128         return engine->CreateUndefined();
129     }
130 
131     JsFileAccessExtAbility* jsExtension = static_cast<JsFileAccessExtAbility*>(info->functionInfo->data);
132     if (jsExtension == nullptr) {
133         HILOG_ERROR("invalid JsFileAccessExtAbility.");
134         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
135         return engine->CreateUndefined();
136     }
137 
138     NotifyMessage message(deviceType, notifyType, "", uri);
139     auto ret = jsExtension->Notify(message);
140     if (ret != ERR_OK) {
141         HILOG_ERROR("JsFileAccessExtAbility notify error, ret:%{public}d", ret);
142     }
143     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
144     return engine->CreateUndefined();
145 }
146 
OnStart(const AAFwk::Want & want)147 void JsFileAccessExtAbility::OnStart(const AAFwk::Want &want)
148 {
149     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OnStart");
150     Extension::OnStart(want);
151     HandleScope handleScope(jsRuntime_);
152     napi_env env = reinterpret_cast<napi_env>(&jsRuntime_.GetNativeEngine());
153     napi_value napiWant = OHOS::AppExecFwk::WrapWant(env, want);
154     NativeValue* nativeWant = reinterpret_cast<NativeValue*>(napiWant);
155     NativeValue* argv[] = {nativeWant};
156     CallObjectMethod("onCreate", argv, ARGC_ONE);
157 
158     const std::string funcName = "FuncCallback";
159     auto& nativeEngine = jsRuntime_.GetNativeEngine();
160     NativeValue* func = nativeEngine.CreateFunction(funcName.c_str(), funcName.length(),
161         JsFileAccessExtAbility::FuncCallback, this);
162     NativeValue* argvCallback[] = {func};
163     CallObjectMethod("registerCallback", argvCallback, ARGC_ONE);
164     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
165 }
166 
OnConnect(const AAFwk::Want & want)167 sptr<IRemoteObject> JsFileAccessExtAbility::OnConnect(const AAFwk::Want &want)
168 {
169     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OnConnect");
170     Extension::OnConnect(want);
171     sptr<FileAccessExtStubImpl> remoteObject = new (std::nothrow) FileAccessExtStubImpl(
172         std::static_pointer_cast<JsFileAccessExtAbility>(shared_from_this()),
173         reinterpret_cast<napi_env>(&jsRuntime_.GetNativeEngine()));
174     if (remoteObject == nullptr) {
175         HILOG_ERROR("No memory allocated for FileExtStubImpl");
176         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
177         return nullptr;
178     }
179 
180     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
181     return remoteObject->AsObject();
182 }
183 
CallObjectMethod(const char * name,NativeValue * const * argv,size_t argc)184 NativeValue* JsFileAccessExtAbility::CallObjectMethod(const char* name, NativeValue* const* argv, size_t argc)
185 {
186     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CallObjectMethod");
187     if (!jsObj_) {
188         HILOG_ERROR("JsFileAccessExtAbility::CallObjectMethod jsObj Not found FileAccessExtAbility.js");
189         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
190         return nullptr;
191     }
192 
193     HandleEscape handleEscape(jsRuntime_);
194     auto& nativeEngine = jsRuntime_.GetNativeEngine();
195 
196     NativeValue* value = jsObj_->Get();
197     if (value == nullptr) {
198         HILOG_ERROR("Failed to get FileAccessExtAbility value");
199         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
200         return nullptr;
201     }
202 
203     NativeObject* obj = ConvertNativeValueTo<NativeObject>(value);
204     if (obj == nullptr) {
205         HILOG_ERROR("Failed to get FileAccessExtAbility object");
206         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
207         return nullptr;
208     }
209 
210     NativeValue* method = obj->GetProperty(name);
211     if (method == nullptr) {
212         HILOG_ERROR("Failed to get '%{public}s' from FileAccessExtAbility object", name);
213         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
214         return nullptr;
215     }
216 
217     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
218     return handleEscape.Escape(nativeEngine.CallFunction(value, method, argv, argc));
219 }
220 
DoCallJsMethod(CallJsParam * param)221 static int DoCallJsMethod(CallJsParam *param)
222 {
223     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "DoCallJsMethod");
224     JsRuntime *jsRuntime = param->jsRuntime;
225     if (jsRuntime == nullptr) {
226         HILOG_ERROR("failed to get jsRuntime.");
227         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
228         return EINVAL;
229     }
230     HandleEscape handleEscape(*jsRuntime);
231     auto& nativeEngine = jsRuntime->GetNativeEngine();
232     size_t argc = 0;
233     NativeValue *argv[MAX_ARG_COUNT] = { nullptr };
234     if (param->argParser != nullptr) {
235         if (!param->argParser(nativeEngine, argv, argc)) {
236             HILOG_ERROR("failed to get params.");
237             FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
238             return EINVAL;
239         }
240     }
241     NativeValue *value = param->jsObj->Get();
242     if (value == nullptr) {
243         HILOG_ERROR("failed to get native value object.");
244         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
245         return EINVAL;
246     }
247     NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
248     if (obj == nullptr) {
249         HILOG_ERROR("failed to get FileExtAbility object.");
250         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
251         return EINVAL;
252     }
253     NativeValue *method = obj->GetProperty(param->funcName.c_str());
254     if (method == nullptr) {
255         HILOG_ERROR("failed to get %{public}s from FileExtAbility object.", param->funcName.c_str());
256         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
257         return EINVAL;
258     }
259     if (param->retParser == nullptr) {
260         HILOG_ERROR("ResultValueParser must not null.");
261         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
262         return EINVAL;
263     }
264     if (!param->retParser(nativeEngine, handleEscape.Escape(nativeEngine.CallFunction(value, method, argv, argc)))) {
265         HILOG_INFO("Parser js result fail.");
266         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
267         return E_GETRESULT;
268     }
269     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
270     return ERR_OK;
271 }
272 
CallJsMethod(const std::string & funcName,JsRuntime & jsRuntime,NativeReference * jsObj,InputArgsParser argParser,ResultValueParser retParser)273 int JsFileAccessExtAbility::CallJsMethod(const std::string &funcName, JsRuntime &jsRuntime, NativeReference *jsObj,
274     InputArgsParser argParser, ResultValueParser retParser)
275 {
276     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CallJsMethod");
277     uv_loop_s *loop = nullptr;
278     napi_status status = napi_get_uv_event_loop(reinterpret_cast<napi_env>(&jsRuntime.GetNativeEngine()), &loop);
279     if (status != napi_ok) {
280         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
281         HILOG_ERROR("failed to get uv event loop.");
282         return EINVAL;
283     }
284     auto param = std::make_shared<CallJsParam>(funcName, &jsRuntime, jsObj, argParser, retParser);
285     if (param == nullptr) {
286         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
287         HILOG_ERROR("failed to new param.");
288         return EINVAL;
289     }
290     auto work = std::make_shared<uv_work_t>();
291     if (work == nullptr) {
292         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
293         HILOG_ERROR("failed to new uv_work_t.");
294         return EINVAL;
295     }
296     work->data = reinterpret_cast<void *>(param.get());
297     int ret = uv_queue_work(loop, work.get(), [](uv_work_t *work) {}, [](uv_work_t *work, int status) {
298         CallJsParam *param = reinterpret_cast<CallJsParam *>(work->data);
299         do {
300             if (param == nullptr) {
301                 HILOG_ERROR("failed to get CallJsParam.");
302                 break;
303             }
304             if (DoCallJsMethod(param) != ERR_OK) {
305                 HILOG_ERROR("failed to call DoCallJsMethod.");
306             }
307         } while (false);
308         std::unique_lock<std::mutex> lock(param->fileOperateMutex);
309         param->isReady = true;
310         param->fileOperateCondition.notify_one();
311     });
312     if (ret != 0) {
313         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
314         HILOG_ERROR("failed to exec uv_queue_work.");
315         return EINVAL;
316     }
317     std::unique_lock<std::mutex> lock(param->fileOperateMutex);
318     param->fileOperateCondition.wait(lock, [param]() { return param->isReady; });
319     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
320     return ERR_OK;
321 }
322 
GetSrcPath(std::string & srcPath)323 void JsFileAccessExtAbility::GetSrcPath(std::string &srcPath)
324 {
325     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetSrcPath");
326     if (!Extension::abilityInfo_->isStageBasedModel) {
327         /* temporary compatibility api8 + config.json */
328         srcPath.append(Extension::abilityInfo_->package);
329         srcPath.append("/assets/js/");
330         if (!Extension::abilityInfo_->srcPath.empty()) {
331             srcPath.append(Extension::abilityInfo_->srcPath);
332         }
333         srcPath.append("/").append(Extension::abilityInfo_->name).append(".abc");
334         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
335         return;
336     }
337 
338     if (!Extension::abilityInfo_->srcEntrance.empty()) {
339         srcPath.append(Extension::abilityInfo_->moduleName + "/");
340         srcPath.append(Extension::abilityInfo_->srcEntrance);
341         srcPath.erase(srcPath.rfind('.'));
342         srcPath.append(".abc");
343     }
344 
345     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
346 }
347 
348 template <typename T>
349 struct Value {
350     T data;
351     int code {ERR_OK};
352 };
353 
OpenFile(const Uri & uri,int flags,int & fd)354 int JsFileAccessExtAbility::OpenFile(const Uri &uri, int flags, int &fd)
355 {
356     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile");
357     auto value = std::make_shared<Value<int>>();
358     if (value == nullptr) {
359         HILOG_ERROR("OpenFile value is nullptr.");
360         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
361         return E_GETRESULT;
362     }
363 
364     auto argParser = [uri, flags](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
365         NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length());
366         NativeValue *nativeFlags = engine.CreateNumber((int32_t)flags);
367         if (nativeUri == nullptr || nativeFlags == nullptr) {
368             HILOG_ERROR("create uri or flags native js value fail.");
369             return false;
370         }
371         argv[ARGC_ZERO] = nativeUri;
372         argv[ARGC_ONE] = nativeFlags;
373         argc = ARGC_TWO;
374         return true;
375     };
376     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
377         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
378         if (obj == nullptr) {
379             HILOG_ERROR("Convert js object fail.");
380             return false;
381         }
382 
383         bool ret = ConvertFromJsValue(engine, obj->GetProperty("fd"), value->data);
384         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
385         if (!ret) {
386             HILOG_ERROR("Convert js value fail.");
387         }
388         return ret;
389     };
390 
391     auto errCode = CallJsMethod("openFile", jsRuntime_, jsObj_.get(), argParser, retParser);
392     if (errCode != ERR_OK) {
393         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
394         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
395         return errCode;
396     }
397 
398     if (value->code != ERR_OK) {
399         HILOG_ERROR("fileio fail.");
400         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
401         return value->code;
402     }
403 
404     fd = value->data;
405     if (fd < ERR_OK) {
406         HILOG_ERROR("Failed to get file descriptor fd: %{public}d", fd);
407         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
408         return E_GETRESULT;
409     }
410     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
411     return ERR_OK;
412 }
413 
CreateFile(const Uri & parent,const std::string & displayName,Uri & newFile)414 int JsFileAccessExtAbility::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile)
415 {
416     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CreateFile");
417     auto value = std::make_shared<Value<std::string>>();
418     if (value == nullptr) {
419         HILOG_ERROR("CreateFile value is nullptr.");
420         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
421         return E_GETRESULT;
422     }
423 
424     auto argParser = [parent, displayName](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
425         NativeValue *nativeParent = engine.CreateString(parent.ToString().c_str(), parent.ToString().length());
426         NativeValue *nativeDisplayName = engine.CreateString(displayName.c_str(), displayName.length());
427         if (nativeParent == nullptr || nativeDisplayName == nullptr) {
428             HILOG_ERROR("create parent uri or displayName native js value fail.");
429             return false;
430         }
431         argv[ARGC_ZERO] = nativeParent;
432         argv[ARGC_ONE] = nativeDisplayName;
433         argc = ARGC_TWO;
434         return true;
435     };
436     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
437         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
438         if (obj == nullptr) {
439             HILOG_ERROR("Convert js object fail.");
440             return false;
441         }
442 
443         bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data);
444         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
445         if (!ret) {
446             HILOG_ERROR("Convert js value fail.");
447         }
448         return ret;
449     };
450 
451     auto errCode = CallJsMethod("createFile", jsRuntime_, jsObj_.get(), argParser, retParser);
452     if (errCode != ERR_OK) {
453         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
454         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
455         return errCode;
456     }
457 
458     if (value->code != ERR_OK) {
459         HILOG_ERROR("fileio fail.");
460         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
461         return value->code;
462     }
463 
464     if ((value->data).empty()) {
465         HILOG_ERROR("call CreateFile with return empty.");
466         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
467         return E_GETRESULT;
468     }
469 
470     newFile = Uri(value->data);
471     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
472     return ERR_OK;
473 }
474 
Mkdir(const Uri & parent,const std::string & displayName,Uri & newFile)475 int JsFileAccessExtAbility::Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile)
476 {
477     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Mkdir");
478     auto value = std::make_shared<Value<std::string>>();
479     if (value == nullptr) {
480         HILOG_ERROR("Mkdir value is nullptr.");
481         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
482         return E_GETRESULT;
483     }
484 
485     auto argParser = [parent, displayName](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
486         NativeValue *nativeParent = engine.CreateString(parent.ToString().c_str(), parent.ToString().length());
487         NativeValue *nativeDisplayName = engine.CreateString(displayName.c_str(), displayName.length());
488         if (nativeParent == nullptr || nativeDisplayName == nullptr) {
489             HILOG_ERROR("create parent uri native js value fail.");
490             return false;
491         }
492         argv[ARGC_ZERO] = nativeParent;
493         argv[ARGC_ONE] = nativeDisplayName;
494         argc = ARGC_TWO;
495         return true;
496     };
497     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
498         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
499         if (obj == nullptr) {
500             HILOG_ERROR("Convert js object fail.");
501             return false;
502         }
503 
504         bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data);
505         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
506         if (!ret) {
507             HILOG_ERROR("Convert js value fail.");
508         }
509 
510         return ret;
511     };
512 
513     auto errCode = CallJsMethod("mkdir", jsRuntime_, jsObj_.get(), argParser, retParser);
514     if (errCode != ERR_OK) {
515         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
516         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
517         return errCode;
518     }
519 
520     if (value->code != ERR_OK) {
521         HILOG_ERROR("fileio fail.");
522         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
523         return value->code;
524     }
525 
526     if ((value->data).empty()) {
527         HILOG_ERROR("call Mkdir with return empty.");
528         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
529         return E_GETRESULT;
530     }
531     newFile = Uri(value->data);
532     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
533     return ERR_OK;
534 }
535 
Delete(const Uri & sourceFile)536 int JsFileAccessExtAbility::Delete(const Uri &sourceFile)
537 {
538     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Delete");
539     auto ret = std::make_shared<int>();
540     if (ret == nullptr) {
541         HILOG_ERROR("Delete value is nullptr.");
542         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
543         return E_GETRESULT;
544     }
545 
546     auto argParser = [uri = sourceFile](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
547         NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length());
548         if (nativeUri == nullptr) {
549             HILOG_ERROR("create sourceFile uri native js value fail.");
550             return false;
551         }
552         argv[ARGC_ZERO] = nativeUri;
553         argc = ARGC_ONE;
554         return true;
555     };
556     auto retParser = [ret](NativeEngine &engine, NativeValue *result) -> bool {
557         bool res = ConvertFromJsValue(engine, result, *ret);
558         if (!res) {
559             HILOG_ERROR("Convert js value fail.");
560         }
561         return res;
562     };
563 
564     auto errCode = CallJsMethod("delete", jsRuntime_, jsObj_.get(), argParser, retParser);
565     if (errCode != ERR_OK) {
566         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
567         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
568         return errCode;
569     }
570 
571     if (*ret != ERR_OK) {
572         HILOG_ERROR("fileio fail.");
573         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
574         return *ret;
575     }
576 
577     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
578     return ERR_OK;
579 }
580 
Move(const Uri & sourceFile,const Uri & targetParent,Uri & newFile)581 int JsFileAccessExtAbility::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile)
582 {
583     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Move");
584     auto value = std::make_shared<Value<std::string>>();
585     if (value == nullptr) {
586         HILOG_ERROR("Move value is nullptr.");
587         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
588         return E_GETRESULT;
589     }
590 
591     auto argParser = [sourceFile, targetParent](NativeEngine &engine, NativeValue* argv[], size_t &argc) -> bool {
592         NativeValue *srcUri = engine.CreateString(sourceFile.ToString().c_str(),
593             sourceFile.ToString().length());
594         NativeValue *dstUri = engine.CreateString(targetParent.ToString().c_str(), targetParent.ToString().length());
595         if (srcUri == nullptr || dstUri == nullptr) {
596             HILOG_ERROR("create sourceFile uri native js value fail.");
597             return false;
598         }
599         argv[ARGC_ZERO] = srcUri;
600         argv[ARGC_ONE] = dstUri;
601         argc = ARGC_TWO;
602         return true;
603     };
604     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
605         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
606         if (obj == nullptr) {
607             HILOG_ERROR("Convert js object fail.");
608             return false;
609         }
610 
611         bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data);
612         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
613         if (!ret) {
614             HILOG_ERROR("Convert js value fail.");
615         }
616         return ret;
617     };
618 
619     auto errCode = CallJsMethod("move", jsRuntime_, jsObj_.get(), argParser, retParser);
620     if (errCode != ERR_OK) {
621         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
622         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
623         return errCode;
624     }
625 
626     if (value->code != ERR_OK) {
627         HILOG_ERROR("fileio fail.");
628         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
629         return value->code;
630     }
631 
632     if ((value->data).empty()) {
633         HILOG_ERROR("call move with return empty.");
634         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
635         return E_GETRESULT;
636     }
637     newFile = Uri(value->data);
638     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
639     return ERR_OK;
640 }
641 
Rename(const Uri & sourceFile,const std::string & displayName,Uri & newFile)642 int JsFileAccessExtAbility::Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile)
643 {
644     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Rename");
645     auto value = std::make_shared<Value<std::string>>();
646     if (value == nullptr) {
647         HILOG_ERROR("Rename value is nullptr.");
648         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
649         return E_GETRESULT;
650     }
651     auto argParser = [sourceFile, displayName](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
652         NativeValue *nativeSourceFile = engine.CreateString(sourceFile.ToString().c_str(),
653             sourceFile.ToString().length());
654         NativeValue *nativeDisplayName = engine.CreateString(displayName.c_str(), displayName.length());
655         if (nativeSourceFile == nullptr || nativeDisplayName == nullptr) {
656             HILOG_ERROR("create sourceFile uri or displayName native js value fail.");
657             return false;
658         }
659         argv[ARGC_ZERO] = nativeSourceFile;
660         argv[ARGC_ONE] = nativeDisplayName;
661         argc = ARGC_TWO;
662         return true;
663     };
664     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
665         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
666         if (obj == nullptr) {
667             HILOG_ERROR("Convert js object fail.");
668             return false;
669         }
670 
671         bool ret = ConvertFromJsValue(engine, obj->GetProperty("uri"), value->data);
672         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
673         if (!ret) {
674             HILOG_ERROR("Convert js value fail.");
675         }
676         return ret;
677     };
678 
679     auto errCode = CallJsMethod("rename", jsRuntime_, jsObj_.get(), argParser, retParser);
680     if (errCode != ERR_OK) {
681         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
682         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
683         return errCode;
684     }
685 
686     if (value->code != ERR_OK) {
687         HILOG_ERROR("fileio fail.");
688         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
689         return value->code;
690     }
691 
692     if ((value->data).empty()) {
693         HILOG_ERROR("call Rename with return empty.");
694         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
695         return E_GETRESULT;
696     }
697     newFile = Uri(value->data);
698     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
699     return ERR_OK;
700 }
701 
702 
ParserListFileJsResult(NativeEngine & engine,NativeValue * nativeValue,Value<std::vector<FileInfo>> & result)703 static bool ParserListFileJsResult(NativeEngine &engine, NativeValue *nativeValue, Value<std::vector<FileInfo>> &result)
704 {
705     NativeObject *obj = ConvertNativeValueTo<NativeObject>(nativeValue);
706     if (obj == nullptr) {
707         HILOG_ERROR("Convert js object fail.");
708         return false;
709     }
710 
711     bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), result.code);
712     NativeArray *nativeArray = ConvertNativeValueTo<NativeArray>(obj->GetProperty("infos"));
713     if (nativeArray == nullptr) {
714         HILOG_ERROR("Convert js array object fail.");
715         return false;
716     }
717 
718     for (uint32_t i = 0; i < nativeArray->GetLength(); i++) {
719         NativeValue *nativeFileInfo = nativeArray->GetElement(i);
720         if (nativeFileInfo == nullptr) {
721             HILOG_ERROR("get native FileInfo fail.");
722             return false;
723         }
724 
725         obj = ConvertNativeValueTo<NativeObject>(nativeFileInfo);
726         if (obj == nullptr) {
727             HILOG_ERROR("Convert js object fail.");
728             return false;
729         }
730 
731         FileInfo fileInfo;
732         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), fileInfo.uri);
733         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("fileName"), fileInfo.fileName);
734         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mode"), fileInfo.mode);
735         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("size"), fileInfo.size);
736         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mtime"), fileInfo.mtime);
737         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mimeType"), fileInfo.mimeType);
738         if (!ret) {
739             HILOG_ERROR("Convert js value fail.");
740             return ret;
741         }
742 
743         result.data.emplace_back(std::move(fileInfo));
744     }
745     return true;
746 }
747 
MakeStringNativeArray(NativeEngine & engine,std::vector<std::string> & inputArray,NativeValue * resultArray)748 static int MakeStringNativeArray(NativeEngine &engine, std::vector<std::string> &inputArray, NativeValue *resultArray)
749 {
750     NativeArray *nativeArray = ConvertNativeValueTo<NativeArray>(resultArray);
751     if (nativeArray == nullptr) {
752         HILOG_ERROR("Create NativeArray nullptr");
753         return E_GETRESULT;
754     }
755 
756     bool ret = false;
757     for (uint32_t i = 0; i < nativeArray->GetLength(); i++) {
758         NativeValue* nativeValue = engine.CreateString(inputArray[i].c_str(), inputArray[i].length());
759         if (nativeValue == nullptr) {
760             HILOG_ERROR("Create NativeValue fail.");
761             return E_GETRESULT;
762         }
763 
764         ret = nativeArray->SetElement(i, nativeValue);
765         if (!ret) {
766             HILOG_ERROR("Add NativeValue to NativeArray fail.");
767             return E_IPCS;
768         }
769     }
770 
771     return ERR_OK;
772 }
773 
MakeJsNativeFileFilter(NativeEngine & engine,const FileFilter & filter,NativeValue * nativeFilter)774 static int MakeJsNativeFileFilter(NativeEngine &engine, const FileFilter &filter, NativeValue *nativeFilter)
775 {
776     nativeFilter = engine.CreateObject();
777     if (nativeFilter == nullptr) {
778         HILOG_ERROR("Create js NativeValue fail.");
779         return E_GETRESULT;
780     }
781 
782     NativeValue *suffixArray = engine.CreateArray(filter.GetSuffix().size());
783     if (suffixArray == nullptr) {
784         HILOG_ERROR("Create Suffix native array value fail.");
785         return E_GETRESULT;
786     }
787 
788     std::vector<std::string> suffixVec = filter.GetSuffix();
789     int errorCode = MakeStringNativeArray(engine, suffixVec, suffixArray);
790     if (errorCode != ERR_OK) {
791         HILOG_ERROR("Create Suffix native array value fail, code:%{public}d.", errorCode);
792         return errorCode;
793     }
794 
795     NativeValue *displayNameArray = engine.CreateArray(filter.GetDisplayName().size());
796     if (displayNameArray == nullptr) {
797         HILOG_ERROR("Create DisplayName native array value fail.");
798         return E_GETRESULT;
799     }
800 
801     std::vector<std::string> displayNameVec = filter.GetDisplayName();
802     errorCode = MakeStringNativeArray(engine, displayNameVec, displayNameArray);
803     if (errorCode != ERR_OK) {
804         HILOG_ERROR("Create DisplayName native array value fail, code:%{public}d.", errorCode);
805         return errorCode;
806     }
807 
808     NativeValue *mimeTypeArray = engine.CreateArray(filter.GetMimeType().size());
809     if (mimeTypeArray == nullptr) {
810         HILOG_ERROR("Create MimeType native array value fail.");
811         return E_GETRESULT;
812     }
813 
814     std::vector<std::string> mimeTypeVec = filter.GetMimeType();
815     errorCode = MakeStringNativeArray(engine, mimeTypeVec, mimeTypeArray);
816     if (errorCode != ERR_OK) {
817         HILOG_ERROR("Create MimeType native array value fail, code:%{public}d.", errorCode);
818         return errorCode;
819     }
820 
821     NativeValue *nativeFileSizeOver = engine.CreateNumber(filter.GetFileSizeOver());
822     if (nativeFileSizeOver == nullptr) {
823         HILOG_ERROR("Create NativeFileSizeOver native js value fail.");
824         return E_GETRESULT;
825     }
826 
827     NativeValue *nativeLastModifiedAfter = engine.CreateNumber(filter.GetLastModifiedAfter());
828     if (nativeLastModifiedAfter == nullptr) {
829         HILOG_ERROR("Create NativeLastModifiedAfter native js value fail.");
830         return E_GETRESULT;
831     }
832 
833     NativeValue *nativeExcludeMedia = engine.CreateBoolean(filter.GetExcludeMedia());
834     if (nativeExcludeMedia == nullptr) {
835         HILOG_ERROR("Create NativeExcludeMedia native js value fail.");
836         return E_GETRESULT;
837     }
838 
839     NativeObject *objFilter = ConvertNativeValueTo<NativeObject>(nativeFilter);
840     if (objFilter == nullptr) {
841         HILOG_ERROR("Convert js object fail.");
842         return E_GETRESULT;
843     }
844 
845     bool ret = objFilter->SetProperty("suffix", suffixArray);
846     ret = ret && objFilter->SetProperty("displayName", displayNameArray);
847     ret = ret && objFilter->SetProperty("mimeType", mimeTypeArray);
848     ret = ret && objFilter->SetProperty("fileSizeOver", nativeFileSizeOver);
849     ret = ret && objFilter->SetProperty("lastModifiedAfter", nativeLastModifiedAfter);
850     ret = ret && objFilter->SetProperty("excludeMedia", nativeExcludeMedia);
851     if (!ret) {
852         HILOG_ERROR("Set property to Filter NativeValue fail.");
853         return EINVAL;
854     }
855 
856     return ERR_OK;
857 }
858 
ListFile(const FileInfo & fileInfo,const int64_t offset,const int64_t maxCount,const FileFilter & filter,std::vector<FileInfo> & fileInfoVec)859 int JsFileAccessExtAbility::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
860     const FileFilter &filter, std::vector<FileInfo> &fileInfoVec)
861 {
862     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile");
863     auto value = std::make_shared<Value<std::vector<FileInfo>>>();
864     if (value == nullptr) {
865         HILOG_ERROR("ListFile value is nullptr.");
866         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
867         return E_GETRESULT;
868     }
869 
870     auto argParser =
871         [fileInfo, offset, maxCount, filter](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
872         NativeValue *uri = engine.CreateString(fileInfo.uri.c_str(), fileInfo.uri.length());
873         if (uri == nullptr) {
874             HILOG_ERROR("create sourceFile uri native js value fail.");
875             return false;
876         }
877 
878         NativeValue *nativeOffset = engine.CreateNumber(offset);
879         if (nativeOffset == nullptr) {
880             HILOG_ERROR("create nativeMaxNum native js value fail.");
881             return false;
882         }
883 
884         NativeValue *nativeMaxCount = engine.CreateNumber(maxCount);
885         if (nativeMaxCount == nullptr) {
886             HILOG_ERROR("create nativeMaxNum native js value fail.");
887             return false;
888         }
889 
890         NativeValue* nativeFilter = nullptr;
891         if (filter.GetHasFilter()) {
892             int ret = MakeJsNativeFileFilter(engine, filter, nativeFilter);
893             if (ret != ERR_OK) {
894                 HILOG_ERROR("Create js NativeValue fail.");
895                 return ret;
896             }
897         } else {
898             nativeFilter = engine.CreateNull();
899             if (nativeFilter == nullptr) {
900                 HILOG_ERROR("Create js NativeValue fail.");
901                 return E_GETRESULT;
902             }
903         }
904 
905         argv[ARGC_ZERO] = uri;
906         argv[ARGC_ONE] = nativeOffset;
907         argv[ARGC_TWO] = nativeMaxCount;
908         argv[ARGC_THREE] = nativeFilter;
909         argc = ARGC_FOUR;
910         return true;
911     };
912     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
913         Value<std::vector<FileInfo>> fileInfo;
914         bool ret = ParserListFileJsResult(engine, result, fileInfo);
915         if (!ret) {
916             HILOG_ERROR("Parser js value fail.");
917             return ret;
918         }
919 
920         *value = std::move(fileInfo);
921         return true;
922     };
923 
924     auto errCode = CallJsMethod("listFile", jsRuntime_, jsObj_.get(), argParser, retParser);
925     if (errCode != ERR_OK) {
926         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
927         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
928         return errCode;
929     }
930 
931     if (value->code != ERR_OK) {
932         HILOG_ERROR("fileio fail.");
933         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
934         return value->code;
935     }
936 
937     fileInfoVec = std::move(value->data);
938     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
939     return ERR_OK;
940 }
941 
ParserGetRootsJsResult(NativeEngine & engine,NativeValue * nativeValue,Value<std::vector<RootInfo>> & result)942 static bool ParserGetRootsJsResult(NativeEngine &engine, NativeValue *nativeValue, Value<std::vector<RootInfo>> &result)
943 {
944     NativeObject *obj = ConvertNativeValueTo<NativeObject>(nativeValue);
945     if (obj == nullptr) {
946         HILOG_ERROR("Convert js object fail.");
947         return false;
948     }
949 
950     bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), result.code);
951     NativeArray *nativeArray = ConvertNativeValueTo<NativeArray>(obj->GetProperty("roots"));
952     if (nativeArray == nullptr) {
953         HILOG_ERROR("nativeArray is nullptr");
954         return false;
955     }
956 
957     for (uint32_t i = 0; i < nativeArray->GetLength(); i++) {
958         NativeValue *nativeRootInfo = nativeArray->GetElement(i);
959         if (nativeRootInfo == nullptr) {
960             HILOG_ERROR("get native FileInfo fail.");
961             return false;
962         }
963 
964         obj = ConvertNativeValueTo<NativeObject>(nativeRootInfo);
965         if (obj == nullptr) {
966             HILOG_ERROR("Convert js object fail.");
967             return false;
968         }
969 
970         RootInfo rootInfo;
971         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("deviceType"), rootInfo.deviceType);
972         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), rootInfo.uri);
973         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("displayName"), rootInfo.displayName);
974         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("deviceFlags"), rootInfo.deviceFlags);
975         if (!ret) {
976             HILOG_ERROR("Convert js value fail.");
977             return ret;
978         }
979 
980         result.data.emplace_back(std::move(rootInfo));
981     }
982 
983     return true;
984 }
985 
GetRoots(std::vector<RootInfo> & rootInfoVec)986 int JsFileAccessExtAbility::GetRoots(std::vector<RootInfo> &rootInfoVec)
987 {
988     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots");
989     auto value = std::make_shared<Value<std::vector<RootInfo>>>();
990     if (value == nullptr) {
991         HILOG_ERROR("GetRoots value is nullptr.");
992         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
993         return E_GETRESULT;
994     }
995 
996     auto argParser = [](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
997         argc = ARGC_ZERO;
998         return true;
999     };
1000     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
1001         Value<std::vector<RootInfo>> rootInfoVec;
1002         bool ret = ParserGetRootsJsResult(engine, result, rootInfoVec);
1003         if (!ret) {
1004             HILOG_ERROR("Parser js value fail.");
1005             return ret;
1006         }
1007 
1008         *value = std::move(rootInfoVec);
1009         return true;
1010     };
1011 
1012     auto errCode = CallJsMethod("getRoots", jsRuntime_, jsObj_.get(), argParser, retParser);
1013     if (errCode != ERR_OK) {
1014         HILOG_ERROR("CallJsMethod error, code:%{public}d", errCode);
1015         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1016         return errCode;
1017     }
1018 
1019     if (value->code != ERR_OK) {
1020         HILOG_ERROR("fileio fail.");
1021         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1022         return value->code;
1023     }
1024 
1025     rootInfoVec = std::move(value->data);
1026     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1027     return ERR_OK;
1028 }
1029 
Access(const Uri & uri,bool & isExist)1030 int JsFileAccessExtAbility::Access(const Uri &uri, bool &isExist)
1031 {
1032     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Access");
1033     auto value = std::make_shared<Value<bool>>();
1034     if (value == nullptr) {
1035         HILOG_ERROR("Access value is nullptr.");
1036         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1037         return E_GETRESULT;
1038     }
1039 
1040     auto argParser = [uri](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
1041         NativeValue *nativeUri = engine.CreateString(uri.ToString().c_str(), uri.ToString().length());
1042         argv[ARGC_ZERO] = nativeUri;
1043         argc = ARGC_ONE;
1044         return true;
1045     };
1046     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
1047         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
1048         if (obj == nullptr) {
1049             HILOG_ERROR("Convert js object fail.");
1050             return E_GETRESULT;
1051         }
1052 
1053         bool ret = ConvertFromJsValue(engine, obj->GetProperty("isExist"), value->data);
1054         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
1055         if (!ret) {
1056             HILOG_ERROR("Convert js value fail.");
1057         }
1058         return ret;
1059     };
1060 
1061     auto errCode = CallJsMethod("access", jsRuntime_, jsObj_.get(), argParser, retParser);
1062     if (errCode != ERR_OK) {
1063         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
1064         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1065         return errCode;
1066     }
1067 
1068     if (value->code != ERR_OK) {
1069         HILOG_ERROR("fileio fail.");
1070         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1071         return value->code;
1072     }
1073 
1074     isExist = value->data;
1075     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1076     return ERR_OK;
1077 }
1078 
UriToFileInfo(const Uri & selectFile,FileInfo & fileInfo)1079 int JsFileAccessExtAbility::UriToFileInfo(const Uri &selectFile, FileInfo &fileInfo)
1080 {
1081     StartTrace(HITRACE_TAG_FILEMANAGEMENT, "UriToFileInfo");
1082     auto value = std::make_shared<Value<FileInfo>>();
1083     if (value == nullptr) {
1084         HILOG_ERROR("UriToFileInfo value is nullptr.");
1085         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1086         return E_GETRESULT;
1087     }
1088 
1089     auto argParser = [selectFile](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool {
1090         NativeValue *nativeUri = engine.CreateString(selectFile.ToString().c_str(), selectFile.ToString().length());
1091         if (nativeUri == nullptr) {
1092             HILOG_ERROR("create selectFile uri native js value fail.");
1093             return false;
1094         }
1095         argv[ARGC_ZERO] = nativeUri;
1096         argc = ARGC_ONE;
1097         return true;
1098     };
1099     auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool {
1100         NativeObject *obj = ConvertNativeValueTo<NativeObject>(result);
1101         if (obj == nullptr) {
1102             HILOG_ERROR("Convert js object fail.");
1103             return false;
1104         }
1105         bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), value->code);
1106         if (!ret) {
1107             HILOG_ERROR("Convert js value fail.");
1108             return false;
1109         }
1110 
1111         obj = ConvertNativeValueTo<NativeObject>(obj->GetProperty("fileInfo"));
1112         if (obj == nullptr) {
1113             HILOG_ERROR("Convert js-fileInfo object fail.");
1114             return false;
1115         }
1116 
1117         FileInfo fileInfo;
1118         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), fileInfo.uri);
1119         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("fileName"), fileInfo.fileName);
1120         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mode"), fileInfo.mode);
1121         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("size"), fileInfo.size);
1122         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mtime"), fileInfo.mtime);
1123         ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mimeType"), fileInfo.mimeType);
1124         if (!ret) {
1125             HILOG_ERROR("Convert js value fail.");
1126             return false;
1127         }
1128         value->data = std::move(fileInfo);
1129         return ret;
1130     };
1131 
1132     auto errCode = CallJsMethod("uriToFileInfo", jsRuntime_, jsObj_.get(), argParser, retParser);
1133     if (errCode != ERR_OK) {
1134         HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode);
1135         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1136         return errCode;
1137     }
1138 
1139     if (value->code != ERR_OK) {
1140         HILOG_ERROR("fileio fail.");
1141         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1142         return value->code;
1143     }
1144 
1145     fileInfo = std::move(value->data);
1146     FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
1147     return ERR_OK;
1148 }
1149 } // namespace FileAccessFwk
1150 } // namespace OHOS
1151