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