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