diff --git a/interfaces/kits/ani/file_share/BUILD.gn b/interfaces/kits/ani/file_share/BUILD.gn index 772e9e2591adec8eb005bfdaf1e5bf43b24fa735..6acb23f62750469fb55eff6dad6a911af87100b4 100644 --- a/interfaces/kits/ani/file_share/BUILD.gn +++ b/interfaces/kits/ani/file_share/BUILD.gn @@ -56,6 +56,7 @@ ohos_shared_library("fileshare_ani") { "hilog:libhilog", "init:libbegetutil", "ipc:ipc_core", + "napi:ace_napi", "runtime_core:ani", ] part_name = "app_file_service" diff --git a/interfaces/kits/ani/file_share/ets/@ohos.fileshare.ets b/interfaces/kits/ani/file_share/ets/@ohos.fileshare.ets index caa55189da14107d7eaf4002374d6a8c09c2d072..2ab89f5a3ffe9695fdd12d6350d1e5e2e198576c 100644 --- a/interfaces/kits/ani/file_share/ets/@ohos.fileshare.ets +++ b/interfaces/kits/ani/file_share/ets/@ohos.fileshare.ets @@ -16,34 +16,35 @@ import type { AsyncCallback } from '@ohos.base'; import { BusinessError } from '@ohos.base'; import type wantConstant from '@ohos.app.ability.wantConstant'; +import hilog from '@ohos.hilog' export namespace fileShare { loadLibrary("fileshare_ani") export function grantUriPermission(uri: string, bundleName: string, flag: wantConstant.Flags, callback: AsyncCallback): void { - console.log("Start grantUriPermission in callback main thread."); + hilog.info(0x0000, 'grantUriPermission', "Start grantUriPermission in callback main thread."); let p1 = taskpool.execute(grantUriPermissionSync, uri, bundleName, flag); p1.then((err: NullishType) => { let error: BusinessError; callback(error, undefined); }); p1.catch((err: NullishType) => { - console.log("grantUriPermission catch in callback thread."); - let error: BusinessError; + hilog.info(0x0000, 'grantUriPermission', "grantUriPermission catch in callback thread."); + let error = err as BusinessError; callback(error, undefined); }); } export function grantUriPermission(uri: string, bundleName: string, flag: wantConstant.Flags): Promise { - console.log("Start grantUriPermission in promise main thread"); + hilog.info(0x0000, 'grantUriPermission', "Start grantUriPermission in promise main thread"); let p = new Promise((resolve: (value: undefined) => void, reject: (error: Object) => void): void => { let p1 = taskpool.execute(grantUriPermissionSync, uri, bundleName, flag); p1.then((e: NullishType): void => { resolve(undefined); }); p1.catch((e: Error): void => { - console.log("grantUriPermission catch in promise thread."); + hilog.info(0x0000, 'grantUriPermission', "grantUriPermission catch in promise thread."); reject(e); }); }); @@ -51,7 +52,7 @@ export namespace fileShare { } export function grantUriPermissionSync(uri: string, bundleName: string, flag: wantConstant.Flags):int { - console.log("Start grantUriPermissionSync in thread."); + hilog.info(0x0000, 'grantUriPermission', "Start grantUriPermissionSync in thread."); grantUriPermissionInner(uri, bundleName, flag); return 0; } diff --git a/interfaces/kits/ani/file_share/src/ani_file_share.cpp b/interfaces/kits/ani/file_share/src/ani_file_share.cpp index 800b8e50f7b3da4449617ee6a0488f351c87f41f..2a12db9328fe45f5679bde90d03a7f04cc228774 100644 --- a/interfaces/kits/ani/file_share/src/ani_file_share.cpp +++ b/interfaces/kits/ani/file_share/src/ani_file_share.cpp @@ -23,6 +23,7 @@ #include "datashare_values_bucket.h" #include "ipc_skeleton.h" #include "log.h" +#include "n_error.h" #include "remote_uri.h" #include "tokenid_kit.h" #include "uri.h" @@ -31,6 +32,7 @@ using namespace OHOS::DataShare; using namespace OHOS::DistributedFS::ModuleRemoteUri; +using namespace OHOS::FileManagement::LibN; namespace OHOS { namespace AppFileService { @@ -62,24 +64,41 @@ static ani_int ParseEnumToInt(ani_env *env, ani_enum_item enumItem) return intValue; } -static ani_error CreateAniError(ani_env *env, std::string&& errMsg) +static void ThrowBusinessError(ani_env *env, int errCode, std::string&& errMsg) { - static const char *errorClsName = "Lescompat/Error;"; + LOGD("Begin ThrowBusinessError."); + static const char *errorClsName = "L@ohos/base/BusinessError;"; ani_class cls {}; if (ANI_OK != env->FindClass(errorClsName, &cls)) { - LOGE("%{public}s: Not found namespace %{public}s.", __func__, errorClsName); - return nullptr; + LOGE("find class BusinessError %{public}s failed", errorClsName); + return; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "Lstd/core/String;:V", &ctor)) { - LOGE("%{public}s: Not found in %{public}s.", __func__, errorClsName); - return nullptr; + if (ANI_OK != env->Class_FindMethod(cls, "", ":V", &ctor)) { + LOGE("find method BusinessError.constructor failed"); + return; } - ani_string error_msg; - env->String_NewUTF8(errMsg.c_str(), 17U, &error_msg); ani_object errorObject; - env->Object_New(cls, ctor, &errorObject, error_msg); - return static_cast(errorObject); + if (ANI_OK != env->Object_New(cls, ctor, &errorObject)) { + LOGE("create BusinessError object failed"); + return; + } + ani_double aniErrCode = static_cast(errCode); + ani_string errMsgStr; + if (ANI_OK != env->String_NewUTF8(errMsg.c_str(), errMsg.size(), &errMsgStr)) { + LOGE("convert errMsg to ani_string failed"); + return; + } + if (ANI_OK != env->Object_SetFieldByName_Double(errorObject, "code", aniErrCode)) { + LOGE("set error code failed"); + return; + } + if (ANI_OK != env->Object_SetPropertyByName_Ref(errorObject, "message", errMsgStr)) { + LOGE("set error message failed"); + return; + } + env->ThrowError(static_cast(errorObject)); + return; } static bool IsSystemApp() @@ -234,8 +253,7 @@ static void GrantUriPermission(ani_env *env, ani_string uri, ani_string bundleNa LOGD("Enter GrantUriPermission."); if (!IsSystemApp()) { LOGE("%{public}s: GrantUriPermission is not System App!", __func__); - ani_error error = CreateAniError(env, "GrantUriPermission is not System App!"); - env->ThrowError(error); + ThrowBusinessError(env, E_PERMISSION_SYS, "FileShare::GrantUriPermission is not System App!"); return; } @@ -243,8 +261,7 @@ static void GrantUriPermission(ani_env *env, ani_string uri, ani_string bundleNa std::string uriStr = ParseObjToStr(env, uri); if (!CheckValidPublicUri(uriStr)) { LOGE("%{public}s: GrantUriPermission uri is not valid!", __func__); - ani_error error = CreateAniError(env, "GrantUriPermission uri is not valid!"); - env->ThrowError(error); + ThrowBusinessError(env, EINVAL, "GrantUriPermission uri is not valid!"); return; } uriPermInfo.uri = uriStr; @@ -254,8 +271,7 @@ static void GrantUriPermission(ani_env *env, ani_string uri, ani_string bundleNa ani_int wantConstantFlag = ParseEnumToInt(env, static_cast(enumIndex)); if (wantConstantFlag < 0) { LOGE("%{public}s: GrantUriPermission ParseEnumToInt Faild!", __func__); - ani_error error = CreateAniError(env, "GrantUriPermission ParseEnumToInt Faild!"); - env->ThrowError(error); + ThrowBusinessError(env, EINVAL, "GrantUriPermission is not System App!"); return; } uriPermInfo.flag = wantConstantFlag; @@ -264,7 +280,12 @@ static void GrantUriPermission(ani_env *env, ani_string uri, ani_string bundleNa uriStr.c_str(), bundleNameStr.c_str(), wantConstantFlag, uriPermInfo.mode.c_str()); int ret = DoGrantUriPermission(uriPermInfo); - LOGD("DoGrantUriPermission ret: %{public}d.", ret); + if (ret < 0) { + LOGE("FileShare::GrantUriPermission DoGrantUriPermission failed with %{public}d", ret); + ThrowBusinessError(env, -ret, "GrantUriPermission failed"); + return; + } + LOGD("FileShare::GrantUriPermission DoGrantUriPermission successfully!"); } } // namespace ModuleFileShare } // namespace AppFileService diff --git a/interfaces/kits/ani/file_uri/BUILD.gn b/interfaces/kits/ani/file_uri/BUILD.gn index c3545159d00f886955e9eb735f777a1e5335bde7..7fad45cea19635dfcd20ecb8cffd7a3d3f7214cd 100644 --- a/interfaces/kits/ani/file_uri/BUILD.gn +++ b/interfaces/kits/ani/file_uri/BUILD.gn @@ -49,6 +49,7 @@ ohos_shared_library("fileuri_ani") { "file_api:filemgmt_libn", "hilog:libhilog", "ipc:ipc_core", + "napi:ace_napi", "runtime_core:ani", "samgr:samgr_proxy", ] diff --git a/interfaces/kits/ani/file_uri/src/ani_file_uri.cpp b/interfaces/kits/ani/file_uri/src/ani_file_uri.cpp index ee5c314bdde9041ae7aa3dd306441c026585f728..e7f181117c64cb28461a6d2a32a157179c04dfdb 100644 --- a/interfaces/kits/ani/file_uri/src/ani_file_uri.cpp +++ b/interfaces/kits/ani/file_uri/src/ani_file_uri.cpp @@ -20,6 +20,7 @@ #include "file_uri_entity.h" #include "file_utils.h" #include "log.h" +#include "n_error.h" using namespace OHOS::AppFileService; @@ -47,24 +48,41 @@ static ModuleFileUri::FileUriEntity *unwrapp(ani_env *env, ani_object object) return reinterpret_cast(fileuriEntity_); } -static ani_error CreateAniError(ani_env *env, std::string&& errMsg) +static void ThrowBusinessError(ani_env *env, int errCode, std::string&& errMsg) { - static const char *errorClsName = "Lescompat/Error;"; + LOGD("Begin ThrowBusinessError."); + static const char *errorClsName = "L@ohos/base/BusinessError;"; ani_class cls {}; if (ANI_OK != env->FindClass(errorClsName, &cls)) { - LOGE("Not found %{public}s.", errorClsName); - return nullptr; + LOGE("find class BusinessError %{public}s failed", errorClsName); + return; } ani_method ctor; - if (ANI_OK != env->Class_FindMethod(cls, "", "Lstd/core/String;:V", &ctor)) { - LOGE("Not found method in %{public}s.", errorClsName); - return nullptr; + if (ANI_OK != env->Class_FindMethod(cls, "", ":V", &ctor)) { + LOGE("find method BusinessError.constructor failed"); + return; } - ani_string error_msg; - env->String_NewUTF8(errMsg.c_str(), 17U, &error_msg); ani_object errorObject; - env->Object_New(cls, ctor, &errorObject, error_msg); - return static_cast(errorObject); + if (ANI_OK != env->Object_New(cls, ctor, &errorObject)) { + LOGE("create BusinessError object failed"); + return; + } + ani_double aniErrCode = static_cast(errCode); + ani_string errMsgStr; + if (ANI_OK != env->String_NewUTF8(errMsg.c_str(), errMsg.size(), &errMsgStr)) { + LOGE("convert errMsg to ani_string failed"); + return; + } + if (ANI_OK != env->Object_SetFieldByName_Double(errorObject, "code", aniErrCode)) { + LOGE("set error code failed"); + return; + } + if (ANI_OK != env->Object_SetPropertyByName_Ref(errorObject, "message", errMsgStr)) { + LOGE("set error message failed"); + return; + } + env->ThrowError(static_cast(errorObject)); + return; } static ani_string GetUriFromPath(ani_env *env, ani_string stringObj) @@ -72,18 +90,11 @@ static ani_string GetUriFromPath(ani_env *env, ani_string stringObj) LOGD("Enter GetUriFromPath"); ani_string uriObj = nullptr; std::string path = ParseObjToStr(env, stringObj); - if (path == "") { - LOGE("GetUriFromPath get path parameter failed!"); - ani_error err = CreateAniError(env, "GetUriFromPath get path parameter failed!"); - env->ThrowError(err); - return uriObj; - } std::string uri = CommonFunc::GetUriFromPath(path); if (uri == "") { LOGE("CommonFunc::GetUriFromPath failed!"); - ani_error err = CreateAniError(env, "GetUriFromPath failed!"); - env->ThrowError(err); + ThrowBusinessError(env, OHOS::FileManagement::LibN::E_PARAMS, "CommonFunc::GetUriFromPath failed!"); return uriObj; } LOGD("GetUriFromPath uri: %{public}s", uri.c_str()); @@ -99,15 +110,13 @@ void FileUriConstructor(ani_env *env, ani_object obj, ani_string stringObj) std::string path = ParseObjToStr(env, stringObj); if (path == "") { LOGE("FileUriConstructor get path parameter failed!"); - ani_error err = CreateAniError(env, "GetUriFromPath get path parameter failed!"); - env->ThrowError(err); + ThrowBusinessError(env, EINVAL, "Failed to get path"); return; } auto fileuriEntity = OHOS::FileManagement::CreateUniquePtr(path); if (fileuriEntity == nullptr) { LOGE("Failed to request heap memory."); - ani_error err = CreateAniError(env, "Failed to request heap memory."); - env->ThrowError(err); + ThrowBusinessError(env, ENOMEM, "Failed to request heap memory."); return; } LOGD("FileUriConstructor fileuriEntity: %{public}p.", fileuriEntity.get()); @@ -115,8 +124,7 @@ void FileUriConstructor(ani_env *env, ani_object obj, ani_string stringObj) ani_namespace ns; if (env->FindNamespace("L@ohos/file/fileuri/fileUri;", &ns) != ANI_OK) { LOGE("Namespace L@ohos/file/fileuri/fileUri not found."); - ani_error err = CreateAniError(env, "Namespace L@ohos/file/fileuri/fileUri not found."); - env->ThrowError(err); + ThrowBusinessError(env, EPERM, "Namespace L@ohos/file/fileuri/fileUri not found."); return; }; @@ -124,23 +132,20 @@ void FileUriConstructor(ani_env *env, ani_object obj, ani_string stringObj) static const char *className = "LFileUri;"; if (env->Namespace_FindClass(ns, className, &cls) != ANI_OK) { LOGE("Not found class LFileUri in Namespace L@ohos/file/fileuri/fileUri."); - ani_error err = CreateAniError(env, "Class LFileUri not found."); - env->ThrowError(err); + ThrowBusinessError(env, EPERM, "Class LFileUri not found."); return; } ani_method acquireObj; if (ANI_OK != env->Class_FindMethod(cls, "acquireFileUriEntity", "J:V", &acquireObj)) { LOGE("Not found method acquireFileUriEntity in class LFileUri."); - ani_error err = CreateAniError(env, "Method acquireFileUriEntity not found."); - env->ThrowError(err); + ThrowBusinessError(env, EPERM, "Method acquireFileUriEntity not found."); return; } if (ANI_OK != env->Object_CallMethod_Void(obj, acquireObj, reinterpret_cast(fileuriEntity.get()))) { LOGE("Call method acquireFileUriEntity failed."); - ani_error err = CreateAniError(env, "Call method acquireFileUriEntity failed."); - env->ThrowError(err); + ThrowBusinessError(env, EPERM, "Call method acquireFileUriEntity failed."); return; } }