• 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()) {
129         return true;
130     }
131     if (strings.size() > MAX_ID_SIZE) {
132         HILOGE("string vector, strings size is invalid! size : %{public}zu", strings.size());
133         return false;
134     }
135     for (const auto& item : strings) {
136         WRITE_HELPER_RET(parcel, String, item, false);
137     }
138     return true;
139 }
140 
Marshalling(MessageParcel & parcel,const std::vector<int32_t> & params)141 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<int32_t>& params)
142 {
143     size_t size = params.size();
144     WRITE_HELPER_RET(parcel, Uint32, size, false);
145     if (params.empty()) {
146         return true;
147     }
148     if (params.size() > MAX_ID_SIZE) {
149         HILOGE("int32_t vector, params size is invalid! size : %{public}zu", params.size());
150         return false;
151     }
152     for (const auto& item : params) {
153         WRITE_HELPER_RET(parcel, Int32, item, false);
154     }
155     return true;
156 }
157 
Marshalling(MessageParcel & parcel,const std::vector<uint8_t> & params)158 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<uint8_t>& params)
159 {
160     int32_t length = static_cast<int32_t>(params.size());
161     WRITE_HELPER_RET(parcel, Int32, length, false);
162     if (params.empty() || params.size() > MAX_ICON_SIZE) {
163         HILOGE("uint8_t vector, params size is invalid! size : %{public}zu", params.size());
164         return false;
165     }
166     if (length > 0) {
167         const unsigned char *buffer = reinterpret_cast<const unsigned char *>(params.data());
168         parcel.WriteRawData(buffer, length);
169     }
170     return true;
171 }
172 
Marshalling(MessageParcel & parcel,const std::map<std::string,std::string> & params)173 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string, std::string>& params)
174 {
175     uint32_t size = params.size();
176     WRITE_HELPER_RET(parcel, Uint32, size, false);
177     if (params.size() == 0 || params.size() > MAX_PARAM_SIZE) {
178         HILOGE("Params size is invalid!size : %{public}zu", params.size());
179         return false;
180     }
181     for (const auto& item : params) {
182         WRITE_HELPER_RET(parcel, String, item.first + SEPARATOR + item.second, false);
183     }
184     return true;
185 }
186 
Marshalling(MessageParcel & parcel,const std::map<std::string,OHOS::DistributedDeviceProfile::SubscribeInfo> & listenerMap)187 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string,
188     OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
189 {
190     uint32_t size = listenerMap.size();
191     WRITE_HELPER_RET(parcel, Uint32, size, false);
192     if (listenerMap.size() == 0 || listenerMap.size() > MAX_LISTENER_SIZE) {
193         HILOGE("listenerMap size is invalid!size : %{public}zu", listenerMap.size());
194         return false;
195     }
196     for (const auto& item : listenerMap) {
197         OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo = item.second;
198         if (!subscribeInfo.Marshalling(parcel)) {
199             HILOGE("subscribeInfo Marshalling fail!");
200             return false;
201         }
202     }
203     return true;
204 }
205 
Marshalling(MessageParcel & parcel,const std::unordered_set<ProfileChangeType> & changeTypes)206 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::unordered_set<ProfileChangeType>& changeTypes)
207 {
208     uint32_t size = changeTypes.size();
209     WRITE_HELPER_RET(parcel, Uint32, size, false);
210     if (changeTypes.size() == 0 || changeTypes.size() > MAX_SUBSCRIBE_CHANGE_SIZE) {
211         HILOGE("listenerMap size is invalid!size : %{public}zu", changeTypes.size());
212         return false;
213     }
214     for (ProfileChangeType item : changeTypes) {
215         WRITE_HELPER_RET(parcel, Int32, static_cast<int32_t>(item), false);
216     }
217     return true;
218 }
219 
Marshalling(MessageParcel & parcel,const std::vector<TrustedDeviceInfo> & deviceInfos)220 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<TrustedDeviceInfo>& deviceInfos)
221 {
222     uint32_t size = deviceInfos.size();
223     WRITE_HELPER_RET(parcel, Uint32, size, false);
224     if (deviceInfos.empty() || deviceInfos.size() > MAX_PROFILE_SIZE) {
225         HILOGE("deviceInfos size is invalid!size : %{public}zu", deviceInfos.size());
226         return false;
227     }
228     for (const auto& item : deviceInfos) {
229         item.Marshalling(parcel);
230     }
231     return true;
232 }
233 
Marshalling(MessageParcel & parcel,const std::vector<DeviceIconInfo> & deviceIconInfos)234 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<DeviceIconInfo>& deviceIconInfos)
235 {
236     uint32_t size = deviceIconInfos.size();
237     WRITE_HELPER_RET(parcel, Uint32, size, false);
238     if (deviceIconInfos.size() > MAX_PROFILE_SIZE) {
239         HILOGE("deviceInfos size is invalid!size : %{public}zu", deviceIconInfos.size());
240         return false;
241     }
242     for (const auto& item : deviceIconInfos) {
243         item.Marshalling(parcel);
244     }
245     return true;
246 }
247 
Marshalling(MessageParcel & parcel,const std::vector<ServiceInfoProfile> & serviceInfoProfiles)248 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ServiceInfoProfile>& serviceInfoProfiles)
249 {
250     uint32_t size = serviceInfoProfiles.size();
251     WRITE_HELPER_RET(parcel, Uint32, size, false);
252     if (serviceInfoProfiles.empty() || serviceInfoProfiles.size() > MAX_PROFILE_SIZE) {
253         HILOGE("deviceInfos size is invalid!size : %{public}zu", serviceInfoProfiles.size());
254         return false;
255     }
256     for (const auto& item : serviceInfoProfiles) {
257         item.Marshalling(parcel);
258     }
259     return true;
260 }
261 
UnMarshalling(MessageParcel & parcel,std::vector<ServiceInfoProfile> & serviceInfoProfiles)262 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceInfoProfile>& serviceInfoProfiles)
263 {
264     uint32_t size = parcel.ReadUint32();
265     if (size == 0 || size > MAX_PROFILE_SIZE) {
266         HILOGE("Profile size is invalid!size : %{public}u", size);
267         return false;
268     }
269     for (uint32_t i = 0; i < size; i++) {
270         ServiceInfoProfile serviceInfoProfile;
271         if (!serviceInfoProfile.UnMarshalling(parcel)) {
272             HILOGE("Profile UnMarshalling fail!");
273             return false;
274         }
275         serviceInfoProfiles.emplace_back(serviceInfoProfile);
276     }
277     return true;
278 }
279 
UnMarshalling(MessageParcel & parcel,std::vector<DeviceIconInfo> & deviceIconInfos)280 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<DeviceIconInfo>& deviceIconInfos)
281 {
282     uint32_t size = parcel.ReadUint32();
283     if (size == 0 || size > MAX_PROFILE_SIZE) {
284         HILOGE("Profile size is invalid!size : %{public}u", size);
285         return false;
286     }
287     for (uint32_t i = 0; i < size; i++) {
288         DeviceIconInfo deviceIconInfo;
289         if (!deviceIconInfo.UnMarshalling(parcel)) {
290             HILOGE("Profile UnMarshalling fail!");
291             return false;
292         }
293         deviceIconInfos.emplace_back(deviceIconInfo);
294     }
295     return true;
296 }
297 
UnMarshalling(MessageParcel & parcel,std::vector<ProductInfo> & productInfos)298 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ProductInfo>& productInfos)
299 {
300     uint32_t size = parcel.ReadUint32();
301     if (size == 0 || size > MAX_PROFILE_SIZE) {
302         HILOGE("Profile size is invalid!size : %{public}u", size);
303         return false;
304     }
305     for (uint32_t i = 0; i < size; i++) {
306         ProductInfo productInfo;
307         if (!productInfo.UnMarshalling(parcel)) {
308             HILOGE("Profile UnMarshalling fail!");
309             return false;
310         }
311         productInfos.emplace_back(productInfo);
312     }
313     return true;
314 }
315 
UnMarshalling(MessageParcel & parcel,std::vector<TrustDeviceProfile> & trustDeviceProfiles)316 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustDeviceProfile>& trustDeviceProfiles)
317 {
318     uint32_t size = parcel.ReadUint32();
319     if (size == 0 || size > MAX_PROFILE_SIZE) {
320         HILOGE("Profile size is invalid!size : %{public}u", size);
321         return false;
322     }
323     for (uint32_t i = 0; i < size; i++) {
324         TrustDeviceProfile trustDeviceProfile;
325         if (!trustDeviceProfile.UnMarshalling(parcel)) {
326             HILOGE("Profile UnMarshalling fail!");
327             return false;
328         }
329         trustDeviceProfiles.emplace_back(trustDeviceProfile);
330     }
331     return true;
332 }
333 
UnMarshalling(MessageParcel & parcel,std::vector<AccessControlProfile> & aclProfiles)334 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<AccessControlProfile>& aclProfiles)
335 {
336     uint32_t size = parcel.ReadUint32();
337     if (size == 0 || size > MAX_PROFILE_SIZE) {
338         HILOGE("Profile size is invalid!size : %{public}u", size);
339         return false;
340     }
341     for (uint32_t i = 0; i < size; i++) {
342         AccessControlProfile aclProfile;
343         if (!aclProfile.UnMarshalling(parcel)) {
344             HILOGE("Profile UnMarshalling fail!");
345             return false;
346         }
347         aclProfiles.emplace_back(aclProfile);
348     }
349     return true;
350 }
351 
UnMarshalling(MessageParcel & parcel,std::vector<DeviceProfile> & deviceProfiles)352 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<DeviceProfile>& deviceProfiles)
353 {
354     uint32_t size = parcel.ReadUint32();
355     if (size == 0 || size > MAX_PROFILE_SIZE) {
356         HILOGE("Profile size is invalid!size : %{public}u", size);
357         return false;
358     }
359     for (uint32_t i = 0; i < size; i++) {
360         DeviceProfile deviceProfile;
361         if (!deviceProfile.UnMarshalling(parcel)) {
362             HILOGE("Profile UnMarshalling fail!");
363             return false;
364         }
365         deviceProfiles.emplace_back(deviceProfile);
366     }
367     return true;
368 }
369 
UnMarshalling(MessageParcel & parcel,std::vector<ServiceProfile> & serviceProfiles)370 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceProfile>& serviceProfiles)
371 {
372     uint32_t size = parcel.ReadUint32();
373     if (size == 0 || size > MAX_PROFILE_SIZE) {
374         HILOGE("Profile size is invalid!size : %{public}u", size);
375         return false;
376     }
377     for (uint32_t i = 0; i < size; i++) {
378         ServiceProfile serviceProfile;
379         if (!serviceProfile.UnMarshalling(parcel)) {
380             HILOGE("Profile UnMarshalling fail!");
381             return false;
382         }
383         serviceProfiles.emplace_back(serviceProfile);
384     }
385     return true;
386 }
387 
UnMarshalling(MessageParcel & parcel,std::vector<CharacteristicProfile> & charProfiles)388 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<CharacteristicProfile>& charProfiles)
389 {
390     uint32_t size = parcel.ReadUint32();
391     if (size == 0 || size > MAX_PROFILE_SIZE) {
392         HILOGE("Profile size is invalid!size : %{public}u", size);
393         return false;
394     }
395     for (uint32_t i = 0; i < size; i++) {
396         CharacteristicProfile charProfile;
397         if (!charProfile.UnMarshalling(parcel)) {
398             HILOGE("Profile UnMarshalling fail!");
399             return false;
400         }
401         charProfiles.emplace_back(charProfile);
402     }
403     return true;
404 }
405 
UnMarshalling(MessageParcel & parcel,std::vector<std::string> & strings)406 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<std::string>& strings)
407 {
408     size_t size = parcel.ReadUint32();
409     if (size == 0) {
410         return true;
411     }
412     if (size > MAX_ID_SIZE) {
413         HILOGE("string vector, strings size is invalid!size : %{public}zu", size);
414         return false;
415     }
416     for (uint32_t i = 0; i < size; i++) {
417         std::string item = "";
418         READ_HELPER_RET(parcel, String, item, false);
419         strings.emplace_back(item);
420     }
421     return true;
422 }
423 
UnMarshalling(MessageParcel & parcel,std::vector<int32_t> & params)424 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<int32_t>& params)
425 {
426     size_t size = parcel.ReadUint32();
427     if (size == 0) {
428         return true;
429     }
430     if (size > MAX_ID_SIZE) {
431         HILOGE("int32_t vector, params size is invalid! size : %{public}zu", size);
432         return false;
433     }
434     for (uint32_t i = 0; i < size; i++) {
435         int32_t item = 0;
436         READ_HELPER_RET(parcel, Int32, item, false);
437         params.emplace_back(item);
438     }
439     return true;
440 }
441 
UnMarshalling(MessageParcel & parcel,std::vector<uint8_t> & params)442 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<uint8_t>& params)
443 {
444     int32_t length = parcel.ReadInt32();
445     if (length <= 0 || length > MAX_ICON_SIZE) {
446         HILOGE("uint8_t vector, params size is invalid! size : %{public}d", length);
447         return false;
448     }
449     const void *temp = parcel.ReadRawData((size_t)length);
450     if (temp == nullptr) {
451         HILOGE("read raw data failed, length = %{public}d", length);
452         return false;
453     }
454     const unsigned char *buffer = reinterpret_cast<const unsigned char *>(temp);
455     if (buffer == nullptr) {
456         HILOGE("Unexpected null after reinterpret_cast");
457         return false;
458     }
459     std::vector<uint8_t> icon(buffer, buffer + length);
460     params = icon;
461     return true;
462 }
463 
UnMarshalling(MessageParcel & parcel,std::map<std::string,std::string> & params)464 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string, std::string>& params)
465 {
466     uint32_t size = parcel.ReadUint32();
467     if (size == 0 || size > MAX_PARAM_SIZE) {
468         HILOGE("Params size is invalid!size : %{public}u", size);
469         return false;
470     }
471     for (uint32_t i = 0; i < size; i++) {
472         std::string item = "";
473         READ_HELPER_RET(parcel, String, item, false);
474         std::string::size_type position = item.find(SEPARATOR);
475         if (position == item.npos) {
476             HILOGE("Not found the separator!");
477             continue;
478         }
479         std::string key = item.substr(0, position);
480         std::string value = item.substr(position + 1);
481         params[key] = value;
482     }
483     return true;
484 }
485 
UnMarshalling(MessageParcel & parcel,std::map<std::string,OHOS::DistributedDeviceProfile::SubscribeInfo> & listenerMap)486 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string,
487     OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
488 {
489     uint32_t size = parcel.ReadUint32();
490     if (size == 0 || size > MAX_LISTENER_SIZE) {
491         HILOGE("Params size is invalid!size : %{public}u", size);
492         return false;
493     }
494     for (uint32_t i = 0; i < size; i++) {
495         OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo;
496         if (!subscribeInfo.UnMarshalling(parcel)) {
497             HILOGE("subscribeInfo UnMarshalling fail!");
498             return false;
499         }
500         listenerMap[subscribeInfo.GetSubscribeKey() + SEPARATOR + std::to_string(subscribeInfo.GetSaId())] =
501             subscribeInfo;
502     }
503     return true;
504 }
505 
UnMarshalling(MessageParcel & parcel,std::unordered_set<ProfileChangeType> & changeTypes)506 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::unordered_set<ProfileChangeType>& changeTypes)
507 {
508     uint32_t size = parcel.ReadUint32();
509     if (size == 0 || size > MAX_SUBSCRIBE_CHANGE_SIZE) {
510         HILOGE("Params size is invalid!size : %{public}u", size);
511         return false;
512     }
513     for (uint32_t i = 0; i < size; i++) {
514         uint32_t num = parcel.ReadUint32();
515         if (num <= ProfileChangeType::PROFILE_CHANGE_TYPE_MIN || num >= ProfileChangeType::PROFILE_CHANGE_TYPE_MAX) {
516             HILOGE("The value is invalid!");
517             return false;
518         }
519         changeTypes.emplace(static_cast<ProfileChangeType>(num));
520     }
521     return true;
522 }
523 
UnMarshalling(MessageParcel & parcel,std::vector<TrustedDeviceInfo> & deviceInfos)524 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustedDeviceInfo>& deviceInfos)
525 {
526     uint32_t size = parcel.ReadUint32();
527     if (size == 0 || size > MAX_PROFILE_SIZE) {
528         HILOGE("deviceInfos size is invalid!size : %{public}u", size);
529         return false;
530     }
531     for (uint32_t i = 0; i < size; i++) {
532         TrustedDeviceInfo item;
533         if (!item.UnMarshalling(parcel)) {
534             HILOGE("Profile UnMarshalling fail!");
535             return false;
536         }
537         deviceInfos.emplace_back(item);
538     }
539     return true;
540 }
541 } // namespace DistributedDeviceProfile
542 } // namespace OHOS
543