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