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