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