• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ipc_utils.h"
17 #include "dp_subscribe_info.h"
18 #include "macro_utils.h"
19 
20 namespace OHOS {
21 namespace DistributedDeviceProfile {
22 namespace {
23     const std::string TAG = "IpcUtils";
24 }
Marshalling(MessageParcel & parcel,const std::vector<TrustDeviceProfile> & trustDeviceProfiles)25 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<TrustDeviceProfile>& trustDeviceProfiles)
26 {
27     uint32_t size = trustDeviceProfiles.size();
28     WRITE_HELPER_RET(parcel, Uint32, size, false);
29     if (trustDeviceProfiles.empty() || trustDeviceProfiles.size() > MAX_PROFILE_SIZE) {
30         HILOGE("profile size is invalid!size : %{public}zu", trustDeviceProfiles.size());
31         return false;
32     }
33     for (const auto& profile : trustDeviceProfiles) {
34         if (!profile.Marshalling(parcel)) {
35             HILOGE("profile Marshalling fail!");
36             return false;
37         }
38     }
39     return true;
40 }
41 
Marshalling(MessageParcel & parcel,const std::vector<AccessControlProfile> & aclProfiles)42 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<AccessControlProfile>& aclProfiles)
43 {
44     uint32_t size = aclProfiles.size();
45     WRITE_HELPER_RET(parcel, Uint32, size, false);
46     if (aclProfiles.empty() || aclProfiles.size() > MAX_PROFILE_SIZE) {
47         HILOGE("profile size is invalid!size : %{public}zu", aclProfiles.size());
48         return false;
49     }
50     for (const auto& profile : aclProfiles) {
51         if (!profile.Marshalling(parcel)) {
52             HILOGE("profile Marshalling fail!");
53             return false;
54         }
55     }
56     return true;
57 }
58 
Marshalling(MessageParcel & parcel,const std::vector<DeviceProfile> & deviceProfiles)59 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<DeviceProfile>& deviceProfiles)
60 {
61     uint32_t size = deviceProfiles.size();
62     WRITE_HELPER_RET(parcel, Uint32, size, false);
63     if (deviceProfiles.empty() || deviceProfiles.size() > MAX_PROFILE_SIZE) {
64         HILOGE("profile size is invalid!size : %{public}zu", deviceProfiles.size());
65         return false;
66     }
67     for (const auto& profile : deviceProfiles) {
68         if (!profile.Marshalling(parcel)) {
69             HILOGE("profile Marshalling fail!");
70             return false;
71         }
72     }
73     return true;
74 }
75 
Marshalling(MessageParcel & parcel,const std::vector<ProductInfo> & productInfos)76 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ProductInfo>& productInfos)
77 {
78     uint32_t size = productInfos.size();
79     WRITE_HELPER_RET(parcel, Uint32, size, false);
80     if (productInfos.empty() || productInfos.size() > MAX_PROFILE_SIZE) {
81         HILOGE("profile size is invalid!size : %{public}zu", productInfos.size());
82         return false;
83     }
84     for (const auto& productInfo : productInfos) {
85         if (!productInfo.Marshalling(parcel)) {
86             HILOGE("productInfo Marshalling fail!");
87             return false;
88         }
89     }
90     return true;
91 }
92 
Marshalling(MessageParcel & parcel,const std::vector<ServiceProfile> & serviceProfiles)93 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ServiceProfile>& serviceProfiles)
94 {
95     uint32_t size = serviceProfiles.size();
96     WRITE_HELPER_RET(parcel, Uint32, size, false);
97     if (serviceProfiles.empty() || serviceProfiles.size() > MAX_PROFILE_SIZE) {
98         HILOGE("profile size is invalid!size : %{public}zu", serviceProfiles.size());
99         return false;
100     }
101     for (const auto& profile : serviceProfiles) {
102         if (!profile.Marshalling(parcel)) {
103             HILOGE("profile Marshalling fail!");
104             return false;
105         }
106     }
107     return true;
108 }
109 
Marshalling(MessageParcel & parcel,const std::vector<CharacteristicProfile> & charProfiles)110 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<CharacteristicProfile>& charProfiles)
111 {
112     uint32_t size = charProfiles.size();
113     WRITE_HELPER_RET(parcel, Uint32, size, false);
114     if (charProfiles.empty() || charProfiles.size() > MAX_PROFILE_SIZE) {
115         HILOGE("profile size is invalid!size : %{public}zu", charProfiles.size());
116         return false;
117     }
118     for (const auto& profile : charProfiles) {
119         profile.Marshalling(parcel);
120     }
121     return true;
122 }
123 
Marshalling(MessageParcel & parcel,const std::vector<std::string> & strings)124 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<std::string>& strings)
125 {
126     size_t size = strings.size();
127     WRITE_HELPER_RET(parcel, Uint32, size, false);
128     if (strings.empty() || strings.size() > MAX_ID_SIZE) {
129         HILOGE("string vector, strings size is invalid! size : %{public}zu", strings.size());
130         return false;
131     }
132     for (const auto& item : strings) {
133         WRITE_HELPER_RET(parcel, String, item, false);
134     }
135     return true;
136 }
137 
Marshalling(MessageParcel & parcel,const std::vector<int32_t> & params)138 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<int32_t>& params)
139 {
140     size_t size = params.size();
141     WRITE_HELPER_RET(parcel, Uint32, size, false);
142     if (params.empty() || params.size() > MAX_ID_SIZE) {
143         HILOGE("int32_t vector, params size is invalid! size : %{public}zu", params.size());
144         return false;
145     }
146     for (const auto& item : params) {
147         WRITE_HELPER_RET(parcel, Int32, item, false);
148     }
149     return true;
150 }
151 
Marshalling(MessageParcel & parcel,const std::vector<uint8_t> & params)152 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<uint8_t>& params)
153 {
154     int32_t length = static_cast<int32_t>(params.size());
155     WRITE_HELPER_RET(parcel, Int32, length, false);
156     if (params.empty() || params.size() > MAX_ICON_SIZE) {
157         HILOGE("uint8_t vector, params size is invalid! size : %{public}zu", params.size());
158         return false;
159     }
160     if (length > 0) {
161         const unsigned char *buffer = reinterpret_cast<const unsigned char *>(params.data());
162         parcel.WriteRawData(buffer, length);
163     }
164     return true;
165 }
166 
Marshalling(MessageParcel & parcel,const std::map<std::string,std::string> & params)167 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string, std::string>& params)
168 {
169     uint32_t size = params.size();
170     WRITE_HELPER_RET(parcel, Uint32, size, false);
171     if (params.size() == 0 || params.size() > MAX_PARAM_SIZE) {
172         HILOGE("Params size is invalid!size : %{public}zu", params.size());
173         return false;
174     }
175     for (const auto& item : params) {
176         WRITE_HELPER_RET(parcel, String, item.first + SEPARATOR + item.second, false);
177     }
178     return true;
179 }
180 
Marshalling(MessageParcel & parcel,const std::map<std::string,OHOS::DistributedDeviceProfile::SubscribeInfo> & listenerMap)181 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string,
182     OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
183 {
184     uint32_t size = listenerMap.size();
185     WRITE_HELPER_RET(parcel, Uint32, size, false);
186     if (listenerMap.size() == 0 || listenerMap.size() > MAX_LISTENER_SIZE) {
187         HILOGE("listenerMap size is invalid!size : %{public}zu", listenerMap.size());
188         return false;
189     }
190     for (const auto& item : listenerMap) {
191         OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo = item.second;
192         if (!subscribeInfo.Marshalling(parcel)) {
193             HILOGE("subscribeInfo Marshalling fail!");
194             return false;
195         }
196     }
197     return true;
198 }
199 
Marshalling(MessageParcel & parcel,const std::unordered_set<ProfileChangeType> & changeTypes)200 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::unordered_set<ProfileChangeType>& changeTypes)
201 {
202     uint32_t size = changeTypes.size();
203     WRITE_HELPER_RET(parcel, Uint32, size, false);
204     if (changeTypes.size() == 0 || changeTypes.size() > MAX_SUBSCRIBE_CHANGE_SIZE) {
205         HILOGE("listenerMap size is invalid!size : %{public}zu", changeTypes.size());
206         return false;
207     }
208     for (ProfileChangeType item : changeTypes) {
209         WRITE_HELPER_RET(parcel, Int32, static_cast<int32_t>(item), false);
210     }
211     return true;
212 }
213 
Marshalling(MessageParcel & parcel,const std::vector<TrustedDeviceInfo> & deviceInfos)214 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<TrustedDeviceInfo>& deviceInfos)
215 {
216     uint32_t size = deviceInfos.size();
217     WRITE_HELPER_RET(parcel, Uint32, size, false);
218     if (deviceInfos.empty() || deviceInfos.size() > MAX_PROFILE_SIZE) {
219         HILOGE("deviceInfos size is invalid!size : %{public}zu", deviceInfos.size());
220         return false;
221     }
222     for (const auto& item : deviceInfos) {
223         item.Marshalling(parcel);
224     }
225     return true;
226 }
227 
Marshalling(MessageParcel & parcel,const std::vector<DeviceIconInfo> & deviceIconInfos)228 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<DeviceIconInfo>& deviceIconInfos)
229 {
230     uint32_t size = deviceIconInfos.size();
231     WRITE_HELPER_RET(parcel, Uint32, size, false);
232     if (deviceIconInfos.size() > MAX_PROFILE_SIZE) {
233         HILOGE("deviceInfos size is invalid!size : %{public}zu", deviceIconInfos.size());
234         return false;
235     }
236     for (const auto& item : deviceIconInfos) {
237         item.Marshalling(parcel);
238     }
239     return true;
240 }
241 
Marshalling(MessageParcel & parcel,const std::vector<ServiceInfoProfile> & serviceInfoProfiles)242 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ServiceInfoProfile>& serviceInfoProfiles)
243 {
244     uint32_t size = serviceInfoProfiles.size();
245     WRITE_HELPER_RET(parcel, Uint32, size, false);
246     if (serviceInfoProfiles.empty() || serviceInfoProfiles.size() > MAX_PROFILE_SIZE) {
247         HILOGE("deviceInfos size is invalid!size : %{public}zu", serviceInfoProfiles.size());
248         return false;
249     }
250     for (const auto& item : serviceInfoProfiles) {
251         item.Marshalling(parcel);
252     }
253     return true;
254 }
255 
UnMarshalling(MessageParcel & parcel,std::vector<ServiceInfoProfile> & serviceInfoProfiles)256 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceInfoProfile>& serviceInfoProfiles)
257 {
258     uint32_t size = parcel.ReadUint32();
259     if (size == 0 || size > MAX_PROFILE_SIZE) {
260         HILOGE("Profile size is invalid!size : %{public}u", size);
261         return false;
262     }
263     for (uint32_t i = 0; i < size; i++) {
264         ServiceInfoProfile serviceInfoProfile;
265         if (!serviceInfoProfile.UnMarshalling(parcel)) {
266             HILOGE("Profile UnMarshalling fail!");
267             return false;
268         }
269         serviceInfoProfiles.emplace_back(serviceInfoProfile);
270     }
271     return true;
272 }
273 
UnMarshalling(MessageParcel & parcel,std::vector<DeviceIconInfo> & deviceIconInfos)274 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<DeviceIconInfo>& deviceIconInfos)
275 {
276     uint32_t size = parcel.ReadUint32();
277     if (size == 0 || size > MAX_PROFILE_SIZE) {
278         HILOGE("Profile size is invalid!size : %{public}u", size);
279         return false;
280     }
281     for (uint32_t i = 0; i < size; i++) {
282         DeviceIconInfo deviceIconInfo;
283         if (!deviceIconInfo.UnMarshalling(parcel)) {
284             HILOGE("Profile UnMarshalling fail!");
285             return false;
286         }
287         deviceIconInfos.emplace_back(deviceIconInfo);
288     }
289     return true;
290 }
291 
UnMarshalling(MessageParcel & parcel,std::vector<ProductInfo> & productInfos)292 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ProductInfo>& productInfos)
293 {
294     uint32_t size = parcel.ReadUint32();
295     if (size == 0 || size > MAX_PROFILE_SIZE) {
296         HILOGE("Profile size is invalid!size : %{public}u", size);
297         return false;
298     }
299     for (uint32_t i = 0; i < size; i++) {
300         ProductInfo productInfo;
301         if (!productInfo.UnMarshalling(parcel)) {
302             HILOGE("Profile UnMarshalling fail!");
303             return false;
304         }
305         productInfos.emplace_back(productInfo);
306     }
307     return true;
308 }
309 
UnMarshalling(MessageParcel & parcel,std::vector<TrustDeviceProfile> & trustDeviceProfiles)310 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustDeviceProfile>& trustDeviceProfiles)
311 {
312     uint32_t size = parcel.ReadUint32();
313     if (size == 0 || size > MAX_PROFILE_SIZE) {
314         HILOGE("Profile size is invalid!size : %{public}u", size);
315         return false;
316     }
317     for (uint32_t i = 0; i < size; i++) {
318         TrustDeviceProfile trustDeviceProfile;
319         if (!trustDeviceProfile.UnMarshalling(parcel)) {
320             HILOGE("Profile UnMarshalling fail!");
321             return false;
322         }
323         trustDeviceProfiles.emplace_back(trustDeviceProfile);
324     }
325     return true;
326 }
327 
UnMarshalling(MessageParcel & parcel,std::vector<AccessControlProfile> & aclProfiles)328 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<AccessControlProfile>& aclProfiles)
329 {
330     uint32_t size = parcel.ReadUint32();
331     if (size == 0 || size > MAX_PROFILE_SIZE) {
332         HILOGE("Profile size is invalid!size : %{public}u", size);
333         return false;
334     }
335     for (uint32_t i = 0; i < size; i++) {
336         AccessControlProfile aclProfile;
337         if (!aclProfile.UnMarshalling(parcel)) {
338             HILOGE("Profile UnMarshalling fail!");
339             return false;
340         }
341         aclProfiles.emplace_back(aclProfile);
342     }
343     return true;
344 }
345 
UnMarshalling(MessageParcel & parcel,std::vector<DeviceProfile> & deviceProfiles)346 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<DeviceProfile>& deviceProfiles)
347 {
348     uint32_t size = parcel.ReadUint32();
349     if (size == 0 || size > MAX_PROFILE_SIZE) {
350         HILOGE("Profile size is invalid!size : %{public}u", size);
351         return false;
352     }
353     for (uint32_t i = 0; i < size; i++) {
354         DeviceProfile deviceProfile;
355         if (!deviceProfile.UnMarshalling(parcel)) {
356             HILOGE("Profile UnMarshalling fail!");
357             return false;
358         }
359         deviceProfiles.emplace_back(deviceProfile);
360     }
361     return true;
362 }
363 
UnMarshalling(MessageParcel & parcel,std::vector<ServiceProfile> & serviceProfiles)364 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceProfile>& serviceProfiles)
365 {
366     uint32_t size = parcel.ReadUint32();
367     if (size == 0 || size > MAX_PROFILE_SIZE) {
368         HILOGE("Profile size is invalid!size : %{public}u", size);
369         return false;
370     }
371     for (uint32_t i = 0; i < size; i++) {
372         ServiceProfile serviceProfile;
373         if (!serviceProfile.UnMarshalling(parcel)) {
374             HILOGE("Profile UnMarshalling fail!");
375             return false;
376         }
377         serviceProfiles.emplace_back(serviceProfile);
378     }
379     return true;
380 }
381 
UnMarshalling(MessageParcel & parcel,std::vector<CharacteristicProfile> & charProfiles)382 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<CharacteristicProfile>& charProfiles)
383 {
384     uint32_t size = parcel.ReadUint32();
385     if (size == 0 || size > MAX_PROFILE_SIZE) {
386         HILOGE("Profile size is invalid!size : %{public}u", size);
387         return false;
388     }
389     for (uint32_t i = 0; i < size; i++) {
390         CharacteristicProfile charProfile;
391         if (!charProfile.UnMarshalling(parcel)) {
392             HILOGE("Profile UnMarshalling fail!");
393             return false;
394         }
395         charProfiles.emplace_back(charProfile);
396     }
397     return true;
398 }
399 
UnMarshalling(MessageParcel & parcel,std::vector<std::string> & strings)400 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<std::string>& strings)
401 {
402     size_t size = parcel.ReadUint32();
403     if (size == 0 || size > MAX_ID_SIZE) {
404         HILOGE("string vector, strings size is invalid!size : %{public}zu", size);
405         return false;
406     }
407     for (uint32_t i = 0; i < size; i++) {
408         std::string item = "";
409         READ_HELPER_RET(parcel, String, item, false);
410         strings.emplace_back(item);
411     }
412     return true;
413 }
414 
UnMarshalling(MessageParcel & parcel,std::vector<int32_t> & params)415 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<int32_t>& params)
416 {
417     size_t size = parcel.ReadUint32();
418     if (size == 0 || size > MAX_ID_SIZE) {
419         HILOGE("int32_t vector, params size is invalid! size : %{public}zu", size);
420         return false;
421     }
422     for (uint32_t i = 0; i < size; i++) {
423         int32_t item = 0;
424         READ_HELPER_RET(parcel, Int32, item, false);
425         params.emplace_back(item);
426     }
427     return true;
428 }
429 
UnMarshalling(MessageParcel & parcel,std::vector<uint8_t> & params)430 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<uint8_t>& params)
431 {
432     int32_t length = parcel.ReadInt32();
433     if (length <= 0 || length > MAX_ICON_SIZE) {
434         HILOGE("uint8_t vector, params size is invalid! size : %{public}d", length);
435         return false;
436     }
437     const void *temp = parcel.ReadRawData((size_t)length);
438     if (temp == nullptr) {
439         HILOGE("read raw data failed, length = %{public}d", length);
440         return false;
441     }
442     const unsigned char *buffer = reinterpret_cast<const unsigned char *>(temp);
443     if (buffer == nullptr) {
444         HILOGE("Unexpected null after reinterpret_cast");
445         return false;
446     }
447     std::vector<uint8_t> icon(buffer, buffer + length);
448     params = icon;
449     return true;
450 }
451 
UnMarshalling(MessageParcel & parcel,std::map<std::string,std::string> & params)452 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string, std::string>& params)
453 {
454     uint32_t size = parcel.ReadUint32();
455     if (size == 0 || size > MAX_PARAM_SIZE) {
456         HILOGE("Params size is invalid!size : %{public}u", size);
457         return false;
458     }
459     for (uint32_t i = 0; i < size; i++) {
460         std::string item = "";
461         READ_HELPER_RET(parcel, String, item, false);
462         std::string::size_type position = item.find(SEPARATOR);
463         if (position == item.npos) {
464             HILOGE("Not found the separator!");
465             continue;
466         }
467         std::string key = item.substr(0, position);
468         std::string value = item.substr(position + 1);
469         params[key] = value;
470     }
471     return true;
472 }
473 
UnMarshalling(MessageParcel & parcel,std::map<std::string,OHOS::DistributedDeviceProfile::SubscribeInfo> & listenerMap)474 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string,
475     OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
476 {
477     uint32_t size = parcel.ReadUint32();
478     if (size == 0 || size > MAX_LISTENER_SIZE) {
479         HILOGE("Params size is invalid!size : %{public}u", size);
480         return false;
481     }
482     for (uint32_t i = 0; i < size; i++) {
483         OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo;
484         if (!subscribeInfo.UnMarshalling(parcel)) {
485             HILOGE("subscribeInfo UnMarshalling fail!");
486             return false;
487         }
488         listenerMap[subscribeInfo.GetSubscribeKey() + SEPARATOR + std::to_string(subscribeInfo.GetSaId())] =
489             subscribeInfo;
490     }
491     return true;
492 }
493 
UnMarshalling(MessageParcel & parcel,std::unordered_set<ProfileChangeType> & changeTypes)494 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::unordered_set<ProfileChangeType>& changeTypes)
495 {
496     uint32_t size = parcel.ReadUint32();
497     if (size == 0 || size > MAX_SUBSCRIBE_CHANGE_SIZE) {
498         HILOGE("Params size is invalid!size : %{public}u", size);
499         return false;
500     }
501     for (uint32_t i = 0; i < size; i++) {
502         uint32_t num = parcel.ReadUint32();
503         if (num <= ProfileChangeType::PROFILE_CHANGE_TYPE_MIN || num >= ProfileChangeType::PROFILE_CHANGE_TYPE_MAX) {
504             HILOGE("The value is invalid!");
505             return false;
506         }
507         changeTypes.emplace(static_cast<ProfileChangeType>(num));
508     }
509     return true;
510 }
511 
UnMarshalling(MessageParcel & parcel,std::vector<TrustedDeviceInfo> & deviceInfos)512 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustedDeviceInfo>& deviceInfos)
513 {
514     uint32_t size = parcel.ReadUint32();
515     if (size == 0 || size > MAX_PROFILE_SIZE) {
516         HILOGE("deviceInfos size is invalid!size : %{public}u", size);
517         return false;
518     }
519     for (uint32_t i = 0; i < size; i++) {
520         TrustedDeviceInfo item;
521         if (!item.UnMarshalling(parcel)) {
522             HILOGE("Profile UnMarshalling fail!");
523             return false;
524         }
525         deviceInfos.emplace_back(item);
526     }
527     return true;
528 }
529 } // namespace DistributedDeviceProfile
530 } // namespace OHOS
531