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