1 /*
2 * Copyright (c) 2023-2024 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 "insight_intent_execute_param.h"
17
18 #include <charconv>
19
20 #include "hilog_tag_wrapper.h"
21 #include "hitrace_meter.h"
22 #include "insight_intent_constant.h"
23 #include "int_wrapper.h"
24 #include "string_wrapper.h"
25
26 namespace OHOS {
27 namespace AppExecFwk {
28 using WantParams = OHOS::AAFwk::WantParams;
ReadFromParcel(Parcel & parcel)29 bool InsightIntentExecuteParam::ReadFromParcel(Parcel &parcel)
30 {
31 bundleName_ = Str16ToStr8(parcel.ReadString16());
32 moduleName_ = Str16ToStr8(parcel.ReadString16());
33 abilityName_ = Str16ToStr8(parcel.ReadString16());
34 insightIntentName_ = Str16ToStr8(parcel.ReadString16());
35 std::shared_ptr<WantParams> wantParams(parcel.ReadParcelable<WantParams>());
36 if (wantParams == nullptr) {
37 return false;
38 }
39 insightIntentParam_ = wantParams;
40 executeMode_ = parcel.ReadInt32();
41 insightIntentId_ = parcel.ReadUint64();
42 displayId_ = parcel.ReadInt32();
43 parcel.ReadStringVector(&uris_);
44 flags_ = parcel.ReadInt32();
45 decoratorType_ = parcel.ReadInt8();
46 srcEntrance_ = Str16ToStr8(parcel.ReadString16());
47 className_ = Str16ToStr8(parcel.ReadString16());
48 methodName_ = Str16ToStr8(parcel.ReadString16());
49 parcel.ReadStringVector(&methodParams_);
50 pagePath_ = Str16ToStr8(parcel.ReadString16());
51 navigationId_ = Str16ToStr8(parcel.ReadString16());
52 navDestinationName_ = Str16ToStr8(parcel.ReadString16());
53 return true;
54 }
55
Unmarshalling(Parcel & parcel)56 InsightIntentExecuteParam *InsightIntentExecuteParam::Unmarshalling(Parcel &parcel)
57 {
58 InsightIntentExecuteParam *param = new (std::nothrow) InsightIntentExecuteParam();
59 if (param == nullptr) {
60 return nullptr;
61 }
62
63 if (!param->ReadFromParcel(parcel)) {
64 delete param;
65 param = nullptr;
66 }
67 return param;
68 }
69
Marshalling(Parcel & parcel) const70 bool InsightIntentExecuteParam::Marshalling(Parcel &parcel) const
71 {
72 parcel.WriteString16(Str8ToStr16(bundleName_));
73 parcel.WriteString16(Str8ToStr16(moduleName_));
74 parcel.WriteString16(Str8ToStr16(abilityName_));
75 parcel.WriteString16(Str8ToStr16(insightIntentName_));
76 parcel.WriteParcelable(insightIntentParam_.get());
77 parcel.WriteInt32(executeMode_);
78 parcel.WriteUint64(insightIntentId_);
79 parcel.WriteInt32(displayId_);
80 parcel.WriteStringVector(uris_);
81 parcel.WriteInt32(flags_);
82 parcel.WriteInt8(decoratorType_);
83 parcel.WriteString16(Str8ToStr16(srcEntrance_));
84 parcel.WriteString16(Str8ToStr16(className_));
85 parcel.WriteString16(Str8ToStr16(methodName_));
86 parcel.WriteStringVector(methodParams_);
87 parcel.WriteString16(Str8ToStr16(pagePath_));
88 parcel.WriteString16(Str8ToStr16(navigationId_));
89 parcel.WriteString16(Str8ToStr16(navDestinationName_));
90 return true;
91 }
92
IsInsightIntentExecute(const AAFwk::Want & want)93 bool InsightIntentExecuteParam::IsInsightIntentExecute(const AAFwk::Want &want)
94 {
95 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_NAME)) {
96 return true;
97 }
98 return false;
99 }
100
IsInsightIntentPage(const AAFwk::Want & want)101 bool InsightIntentExecuteParam::IsInsightIntentPage(const AAFwk::Want &want)
102 {
103 if (!want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_NAME)) {
104 return false;
105 }
106
107 const WantParams &wantParams = want.GetParams();
108 auto type = wantParams.GetIntParam(INSIGHT_INTENT_DECORATOR_TYPE, -1);
109 if (type == static_cast<int>(AbilityRuntime::InsightIntentType::DECOR_PAGE)) {
110 return true;
111 }
112
113 return false;
114 }
115
GenerateFromWant(const AAFwk::Want & want,InsightIntentExecuteParam & executeParam)116 bool InsightIntentExecuteParam::GenerateFromWant(const AAFwk::Want &want,
117 InsightIntentExecuteParam &executeParam)
118 {
119 const WantParams &wantParams = want.GetParams();
120 if (!wantParams.HasParam(INSIGHT_INTENT_EXECUTE_PARAM_NAME)) {
121 TAG_LOGE(AAFwkTag::INTENT, "empty want");
122 return false;
123 }
124 uint64_t insightIntentId = 0;
125 std::string idStr = wantParams.GetStringParam(INSIGHT_INTENT_EXECUTE_PARAM_ID);
126 auto res = std::from_chars(idStr.c_str(), idStr.c_str() + idStr.size(), insightIntentId);
127 if (res.ec != std::errc()) {
128 TAG_LOGE(AAFwkTag::ABILITY, "invalid insight intent ID");
129 return false;
130 }
131
132 AppExecFwk::ElementName elementName = want.GetElement();
133 executeParam.bundleName_ = elementName.GetBundleName();
134 executeParam.moduleName_ = elementName.GetModuleName();
135 executeParam.abilityName_ = elementName.GetAbilityName();
136 executeParam.insightIntentName_ = wantParams.GetStringParam(INSIGHT_INTENT_EXECUTE_PARAM_NAME);
137 executeParam.insightIntentId_ = insightIntentId;
138 executeParam.executeMode_ = wantParams.GetIntParam(INSIGHT_INTENT_EXECUTE_PARAM_MODE, 0);
139
140 auto insightIntentParam = wantParams.GetWantParams(INSIGHT_INTENT_EXECUTE_PARAM_PARAM);
141 UpdateInsightIntentCallerInfo(wantParams, insightIntentParam);
142 executeParam.insightIntentParam_ = std::make_shared<WantParams>(insightIntentParam);
143 executeParam.uris_ = want.GetStringArrayParam(INSIGHT_INTENT_EXECUTE_PARAM_URI);
144 executeParam.flags_ = wantParams.GetIntParam(INSIGHT_INTENT_EXECUTE_PARAM_FLAGS, 0);
145 executeParam.decoratorType_ = wantParams.GetIntParam(INSIGHT_INTENT_DECORATOR_TYPE, 0);
146 executeParam.srcEntrance_ = wantParams.GetStringParam(INSIGHT_INTENT_SRC_ENTRANCE);
147 executeParam.className_ = wantParams.GetStringParam(INSIGHT_INTENT_FUNC_PARAM_CLASSNAME);
148 executeParam.methodName_ = wantParams.GetStringParam(INSIGHT_INTENT_FUNC_PARAM_METHODNAME);
149 executeParam.methodParams_ = want.GetStringArrayParam(INSIGHT_INTENT_FUNC_PARAM_METHODPARAMS);
150 executeParam.pagePath_ = wantParams.GetStringParam(INSIGHT_INTENT_PAGE_PARAM_PAGEPATH);
151 executeParam.navigationId_ = wantParams.GetStringParam(INSIGHT_INTENT_PAGE_PARAM_NAVIGATIONID);
152 executeParam.navDestinationName_ = wantParams.GetStringParam(INSIGHT_INTENT_PAGE_PARAM_NAVDESTINATIONNAME);
153 return true;
154 }
155
RemoveInsightIntent(AAFwk::Want & want)156 bool InsightIntentExecuteParam::RemoveInsightIntent(AAFwk::Want &want)
157 {
158 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
159 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_NAME)) {
160 want.RemoveParam(INSIGHT_INTENT_EXECUTE_PARAM_NAME);
161 }
162 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_ID)) {
163 want.RemoveParam(INSIGHT_INTENT_EXECUTE_PARAM_ID);
164 }
165 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_MODE)) {
166 want.RemoveParam(INSIGHT_INTENT_EXECUTE_PARAM_MODE);
167 }
168 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_PARAM)) {
169 want.RemoveParam(INSIGHT_INTENT_EXECUTE_PARAM_PARAM);
170 }
171 if (want.HasParameter(INSIGHT_INTENT_SRC_ENTRY)) {
172 want.RemoveParam(INSIGHT_INTENT_SRC_ENTRY);
173 }
174 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_URI)) {
175 want.RemoveParam(INSIGHT_INTENT_EXECUTE_PARAM_URI);
176 }
177 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_PARAM_FLAGS)) {
178 want.RemoveParam(INSIGHT_INTENT_EXECUTE_PARAM_FLAGS);
179 }
180 if (want.HasParameter(INSIGHT_INTENT_EXECUTE_OPENLINK_FLAG)) {
181 want.RemoveParam(INSIGHT_INTENT_EXECUTE_OPENLINK_FLAG);
182 }
183 if (want.HasParameter(INSIGHT_INTENT_DECORATOR_TYPE)) {
184 want.RemoveParam(INSIGHT_INTENT_DECORATOR_TYPE);
185 }
186 if (want.HasParameter(INSIGHT_INTENT_SRC_ENTRANCE)) {
187 want.RemoveParam(INSIGHT_INTENT_SRC_ENTRANCE);
188 }
189 if (want.HasParameter(INSIGHT_INTENT_FUNC_PARAM_CLASSNAME)) {
190 want.RemoveParam(INSIGHT_INTENT_FUNC_PARAM_CLASSNAME);
191 }
192 if (want.HasParameter(INSIGHT_INTENT_FUNC_PARAM_METHODNAME)) {
193 want.RemoveParam(INSIGHT_INTENT_FUNC_PARAM_METHODNAME);
194 }
195 if (want.HasParameter(INSIGHT_INTENT_FUNC_PARAM_METHODPARAMS)) {
196 want.RemoveParam(INSIGHT_INTENT_FUNC_PARAM_METHODPARAMS);
197 }
198 if (want.HasParameter(INSIGHT_INTENT_PAGE_PARAM_PAGEPATH)) {
199 want.RemoveParam(INSIGHT_INTENT_PAGE_PARAM_PAGEPATH);
200 }
201 if (want.HasParameter(INSIGHT_INTENT_PAGE_PARAM_NAVIGATIONID)) {
202 want.RemoveParam(INSIGHT_INTENT_PAGE_PARAM_NAVIGATIONID);
203 }
204 if (want.HasParameter(INSIGHT_INTENT_PAGE_PARAM_NAVDESTINATIONNAME)) {
205 want.RemoveParam(INSIGHT_INTENT_PAGE_PARAM_NAVDESTINATIONNAME);
206 }
207 return true;
208 }
209
UpdateInsightIntentCallerInfo(const WantParams & wantParams,WantParams & insightIntentParam)210 void InsightIntentExecuteParam::UpdateInsightIntentCallerInfo(const WantParams &wantParams,
211 WantParams &insightIntentParam)
212 {
213 insightIntentParam.Remove(AAFwk::Want::PARAM_RESV_CALLER_TOKEN);
214 insightIntentParam.SetParam(AAFwk::Want::PARAM_RESV_CALLER_TOKEN,
215 AAFwk::Integer::Box(wantParams.GetIntParam(AAFwk::Want::PARAM_RESV_CALLER_TOKEN, 0)));
216
217 insightIntentParam.Remove(AAFwk::Want::PARAM_RESV_CALLER_UID);
218 insightIntentParam.SetParam(AAFwk::Want::PARAM_RESV_CALLER_UID,
219 AAFwk::Integer::Box(wantParams.GetIntParam(AAFwk::Want::PARAM_RESV_CALLER_UID, 0)));
220
221 insightIntentParam.Remove(AAFwk::Want::PARAM_RESV_CALLER_PID);
222 insightIntentParam.SetParam(AAFwk::Want::PARAM_RESV_CALLER_PID,
223 AAFwk::Integer::Box(wantParams.GetIntParam(AAFwk::Want::PARAM_RESV_CALLER_PID, 0)));
224
225 insightIntentParam.Remove(AAFwk::Want::PARAM_RESV_CALLER_BUNDLE_NAME);
226 insightIntentParam.SetParam(AAFwk::Want::PARAM_RESV_CALLER_BUNDLE_NAME,
227 AAFwk::String::Box(wantParams.GetStringParam(AAFwk::Want::PARAM_RESV_CALLER_BUNDLE_NAME)));
228 }
229 } // namespace AppExecFwk
230 } // namespace OHOS
231