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