1f8af9c48Sopenharmony_ci/*
2f8af9c48Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3f8af9c48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f8af9c48Sopenharmony_ci * you may not use this file except in compliance with the License.
5f8af9c48Sopenharmony_ci * You may obtain a copy of the License at
6f8af9c48Sopenharmony_ci *
7f8af9c48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f8af9c48Sopenharmony_ci *
9f8af9c48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f8af9c48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f8af9c48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f8af9c48Sopenharmony_ci * See the License for the specific language governing permissions and
13f8af9c48Sopenharmony_ci * limitations under the License.
14f8af9c48Sopenharmony_ci */
15f8af9c48Sopenharmony_ci
16f8af9c48Sopenharmony_ci#include "ipc_utils.h"
17f8af9c48Sopenharmony_ci#include "dp_subscribe_info.h"
18f8af9c48Sopenharmony_ci#include "macro_utils.h"
19f8af9c48Sopenharmony_ci
20f8af9c48Sopenharmony_cinamespace OHOS {
21f8af9c48Sopenharmony_cinamespace DistributedDeviceProfile {
22f8af9c48Sopenharmony_cinamespace {
23f8af9c48Sopenharmony_ci    const std::string TAG = "IpcUtils";
24f8af9c48Sopenharmony_ci}
25f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<TrustDeviceProfile>& trustDeviceProfiles)
26f8af9c48Sopenharmony_ci{
27f8af9c48Sopenharmony_ci    if (trustDeviceProfiles.empty() || trustDeviceProfiles.size() > MAX_PROFILE_SIZE) {
28f8af9c48Sopenharmony_ci        HILOGE("profile size is invalid!size : %{public}zu", trustDeviceProfiles.size());
29f8af9c48Sopenharmony_ci        return false;
30f8af9c48Sopenharmony_ci    }
31f8af9c48Sopenharmony_ci    uint32_t size = trustDeviceProfiles.size();
32f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
33f8af9c48Sopenharmony_ci    for (const auto& profile : trustDeviceProfiles) {
34f8af9c48Sopenharmony_ci        if (!profile.Marshalling(parcel)) {
35f8af9c48Sopenharmony_ci            HILOGE("profile Marshalling fail!");
36f8af9c48Sopenharmony_ci            return false;
37f8af9c48Sopenharmony_ci        }
38f8af9c48Sopenharmony_ci    }
39f8af9c48Sopenharmony_ci    return true;
40f8af9c48Sopenharmony_ci}
41f8af9c48Sopenharmony_ci
42f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<AccessControlProfile>& aclProfiles)
43f8af9c48Sopenharmony_ci{
44f8af9c48Sopenharmony_ci    if (aclProfiles.empty() || aclProfiles.size() > MAX_PROFILE_SIZE) {
45f8af9c48Sopenharmony_ci        HILOGE("profile size is invalid!size : %{public}zu", aclProfiles.size());
46f8af9c48Sopenharmony_ci        return false;
47f8af9c48Sopenharmony_ci    }
48f8af9c48Sopenharmony_ci    uint32_t size = aclProfiles.size();
49f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
50f8af9c48Sopenharmony_ci    for (const auto& profile : aclProfiles) {
51f8af9c48Sopenharmony_ci        if (!profile.Marshalling(parcel)) {
52f8af9c48Sopenharmony_ci            HILOGE("profile Marshalling fail!");
53f8af9c48Sopenharmony_ci            return false;
54f8af9c48Sopenharmony_ci        }
55f8af9c48Sopenharmony_ci    }
56f8af9c48Sopenharmony_ci    return true;
57f8af9c48Sopenharmony_ci}
58f8af9c48Sopenharmony_ci
59f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ServiceProfile>& serviceProfiles)
60f8af9c48Sopenharmony_ci{
61f8af9c48Sopenharmony_ci    if (serviceProfiles.empty() || serviceProfiles.size() > MAX_PROFILE_SIZE) {
62f8af9c48Sopenharmony_ci        HILOGE("profile size is invalid!size : %{public}zu", serviceProfiles.size());
63f8af9c48Sopenharmony_ci        return false;
64f8af9c48Sopenharmony_ci    }
65f8af9c48Sopenharmony_ci    uint32_t size = serviceProfiles.size();
66f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
67f8af9c48Sopenharmony_ci    for (const auto& profile : serviceProfiles) {
68f8af9c48Sopenharmony_ci        if (!profile.Marshalling(parcel)) {
69f8af9c48Sopenharmony_ci            HILOGE("profile Marshalling fail!");
70f8af9c48Sopenharmony_ci            return false;
71f8af9c48Sopenharmony_ci        }
72f8af9c48Sopenharmony_ci    }
73f8af9c48Sopenharmony_ci    return true;
74f8af9c48Sopenharmony_ci}
75f8af9c48Sopenharmony_ci
76f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<CharacteristicProfile>& charProfiles)
77f8af9c48Sopenharmony_ci{
78f8af9c48Sopenharmony_ci    if (charProfiles.empty() || charProfiles.size() > MAX_PROFILE_SIZE) {
79f8af9c48Sopenharmony_ci        HILOGE("profile size is invalid!size : %{public}zu", charProfiles.size());
80f8af9c48Sopenharmony_ci        return false;
81f8af9c48Sopenharmony_ci    }
82f8af9c48Sopenharmony_ci    uint32_t size = charProfiles.size();
83f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
84f8af9c48Sopenharmony_ci    for (const auto& profile : charProfiles) {
85f8af9c48Sopenharmony_ci        profile.Marshalling(parcel);
86f8af9c48Sopenharmony_ci    }
87f8af9c48Sopenharmony_ci    return true;
88f8af9c48Sopenharmony_ci}
89f8af9c48Sopenharmony_ci
90f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string, std::string>& params)
91f8af9c48Sopenharmony_ci{
92f8af9c48Sopenharmony_ci    if (params.size() == 0 || params.size() > MAX_PARAM_SIZE) {
93f8af9c48Sopenharmony_ci        HILOGE("Params size is invalid!size : %{public}zu", params.size());
94f8af9c48Sopenharmony_ci        return false;
95f8af9c48Sopenharmony_ci    }
96f8af9c48Sopenharmony_ci    uint32_t size = params.size();
97f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
98f8af9c48Sopenharmony_ci    for (const auto& item : params) {
99f8af9c48Sopenharmony_ci        WRITE_HELPER_RET(parcel, String, item.first + SEPARATOR + item.second, false);
100f8af9c48Sopenharmony_ci    }
101f8af9c48Sopenharmony_ci    return true;
102f8af9c48Sopenharmony_ci}
103f8af9c48Sopenharmony_ci
104f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string,
105f8af9c48Sopenharmony_ci    OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
106f8af9c48Sopenharmony_ci{
107f8af9c48Sopenharmony_ci    if (listenerMap.size() == 0 || listenerMap.size() > MAX_LISTENER_SIZE) {
108f8af9c48Sopenharmony_ci        HILOGE("listenerMap size is invalid!size : %{public}zu", listenerMap.size());
109f8af9c48Sopenharmony_ci        return false;
110f8af9c48Sopenharmony_ci    }
111f8af9c48Sopenharmony_ci    uint32_t size = listenerMap.size();
112f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
113f8af9c48Sopenharmony_ci    for (const auto& item : listenerMap) {
114f8af9c48Sopenharmony_ci        OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo = item.second;
115f8af9c48Sopenharmony_ci        if (!subscribeInfo.Marshalling(parcel)) {
116f8af9c48Sopenharmony_ci            HILOGE("subscribeInfo Marshalling fail!");
117f8af9c48Sopenharmony_ci            return false;
118f8af9c48Sopenharmony_ci        }
119f8af9c48Sopenharmony_ci    }
120f8af9c48Sopenharmony_ci    return true;
121f8af9c48Sopenharmony_ci}
122f8af9c48Sopenharmony_ci
123f8af9c48Sopenharmony_cibool IpcUtils::Marshalling(MessageParcel& parcel, const std::unordered_set<ProfileChangeType>& changeTypes)
124f8af9c48Sopenharmony_ci{
125f8af9c48Sopenharmony_ci    if (changeTypes.size() == 0 || changeTypes.size() > MAX_SUBSCRIBE_CHANGE_SIZE) {
126f8af9c48Sopenharmony_ci        HILOGE("listenerMap size is invalid!size : %{public}zu", changeTypes.size());
127f8af9c48Sopenharmony_ci        return false;
128f8af9c48Sopenharmony_ci    }
129f8af9c48Sopenharmony_ci    uint32_t size = changeTypes.size();
130f8af9c48Sopenharmony_ci    WRITE_HELPER_RET(parcel, Uint32, size, false);
131f8af9c48Sopenharmony_ci    for (ProfileChangeType item : changeTypes) {
132f8af9c48Sopenharmony_ci        WRITE_HELPER_RET(parcel, Int32, static_cast<int32_t>(item), false);
133f8af9c48Sopenharmony_ci    }
134f8af9c48Sopenharmony_ci    return true;
135f8af9c48Sopenharmony_ci}
136f8af9c48Sopenharmony_ci
137f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustDeviceProfile>& trustDeviceProfiles)
138f8af9c48Sopenharmony_ci{
139f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
140f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_PROFILE_SIZE) {
141f8af9c48Sopenharmony_ci        HILOGE("Profile size is invalid!size : %{public}u", size);
142f8af9c48Sopenharmony_ci        return false;
143f8af9c48Sopenharmony_ci    }
144f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
145f8af9c48Sopenharmony_ci        TrustDeviceProfile trustDeviceProfile;
146f8af9c48Sopenharmony_ci        if (!trustDeviceProfile.UnMarshalling(parcel)) {
147f8af9c48Sopenharmony_ci            HILOGE("Profile UnMarshalling fail!");
148f8af9c48Sopenharmony_ci            return false;
149f8af9c48Sopenharmony_ci        }
150f8af9c48Sopenharmony_ci        trustDeviceProfiles.emplace_back(trustDeviceProfile);
151f8af9c48Sopenharmony_ci    }
152f8af9c48Sopenharmony_ci    return true;
153f8af9c48Sopenharmony_ci}
154f8af9c48Sopenharmony_ci
155f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<AccessControlProfile>& aclProfiles)
156f8af9c48Sopenharmony_ci{
157f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
158f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_PROFILE_SIZE) {
159f8af9c48Sopenharmony_ci        HILOGE("Profile size is invalid!size : %{public}u", size);
160f8af9c48Sopenharmony_ci        return false;
161f8af9c48Sopenharmony_ci    }
162f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
163f8af9c48Sopenharmony_ci        AccessControlProfile aclProfile;
164f8af9c48Sopenharmony_ci        if (!aclProfile.UnMarshalling(parcel)) {
165f8af9c48Sopenharmony_ci            HILOGE("Profile UnMarshalling fail!");
166f8af9c48Sopenharmony_ci            return false;
167f8af9c48Sopenharmony_ci        }
168f8af9c48Sopenharmony_ci        aclProfiles.emplace_back(aclProfile);
169f8af9c48Sopenharmony_ci    }
170f8af9c48Sopenharmony_ci    return true;
171f8af9c48Sopenharmony_ci}
172f8af9c48Sopenharmony_ci
173f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceProfile>& serviceProfiles)
174f8af9c48Sopenharmony_ci{
175f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
176f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_PROFILE_SIZE) {
177f8af9c48Sopenharmony_ci        HILOGE("Profile size is invalid!size : %{public}u", size);
178f8af9c48Sopenharmony_ci        return false;
179f8af9c48Sopenharmony_ci    }
180f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
181f8af9c48Sopenharmony_ci        ServiceProfile serviceProfile;
182f8af9c48Sopenharmony_ci        if (!serviceProfile.UnMarshalling(parcel)) {
183f8af9c48Sopenharmony_ci            HILOGE("Profile UnMarshalling fail!");
184f8af9c48Sopenharmony_ci            return false;
185f8af9c48Sopenharmony_ci        }
186f8af9c48Sopenharmony_ci        serviceProfiles.emplace_back(serviceProfile);
187f8af9c48Sopenharmony_ci    }
188f8af9c48Sopenharmony_ci    return true;
189f8af9c48Sopenharmony_ci}
190f8af9c48Sopenharmony_ci
191f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<CharacteristicProfile>& charProfiles)
192f8af9c48Sopenharmony_ci{
193f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
194f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_PROFILE_SIZE) {
195f8af9c48Sopenharmony_ci        HILOGE("Profile size is invalid!size : %{public}u", size);
196f8af9c48Sopenharmony_ci        return false;
197f8af9c48Sopenharmony_ci    }
198f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
199f8af9c48Sopenharmony_ci        CharacteristicProfile charProfile;
200f8af9c48Sopenharmony_ci        if (!charProfile.UnMarshalling(parcel)) {
201f8af9c48Sopenharmony_ci            HILOGE("Profile UnMarshalling fail!");
202f8af9c48Sopenharmony_ci            return false;
203f8af9c48Sopenharmony_ci        }
204f8af9c48Sopenharmony_ci        charProfiles.emplace_back(charProfile);
205f8af9c48Sopenharmony_ci    }
206f8af9c48Sopenharmony_ci    return true;
207f8af9c48Sopenharmony_ci}
208f8af9c48Sopenharmony_ci
209f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string, std::string>& params)
210f8af9c48Sopenharmony_ci{
211f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
212f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_PARAM_SIZE) {
213f8af9c48Sopenharmony_ci        HILOGE("Params size is invalid!size : %{public}u", size);
214f8af9c48Sopenharmony_ci        return false;
215f8af9c48Sopenharmony_ci    }
216f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
217f8af9c48Sopenharmony_ci        std::string item = "";
218f8af9c48Sopenharmony_ci        READ_HELPER_RET(parcel, String, item, false);
219f8af9c48Sopenharmony_ci        std::string::size_type position = item.find(SEPARATOR);
220f8af9c48Sopenharmony_ci        if (position == item.npos) {
221f8af9c48Sopenharmony_ci            HILOGE("Not found the separator!");
222f8af9c48Sopenharmony_ci            continue;
223f8af9c48Sopenharmony_ci        }
224f8af9c48Sopenharmony_ci        std::string key = item.substr(0, position);
225f8af9c48Sopenharmony_ci        std::string value = item.substr(position + 1);
226f8af9c48Sopenharmony_ci        params[key] = value;
227f8af9c48Sopenharmony_ci    }
228f8af9c48Sopenharmony_ci    return true;
229f8af9c48Sopenharmony_ci}
230f8af9c48Sopenharmony_ci
231f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string,
232f8af9c48Sopenharmony_ci    OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
233f8af9c48Sopenharmony_ci{
234f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
235f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_LISTENER_SIZE) {
236f8af9c48Sopenharmony_ci        HILOGE("Params size is invalid!size : %{public}u", size);
237f8af9c48Sopenharmony_ci        return false;
238f8af9c48Sopenharmony_ci    }
239f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
240f8af9c48Sopenharmony_ci        OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo;
241f8af9c48Sopenharmony_ci        if (!subscribeInfo.UnMarshalling(parcel)) {
242f8af9c48Sopenharmony_ci            HILOGE("subscribeInfo UnMarshalling fail!");
243f8af9c48Sopenharmony_ci            return false;
244f8af9c48Sopenharmony_ci        }
245f8af9c48Sopenharmony_ci        listenerMap[subscribeInfo.GetSubscribeKey() + SEPARATOR + std::to_string(subscribeInfo.GetSaId())] =
246f8af9c48Sopenharmony_ci            subscribeInfo;
247f8af9c48Sopenharmony_ci    }
248f8af9c48Sopenharmony_ci    return true;
249f8af9c48Sopenharmony_ci}
250f8af9c48Sopenharmony_ci
251f8af9c48Sopenharmony_cibool IpcUtils::UnMarshalling(MessageParcel& parcel, std::unordered_set<ProfileChangeType>& changeTypes)
252f8af9c48Sopenharmony_ci{
253f8af9c48Sopenharmony_ci    uint32_t size = parcel.ReadUint32();
254f8af9c48Sopenharmony_ci    if (size == 0 || size > MAX_SUBSCRIBE_CHANGE_SIZE) {
255f8af9c48Sopenharmony_ci        HILOGE("Params size is invalid!size : %{public}u", size);
256f8af9c48Sopenharmony_ci        return false;
257f8af9c48Sopenharmony_ci    }
258f8af9c48Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
259f8af9c48Sopenharmony_ci        uint32_t num = parcel.ReadUint32();
260f8af9c48Sopenharmony_ci        if (num <= ProfileChangeType::PROFILE_CHANGE_TYPE_MIN || num >= ProfileChangeType::PROFILE_CHANGE_TYPE_MAX) {
261f8af9c48Sopenharmony_ci            HILOGE("The value is invalid!");
262f8af9c48Sopenharmony_ci            return false;
263f8af9c48Sopenharmony_ci        }
264f8af9c48Sopenharmony_ci        changeTypes.emplace(static_cast<ProfileChangeType>(num));
265f8af9c48Sopenharmony_ci    }
266f8af9c48Sopenharmony_ci    return true;
267f8af9c48Sopenharmony_ci}
268f8af9c48Sopenharmony_ci} // namespace DistributedDeviceProfile
269f8af9c48Sopenharmony_ci} // namespace OHOS
270