1eace7efcSopenharmony_ci/* 2eace7efcSopenharmony_ci* Copyright (c) 2023 Huawei Device Co., Ltd. 3eace7efcSopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License"); 4eace7efcSopenharmony_ci* you may not use this file except in compliance with the License. 5eace7efcSopenharmony_ci* You may obtain a copy of the License at 6eace7efcSopenharmony_ci* 7eace7efcSopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 8eace7efcSopenharmony_ci* 9eace7efcSopenharmony_ci* Unless required by applicable law or agreed to in writing, software 10eace7efcSopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS, 11eace7efcSopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12eace7efcSopenharmony_ci* See the License for the specific language governing permissions and 13eace7efcSopenharmony_ci* limitations under the License. 14eace7efcSopenharmony_ci*/ 15eace7efcSopenharmony_ci#include <limits> 16eace7efcSopenharmony_ci#include "dataobs_mgr_changeinfo.h" 17eace7efcSopenharmony_ci#include "dataobs_utils.h" 18eace7efcSopenharmony_ci#include "securec.h" 19eace7efcSopenharmony_ci 20eace7efcSopenharmony_cinamespace OHOS { 21eace7efcSopenharmony_cinamespace AAFwk { 22eace7efcSopenharmony_ciusing Value = std::variant<std::monostate, int64_t, double, std::string, bool, std::vector<uint8_t>>; 23eace7efcSopenharmony_ciusing VBucket = std::map<std::string, Value>; 24eace7efcSopenharmony_ciusing VBuckets = std::vector<VBucket>; 25eace7efcSopenharmony_cibool ChangeInfo::Marshalling(const ChangeInfo &input, MessageParcel &parcel) 26eace7efcSopenharmony_ci{ 27eace7efcSopenharmony_ci if (!parcel.WriteUint32(static_cast<uint32_t>(input.changeType_))) { 28eace7efcSopenharmony_ci return false; 29eace7efcSopenharmony_ci } 30eace7efcSopenharmony_ci 31eace7efcSopenharmony_ci if (input.uris_.size() > std::numeric_limits<uint32_t>::max() || 32eace7efcSopenharmony_ci !parcel.WriteUint32(static_cast<uint32_t>(input.uris_.size()))) { 33eace7efcSopenharmony_ci return false; 34eace7efcSopenharmony_ci } 35eace7efcSopenharmony_ci 36eace7efcSopenharmony_ci for (auto const &uri : input.uris_) { 37eace7efcSopenharmony_ci if (!parcel.WriteString(uri.ToString())) { 38eace7efcSopenharmony_ci return false; 39eace7efcSopenharmony_ci } 40eace7efcSopenharmony_ci } 41eace7efcSopenharmony_ci 42eace7efcSopenharmony_ci if (!parcel.WriteUint32(input.size_)) { 43eace7efcSopenharmony_ci return false; 44eace7efcSopenharmony_ci } 45eace7efcSopenharmony_ci 46eace7efcSopenharmony_ci if (!(input.size_ == 0 || parcel.WriteBuffer(input.data_, input.size_))) { 47eace7efcSopenharmony_ci return false; 48eace7efcSopenharmony_ci } 49eace7efcSopenharmony_ci 50eace7efcSopenharmony_ci if (!DataObsUtils::Marshal(parcel, input.valueBuckets_)) { 51eace7efcSopenharmony_ci return false; 52eace7efcSopenharmony_ci } 53eace7efcSopenharmony_ci return true; 54eace7efcSopenharmony_ci} 55eace7efcSopenharmony_ci 56eace7efcSopenharmony_cibool ChangeInfo::Unmarshalling(ChangeInfo &output, MessageParcel &parcel) 57eace7efcSopenharmony_ci{ 58eace7efcSopenharmony_ci uint32_t changeType; 59eace7efcSopenharmony_ci if (!parcel.ReadUint32(changeType)) { 60eace7efcSopenharmony_ci return false; 61eace7efcSopenharmony_ci } 62eace7efcSopenharmony_ci 63eace7efcSopenharmony_ci uint32_t len = 0; 64eace7efcSopenharmony_ci if (!parcel.ReadUint32(len)) { 65eace7efcSopenharmony_ci return false; 66eace7efcSopenharmony_ci } 67eace7efcSopenharmony_ci if (len > LIST_MAX_COUNT) { 68eace7efcSopenharmony_ci return false; 69eace7efcSopenharmony_ci } 70eace7efcSopenharmony_ci 71eace7efcSopenharmony_ci std::list<Uri> uris; 72eace7efcSopenharmony_ci for (uint32_t i = 0; i < len; i++) { 73eace7efcSopenharmony_ci Uri uri = Uri(parcel.ReadString()); 74eace7efcSopenharmony_ci if (uri.ToString().empty()) { 75eace7efcSopenharmony_ci return false; 76eace7efcSopenharmony_ci } 77eace7efcSopenharmony_ci uris.emplace_back(std::move(uri)); 78eace7efcSopenharmony_ci } 79eace7efcSopenharmony_ci 80eace7efcSopenharmony_ci uint32_t size = 0; 81eace7efcSopenharmony_ci if (!parcel.ReadUint32(size)) { 82eace7efcSopenharmony_ci return false; 83eace7efcSopenharmony_ci } 84eace7efcSopenharmony_ci 85eace7efcSopenharmony_ci const uint8_t *data = size > 0 ? parcel.ReadBuffer(size) : nullptr; 86eace7efcSopenharmony_ci if (size > 0 && data == nullptr) { 87eace7efcSopenharmony_ci return false; 88eace7efcSopenharmony_ci } 89eace7efcSopenharmony_ci VBuckets buckets; 90eace7efcSopenharmony_ci if (!(DataObsUtils::Unmarshal(parcel, buckets))) { 91eace7efcSopenharmony_ci return false; 92eace7efcSopenharmony_ci } 93eace7efcSopenharmony_ci output.changeType_ = static_cast<ChangeType>(changeType); 94eace7efcSopenharmony_ci std::swap(output.uris_, uris); 95eace7efcSopenharmony_ci output.data_ = const_cast<uint8_t*>(data); 96eace7efcSopenharmony_ci output.size_ = size; 97eace7efcSopenharmony_ci output.valueBuckets_ = std::move(buckets); 98eace7efcSopenharmony_ci return true; 99eace7efcSopenharmony_ci} 100eace7efcSopenharmony_ci} // namespace AAFwk 101eace7efcSopenharmony_ci} // namespace OHOS