1 /*
2 * Copyright (c) 2021-2023 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 "distributed_want_params.h"
17
18 #include "array_wrapper.h"
19 #include "base_interfaces.h"
20 #include "base_obj.h"
21 #include "bool_wrapper.h"
22 #include "byte_wrapper.h"
23 #include "distributed_want_params_wrapper.h"
24 #include "double_wrapper.h"
25 #include "dtbschedmgr_log.h"
26 #include "float_wrapper.h"
27 #include "int_wrapper.h"
28 #include "long_wrapper.h"
29 #include "parcel.h"
30 #include "securec.h"
31 #include "short_wrapper.h"
32 #include "string_ex.h"
33 #include "string_wrapper.h"
34 #include "want_params_wrapper.h"
35 #include "zchar_wrapper.h"
36 #include "remote_object_wrapper.h"
37
38 namespace OHOS {
39 namespace DistributedSchedule {
40 namespace {
41 const char* FD = "FD";
42 const char* REMOTE_OBJECT = "RemoteObject";
43 const char* TYPE_PROPERTY = "type";
44 const char* VALUE_PROPERTY = "value";
45 const std::string TAG = "DistributedUnsupportedData";
46 }
47
48 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc> DistributedWantParams::interfaceQueryToStrMap = {
49 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
50 DistributedWantParams::VALUE_TYPE_BOOLEAN, &DistributedWantParams::BooleanQueryToStr),
51 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
52 DistributedWantParams::VALUE_TYPE_BYTE, &DistributedWantParams::ByteQueryToStr),
53 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
54 DistributedWantParams::VALUE_TYPE_CHAR, &DistributedWantParams::CharQueryToStr),
55 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
56 DistributedWantParams::VALUE_TYPE_SHORT, &DistributedWantParams::ShortQueryToStr),
57 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
58 DistributedWantParams::VALUE_TYPE_INT, &DistributedWantParams::IntegerQueryToStr),
59 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
60 DistributedWantParams::VALUE_TYPE_LONG, &DistributedWantParams::LongQueryToStr),
61 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
62 DistributedWantParams::VALUE_TYPE_FLOAT, &DistributedWantParams::FloatQueryToStr),
63 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
64 DistributedWantParams::VALUE_TYPE_DOUBLE, &DistributedWantParams::DoubleQueryToStr),
65 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
66 DistributedWantParams::VALUE_TYPE_STRING, &DistributedWantParams::StringQueryToStr),
67 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
68 DistributedWantParams::VALUE_TYPE_ARRAY, &DistributedWantParams::ArrayQueryToStr),
69 std::map<int, DistributedWantParams::InterfaceQueryToStrFunc>::value_type(
70 DistributedWantParams::VALUE_TYPE_WANTPARAMS, &DistributedWantParams::DistributedWantParamsQueryToStr),
71 };
72
73 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc> DistributedWantParams::interfaceQueryEqualsMap = {
74 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
75 DistributedWantParams::VALUE_TYPE_BOOLEAN, &DistributedWantParams::BooleanQueryEquals),
76 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
77 DistributedWantParams::VALUE_TYPE_BYTE, &DistributedWantParams::ByteQueryEquals),
78 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
79 DistributedWantParams::VALUE_TYPE_CHAR, &DistributedWantParams::CharQueryEquals),
80 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
81 DistributedWantParams::VALUE_TYPE_STRING, &DistributedWantParams::StringQueryEquals),
82 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
83 DistributedWantParams::VALUE_TYPE_ARRAY, &DistributedWantParams::ArrayQueryEquals),
84 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
85 DistributedWantParams::VALUE_TYPE_WANTPARAMS, &DistributedWantParams::DistributedWantParamsQueryEquals),
86 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
87 DistributedWantParams::VALUE_TYPE_SHORT, &DistributedWantParams::ShortQueryEquals),
88 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
89 DistributedWantParams::VALUE_TYPE_INT, &DistributedWantParams::IntegerQueryEquals),
90 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
91 DistributedWantParams::VALUE_TYPE_LONG, &DistributedWantParams::LongQueryEquals),
92 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
93 DistributedWantParams::VALUE_TYPE_FLOAT, &DistributedWantParams::FloatQueryEquals),
94 std::map<int, DistributedWantParams::InterfaceQueryEqualsFunc>::value_type(
95 DistributedWantParams::VALUE_TYPE_DOUBLE, &DistributedWantParams::DoubleQueryEquals),
96 };
97
~DistributedUnsupportedData()98 DistributedUnsupportedData::~DistributedUnsupportedData()
99 {
100 if (buffer != nullptr) {
101 delete[] buffer;
102 buffer = nullptr;
103 }
104 }
105
106 DistributedUnsupportedData::DistributedUnsupportedData() = default;
107
DistributedUnsupportedData(const DistributedUnsupportedData & other)108 DistributedUnsupportedData::DistributedUnsupportedData(const DistributedUnsupportedData& other)
109 : key(other.key), type(other.type), size(other.size)
110 {
111 buffer = new uint8_t[size];
112 int32_t ret = memcpy_s(buffer, size, other.buffer, size);
113 if (ret != EOK) {
114 HILOGE("memory copy failed, ret %{public}d", ret);
115 key.clear();
116 type = 0;
117 size = 0;
118 delete[] buffer;
119 buffer = nullptr;
120 }
121 }
122
DistributedUnsupportedData(DistributedUnsupportedData && other)123 DistributedUnsupportedData::DistributedUnsupportedData(DistributedUnsupportedData&& other)
124 : key(std::move(other.key)), type(other.type), size(other.size), buffer(other.buffer)
125 {
126 other.type = 0;
127 other.size = 0;
128 other.buffer = nullptr;
129 }
130
operator =(const DistributedUnsupportedData & other)131 DistributedUnsupportedData& DistributedUnsupportedData::operator=(const DistributedUnsupportedData& other)
132 {
133 if (this == &other) {
134 return *this;
135 }
136 key = other.key;
137 type = other.type;
138 size = other.size;
139 buffer = new uint8_t[size];
140 int32_t ret = memcpy_s(buffer, size, other.buffer, size);
141 if (ret != EOK) {
142 HILOGE("memory copy failed, ret %{public}d", ret);
143 key.clear();
144 type = 0;
145 size = 0;
146 delete[] buffer;
147 buffer = nullptr;
148 }
149 return *this;
150 }
151
operator =(DistributedUnsupportedData && other)152 DistributedUnsupportedData& DistributedUnsupportedData::operator=(DistributedUnsupportedData&& other)
153 {
154 key = std::move(other.key);
155 type = other.type;
156 size = other.size;
157 std::swap(buffer, other.buffer);
158
159 other.type = 0;
160 other.size = 0;
161 if (other.buffer) {
162 delete[] other.buffer;
163 other.buffer = nullptr;
164 }
165 return *this;
166 }
167
BooleanQueryToStr(const sptr<AAFwk::IInterface> iIt)168 std::string DistributedWantParams::BooleanQueryToStr(const sptr<AAFwk::IInterface> iIt)
169 {
170 AAFwk::IBoolean* obj = AAFwk::IBoolean::Query(iIt);
171 return obj == nullptr ? "" : static_cast<AAFwk::Boolean*>(obj)->ToString();
172 }
173
ByteQueryToStr(const sptr<AAFwk::IInterface> iIt)174 std::string DistributedWantParams::ByteQueryToStr(const sptr<AAFwk::IInterface> iIt)
175 {
176 AAFwk::IByte* obj = AAFwk::IByte::Query(iIt);
177 return obj == nullptr ? "" : static_cast<AAFwk::Byte*>(obj)->ToString();
178 }
179
CharQueryToStr(const sptr<AAFwk::IInterface> iIt)180 std::string DistributedWantParams::CharQueryToStr(const sptr<AAFwk::IInterface> iIt)
181 {
182 AAFwk::IChar* obj = AAFwk::IChar::Query(iIt);
183 return obj == nullptr ? "" : static_cast<AAFwk::Char*>(obj)->ToString();
184 }
185
ShortQueryToStr(const sptr<AAFwk::IInterface> iIt)186 std::string DistributedWantParams::ShortQueryToStr(const sptr<AAFwk::IInterface> iIt)
187 {
188 AAFwk::IShort* obj = AAFwk::IShort::Query(iIt);
189 return obj == nullptr ? "" : static_cast<AAFwk::Short*>(obj)->ToString();
190 }
191
IntegerQueryToStr(const sptr<AAFwk::IInterface> iIt)192 std::string DistributedWantParams::IntegerQueryToStr(const sptr<AAFwk::IInterface> iIt)
193 {
194 AAFwk::IInteger* obj = AAFwk::IInteger::Query(iIt);
195 return obj == nullptr ? "" : static_cast<AAFwk::Integer*>(obj)->ToString();
196 }
197
LongQueryToStr(const sptr<AAFwk::IInterface> iIt)198 std::string DistributedWantParams::LongQueryToStr(const sptr<AAFwk::IInterface> iIt)
199 {
200 AAFwk::ILong* obj = AAFwk::ILong::Query(iIt);
201 return obj == nullptr ? "" : static_cast<AAFwk::Long*>(obj)->ToString();
202 }
203
FloatQueryToStr(const sptr<AAFwk::IInterface> iIt)204 std::string DistributedWantParams::FloatQueryToStr(const sptr<AAFwk::IInterface> iIt)
205 {
206 AAFwk::IFloat* obj = AAFwk::IFloat::Query(iIt);
207 return obj == nullptr ? "" : static_cast<AAFwk::Float*>(obj)->ToString();
208 }
209
DoubleQueryToStr(const sptr<AAFwk::IInterface> iIt)210 std::string DistributedWantParams::DoubleQueryToStr(const sptr<AAFwk::IInterface> iIt)
211 {
212 AAFwk::IDouble* obj = AAFwk::IDouble::Query(iIt);
213 return obj == nullptr ? "" : static_cast<AAFwk::Double*>(obj)->ToString();
214 }
215
StringQueryToStr(const sptr<AAFwk::IInterface> iIt)216 std::string DistributedWantParams::StringQueryToStr(const sptr<AAFwk::IInterface> iIt)
217 {
218 AAFwk::IString* obj = AAFwk::IString::Query(iIt);
219 return obj == nullptr ? "" : static_cast<AAFwk::String*>(obj)->ToString();
220 }
221
ArrayQueryToStr(const sptr<AAFwk::IInterface> iIt)222 std::string DistributedWantParams::ArrayQueryToStr(const sptr<AAFwk::IInterface> iIt)
223 {
224 AAFwk::IArray* obj = AAFwk::IArray::Query(iIt);
225 return obj == nullptr ? "" : static_cast<AAFwk::Array*>(obj)->ToString();
226 }
227
DistributedWantParamsQueryToStr(const sptr<AAFwk::IInterface> iIt)228 std::string DistributedWantParams::DistributedWantParamsQueryToStr(const sptr<AAFwk::IInterface> iIt)
229 {
230 IDistributedWantParams* obj = IDistributedWantParams::Query(iIt);
231 return obj == nullptr ? "" : static_cast<DistributedWantParamWrapper*>(obj)->ToString();
232 }
233
BooleanQueryEquals(const sptr<AAFwk::IInterface> iIt)234 bool DistributedWantParams::BooleanQueryEquals(const sptr<AAFwk::IInterface> iIt)
235 {
236 AAFwk::IBoolean* obj = AAFwk::IBoolean::Query(iIt);
237 return obj == nullptr ? false : static_cast<AAFwk::Boolean*>(obj)->Equals(*static_cast<AAFwk::Boolean*>(obj));
238 }
239
ByteQueryEquals(const sptr<AAFwk::IInterface> iIt)240 bool DistributedWantParams::ByteQueryEquals(const sptr<AAFwk::IInterface> iIt)
241 {
242 AAFwk::IByte* obj = AAFwk::IByte::Query(iIt);
243 return obj == nullptr ? false : static_cast<AAFwk::Byte*>(obj)->Equals(*static_cast<AAFwk::Byte*>(obj));
244 }
245
CharQueryEquals(const sptr<AAFwk::IInterface> iIt)246 bool DistributedWantParams::CharQueryEquals(const sptr<AAFwk::IInterface> iIt)
247 {
248 AAFwk::IChar* obj = AAFwk::IChar::Query(iIt);
249 return obj == nullptr ? false : static_cast<AAFwk::Char*>(obj)->Equals(*static_cast<AAFwk::Char*>(obj));
250 }
251
StringQueryEquals(const sptr<AAFwk::IInterface> iIt)252 bool DistributedWantParams::StringQueryEquals(const sptr<AAFwk::IInterface> iIt)
253 {
254 AAFwk::IString* obj = AAFwk::IString::Query(iIt);
255 return obj == nullptr ? false : static_cast<AAFwk::String*>(obj)->Equals(*static_cast<AAFwk::String*>(obj));
256 }
257
ArrayQueryEquals(const sptr<AAFwk::IInterface> iIt)258 bool DistributedWantParams::ArrayQueryEquals(const sptr<AAFwk::IInterface> iIt)
259 {
260 AAFwk::IArray* obj = AAFwk::IArray::Query(iIt);
261 return obj == nullptr ? false : static_cast<AAFwk::Array*>(obj)->Equals(*static_cast<AAFwk::Array*>(obj));
262 }
263
DistributedWantParamsQueryEquals(const sptr<AAFwk::IInterface> iIt)264 bool DistributedWantParams::DistributedWantParamsQueryEquals(const sptr<AAFwk::IInterface> iIt)
265 {
266 IDistributedWantParams* obj = IDistributedWantParams::Query(iIt);
267 return obj == nullptr ? false : static_cast<DistributedWantParamWrapper*>(obj)
268 ->Equals(*static_cast<DistributedWantParamWrapper*>(obj));
269 }
ShortQueryEquals(const sptr<AAFwk::IInterface> iIt)270 bool DistributedWantParams::ShortQueryEquals(const sptr<AAFwk::IInterface> iIt)
271 {
272 AAFwk::IShort* obj = AAFwk::IShort::Query(iIt);
273 return obj == nullptr ? false : static_cast<AAFwk::Short*>(obj)->Equals(*static_cast<AAFwk::Short*>(obj));
274 }
275
IntegerQueryEquals(const sptr<AAFwk::IInterface> iIt)276 bool DistributedWantParams::IntegerQueryEquals(const sptr<AAFwk::IInterface> iIt)
277 {
278 AAFwk::IInteger* obj = AAFwk::IInteger::Query(iIt);
279 return obj == nullptr ? false : static_cast<AAFwk::Integer*>(obj)->Equals(*static_cast<AAFwk::Integer*>(obj));
280 }
281
LongQueryEquals(const sptr<AAFwk::IInterface> iIt)282 bool DistributedWantParams::LongQueryEquals(const sptr<AAFwk::IInterface> iIt)
283 {
284 AAFwk::ILong* obj = AAFwk::ILong::Query(iIt);
285 return obj == nullptr ? false : static_cast<AAFwk::Long*>(obj)->Equals(*static_cast<AAFwk::Long*>(obj));
286 }
287
FloatQueryEquals(const sptr<AAFwk::IInterface> iIt)288 bool DistributedWantParams::FloatQueryEquals(const sptr<AAFwk::IInterface> iIt)
289 {
290 AAFwk::IFloat* obj = AAFwk::IFloat::Query(iIt);
291 return obj == nullptr ? false : static_cast<AAFwk::Float*>(obj)->Equals(*static_cast<AAFwk::Float*>(obj));
292 }
293
DoubleQueryEquals(const sptr<AAFwk::IInterface> iIt)294 bool DistributedWantParams::DoubleQueryEquals(const sptr<AAFwk::IInterface> iIt)
295 {
296 AAFwk::IDouble* obj = AAFwk::IDouble::Query(iIt);
297 return obj == nullptr ? false : static_cast<AAFwk::Double*>(obj)->Equals(*static_cast<AAFwk::Double*>(obj));
298 }
299
GetStringByType(const sptr<AAFwk::IInterface> iIt,int typeId)300 std::string DistributedWantParams::GetStringByType(const sptr<AAFwk::IInterface> iIt, int typeId)
301 {
302 auto iter = interfaceQueryToStrMap.find(typeId);
303 if (iter != interfaceQueryToStrMap.end()) {
304 DistributedWantParams::InterfaceQueryToStrFunc &func = iter->second;
305 return (*func)(iIt);
306 }
307 return "";
308 }
309 template<typename T1, typename T2, typename T3>
310 static void SetNewArray(const AAFwk::InterfaceID& id, AAFwk::IArray* orgIArray, sptr<AAFwk::IArray>& ao);
311
DistributedWantParams(const DistributedWantParams & wantParams)312 DistributedWantParams::DistributedWantParams(const DistributedWantParams& wantParams)
313 {
314 params_.clear();
315 NewParams(wantParams, *this);
316 }
317 // inner use function
NewParams(const DistributedWantParams & source,DistributedWantParams & dest)318 bool DistributedWantParams::NewParams(const DistributedWantParams& source, DistributedWantParams& dest)
319 {
320 // Deep copy
321 for (auto it = source.params_.begin(); it != source.params_.end(); it++) {
322 sptr<IInterface> o = it->second;
323 if (AAFwk::IString::Query(o) != nullptr) {
324 dest.params_[it->first] = AAFwk::String::Box(AAFwk::String::Unbox(AAFwk::IString::Query(o)));
325 } else if (AAFwk::IBoolean::Query(o) != nullptr) {
326 dest.params_[it->first] = AAFwk::Boolean::Box(AAFwk::Boolean::Unbox(AAFwk::IBoolean::Query(o)));
327 } else if (AAFwk::IByte::Query(o) != nullptr) {
328 dest.params_[it->first] = AAFwk::Byte::Box(AAFwk::Byte::Unbox(AAFwk::IByte::Query(o)));
329 } else if (AAFwk::IChar::Query(o) != nullptr) {
330 dest.params_[it->first] = AAFwk::Char::Box(AAFwk::Char::Unbox(AAFwk::IChar::Query(o)));
331 } else if (AAFwk::IShort::Query(o) != nullptr) {
332 dest.params_[it->first] = AAFwk::Short::Box(AAFwk::Short::Unbox(AAFwk::IShort::Query(o)));
333 } else if (AAFwk::IInteger::Query(o) != nullptr) {
334 dest.params_[it->first] = AAFwk::Integer::Box(AAFwk::Integer::Unbox(AAFwk::IInteger::Query(o)));
335 } else if (AAFwk::ILong::Query(o) != nullptr) {
336 dest.params_[it->first] = AAFwk::Long::Box(AAFwk::Long::Unbox(AAFwk::ILong::Query(o)));
337 } else if (AAFwk::IFloat::Query(o) != nullptr) {
338 dest.params_[it->first] = AAFwk::Float::Box(AAFwk::Float::Unbox(AAFwk::IFloat::Query(o)));
339 } else if (AAFwk::IDouble::Query(o) != nullptr) {
340 dest.params_[it->first] = AAFwk::Double::Box(AAFwk::Double::Unbox(AAFwk::IDouble::Query(o)));
341 } else if (AAFwk::IRemoteObjectWrap::Query(o) != nullptr) {
342 dest.params_[it->first] =
343 AAFwk::RemoteObjectWrap::Box(AAFwk::RemoteObjectWrap::UnBox(AAFwk::IRemoteObjectWrap::Query(o)));
344 } else if (IDistributedWantParams::Query(o) != nullptr) {
345 DistributedWantParams newDest(DistributedWantParamWrapper::Unbox(IDistributedWantParams::Query(o)));
346 dest.params_[it->first] = DistributedWantParamWrapper::Box(newDest);
347 } else if (AAFwk::IArray::Query(o) != nullptr) {
348 sptr<AAFwk::IArray> destAO = nullptr;
349 if (!NewArrayData(AAFwk::IArray::Query(o), destAO)) {
350 continue;
351 }
352 dest.params_[it->first] = destAO;
353 }
354 }
355 return true;
356 }
357
NewArrayData(AAFwk::IArray * source,sptr<AAFwk::IArray> & dest)358 bool DistributedWantParams::NewArrayData(AAFwk::IArray* source, sptr<AAFwk::IArray>& dest)
359 {
360 if (AAFwk::Array::IsBooleanArray(source)) {
361 SetNewArray<bool, AAFwk::Boolean, AAFwk::IBoolean>(AAFwk::g_IID_IBoolean, source, dest);
362 } else if (AAFwk::Array::IsCharArray(source)) {
363 SetNewArray<char, AAFwk::Char, AAFwk::IChar>(AAFwk::g_IID_IChar, source, dest);
364 } else if (AAFwk::Array::IsByteArray(source)) {
365 SetNewArray<AAFwk::byte, AAFwk::Byte, AAFwk::IByte>(AAFwk::g_IID_IByte, source, dest);
366 } else if (AAFwk::Array::IsShortArray(source)) {
367 SetNewArray<short, AAFwk::Short, AAFwk::IShort>(AAFwk::g_IID_IShort, source, dest);
368 } else if (AAFwk::Array::IsIntegerArray(source)) {
369 SetNewArray<int, AAFwk::Integer, AAFwk::IInteger>(AAFwk::g_IID_IInteger, source, dest);
370 } else if (AAFwk::Array::IsLongArray(source)) {
371 SetNewArray<long, AAFwk::Long, AAFwk::ILong>(AAFwk::g_IID_ILong, source, dest);
372 } else if (AAFwk::Array::IsFloatArray(source)) {
373 SetNewArray<float, AAFwk::Float, AAFwk::IFloat>(AAFwk::g_IID_IFloat, source, dest);
374 } else if (AAFwk::Array::IsDoubleArray(source)) {
375 SetNewArray<double, AAFwk::Double, AAFwk::IDouble>(AAFwk::g_IID_IDouble, source, dest);
376 } else if (AAFwk::Array::IsStringArray(source)) {
377 SetNewArray<std::string, AAFwk::String, AAFwk::IString>(AAFwk::g_IID_IString, source, dest);
378 } else {
379 return false;
380 }
381
382 if (dest == nullptr) {
383 return false;
384 }
385
386 return true;
387 }
388
operator =(const DistributedWantParams & other)389 DistributedWantParams& DistributedWantParams::operator=(const DistributedWantParams& other)
390 {
391 if (this != &other) {
392 params_.clear();
393 NewParams(other, *this);
394 }
395 return *this;
396 }
397
operator ==(const DistributedWantParams & other)398 bool DistributedWantParams::operator==(const DistributedWantParams& other)
399 {
400 if (this->params_.size() != other.params_.size()) {
401 return false;
402 }
403 for (auto itthis : this->params_) {
404 auto itother = other.params_.find(itthis.first);
405 if (itother == other.params_.end()) {
406 return false;
407 }
408 if (!CompareInterface(itother->second, itthis.second, DistributedWantParams::GetDataType(itother->second))) {
409 return false;
410 }
411 }
412 return true;
413 }
414
GetDataType(const sptr<IInterface> iIt)415 int DistributedWantParams::GetDataType(const sptr<IInterface> iIt)
416 {
417 if (iIt != nullptr && AAFwk::IBoolean::Query(iIt) != nullptr) {
418 return VALUE_TYPE_BOOLEAN;
419 } else if (iIt != nullptr && AAFwk::IByte::Query(iIt) != nullptr) {
420 return VALUE_TYPE_BYTE;
421 } else if (iIt != nullptr && AAFwk::IChar::Query(iIt) != nullptr) {
422 return VALUE_TYPE_CHAR;
423 } else if (iIt != nullptr && AAFwk::IString::Query(iIt) != nullptr) {
424 return VALUE_TYPE_STRING;
425 } else if (iIt != nullptr && AAFwk::IArray::Query(iIt) != nullptr) {
426 return VALUE_TYPE_ARRAY;
427 } else if (iIt != nullptr && IDistributedWantParams::Query(iIt) != nullptr) {
428 return VALUE_TYPE_WANTPARAMS;
429 } else {
430 return GetNumberDataType(iIt);
431 }
432 }
433
GetNumberDataType(const sptr<AAFwk::IInterface> iIt)434 int DistributedWantParams::GetNumberDataType(const sptr<AAFwk::IInterface> iIt)
435 {
436 if (iIt != nullptr && AAFwk::IShort::Query(iIt) != nullptr) {
437 return VALUE_TYPE_SHORT;
438 } else if (iIt != nullptr && AAFwk::IInteger::Query(iIt) != nullptr) {
439 return VALUE_TYPE_INT;
440 } else if (iIt != nullptr && AAFwk::ILong::Query(iIt) != nullptr) {
441 return VALUE_TYPE_LONG;
442 } else if (iIt != nullptr && AAFwk::IFloat::Query(iIt) != nullptr) {
443 return VALUE_TYPE_FLOAT;
444 } else if (iIt != nullptr && AAFwk::IDouble::Query(iIt) != nullptr) {
445 return VALUE_TYPE_DOUBLE;
446 }
447 return VALUE_TYPE_NULL;
448 }
449
GetInterfaceByType(int typeId,const std::string & value)450 sptr<IInterface> DistributedWantParams::GetInterfaceByType(int typeId, const std::string& value)
451 {
452 if (typeId == VALUE_TYPE_BOOLEAN) {
453 return AAFwk::Boolean::Parse(value);
454 } else if (typeId == VALUE_TYPE_BYTE) {
455 return AAFwk::Byte::Parse(value);
456 } else if (typeId == VALUE_TYPE_CHAR) {
457 return AAFwk::Char::Parse(value);
458 } else if (typeId == VALUE_TYPE_SHORT) {
459 return AAFwk::Short::Parse(value);
460 } else if (typeId == VALUE_TYPE_INT) {
461 return AAFwk::Integer::Parse(value);
462 } else if (typeId == VALUE_TYPE_LONG) {
463 return AAFwk::Long::Parse(value);
464 } else if (typeId == VALUE_TYPE_FLOAT) {
465 return AAFwk::Float::Parse(value);
466 } else if (typeId == VALUE_TYPE_DOUBLE) {
467 return AAFwk::Double::Parse(value);
468 } else if (typeId == VALUE_TYPE_STRING) {
469 return AAFwk::String::Parse(value);
470 } else if (typeId == VALUE_TYPE_ARRAY) {
471 return AAFwk::Array::Parse(value);
472 }
473
474 return nullptr;
475 }
476
CompareInterface(const sptr<IInterface> iIt1,const sptr<IInterface> iIt2,int typeId)477 bool DistributedWantParams::CompareInterface(const sptr<IInterface> iIt1, const sptr<IInterface> iIt2, int typeId)
478 {
479 bool flag = false;
480 auto iter = interfaceQueryEqualsMap.find(typeId);
481 if (iter != interfaceQueryEqualsMap.end()) {
482 DistributedWantParams::InterfaceQueryEqualsFunc &func = iter->second;
483 return (*func)(iIt1);
484 }
485 return flag;
486 }
487
SetParam(const std::string & key,IInterface * value)488 void DistributedWantParams::SetParam(const std::string& key, IInterface* value)
489 {
490 params_[key] = value;
491 }
492
GetParam(const std::string & key) const493 sptr<IInterface> DistributedWantParams::GetParam(const std::string& key) const
494 {
495 auto it = params_.find(key);
496 if (it == params_.cend()) {
497 return nullptr;
498 }
499 return it->second;
500 }
501
GetParams() const502 const std::map<std::string, sptr<IInterface>>& DistributedWantParams::GetParams() const
503 {
504 return params_;
505 }
506
KeySet() const507 const std::set<std::string> DistributedWantParams::KeySet() const
508 {
509 std::set<std::string> keySet;
510 keySet.clear();
511
512 for (auto it : params_) {
513 keySet.emplace(it.first);
514 }
515
516 return keySet;
517 }
518
Remove(const std::string & key)519 void DistributedWantParams::Remove(const std::string& key)
520 {
521 params_.erase(key);
522 }
523
HasParam(const std::string & key) const524 bool DistributedWantParams::HasParam(const std::string& key) const
525 {
526 return (params_.count(key) > 0);
527 }
528
Size() const529 int DistributedWantParams::Size() const
530 {
531 return params_.size();
532 }
533
IsEmpty() const534 bool DistributedWantParams::IsEmpty() const
535 {
536 return (params_.size() == 0);
537 }
538
WriteToParcelString(Parcel & parcel,sptr<IInterface> & o) const539 bool DistributedWantParams::WriteToParcelString(Parcel& parcel, sptr<IInterface>& o) const
540 {
541 std::string value = AAFwk::String::Unbox(AAFwk::IString::Query(o));
542 if (!parcel.WriteInt32(VALUE_TYPE_STRING)) {
543 return false;
544 }
545 return parcel.WriteString16(Str8ToStr16(value));
546 }
547
WriteToParcelBool(Parcel & parcel,sptr<IInterface> & o) const548 bool DistributedWantParams::WriteToParcelBool(Parcel& parcel, sptr<IInterface>& o) const
549 {
550 bool value = AAFwk::Boolean::Unbox(AAFwk::IBoolean::Query(o));
551 if (!parcel.WriteInt32(VALUE_TYPE_BOOLEAN)) {
552 return false;
553 }
554 return parcel.WriteInt8(value);
555 }
556
WriteToParcelWantParams(Parcel & parcel,sptr<IInterface> & o) const557 bool DistributedWantParams::WriteToParcelWantParams(Parcel& parcel, sptr<IInterface>& o) const
558 {
559 DistributedWantParams value = DistributedWantParamWrapper::Unbox(IDistributedWantParams::Query(o));
560
561 auto dType = value.GetParam(TYPE_PROPERTY);
562 AAFwk::IString *typeP = AAFwk::IString::Query(dType);
563 if (typeP != nullptr) {
564 std::string typeValue = AAFwk::String::Unbox(typeP);
565 if (typeValue == FD) {
566 return WriteToParcelFD(parcel, value);
567 }
568 if (typeValue == REMOTE_OBJECT) {
569 return WriteToParcelRemoteObject(parcel, value);
570 }
571 }
572
573 if (!parcel.WriteInt32(VALUE_TYPE_WANTPARAMS)) {
574 return false;
575 }
576
577 auto wantParams = static_cast<DistributedWantParamWrapper*>(IDistributedWantParams::Query(o));
578 if (wantParams == nullptr) {
579 return false;
580 }
581 return parcel.WriteString16(Str8ToStr16(wantParams->ToString()));
582 }
583
WriteToParcelFD(Parcel & parcel,const DistributedWantParams & value) const584 bool DistributedWantParams::WriteToParcelFD(Parcel& parcel, const DistributedWantParams& value) const
585 {
586 if (!parcel.WriteInt32(VALUE_TYPE_FD)) {
587 return false;
588 }
589
590 auto dFdWrap = value.GetParam(VALUE_PROPERTY);
591 AAFwk::IInteger *fdIWrap = AAFwk::IInteger::Query(dFdWrap);
592 if (fdIWrap != nullptr) {
593 int fd = AAFwk::Integer::Unbox(fdIWrap);
594 auto messageParcel = static_cast<MessageParcel*>(&parcel);
595 if (messageParcel == nullptr) {
596 return false;
597 }
598 bool ret = messageParcel->WriteFileDescriptor(fd);
599 return ret;
600 }
601
602 return false;
603 }
604
WriteToParcelRemoteObject(Parcel & parcel,const DistributedWantParams & value) const605 bool DistributedWantParams::WriteToParcelRemoteObject(Parcel& parcel, const DistributedWantParams& value) const
606 {
607 if (!parcel.WriteInt32(VALUE_TYPE_REMOTE_OBJECT)) {
608 return false;
609 }
610
611 auto remoteObjWrap = value.GetParam(VALUE_PROPERTY);
612 AAFwk::IRemoteObjectWrap *remoteObjectIWrap = AAFwk::IRemoteObjectWrap::Query(remoteObjWrap);
613 if (remoteObjectIWrap != nullptr) {
614 auto remoteObject = AAFwk::RemoteObjectWrap::UnBox(remoteObjectIWrap);
615 auto messageParcel = static_cast<MessageParcel*>(&parcel);
616 if (messageParcel == nullptr) {
617 return false;
618 }
619 bool ret = messageParcel->WriteRemoteObject(remoteObject);
620 return ret;
621 }
622 return false;
623 }
624
WriteToParcelByte(Parcel & parcel,sptr<IInterface> & o) const625 bool DistributedWantParams::WriteToParcelByte(Parcel& parcel, sptr<IInterface>& o) const
626 {
627 AAFwk::byte value = AAFwk::Byte::Unbox(AAFwk::IByte::Query(o));
628 if (!parcel.WriteInt32(VALUE_TYPE_BYTE)) {
629 return false;
630 }
631 return parcel.WriteInt8(value);
632 }
633
WriteToParcelChar(Parcel & parcel,sptr<IInterface> & o) const634 bool DistributedWantParams::WriteToParcelChar(Parcel& parcel, sptr<IInterface>& o) const
635 {
636 AAFwk::zchar value = AAFwk::Char::Unbox(AAFwk::IChar::Query(o));
637 if (!parcel.WriteInt32(VALUE_TYPE_CHAR)) {
638 return false;
639 }
640 return parcel.WriteInt32(value);
641 }
642
WriteToParcelShort(Parcel & parcel,sptr<IInterface> & o) const643 bool DistributedWantParams::WriteToParcelShort(Parcel& parcel, sptr<IInterface>& o) const
644 {
645 short value = AAFwk::Short::Unbox(AAFwk::IShort::Query(o));
646 if (!parcel.WriteInt32(VALUE_TYPE_SHORT)) {
647 return false;
648 }
649 return parcel.WriteInt16(value);
650 }
651
WriteToParcelInt(Parcel & parcel,sptr<IInterface> & o) const652 bool DistributedWantParams::WriteToParcelInt(Parcel& parcel, sptr<IInterface>& o) const
653 {
654 int value = AAFwk::Integer::Unbox(AAFwk::IInteger::Query(o));
655 if (!parcel.WriteInt32(VALUE_TYPE_INT)) {
656 return false;
657 }
658 return parcel.WriteInt32(value);
659 }
660
WriteToParcelLong(Parcel & parcel,sptr<IInterface> & o) const661 bool DistributedWantParams::WriteToParcelLong(Parcel& parcel, sptr<IInterface>& o) const
662 {
663 long value = AAFwk::Long::Unbox(AAFwk::ILong::Query(o));
664 if (!parcel.WriteInt32(VALUE_TYPE_LONG)) {
665 return false;
666 }
667 return parcel.WriteInt64(value);
668 }
669
WriteToParcelFloat(Parcel & parcel,sptr<IInterface> & o) const670 bool DistributedWantParams::WriteToParcelFloat(Parcel& parcel, sptr<IInterface>& o) const
671 {
672 float value = AAFwk::Float::Unbox(AAFwk::IFloat::Query(o));
673 if (!parcel.WriteInt32(VALUE_TYPE_FLOAT)) {
674 return false;
675 }
676 return parcel.WriteFloat(value);
677 }
678
WriteToParcelDouble(Parcel & parcel,sptr<IInterface> & o) const679 bool DistributedWantParams::WriteToParcelDouble(Parcel& parcel, sptr<IInterface>& o) const
680 {
681 double value = AAFwk::Double::Unbox(AAFwk::IDouble::Query(o));
682 if (!parcel.WriteInt32(VALUE_TYPE_DOUBLE)) {
683 return false;
684 }
685 return parcel.WriteDouble(value);
686 }
687
WriteMarshalling(Parcel & parcel,sptr<IInterface> & o) const688 bool DistributedWantParams::WriteMarshalling(Parcel& parcel, sptr<IInterface>& o) const
689 {
690 if (AAFwk::IString::Query(o) != nullptr) {
691 return WriteToParcelString(parcel, o);
692 } else if (AAFwk::IBoolean::Query(o) != nullptr) {
693 return WriteToParcelBool(parcel, o);
694 } else if (AAFwk::IByte::Query(o) != nullptr) {
695 return WriteToParcelByte(parcel, o);
696 } else if (AAFwk::IChar::Query(o) != nullptr) {
697 return WriteToParcelChar(parcel, o);
698 } else if (AAFwk::IShort::Query(o) != nullptr) {
699 return WriteToParcelShort(parcel, o);
700 } else if (AAFwk::IInteger::Query(o) != nullptr) {
701 return WriteToParcelInt(parcel, o);
702 } else if (AAFwk::ILong::Query(o) != nullptr) {
703 return WriteToParcelLong(parcel, o);
704 } else if (AAFwk::IFloat::Query(o) != nullptr) {
705 return WriteToParcelFloat(parcel, o);
706 } else if (AAFwk::IDouble::Query(o) != nullptr) {
707 return WriteToParcelDouble(parcel, o);
708 } else if (IDistributedWantParams::Query(o) != nullptr) {
709 return WriteToParcelWantParams(parcel, o);
710 } else {
711 AAFwk::IArray* ao = AAFwk::IArray::Query(o);
712 if (ao != nullptr) {
713 sptr<AAFwk::IArray> array(ao);
714 return WriteArrayToParcel(parcel, array);
715 } else {
716 return true;
717 }
718 }
719 }
720
DoMarshalling(Parcel & parcel) const721 bool DistributedWantParams::DoMarshalling(Parcel& parcel) const
722 {
723 size_t dSize = params_.size();
724 if (!cachedUnsupportedData_.empty()) {
725 dSize += cachedUnsupportedData_.size();
726 }
727
728 if (!parcel.WriteInt32(dSize)) {
729 return false;
730 }
731
732 auto iter = params_.cbegin();
733 while (iter != params_.cend()) {
734 std::string key = iter->first;
735 sptr<AAFwk::IInterface> o = iter->second;
736 if (!parcel.WriteString16(Str8ToStr16(key))) {
737 return false;
738 }
739
740 if (!WriteMarshalling(parcel, o)) {
741 return false;
742 }
743 iter++;
744 }
745
746 if (!cachedUnsupportedData_.empty()) {
747 for (const DistributedUnsupportedData& dData : cachedUnsupportedData_) {
748 if (!parcel.WriteString16(dData.key)) {
749 return false;
750 }
751 if (!parcel.WriteInt32(dData.type)) {
752 return false;
753 }
754 if (!parcel.WriteInt32(dData.size)) {
755 return false;
756 }
757 // Corresponding to Parcel#writeByteArray() in Java.
758 if (!parcel.WriteInt32(dData.size)) {
759 return false;
760 }
761 if (!parcel.WriteBuffer(dData.buffer, dData.size)) {
762 return false;
763 }
764 }
765 }
766 return true;
767 }
768
Marshalling(Parcel & parcel) const769 bool DistributedWantParams::Marshalling(Parcel& parcel) const
770 {
771 return DoMarshalling(parcel);
772 }
773
774 template<typename dataType, typename className>
SetArray(const AAFwk::InterfaceID & id,const std::vector<dataType> & value,sptr<AAFwk::IArray> & ao)775 static bool SetArray(const AAFwk::InterfaceID& id, const std::vector<dataType>& value, sptr<AAFwk::IArray>& ao)
776 {
777 typename std::vector<dataType>::size_type size = value.size();
778 ao = new (std::nothrow) AAFwk::Array(size, id);
779 if (ao != nullptr) {
780 for (typename std::vector<dataType>::size_type i = 0; i < size; i++) {
781 ao->Set(i, className::Box(value[i]));
782 }
783 return true;
784 }
785 return false;
786 }
787
788 template<typename T1, typename T2, typename T3>
FillArray(AAFwk::IArray * ao,std::vector<T1> & array)789 static void FillArray(AAFwk::IArray* ao, std::vector<T1>&array)
790 {
791 auto func = [&](AAFwk::IInterface* object) {
792 if (object != nullptr) {
793 T3* value = T3::Query(object);
794 if (value != nullptr) {
795 array.push_back(T2::Unbox(value));
796 }
797 }
798 };
799 AAFwk::Array::ForEach(ao, func);
800 }
801 // inner use template function
802 template<typename T1, typename T2, typename T3>
SetNewArray(const AAFwk::InterfaceID & id,AAFwk::IArray * orgIArray,sptr<AAFwk::IArray> & ao)803 static void SetNewArray(const AAFwk::InterfaceID& id, AAFwk::IArray* orgIArray, sptr<AAFwk::IArray>& ao)
804 {
805 if (orgIArray == nullptr) {
806 return;
807 }
808 std::vector<T1> dArray;
809 auto func = [&dArray](AAFwk::IInterface* object) {
810 if (object != nullptr) {
811 T3* value = T3::Query(object);
812 if (value != nullptr) {
813 dArray.push_back(T2::Unbox(value));
814 }
815 }
816 };
817 AAFwk::Array::ForEach(orgIArray, func);
818
819 typename std::vector<T1>::size_type size = dArray.size();
820 if (size > 0) {
821 ao = new (std::nothrow) AAFwk::Array(size, id);
822 if (ao != nullptr) {
823 for (typename std::vector<T1>::size_type i = 0; i < size; i++) {
824 ao->Set(i, T2::Box(dArray[i]));
825 }
826 }
827 }
828 }
829
WriteArrayToParcelString(Parcel & parcel,AAFwk::IArray * ao) const830 bool DistributedWantParams::WriteArrayToParcelString(Parcel& parcel, AAFwk::IArray* ao) const
831 {
832 if (ao == nullptr) {
833 return false;
834 }
835
836 std::vector<std::u16string> array;
837 auto func = [&](IInterface* object) {
838 std::string s = AAFwk::String::Unbox(AAFwk::IString::Query(object));
839 array.push_back(Str8ToStr16(s));
840 };
841
842 AAFwk::Array::ForEach(ao, func);
843
844 if (!parcel.WriteInt32(VALUE_TYPE_STRINGARRAY)) {
845 return false;
846 }
847 return parcel.WriteString16Vector(array);
848 }
849
WriteArrayToParcelBool(Parcel & parcel,AAFwk::IArray * ao) const850 bool DistributedWantParams::WriteArrayToParcelBool(Parcel& parcel, AAFwk::IArray* ao) const
851 {
852 if (ao == nullptr) {
853 return false;
854 }
855
856 std::vector<int8_t> array;
857 std::vector<int32_t> intArray;
858 FillArray<int8_t, AAFwk::Boolean, AAFwk::IBoolean>(ao, array);
859 if (!parcel.WriteInt32(VALUE_TYPE_BOOLEANARRAY)) {
860 return false;
861 }
862
863 for (std::vector<int8_t>::size_type i = 0; i < array.size(); i++) {
864 intArray.push_back(array[i]);
865 }
866 return parcel.WriteInt32Vector(intArray);
867 }
868
WriteArrayToParcelByte(Parcel & parcel,AAFwk::IArray * ao) const869 bool DistributedWantParams::WriteArrayToParcelByte(Parcel& parcel, AAFwk::IArray* ao) const
870 {
871 if (ao == nullptr) {
872 return false;
873 }
874
875 std::vector<int8_t> array;
876 FillArray<int8_t, AAFwk::Byte, AAFwk::IByte>(ao, array);
877 if (!parcel.WriteInt32(VALUE_TYPE_BYTEARRAY)) {
878 return false;
879 }
880 return parcel.WriteInt8Vector(array);
881 }
882
WriteArrayToParcelChar(Parcel & parcel,AAFwk::IArray * ao) const883 bool DistributedWantParams::WriteArrayToParcelChar(Parcel& parcel, AAFwk::IArray* ao) const
884 {
885 if (ao == nullptr) {
886 return false;
887 }
888
889 std::vector<int32_t> array;
890 FillArray<int32_t, AAFwk::Char, AAFwk::IChar>(ao, array);
891 if (!parcel.WriteInt32(VALUE_TYPE_CHARARRAY)) {
892 return false;
893 }
894 return parcel.WriteInt32Vector(array);
895 }
896
WriteArrayToParcelShort(Parcel & parcel,AAFwk::IArray * ao) const897 bool DistributedWantParams::WriteArrayToParcelShort(Parcel& parcel, AAFwk::IArray* ao) const
898 {
899 if (ao == nullptr) {
900 return false;
901 }
902
903 std::vector<short> array;
904 FillArray<short, AAFwk::Short, AAFwk::IShort>(ao, array);
905 if (!parcel.WriteInt32(VALUE_TYPE_SHORTARRAY)) {
906 return false;
907 }
908 return parcel.WriteInt16Vector(array);
909 }
910
WriteArrayToParcelInt(Parcel & parcel,AAFwk::IArray * ao) const911 bool DistributedWantParams::WriteArrayToParcelInt(Parcel& parcel, AAFwk::IArray* ao) const
912 {
913 if (ao == nullptr) {
914 return false;
915 }
916
917 std::vector<int> array;
918 FillArray<int, AAFwk::Integer, AAFwk::IInteger>(ao, array);
919 if (!parcel.WriteInt32(VALUE_TYPE_INTARRAY)) {
920 return false;
921 }
922 return parcel.WriteInt32Vector(array);
923 }
924
WriteArrayToParcelLong(Parcel & parcel,AAFwk::IArray * ao) const925 bool DistributedWantParams::WriteArrayToParcelLong(Parcel& parcel, AAFwk::IArray* ao) const
926 {
927 if (ao == nullptr) {
928 return false;
929 }
930
931 std::vector<int64_t> array;
932 FillArray<int64_t, AAFwk::Long, AAFwk::ILong>(ao, array);
933 if (!parcel.WriteInt32(VALUE_TYPE_LONGARRAY)) {
934 return false;
935 }
936 return parcel.WriteInt64Vector(array);
937 }
938
WriteArrayToParcelFloat(Parcel & parcel,AAFwk::IArray * ao) const939 bool DistributedWantParams::WriteArrayToParcelFloat(Parcel& parcel, AAFwk::IArray* ao) const
940 {
941 if (ao == nullptr) {
942 return false;
943 }
944
945 std::vector<float> array;
946 FillArray<float, AAFwk::Float, AAFwk::IFloat>(ao, array);
947 if (!parcel.WriteInt32(VALUE_TYPE_FLOATARRAY)) {
948 return false;
949 }
950 return parcel.WriteFloatVector(array);
951 }
952
WriteArrayToParcelDouble(Parcel & parcel,AAFwk::IArray * ao) const953 bool DistributedWantParams::WriteArrayToParcelDouble(Parcel& parcel, AAFwk::IArray* ao) const
954 {
955 if (ao == nullptr) {
956 return false;
957 }
958
959 std::vector<double> array;
960 FillArray<double, AAFwk::Double, AAFwk::IDouble>(ao, array);
961 if (!parcel.WriteInt32(VALUE_TYPE_DOUBLEARRAY)) {
962 return false;
963 }
964 return parcel.WriteDoubleVector(array);
965 }
966
WriteArrayToParcel(Parcel & parcel,AAFwk::IArray * ao) const967 bool DistributedWantParams::WriteArrayToParcel(Parcel& parcel, AAFwk::IArray* ao) const
968 {
969 if (AAFwk::Array::IsStringArray(ao)) {
970 return WriteArrayToParcelString(parcel, ao);
971 } else if (AAFwk::Array::IsBooleanArray(ao)) {
972 return WriteArrayToParcelBool(parcel, ao);
973 } else if (AAFwk::Array::IsByteArray(ao)) {
974 return WriteArrayToParcelByte(parcel, ao);
975 } else if (AAFwk::Array::IsCharArray(ao)) {
976 return WriteArrayToParcelChar(parcel, ao);
977 } else if (AAFwk::Array::IsShortArray(ao)) {
978 return WriteArrayToParcelShort(parcel, ao);
979 } else if (AAFwk::Array::IsIntegerArray(ao)) {
980 return WriteArrayToParcelInt(parcel, ao);
981 } else if (AAFwk::Array::IsLongArray(ao)) {
982 return WriteArrayToParcelLong(parcel, ao);
983 } else if (AAFwk::Array::IsFloatArray(ao)) {
984 return WriteArrayToParcelFloat(parcel, ao);
985 } else if (AAFwk::Array::IsDoubleArray(ao)) {
986 return WriteArrayToParcelDouble(parcel, ao);
987 } else {
988 return true;
989 }
990 }
991
ReadFromParcelArrayString(Parcel & parcel,sptr<AAFwk::IArray> & ao)992 bool DistributedWantParams::ReadFromParcelArrayString(Parcel& parcel, sptr<AAFwk::IArray>& ao)
993 {
994 std::vector<std::u16string> value;
995 if (!parcel.ReadString16Vector(&value)) {
996 return false;
997 }
998
999 std::vector<std::u16string>::size_type size = value.size();
1000 ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IString);
1001 if (ao == nullptr) {
1002 return false;
1003 }
1004 if (ao != nullptr) {
1005 for (std::vector<std::u16string>::size_type i = 0; i < size; i++) {
1006 ao->Set(i, AAFwk::String::Box(Str16ToStr8(value[i])));
1007 }
1008 return true;
1009 }
1010 return false;
1011 }
1012
ReadFromParcelArrayBool(Parcel & parcel,sptr<AAFwk::IArray> & ao)1013 bool DistributedWantParams::ReadFromParcelArrayBool(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1014 {
1015 std::vector<int32_t> value;
1016 std::vector<int8_t> boolValue;
1017 if (!parcel.ReadInt32Vector(&value)) {
1018 return false;
1019 }
1020
1021 std::vector<int32_t>::size_type size = value.size();
1022 for (std::vector<int32_t>::size_type i = 0; i < size; i++) {
1023 boolValue.push_back(value[i]);
1024 }
1025 return SetArray<int8_t, AAFwk::Boolean>(AAFwk::g_IID_IBoolean, boolValue, ao);
1026 }
1027
ReadFromParcelArrayByte(Parcel & parcel,sptr<AAFwk::IArray> & ao)1028 bool DistributedWantParams::ReadFromParcelArrayByte(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1029 {
1030 std::vector<int8_t> value;
1031 if (!parcel.ReadInt8Vector(&value)) {
1032 return false;
1033 }
1034 return SetArray<int8_t, AAFwk::Byte>(AAFwk::g_IID_IByte, value, ao);
1035 }
1036
ReadFromParcelArrayChar(Parcel & parcel,sptr<AAFwk::IArray> & ao)1037 bool DistributedWantParams::ReadFromParcelArrayChar(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1038 {
1039 std::vector<int32_t> value;
1040 if (!parcel.ReadInt32Vector(&value)) {
1041 return false;
1042 }
1043 return SetArray<int32_t, AAFwk::Char>(AAFwk::g_IID_IChar, value, ao);
1044 }
1045
ReadFromParcelArrayShort(Parcel & parcel,sptr<AAFwk::IArray> & ao)1046 bool DistributedWantParams::ReadFromParcelArrayShort(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1047 {
1048 std::vector<short> value;
1049 if (!parcel.ReadInt16Vector(&value)) {
1050 return false;
1051 }
1052 return SetArray<short, AAFwk::Short>(AAFwk::g_IID_IShort, value, ao);
1053 }
1054
ReadFromParcelArrayInt(Parcel & parcel,sptr<AAFwk::IArray> & ao)1055 bool DistributedWantParams::ReadFromParcelArrayInt(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1056 {
1057 std::vector<int> value;
1058 if (!parcel.ReadInt32Vector(&value)) {
1059 return false;
1060 }
1061 return SetArray<int, AAFwk::Integer>(AAFwk::g_IID_IInteger, value, ao);
1062 }
1063
ReadFromParcelArrayLong(Parcel & parcel,sptr<AAFwk::IArray> & ao)1064 bool DistributedWantParams::ReadFromParcelArrayLong(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1065 {
1066 std::vector<int64_t> value;
1067 if (!parcel.ReadInt64Vector(&value)) {
1068 return false;
1069 }
1070
1071 #ifdef WANT_PARAM_USE_LONG
1072 return SetArray<int64_t, Long>(g_IID_ILong, value, ao);
1073 #else
1074 std::vector<std::string> strList;
1075 for (size_t i = 0; i < value.size(); i++) {
1076 strList.push_back(std::to_string(value[i]));
1077 }
1078 return SetArray<std::string, AAFwk::String>(AAFwk::g_IID_IString, strList, ao);
1079 #endif
1080 }
1081
ReadFromParcelArrayFloat(Parcel & parcel,sptr<AAFwk::IArray> & ao)1082 bool DistributedWantParams::ReadFromParcelArrayFloat(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1083 {
1084 std::vector<float> value;
1085 if (!parcel.ReadFloatVector(&value)) {
1086 return false;
1087 }
1088 return SetArray<float, AAFwk::Float>(AAFwk::g_IID_IFloat, value, ao);
1089 }
1090
ReadFromParcelArrayDouble(Parcel & parcel,sptr<AAFwk::IArray> & ao)1091 bool DistributedWantParams::ReadFromParcelArrayDouble(Parcel& parcel, sptr<AAFwk::IArray>& ao)
1092 {
1093 std::vector<double> value;
1094 if (!parcel.ReadDoubleVector(&value)) {
1095 return false;
1096 }
1097 return SetArray<double, AAFwk::Double>(AAFwk::g_IID_IDouble, value, ao);
1098 }
1099
ReadArrayToParcel(Parcel & parcel,int type,sptr<AAFwk::IArray> & ao)1100 bool DistributedWantParams::ReadArrayToParcel(Parcel& parcel, int type, sptr<AAFwk::IArray>& ao)
1101 {
1102 switch (type) {
1103 case VALUE_TYPE_STRINGARRAY:
1104 case VALUE_TYPE_CHARSEQUENCEARRAY:
1105 return ReadFromParcelArrayString(parcel, ao);
1106 case VALUE_TYPE_BOOLEANARRAY:
1107 return ReadFromParcelArrayBool(parcel, ao);
1108 case VALUE_TYPE_BYTEARRAY:
1109 return ReadFromParcelArrayByte(parcel, ao);
1110 case VALUE_TYPE_CHARARRAY:
1111 return ReadFromParcelArrayChar(parcel, ao);
1112 case VALUE_TYPE_SHORTARRAY:
1113 return ReadFromParcelArrayShort(parcel, ao);
1114 case VALUE_TYPE_INTARRAY:
1115 return ReadFromParcelArrayInt(parcel, ao);
1116 case VALUE_TYPE_LONGARRAY:
1117 return ReadFromParcelArrayLong(parcel, ao);
1118 case VALUE_TYPE_FLOATARRAY:
1119 return ReadFromParcelArrayFloat(parcel, ao);
1120 case VALUE_TYPE_DOUBLEARRAY:
1121 return ReadFromParcelArrayDouble(parcel, ao);
1122 default:
1123 break;
1124 }
1125
1126 return true;
1127 }
1128
ReadFromParcelString(Parcel & parcel,const std::string & key)1129 bool DistributedWantParams::ReadFromParcelString(Parcel& parcel, const std::string& key)
1130 {
1131 std::u16string value = parcel.ReadString16();
1132 std::string strValue(Str16ToStr8(value));
1133 sptr<IInterface> intf = AAFwk::String::Box(Str16ToStr8(value));
1134 if (intf) {
1135 SetParam(key, intf);
1136 }
1137 return true;
1138 }
1139
ReadFromParcelBool(Parcel & parcel,const std::string & key)1140 bool DistributedWantParams::ReadFromParcelBool(Parcel& parcel, const std::string& key)
1141 {
1142 int8_t value;
1143 if (parcel.ReadInt8(value)) {
1144 sptr<IInterface> intf = AAFwk::Boolean::Box(value);
1145 if (intf) {
1146 SetParam(key, intf);
1147 }
1148 return true;
1149 } else {
1150 return false;
1151 }
1152 }
1153
ReadFromParcelInt8(Parcel & parcel,const std::string & key)1154 bool DistributedWantParams::ReadFromParcelInt8(Parcel& parcel, const std::string& key)
1155 {
1156 int8_t value;
1157 if (parcel.ReadInt8(value)) {
1158 sptr<IInterface> intf = AAFwk::Byte::Box(value);
1159 if (intf) {
1160 SetParam(key, intf);
1161 }
1162 return true;
1163 } else {
1164 return false;
1165 }
1166 }
1167
ReadFromParcelChar(Parcel & parcel,const std::string & key)1168 bool DistributedWantParams::ReadFromParcelChar(Parcel& parcel, const std::string& key)
1169 {
1170 int32_t value;
1171 if (parcel.ReadInt32(value)) {
1172 sptr<IInterface> intf = AAFwk::Char::Box(value);
1173 if (intf) {
1174 SetParam(key, intf);
1175 }
1176 return true;
1177 } else {
1178 return false;
1179 }
1180 }
1181
ReadFromParcelShort(Parcel & parcel,const std::string & key)1182 bool DistributedWantParams::ReadFromParcelShort(Parcel& parcel, const std::string& key)
1183 {
1184 short value;
1185 if (parcel.ReadInt16(value)) {
1186 sptr<IInterface> intf = AAFwk::Short::Box(value);
1187 if (intf) {
1188 SetParam(key, intf);
1189 }
1190 return true;
1191 } else {
1192 return false;
1193 }
1194 }
1195
ReadFromParcelInt(Parcel & parcel,const std::string & key)1196 bool DistributedWantParams::ReadFromParcelInt(Parcel& parcel, const std::string& key)
1197 {
1198 int value;
1199 if (parcel.ReadInt32(value)) {
1200 sptr<IInterface> intf = AAFwk::Integer::Box(value);
1201 if (intf) {
1202 SetParam(key, intf);
1203 }
1204 return true;
1205 } else {
1206 return false;
1207 }
1208 }
1209
ReadFromParcelWantParamWrapper(Parcel & parcel,const std::string & key,int type)1210 bool DistributedWantParams::ReadFromParcelWantParamWrapper(Parcel& parcel, const std::string& key, int type)
1211 {
1212 if (type == VALUE_TYPE_FD) {
1213 return ReadFromParcelFD(parcel, key);
1214 }
1215
1216 if (type == VALUE_TYPE_REMOTE_OBJECT) {
1217 return ReadFromParcelRemoteObject(parcel, key);
1218 }
1219
1220 std::u16string value = parcel.ReadString16();
1221 sptr<IInterface> intf = DistributedWantParamWrapper::Parse(Str16ToStr8(value));
1222 if (intf) {
1223 SetParam(key, intf);
1224 }
1225 return true;
1226 }
1227
ReadFromParcelFD(Parcel & parcel,const std::string & key)1228 bool DistributedWantParams::ReadFromParcelFD(Parcel& parcel, const std::string& key)
1229 {
1230 auto messageParcel = static_cast<MessageParcel*>(&parcel);
1231 if (messageParcel == nullptr) {
1232 return false;
1233 }
1234 auto fd = messageParcel->ReadFileDescriptor();
1235 DistributedWantParams wp;
1236 wp.SetParam(TYPE_PROPERTY, AAFwk::String::Box(FD));
1237 wp.SetParam(VALUE_PROPERTY, AAFwk::Integer::Box(fd));
1238 sptr<IDistributedWantParams> pWantParams = DistributedWantParamWrapper::Box(wp);
1239 SetParam(key, pWantParams);
1240 return true;
1241 }
1242
ReadFromParcelRemoteObject(Parcel & parcel,const std::string & key)1243 bool DistributedWantParams::ReadFromParcelRemoteObject(Parcel& parcel, const std::string& key)
1244 {
1245 auto messageParcel = static_cast<MessageParcel*>(&parcel);
1246 if (messageParcel == nullptr) {
1247 return false;
1248 }
1249 auto remoteObject = messageParcel->ReadRemoteObject();
1250 DistributedWantParams wp;
1251 wp.SetParam(TYPE_PROPERTY, AAFwk::String::Box(REMOTE_OBJECT));
1252 wp.SetParam(VALUE_PROPERTY, AAFwk::RemoteObjectWrap::Box(remoteObject));
1253 sptr<IDistributedWantParams> pWantParams = DistributedWantParamWrapper::Box(wp);
1254 SetParam(key, pWantParams);
1255 return true;
1256 }
1257
ReadFromParcelLong(Parcel & parcel,const std::string & key)1258 bool DistributedWantParams::ReadFromParcelLong(Parcel& parcel, const std::string& key)
1259 {
1260 int64_t value;
1261 if (parcel.ReadInt64(value)) {
1262 std::string strValue(std::to_string(value));
1263 #ifdef WANT_PARAM_USE_LONG
1264 sptr<IInterface> intf = Long::Box(value);
1265 #else
1266 sptr<IInterface> intf = AAFwk::String::Box(std::to_string(value));
1267 #endif
1268 if (intf) {
1269 SetParam(key, intf);
1270 }
1271 return true;
1272 } else {
1273 return false;
1274 }
1275 }
1276
ReadFromParcelFloat(Parcel & parcel,const std::string & key)1277 bool DistributedWantParams::ReadFromParcelFloat(Parcel& parcel, const std::string& key)
1278 {
1279 float value;
1280 if (parcel.ReadFloat(value)) {
1281 sptr<IInterface> intf = AAFwk::Float::Box(value);
1282 if (intf) {
1283 SetParam(key, intf);
1284 }
1285 return true;
1286 } else {
1287 return false;
1288 }
1289 }
1290
ReadFromParcelDouble(Parcel & parcel,const std::string & key)1291 bool DistributedWantParams::ReadFromParcelDouble(Parcel& parcel, const std::string& key)
1292 {
1293 double value;
1294 if (parcel.ReadDouble(value)) {
1295 sptr<IInterface> intf = AAFwk::Double::Box(value);
1296 if (intf) {
1297 SetParam(key, intf);
1298 }
1299 return true;
1300 } else {
1301 return false;
1302 }
1303 }
1304
ReadUnsupportedData(Parcel & parcel,const std::string & key,int type)1305 bool DistributedWantParams::ReadUnsupportedData(Parcel& parcel, const std::string& key, int type)
1306 {
1307 int bufferSize = 0;
1308 if (!parcel.ReadInt32(bufferSize)) {
1309 return false;
1310 }
1311 static constexpr int32_t maxAllowedSize = 100 * 1024 * 1024;
1312 if (bufferSize < 0 || bufferSize > maxAllowedSize) {
1313 return false;
1314 }
1315
1316 int32_t length = 0;
1317 if (!parcel.ReadInt32(length)) {
1318 return false;
1319 }
1320 const uint8_t* bufferP = parcel.ReadUnpadBuffer(bufferSize);
1321 if (bufferP == nullptr) {
1322 return false;
1323 }
1324
1325 DistributedUnsupportedData dData;
1326 dData.key = Str8ToStr16(key);
1327 dData.type = type;
1328 dData.size = bufferSize;
1329 dData.buffer = new (std::nothrow) uint8_t[bufferSize];
1330 if (dData.buffer == nullptr) {
1331 return false;
1332 }
1333
1334 int32_t ret = memcpy_s(dData.buffer, bufferSize, bufferP, bufferSize);
1335 if (ret != EOK) {
1336 HILOGE("memory copy failed, ret %{public}d", ret);
1337 return false;
1338 }
1339 cachedUnsupportedData_.emplace_back(std::move(dData));
1340 return true;
1341 }
1342
ReadFromParcelParam(Parcel & parcel,const std::string & key,int type)1343 bool DistributedWantParams::ReadFromParcelParam(Parcel& parcel, const std::string& key, int type)
1344 {
1345 switch (type) {
1346 case VALUE_TYPE_CHARSEQUENCE:
1347 case VALUE_TYPE_STRING:
1348 return ReadFromParcelString(parcel, key);
1349 case VALUE_TYPE_BOOLEAN:
1350 return ReadFromParcelBool(parcel, key);
1351 case VALUE_TYPE_BYTE:
1352 return ReadFromParcelInt8(parcel, key);
1353 case VALUE_TYPE_CHAR:
1354 return ReadFromParcelChar(parcel, key);
1355 case VALUE_TYPE_SHORT:
1356 return ReadFromParcelShort(parcel, key);
1357 case VALUE_TYPE_INT:
1358 return ReadFromParcelInt(parcel, key);
1359 case VALUE_TYPE_LONG:
1360 return ReadFromParcelLong(parcel, key);
1361 case VALUE_TYPE_FLOAT:
1362 return ReadFromParcelFloat(parcel, key);
1363 case VALUE_TYPE_DOUBLE:
1364 return ReadFromParcelDouble(parcel, key);
1365 case VALUE_TYPE_WANTPARAMS:
1366 case VALUE_TYPE_FD:
1367 case VALUE_TYPE_REMOTE_OBJECT:
1368 return ReadFromParcelWantParamWrapper(parcel, key, type);
1369 case VALUE_TYPE_NULL:
1370 break;
1371 case VALUE_TYPE_PARCELABLE:
1372 case VALUE_TYPE_PARCELABLEARRAY:
1373 case VALUE_TYPE_SERIALIZABLE:
1374 case VALUE_TYPE_LIST:
1375 if (!ReadUnsupportedData(parcel, key, type)) {
1376 return false;
1377 }
1378 break;
1379 default: {
1380 sptr<AAFwk::IArray> ao = nullptr;
1381 if (!ReadArrayToParcel(parcel, type, ao)) {
1382 return false;
1383 }
1384 sptr<IInterface> dIntf = ao;
1385 if (dIntf) {
1386 SetParam(key, dIntf);
1387 }
1388 break;
1389 }
1390 }
1391 return true;
1392 }
1393
ReadFromParcel(Parcel & parcel)1394 bool DistributedWantParams::ReadFromParcel(Parcel& parcel)
1395 {
1396 int32_t size;
1397 if (!parcel.ReadInt32(size)) {
1398 return false;
1399 }
1400 if (size > static_cast<int32_t>(parcel.GetDataSize())) {
1401 return false;
1402 }
1403 for (int32_t i = 0; i < size; i++) {
1404 std::u16string key = parcel.ReadString16();
1405 int type;
1406 if (!parcel.ReadInt32(type)) {
1407 return false;
1408 }
1409 if (!ReadFromParcelParam(parcel, Str16ToStr8(key), type)) {
1410 return false;
1411 }
1412 }
1413 return true;
1414 }
1415
Unmarshalling(Parcel & parcel)1416 DistributedWantParams* DistributedWantParams::Unmarshalling(Parcel& parcel)
1417 {
1418 DistributedWantParams* wantParams = new (std::nothrow) DistributedWantParams();
1419 if (wantParams != nullptr && !wantParams->ReadFromParcel(parcel)) {
1420 delete wantParams;
1421 wantParams = nullptr;
1422 }
1423 return wantParams;
1424 }
1425
ToWantParams()1426 AAFwk::WantParams DistributedWantParams::ToWantParams()
1427 {
1428 AAFwk::WantParams wantParams;
1429 std::map<std::string, sptr<IInterface>> data = GetParams();
1430 for (auto it = data.begin(); it != data.end(); it++) {
1431 wantParams.SetParam(it->first, it->second);
1432 }
1433 return wantParams;
1434 }
1435 } // namespace DistributedSchedule
1436 } // namespace OHOS