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