diff --git a/frameworks/ets/ani/ani_common/include/ani_common_want.h b/frameworks/ets/ani/ani_common/include/ani_common_want.h index 4a77835fb823256cc4e339e4c3b52c6033201003..a34527f839a903e70268040416105b5664ef8b22 100644 --- a/frameworks/ets/ani/ani_common/include/ani_common_want.h +++ b/frameworks/ets/ani/ani_common/include/ani_common_want.h @@ -32,6 +32,8 @@ bool UnwrapWant(ani_env *env, ani_object param, AAFwk::Want &want); ani_ref WrapWantParams(ani_env *env, const AAFwk::WantParams &wantParams); bool UnwrapWantParams(ani_env *env, ani_ref param, AAFwk::WantParams &wantParams); +ani_ref WrapWantParamsFD(ani_env *env, const AAFwk::WantParams &wantParams); + bool UnWrapAbilityResult(ani_env *env, ani_object param, int &resultCode, AAFwk::Want &want); ani_object WrapElementName(ani_env *env, const AppExecFwk::ElementName &elementNameParam); diff --git a/frameworks/ets/ani/ani_common/src/ani_common_want.cpp b/frameworks/ets/ani/ani_common/src/ani_common_want.cpp index 13ffe3226aa4538a18762c57eeb17724a814597a..9c638af8fb9f22d9289661001af94ef2cd370d0f 100644 --- a/frameworks/ets/ani/ani_common/src/ani_common_want.cpp +++ b/frameworks/ets/ani/ani_common/src/ani_common_want.cpp @@ -45,6 +45,7 @@ constexpr const char *ELEMENTNAME_CLASS_NAME = "LbundleManager/ElementNameInner/ constexpr const char *RECORD_CLASS_NAME = "Lescompat/Record;"; constexpr const char *RECORD_SET_NAME = "X{C{std.core.Numeric}C{std.core.String}C{std.core.BaseEnum}}C{std.core.Object}:"; +const int PROPERTIES_SIZE = 2; bool InnerWrapWantParams(ani_env *env, ani_class wantCls, ani_object wantObject, const AAFwk::WantParams &wantParams) { @@ -56,6 +57,16 @@ bool InnerWrapWantParams(ani_env *env, ani_class wantCls, ani_object wantObject, return SetFieldRefByName(env, wantCls, wantObject, "parameters", wantParamRef); } +bool InnerWrapWantParamsFD(ani_env *env, ani_class wantCls, ani_object wantObject, const AAFwk::WantParams &wantParams) +{ + ani_ref wantParamFDRef = WrapWantParamsFD(env, wantParams); + if (wantParamFDRef == nullptr) { + TAG_LOGE(AAFwkTag::ANI, "failed to WrapWantParamsFD"); + return false; + } + return SetFieldRefByName(env, wantCls, wantObject, "fds", wantParamFDRef); +} + bool InnerUnwrapWantParams(ani_env *env, ani_object wantObject, AAFwk::WantParams &wantParams) { ani_ref wantParamRef = nullptr; @@ -1049,11 +1060,58 @@ ani_object WrapWant(ani_env *env, const AAFwk::Want &want) SetFieldIntByName(env, cls, object, "flags", want.GetFlags()); SetFieldStringByName(env, cls, object, "action", want.GetAction()); InnerWrapWantParams(env, cls, object, want.GetParams()); + InnerWrapWantParamsFD(env, cls, object, want.GetParams()); SetFieldArrayStringByName(env, cls, object, "entities", want.GetEntities()); return object; } +ani_ref WrapWantParamsFD(ani_env *env, const AAFwk::WantParams &wantParams) +{ + auto paramList = wantParams.GetParams(); + AAFwk::WantParams fds; + for (auto it = paramList.begin(); it != paramList.end(); it++) { + if (AAFwk::IWantParams::Query(it->second) == nullptr) { + TAG_LOGW(AAFwkTag::ANI, "not wantParam"); + continue; + } + auto value = wantParams.GetParam(it->first); + AAFwk::IWantParams *o = AAFwk::IWantParams::Query(value); + if (o == nullptr) { + return nullptr; + } + AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o); + auto valueMap = wp.GetParams(); + if (valueMap.size() != PROPERTIES_SIZE) { + TAG_LOGD(AAFwkTag::ANI, "not fd"); + return nullptr; + } + auto typeIt = valueMap.find(AAFwk::TYPE_PROPERTY); + if (typeIt == valueMap.end()) { + return nullptr; + } + AAFwk::IString *strValue = AAFwk::IString::Query(typeIt->second); + if (strValue == nullptr) { + return nullptr; + } + std::string typeString = AAFwk::String::Unbox(strValue); + if (typeString != AAFwk::FD) { + TAG_LOGD(AAFwkTag::ANI, "not fd"); + return nullptr; + } + auto valueIt = valueMap.find(AAFwk::VALUE_PROPERTY); + if (valueIt == valueMap.end()) { + return nullptr; + } + AAFwk::IInteger *intValue = AAFwk::IInteger::Query(valueIt->second); + if (intValue == nullptr) { + return nullptr; + } + fds.SetParam(it->first, intValue); + } + return WrapWantParams(env, fds); +} + ani_ref WrapWantParams(ani_env *env, const AAFwk::WantParams &wantParams) { if (env == nullptr) { diff --git a/frameworks/ets/ets/@ohos.app.ability.Want.ets b/frameworks/ets/ets/@ohos.app.ability.Want.ets index 89350923dbce0a4f3f253870ff1c9ddcf1eac3bf..b3bf319645fdb5b79d0ff57cd892928519bb6848 100644 --- a/frameworks/ets/ets/@ohos.app.ability.Want.ets +++ b/frameworks/ets/ets/@ohos.app.ability.Want.ets @@ -401,4 +401,5 @@ export default class Want { parameters?: Record; entities?: Array; moduleName?: string; + readonly fds?: Record; }