114cf0368Sopenharmony_ci/*
214cf0368Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
314cf0368Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
414cf0368Sopenharmony_ci * you may not use this file except in compliance with the License.
514cf0368Sopenharmony_ci * You may obtain a copy of the License at
614cf0368Sopenharmony_ci *
714cf0368Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
814cf0368Sopenharmony_ci *
914cf0368Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1014cf0368Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1114cf0368Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1214cf0368Sopenharmony_ci * See the License for the specific language governing permissions and
1314cf0368Sopenharmony_ci * limitations under the License.
1414cf0368Sopenharmony_ci */
1514cf0368Sopenharmony_ci
1614cf0368Sopenharmony_ci#define LOG_TAG "TlvUtil"
1714cf0368Sopenharmony_ci
1814cf0368Sopenharmony_ci#include "tlv_util.h"
1914cf0368Sopenharmony_ci#include "udmf_utils.h"
2014cf0368Sopenharmony_ci#include "logger.h"
2114cf0368Sopenharmony_ci#include "tlv_object.h"
2214cf0368Sopenharmony_ci
2314cf0368Sopenharmony_cinamespace OHOS {
2414cf0368Sopenharmony_cinamespace TLVUtil {
2514cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const std::nullptr_t &input, TLVObject &data)
2614cf0368Sopenharmony_ci{
2714cf0368Sopenharmony_ci    return data.CountHead();
2814cf0368Sopenharmony_ci}
2914cf0368Sopenharmony_ci
3014cf0368Sopenharmony_citemplate <> bool Writing(const std::nullptr_t &input, TLVObject &data, TAG tag)
3114cf0368Sopenharmony_ci{
3214cf0368Sopenharmony_ci    InitWhenFirst(input, data);
3314cf0368Sopenharmony_ci    return data.WriteHead(static_cast<uint16_t>(tag), 0);
3414cf0368Sopenharmony_ci}
3514cf0368Sopenharmony_ci
3614cf0368Sopenharmony_citemplate <> bool Reading(std::nullptr_t &output, TLVObject &data, const TLVHead &head)
3714cf0368Sopenharmony_ci{
3814cf0368Sopenharmony_ci    return data.Read(output, head);
3914cf0368Sopenharmony_ci}
4014cf0368Sopenharmony_ci
4114cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const std::monostate &input, TLVObject &data)
4214cf0368Sopenharmony_ci{
4314cf0368Sopenharmony_ci    return data.Count(input);
4414cf0368Sopenharmony_ci}
4514cf0368Sopenharmony_ci
4614cf0368Sopenharmony_citemplate <> bool Writing(const std::monostate &input, TLVObject &data, TAG tag)
4714cf0368Sopenharmony_ci{
4814cf0368Sopenharmony_ci    InitWhenFirst(input, data);
4914cf0368Sopenharmony_ci    return data.Write(tag, input);
5014cf0368Sopenharmony_ci}
5114cf0368Sopenharmony_ci
5214cf0368Sopenharmony_citemplate <> bool Reading(std::monostate &output, TLVObject &data, const TLVHead &head)
5314cf0368Sopenharmony_ci{
5414cf0368Sopenharmony_ci    return data.Read(output, head);
5514cf0368Sopenharmony_ci}
5614cf0368Sopenharmony_ci
5714cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const std::string &input, TLVObject &data)
5814cf0368Sopenharmony_ci{
5914cf0368Sopenharmony_ci    return data.Count(input);
6014cf0368Sopenharmony_ci}
6114cf0368Sopenharmony_ci
6214cf0368Sopenharmony_citemplate <> bool Writing(const std::string &input, TLVObject &data, TAG tag)
6314cf0368Sopenharmony_ci{
6414cf0368Sopenharmony_ci    InitWhenFirst(input, data);
6514cf0368Sopenharmony_ci    return data.Write(tag, input);
6614cf0368Sopenharmony_ci}
6714cf0368Sopenharmony_ci
6814cf0368Sopenharmony_citemplate <> bool Reading(std::string &output, TLVObject &data, const TLVHead &head)
6914cf0368Sopenharmony_ci{
7014cf0368Sopenharmony_ci    return data.Read(output, head);
7114cf0368Sopenharmony_ci}
7214cf0368Sopenharmony_ci
7314cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const std::vector<uint8_t> &input, TLVObject &data)
7414cf0368Sopenharmony_ci{
7514cf0368Sopenharmony_ci    return data.Count(input);
7614cf0368Sopenharmony_ci}
7714cf0368Sopenharmony_ci
7814cf0368Sopenharmony_citemplate <> bool Writing(const std::vector<uint8_t> &input, TLVObject &data, TAG tag)
7914cf0368Sopenharmony_ci{
8014cf0368Sopenharmony_ci    InitWhenFirst(input, data);
8114cf0368Sopenharmony_ci    return data.Write(tag, input);
8214cf0368Sopenharmony_ci}
8314cf0368Sopenharmony_ci
8414cf0368Sopenharmony_citemplate <> bool Reading(std::vector<uint8_t> &output, TLVObject &data, const TLVHead &head)
8514cf0368Sopenharmony_ci{
8614cf0368Sopenharmony_ci    return data.Read(output, head);
8714cf0368Sopenharmony_ci}
8814cf0368Sopenharmony_ci
8914cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const UDType &input, TLVObject &data)
9014cf0368Sopenharmony_ci{
9114cf0368Sopenharmony_ci    int32_t type = input;
9214cf0368Sopenharmony_ci    return data.CountBasic(type);
9314cf0368Sopenharmony_ci}
9414cf0368Sopenharmony_ci
9514cf0368Sopenharmony_citemplate <> bool Writing(const UDType &input, TLVObject &data, TAG tag)
9614cf0368Sopenharmony_ci{
9714cf0368Sopenharmony_ci    InitWhenFirst(input, data);
9814cf0368Sopenharmony_ci    int32_t type = input;
9914cf0368Sopenharmony_ci    return data.WriteBasic(tag, type);
10014cf0368Sopenharmony_ci}
10114cf0368Sopenharmony_ci
10214cf0368Sopenharmony_citemplate <> bool Reading(UDType &output, TLVObject &data, const TLVHead &head)
10314cf0368Sopenharmony_ci{
10414cf0368Sopenharmony_ci    int32_t type;
10514cf0368Sopenharmony_ci    if (!Reading(type, data, head)) {
10614cf0368Sopenharmony_ci        return false;
10714cf0368Sopenharmony_ci    }
10814cf0368Sopenharmony_ci    if (type < UDType::ENTITY || type >= UDType::UD_BUTT) {
10914cf0368Sopenharmony_ci        return false;
11014cf0368Sopenharmony_ci    }
11114cf0368Sopenharmony_ci    output = static_cast<UDType>(type);
11214cf0368Sopenharmony_ci    return true;
11314cf0368Sopenharmony_ci}
11414cf0368Sopenharmony_ci
11514cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const DataStatus &input, TLVObject &data)
11614cf0368Sopenharmony_ci{
11714cf0368Sopenharmony_ci    int32_t status = input;
11814cf0368Sopenharmony_ci    return data.CountBasic(status);
11914cf0368Sopenharmony_ci}
12014cf0368Sopenharmony_ci
12114cf0368Sopenharmony_citemplate <> bool Writing(const DataStatus &input, TLVObject &data, TAG tag)
12214cf0368Sopenharmony_ci{
12314cf0368Sopenharmony_ci    InitWhenFirst(input, data);
12414cf0368Sopenharmony_ci    int32_t status = input;
12514cf0368Sopenharmony_ci    return data.WriteBasic(tag, status);
12614cf0368Sopenharmony_ci}
12714cf0368Sopenharmony_ci
12814cf0368Sopenharmony_citemplate <> bool Reading(DataStatus &output, TLVObject &data, const TLVHead &head)
12914cf0368Sopenharmony_ci{
13014cf0368Sopenharmony_ci    int32_t status;
13114cf0368Sopenharmony_ci    if (!data.ReadBasic(status, head)) {
13214cf0368Sopenharmony_ci        return false;
13314cf0368Sopenharmony_ci    }
13414cf0368Sopenharmony_ci    if (status < DataStatus::WORKING || status >= DataStatus::FADE) {
13514cf0368Sopenharmony_ci        return false;
13614cf0368Sopenharmony_ci    }
13714cf0368Sopenharmony_ci    output = static_cast<DataStatus>(status);
13814cf0368Sopenharmony_ci    return true;
13914cf0368Sopenharmony_ci}
14014cf0368Sopenharmony_ci
14114cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const Object &input, TLVObject &data)
14214cf0368Sopenharmony_ci{
14314cf0368Sopenharmony_ci    return data.CountHead() + CountBufferSize(input.value_, data);
14414cf0368Sopenharmony_ci}
14514cf0368Sopenharmony_ci
14614cf0368Sopenharmony_citemplate <> bool Writing(const Object &input, TLVObject &data, TAG tag)
14714cf0368Sopenharmony_ci{
14814cf0368Sopenharmony_ci    InitWhenFirst(input, data);
14914cf0368Sopenharmony_ci    auto tagCursor = data.GetCursor();
15014cf0368Sopenharmony_ci    data.OffsetHead();
15114cf0368Sopenharmony_ci    if (!Writing(input.value_, data, TAG::TAG_OBJECT_VALUE)) {
15214cf0368Sopenharmony_ci        return false;
15314cf0368Sopenharmony_ci    }
15414cf0368Sopenharmony_ci    return data.WriteBackHead(static_cast<uint16_t>(tag), tagCursor, data.GetCursor() - tagCursor - sizeof(TLVHead));
15514cf0368Sopenharmony_ci}
15614cf0368Sopenharmony_citemplate <> bool Reading(Object &output, TLVObject &data, const TLVHead &head)
15714cf0368Sopenharmony_ci{
15814cf0368Sopenharmony_ci    TLVHead headValue{};
15914cf0368Sopenharmony_ci    if (!data.ReadHead(headValue)) {
16014cf0368Sopenharmony_ci        return false;
16114cf0368Sopenharmony_ci    }
16214cf0368Sopenharmony_ci    if (headValue.tag != static_cast<uint16_t>(TAG::TAG_OBJECT_VALUE)) {
16314cf0368Sopenharmony_ci        return false;
16414cf0368Sopenharmony_ci    }
16514cf0368Sopenharmony_ci    if (!Reading(output.value_, data, headValue)) {
16614cf0368Sopenharmony_ci        return false;
16714cf0368Sopenharmony_ci    }
16814cf0368Sopenharmony_ci    return true;
16914cf0368Sopenharmony_ci}
17014cf0368Sopenharmony_ci
17114cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const UnifiedKey &input, TLVObject &data)
17214cf0368Sopenharmony_ci{
17314cf0368Sopenharmony_ci    return data.CountHead() + data.Count(input.key) + data.Count(input.intention) + data.Count(input.bundleName) +
17414cf0368Sopenharmony_ci        data.Count(input.groupId);
17514cf0368Sopenharmony_ci}
17614cf0368Sopenharmony_citemplate <> bool Writing(const UnifiedKey &input, TLVObject &data, TAG tag)
17714cf0368Sopenharmony_ci{
17814cf0368Sopenharmony_ci    InitWhenFirst(input, data);
17914cf0368Sopenharmony_ci    auto tagCursor = data.GetCursor();
18014cf0368Sopenharmony_ci    data.OffsetHead();
18114cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_KEY, input.key)) {
18214cf0368Sopenharmony_ci        return false;
18314cf0368Sopenharmony_ci    }
18414cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_INTENTION, input.intention)) {
18514cf0368Sopenharmony_ci        return false;
18614cf0368Sopenharmony_ci    }
18714cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_BUNDLE_NAME, input.bundleName)) {
18814cf0368Sopenharmony_ci        return false;
18914cf0368Sopenharmony_ci    }
19014cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_GROUP_ID, input.groupId)) {
19114cf0368Sopenharmony_ci        return false;
19214cf0368Sopenharmony_ci    }
19314cf0368Sopenharmony_ci    return data.WriteBackHead(static_cast<uint16_t>(tag), tagCursor, data.GetCursor() - tagCursor - sizeof(TLVHead));
19414cf0368Sopenharmony_ci}
19514cf0368Sopenharmony_ci
19614cf0368Sopenharmony_citemplate <> bool Reading(UnifiedKey &output, TLVObject &data, const TLVHead &head)
19714cf0368Sopenharmony_ci{
19814cf0368Sopenharmony_ci    auto endCursor = data.GetCursor() + head.len;
19914cf0368Sopenharmony_ci    while (data.GetCursor() < endCursor) {
20014cf0368Sopenharmony_ci        TLVHead headItem{};
20114cf0368Sopenharmony_ci        if (!data.ReadHead(headItem)) {
20214cf0368Sopenharmony_ci            return false;
20314cf0368Sopenharmony_ci        }
20414cf0368Sopenharmony_ci        switch (headItem.tag) {
20514cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_KEY):
20614cf0368Sopenharmony_ci                if (!data.Read(output.key, headItem)) {
20714cf0368Sopenharmony_ci                    return false;
20814cf0368Sopenharmony_ci                }
20914cf0368Sopenharmony_ci                break;
21014cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_INTENTION):
21114cf0368Sopenharmony_ci                if (!data.Read(output.intention, headItem)) {
21214cf0368Sopenharmony_ci                    return false;
21314cf0368Sopenharmony_ci                }
21414cf0368Sopenharmony_ci                break;
21514cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_BUNDLE_NAME):
21614cf0368Sopenharmony_ci                if (!data.Read(output.bundleName, headItem)) {
21714cf0368Sopenharmony_ci                    return false;
21814cf0368Sopenharmony_ci                }
21914cf0368Sopenharmony_ci                break;
22014cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_GROUP_ID):
22114cf0368Sopenharmony_ci                if (!data.Read(output.groupId, headItem)) {
22214cf0368Sopenharmony_ci                    return false;
22314cf0368Sopenharmony_ci                }
22414cf0368Sopenharmony_ci                break;
22514cf0368Sopenharmony_ci            default:
22614cf0368Sopenharmony_ci                data.Skip(headItem);
22714cf0368Sopenharmony_ci        }
22814cf0368Sopenharmony_ci    }
22914cf0368Sopenharmony_ci    return true;
23014cf0368Sopenharmony_ci}
23114cf0368Sopenharmony_ci
23214cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const UnifiedData &input, TLVObject &data)
23314cf0368Sopenharmony_ci{
23414cf0368Sopenharmony_ci    std::string version = UTILS::GetCurrentSdkVersion();
23514cf0368Sopenharmony_ci    return data.CountHead() + data.Count(version) + TLVUtil::CountBufferSize(input.GetRecords(), data);
23614cf0368Sopenharmony_ci}
23714cf0368Sopenharmony_ci
23814cf0368Sopenharmony_citemplate <> bool Writing(const UnifiedData &input, TLVObject &data, TAG tag)
23914cf0368Sopenharmony_ci{
24014cf0368Sopenharmony_ci    InitWhenFirst(input, data);
24114cf0368Sopenharmony_ci    auto tagCursor = data.GetCursor();
24214cf0368Sopenharmony_ci    data.OffsetHead();
24314cf0368Sopenharmony_ci    std::string version = UTILS::GetCurrentSdkVersion();
24414cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_VERSION, version)) {
24514cf0368Sopenharmony_ci        return false;
24614cf0368Sopenharmony_ci    }
24714cf0368Sopenharmony_ci    if (!TLVUtil::Writing(input.GetRecords(), data, TAG::TAG_UNIFIED_RECORD)) {
24814cf0368Sopenharmony_ci        return false;
24914cf0368Sopenharmony_ci    }
25014cf0368Sopenharmony_ci    return data.WriteBackHead(static_cast<uint16_t>(tag), tagCursor, data.GetCursor() - tagCursor - sizeof(TLVHead));
25114cf0368Sopenharmony_ci}
25214cf0368Sopenharmony_ci
25314cf0368Sopenharmony_citemplate <> bool Reading(UnifiedData &output, TLVObject &data, const TLVHead &head)
25414cf0368Sopenharmony_ci{
25514cf0368Sopenharmony_ci    auto endCursor = data.GetCursor() + head.len;
25614cf0368Sopenharmony_ci    while (data.GetCursor() < endCursor) {
25714cf0368Sopenharmony_ci        TLVHead headItem{};
25814cf0368Sopenharmony_ci        if (!data.ReadHead(headItem)) {
25914cf0368Sopenharmony_ci            return false;
26014cf0368Sopenharmony_ci        }
26114cf0368Sopenharmony_ci        if (headItem.tag == static_cast<uint16_t>(TAG::TAG_VERSION)) {
26214cf0368Sopenharmony_ci            data.Skip(headItem);
26314cf0368Sopenharmony_ci            continue;
26414cf0368Sopenharmony_ci        }
26514cf0368Sopenharmony_ci        if (headItem.tag == static_cast<uint16_t>(TAG::TAG_UNIFIED_RECORD)) {
26614cf0368Sopenharmony_ci            auto records = output.GetRecords();
26714cf0368Sopenharmony_ci            if (!Reading(records, data, headItem)) {
26814cf0368Sopenharmony_ci                return false;
26914cf0368Sopenharmony_ci            }
27014cf0368Sopenharmony_ci            output.SetRecords(records);
27114cf0368Sopenharmony_ci            continue;
27214cf0368Sopenharmony_ci        }
27314cf0368Sopenharmony_ci        data.Skip(headItem);
27414cf0368Sopenharmony_ci    }
27514cf0368Sopenharmony_ci    return true;
27614cf0368Sopenharmony_ci}
27714cf0368Sopenharmony_ci
27814cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const UnifiedRecord &input, TLVObject &data)
27914cf0368Sopenharmony_ci{
28014cf0368Sopenharmony_ci    std::string version = UTILS::GetCurrentSdkVersion();
28114cf0368Sopenharmony_ci    return data.CountHead() + data.Count(version) + data.CountBasic(static_cast<int32_t>(input.GetType())) +
28214cf0368Sopenharmony_ci        data.Count(input.GetUid()) + CountBufferSize(input.GetOriginValue(), data);
28314cf0368Sopenharmony_ci}
28414cf0368Sopenharmony_ci
28514cf0368Sopenharmony_citemplate <> bool Writing(const UnifiedRecord &input, TLVObject &data, TAG tag)
28614cf0368Sopenharmony_ci{
28714cf0368Sopenharmony_ci    InitWhenFirst(input, data);
28814cf0368Sopenharmony_ci    auto tagCursor = data.GetCursor();
28914cf0368Sopenharmony_ci    data.OffsetHead();
29014cf0368Sopenharmony_ci    std::string version = UTILS::GetCurrentSdkVersion();
29114cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_VERSION, version)) {
29214cf0368Sopenharmony_ci        return false;
29314cf0368Sopenharmony_ci    }
29414cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_UD_TYPE, static_cast<int32_t>(input.GetType()))) {
29514cf0368Sopenharmony_ci        return false;
29614cf0368Sopenharmony_ci    }
29714cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_UID, input.GetUid())) {
29814cf0368Sopenharmony_ci        return false;
29914cf0368Sopenharmony_ci    }
30014cf0368Sopenharmony_ci    if (!TLVUtil::Writing(input.GetOriginValue(), data, TAG::TAG_RECORD_VALUE)) {
30114cf0368Sopenharmony_ci        return false;
30214cf0368Sopenharmony_ci    }
30314cf0368Sopenharmony_ci    return data.WriteBackHead(static_cast<uint16_t>(tag), tagCursor, data.GetCursor() - tagCursor - sizeof(TLVHead));
30414cf0368Sopenharmony_ci}
30514cf0368Sopenharmony_ci
30614cf0368Sopenharmony_citemplate <> bool Reading(UnifiedRecord &output, TLVObject &data, const TLVHead &head)
30714cf0368Sopenharmony_ci{
30814cf0368Sopenharmony_ci    auto endCursor = data.GetCursor() + head.len;
30914cf0368Sopenharmony_ci    UDType dataType;
31014cf0368Sopenharmony_ci    std::string uid;
31114cf0368Sopenharmony_ci    ValueType value;
31214cf0368Sopenharmony_ci    while (data.GetCursor() < endCursor) {
31314cf0368Sopenharmony_ci        TLVHead headItem{};
31414cf0368Sopenharmony_ci        if (!data.ReadHead(headItem)) {
31514cf0368Sopenharmony_ci            return false;
31614cf0368Sopenharmony_ci        }
31714cf0368Sopenharmony_ci        switch (headItem.tag) {
31814cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_VERSION):
31914cf0368Sopenharmony_ci                data.Skip(headItem);
32014cf0368Sopenharmony_ci                break;
32114cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_UD_TYPE):
32214cf0368Sopenharmony_ci                if (!TLVUtil::Reading(dataType, data, headItem)) {
32314cf0368Sopenharmony_ci                    return false;
32414cf0368Sopenharmony_ci                }
32514cf0368Sopenharmony_ci                output.SetType(dataType);
32614cf0368Sopenharmony_ci                break;
32714cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_UID):
32814cf0368Sopenharmony_ci                if (!data.Read(uid, headItem)) {
32914cf0368Sopenharmony_ci                    return false;
33014cf0368Sopenharmony_ci                }
33114cf0368Sopenharmony_ci                output.SetUid(uid);
33214cf0368Sopenharmony_ci                break;
33314cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_RECORD_VALUE):
33414cf0368Sopenharmony_ci                if (!TLVUtil::Reading(value, data, headItem)) {
33514cf0368Sopenharmony_ci                    return false;
33614cf0368Sopenharmony_ci                }
33714cf0368Sopenharmony_ci                output.SetValue(value);
33814cf0368Sopenharmony_ci                break;
33914cf0368Sopenharmony_ci            default:
34014cf0368Sopenharmony_ci                data.Skip(headItem);
34114cf0368Sopenharmony_ci        }
34214cf0368Sopenharmony_ci    }
34314cf0368Sopenharmony_ci    return true;
34414cf0368Sopenharmony_ci}
34514cf0368Sopenharmony_ci
34614cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const Runtime &input, TLVObject &data)
34714cf0368Sopenharmony_ci{
34814cf0368Sopenharmony_ci    std::string version = UTILS::GetCurrentSdkVersion();
34914cf0368Sopenharmony_ci    return data.CountHead() + data.CountBasic(input.isPrivate) + data.CountBasic(input.dataVersion) +
35014cf0368Sopenharmony_ci        data.CountBasic(input.recordTotalNum) + data.CountBasic(input.tokenId) +
35114cf0368Sopenharmony_ci        data.CountBasic(static_cast<int64_t>(input.createTime)) +
35214cf0368Sopenharmony_ci        data.CountBasic(static_cast<int64_t>(input.lastModifiedTime)) +
35314cf0368Sopenharmony_ci        data.CountBasic(static_cast<int32_t>(input.dataStatus)) + data.Count(input.sourcePackage) +
35414cf0368Sopenharmony_ci        data.Count(input.createPackage) + data.Count(input.deviceId) + TLVUtil::CountBufferSize(input.key, data) +
35514cf0368Sopenharmony_ci        data.Count(version) + TLVUtil::CountBufferSize(input.privileges, data);
35614cf0368Sopenharmony_ci}
35714cf0368Sopenharmony_ci
35814cf0368Sopenharmony_citemplate <> bool Writing(const Runtime &input, TLVObject &data, TAG tag)
35914cf0368Sopenharmony_ci{
36014cf0368Sopenharmony_ci    InitWhenFirst(input, data);
36114cf0368Sopenharmony_ci    auto tagCursor = data.GetCursor();
36214cf0368Sopenharmony_ci    data.OffsetHead();
36314cf0368Sopenharmony_ci    std::string version = UTILS::GetCurrentSdkVersion();
36414cf0368Sopenharmony_ci    if (!TLVUtil::Writing(version, data, TAG::TAG_VERSION)) {
36514cf0368Sopenharmony_ci        return false;
36614cf0368Sopenharmony_ci    }
36714cf0368Sopenharmony_ci    if (!TLVUtil::Writing(input.key, data, TAG::TAG_KEY)) {
36814cf0368Sopenharmony_ci        return false;
36914cf0368Sopenharmony_ci    }
37014cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_IS_PRIVATE, input.isPrivate)) {
37114cf0368Sopenharmony_ci        return false;
37214cf0368Sopenharmony_ci    }
37314cf0368Sopenharmony_ci    if (!TLVUtil::Writing(input.privileges, data, TAG::TAG_PRIVILEGE)) {
37414cf0368Sopenharmony_ci        return false;
37514cf0368Sopenharmony_ci    }
37614cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_CREATE_TIME, static_cast<int64_t>(input.createTime))) {
37714cf0368Sopenharmony_ci        return false;
37814cf0368Sopenharmony_ci    }
37914cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_SOURCE_PACKAGE, input.sourcePackage)) {
38014cf0368Sopenharmony_ci        return false;
38114cf0368Sopenharmony_ci    }
38214cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_DATA_STATUS, static_cast<int32_t>(input.dataStatus))) {
38314cf0368Sopenharmony_ci        return false;
38414cf0368Sopenharmony_ci    }
38514cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_DATA_VERSION, input.dataVersion)) {
38614cf0368Sopenharmony_ci        return false;
38714cf0368Sopenharmony_ci    }
38814cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_LAST_MODIFIED_TIME, static_cast<int64_t>(input.lastModifiedTime))) {
38914cf0368Sopenharmony_ci        return false;
39014cf0368Sopenharmony_ci    }
39114cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_CREATE_PACKAGE, input.createPackage)) {
39214cf0368Sopenharmony_ci        return false;
39314cf0368Sopenharmony_ci    }
39414cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_DEVICE_ID, input.deviceId)) {
39514cf0368Sopenharmony_ci        return false;
39614cf0368Sopenharmony_ci    }
39714cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_RECORD_TOTAL_NUM, input.recordTotalNum)) {
39814cf0368Sopenharmony_ci        return false;
39914cf0368Sopenharmony_ci    }
40014cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_TOKEN_ID, input.tokenId)) {
40114cf0368Sopenharmony_ci        return false;
40214cf0368Sopenharmony_ci    }
40314cf0368Sopenharmony_ci    return data.WriteBackHead(static_cast<uint16_t>(tag), tagCursor, data.GetCursor() - tagCursor - sizeof(TLVHead));
40414cf0368Sopenharmony_ci}
40514cf0368Sopenharmony_ci
40614cf0368Sopenharmony_citemplate <> bool Reading(Runtime &output, TLVObject &data, const TLVHead &head)
40714cf0368Sopenharmony_ci{
40814cf0368Sopenharmony_ci    auto endCursor = data.GetCursor() + head.len;
40914cf0368Sopenharmony_ci    while (data.GetCursor() < endCursor) {
41014cf0368Sopenharmony_ci        TLVHead headItem{};
41114cf0368Sopenharmony_ci        if (!data.ReadHead(headItem)) {
41214cf0368Sopenharmony_ci            return false;
41314cf0368Sopenharmony_ci        }
41414cf0368Sopenharmony_ci        bool result = true;
41514cf0368Sopenharmony_ci        int64_t createTime = 0;
41614cf0368Sopenharmony_ci        int64_t lastModifiedTime = 0;
41714cf0368Sopenharmony_ci        switch (headItem.tag) {
41814cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_KEY):
41914cf0368Sopenharmony_ci                result = TLVUtil::Reading(output.key, data, headItem);
42014cf0368Sopenharmony_ci                break;
42114cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_IS_PRIVATE):
42214cf0368Sopenharmony_ci                result = data.ReadBasic(output.isPrivate, headItem);
42314cf0368Sopenharmony_ci                break;
42414cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_PRIVILEGE):
42514cf0368Sopenharmony_ci                result = TLVUtil::Reading(output.privileges, data, headItem);
42614cf0368Sopenharmony_ci                break;
42714cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_CREATE_TIME):
42814cf0368Sopenharmony_ci                result = data.ReadBasic(createTime, headItem);
42914cf0368Sopenharmony_ci                output.createTime = static_cast<time_t>(createTime);
43014cf0368Sopenharmony_ci                break;
43114cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_SOURCE_PACKAGE):
43214cf0368Sopenharmony_ci                result = data.Read(output.sourcePackage, headItem);
43314cf0368Sopenharmony_ci                break;
43414cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_DATA_STATUS):
43514cf0368Sopenharmony_ci                result = TLVUtil::Reading(output.dataStatus, data, headItem);
43614cf0368Sopenharmony_ci                break;
43714cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_DATA_VERSION):
43814cf0368Sopenharmony_ci                result = data.ReadBasic(output.dataVersion, headItem);
43914cf0368Sopenharmony_ci                break;
44014cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_LAST_MODIFIED_TIME):
44114cf0368Sopenharmony_ci                result = data.ReadBasic(lastModifiedTime, headItem);
44214cf0368Sopenharmony_ci                output.lastModifiedTime = static_cast<time_t>(lastModifiedTime);
44314cf0368Sopenharmony_ci                break;
44414cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_CREATE_PACKAGE):
44514cf0368Sopenharmony_ci                result = data.Read(output.createPackage, headItem);
44614cf0368Sopenharmony_ci                break;
44714cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_DEVICE_ID):
44814cf0368Sopenharmony_ci                result = data.Read(output.deviceId, headItem);
44914cf0368Sopenharmony_ci                break;
45014cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_RECORD_TOTAL_NUM):
45114cf0368Sopenharmony_ci                result = data.ReadBasic(output.recordTotalNum, headItem);
45214cf0368Sopenharmony_ci                break;
45314cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_TOKEN_ID):
45414cf0368Sopenharmony_ci                result = data.ReadBasic(output.tokenId, headItem);
45514cf0368Sopenharmony_ci                break;
45614cf0368Sopenharmony_ci            default:
45714cf0368Sopenharmony_ci                result = data.Skip(headItem);
45814cf0368Sopenharmony_ci        }
45914cf0368Sopenharmony_ci        if (!result) {
46014cf0368Sopenharmony_ci            return false;
46114cf0368Sopenharmony_ci        }
46214cf0368Sopenharmony_ci    }
46314cf0368Sopenharmony_ci    return true;
46414cf0368Sopenharmony_ci}
46514cf0368Sopenharmony_ci
46614cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const Privilege &input, TLVObject &data)
46714cf0368Sopenharmony_ci{
46814cf0368Sopenharmony_ci    return data.CountHead() + data.CountBasic(input.tokenId) + data.Count(input.readPermission) +
46914cf0368Sopenharmony_ci        data.Count(input.writePermission);
47014cf0368Sopenharmony_ci}
47114cf0368Sopenharmony_ci
47214cf0368Sopenharmony_citemplate <> bool Writing(const Privilege &input, TLVObject &data, TAG tag)
47314cf0368Sopenharmony_ci{
47414cf0368Sopenharmony_ci    InitWhenFirst(input, data);
47514cf0368Sopenharmony_ci    auto tagCursor = data.GetCursor();
47614cf0368Sopenharmony_ci    data.OffsetHead();
47714cf0368Sopenharmony_ci    if (!data.WriteBasic(TAG::TAG_TOKEN_ID, input.tokenId)) {
47814cf0368Sopenharmony_ci        return false;
47914cf0368Sopenharmony_ci    }
48014cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_READPERMISSION, input.readPermission)) {
48114cf0368Sopenharmony_ci        return false;
48214cf0368Sopenharmony_ci    }
48314cf0368Sopenharmony_ci    if (!data.Write(TAG::TAG_WRITEPERMISSION, input.writePermission)) {
48414cf0368Sopenharmony_ci        return false;
48514cf0368Sopenharmony_ci    }
48614cf0368Sopenharmony_ci    return data.WriteBackHead(static_cast<uint16_t>(tag), tagCursor, data.GetCursor() - tagCursor - sizeof(TLVHead));
48714cf0368Sopenharmony_ci}
48814cf0368Sopenharmony_ci
48914cf0368Sopenharmony_citemplate <> bool Reading(Privilege &output, TLVObject &data, const TLVHead &head)
49014cf0368Sopenharmony_ci{
49114cf0368Sopenharmony_ci    auto endCursor = data.GetCursor() + head.len;
49214cf0368Sopenharmony_ci    while (data.GetCursor() < endCursor) {
49314cf0368Sopenharmony_ci        TLVHead headItem{};
49414cf0368Sopenharmony_ci        if (!data.ReadHead(headItem)) {
49514cf0368Sopenharmony_ci            return false;
49614cf0368Sopenharmony_ci        }
49714cf0368Sopenharmony_ci        switch (headItem.tag) {
49814cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_TOKEN_ID):
49914cf0368Sopenharmony_ci                if (!data.ReadBasic(output.tokenId, headItem)) {
50014cf0368Sopenharmony_ci                    return false;
50114cf0368Sopenharmony_ci                }
50214cf0368Sopenharmony_ci                break;
50314cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_READPERMISSION):
50414cf0368Sopenharmony_ci                if (!data.Read(output.readPermission, headItem)) {
50514cf0368Sopenharmony_ci                    return false;
50614cf0368Sopenharmony_ci                }
50714cf0368Sopenharmony_ci                break;
50814cf0368Sopenharmony_ci            case static_cast<uint16_t>(TAG::TAG_WRITEPERMISSION):
50914cf0368Sopenharmony_ci                if (!data.Read(output.writePermission, headItem)) {
51014cf0368Sopenharmony_ci                    return false;
51114cf0368Sopenharmony_ci                }
51214cf0368Sopenharmony_ci                break;
51314cf0368Sopenharmony_ci            default:
51414cf0368Sopenharmony_ci                data.Skip(headItem);
51514cf0368Sopenharmony_ci        }
51614cf0368Sopenharmony_ci    }
51714cf0368Sopenharmony_ci    return true;
51814cf0368Sopenharmony_ci}
51914cf0368Sopenharmony_ci
52014cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const std::shared_ptr<OHOS::Media::PixelMap> &input, TLVObject &data)
52114cf0368Sopenharmony_ci{
52214cf0368Sopenharmony_ci    std::vector<std::uint8_t> val;
52314cf0368Sopenharmony_ci    if (!input->EncodeTlv(val)) {
52414cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Encode pixelMap error when CountBufferSize");
52514cf0368Sopenharmony_ci        return 0;
52614cf0368Sopenharmony_ci    }
52714cf0368Sopenharmony_ci    return CountBufferSize(val, data);
52814cf0368Sopenharmony_ci}
52914cf0368Sopenharmony_ci
53014cf0368Sopenharmony_citemplate <> bool Writing(const std::shared_ptr<OHOS::Media::PixelMap> &input, TLVObject &data, TAG tag)
53114cf0368Sopenharmony_ci{
53214cf0368Sopenharmony_ci    InitWhenFirst(input, data);
53314cf0368Sopenharmony_ci    std::vector<std::uint8_t> val;
53414cf0368Sopenharmony_ci    if (!input->EncodeTlv(val)) {
53514cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Encode pixelMap error when Writing");
53614cf0368Sopenharmony_ci        return false;
53714cf0368Sopenharmony_ci    }
53814cf0368Sopenharmony_ci    return data.Write(tag, val);
53914cf0368Sopenharmony_ci}
54014cf0368Sopenharmony_ci
54114cf0368Sopenharmony_citemplate <> bool Reading(std::shared_ptr<OHOS::Media::PixelMap> &output, TLVObject &data, const TLVHead &head)
54214cf0368Sopenharmony_ci{
54314cf0368Sopenharmony_ci    std::vector<std::uint8_t> val;
54414cf0368Sopenharmony_ci    if (!data.Read(val, head)) {
54514cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Reading u8 vector error.");
54614cf0368Sopenharmony_ci        return false;
54714cf0368Sopenharmony_ci    }
54814cf0368Sopenharmony_ci    output = std::shared_ptr<OHOS::Media::PixelMap>(OHOS::Media::PixelMap::DecodeTlv(val));
54914cf0368Sopenharmony_ci    if (output == nullptr) {
55014cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "DecodeTlv pixelMap error when Reading.");
55114cf0368Sopenharmony_ci        return false;
55214cf0368Sopenharmony_ci    }
55314cf0368Sopenharmony_ci    return true;
55414cf0368Sopenharmony_ci}
55514cf0368Sopenharmony_ci
55614cf0368Sopenharmony_citemplate <> size_t CountBufferSize(const std::shared_ptr<OHOS::AAFwk::Want> &input, TLVObject &data)
55714cf0368Sopenharmony_ci{
55814cf0368Sopenharmony_ci    Parcel parcel;
55914cf0368Sopenharmony_ci    if (!input->Marshalling(parcel)) {
56014cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Marshalling want error when Count");
56114cf0368Sopenharmony_ci        return 0;
56214cf0368Sopenharmony_ci    }
56314cf0368Sopenharmony_ci    auto size = parcel.GetDataSize();
56414cf0368Sopenharmony_ci    std::vector<std::uint8_t> val(size);
56514cf0368Sopenharmony_ci    return CountBufferSize(val, data);
56614cf0368Sopenharmony_ci}
56714cf0368Sopenharmony_ci
56814cf0368Sopenharmony_citemplate <> bool Writing(const std::shared_ptr<OHOS::AAFwk::Want> &input, TLVObject &data, TAG tag)
56914cf0368Sopenharmony_ci{
57014cf0368Sopenharmony_ci    InitWhenFirst(input, data);
57114cf0368Sopenharmony_ci    Parcel parcel;
57214cf0368Sopenharmony_ci    if (!input->Marshalling(parcel)) {
57314cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Marshalling want error in tlv write. tag=%{public}hu", tag);
57414cf0368Sopenharmony_ci        return false;
57514cf0368Sopenharmony_ci    }
57614cf0368Sopenharmony_ci    auto size = parcel.GetDataSize();
57714cf0368Sopenharmony_ci    auto buffer = parcel.GetData();
57814cf0368Sopenharmony_ci    std::vector<std::uint8_t> val(size);
57914cf0368Sopenharmony_ci    if (size != 0) {
58014cf0368Sopenharmony_ci        auto err = memcpy_s(val.data(), size, reinterpret_cast<const void *>(buffer), size);
58114cf0368Sopenharmony_ci        if (err != EOK) {
58214cf0368Sopenharmony_ci            LOG_ERROR(UDMF_FRAMEWORK, "memcpy error in tlv write want. tag=%{public}hu", tag);
58314cf0368Sopenharmony_ci            return false;
58414cf0368Sopenharmony_ci        }
58514cf0368Sopenharmony_ci    }
58614cf0368Sopenharmony_ci    return data.Write(tag, val);
58714cf0368Sopenharmony_ci}
58814cf0368Sopenharmony_ci
58914cf0368Sopenharmony_citemplate <> bool Reading(std::shared_ptr<OHOS::AAFwk::Want> &output, TLVObject &data, const TLVHead &head)
59014cf0368Sopenharmony_ci{
59114cf0368Sopenharmony_ci    std::vector<std::uint8_t> val;
59214cf0368Sopenharmony_ci    if (!data.Read(val, head)) {
59314cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Reading u8 vector error.");
59414cf0368Sopenharmony_ci        return false;
59514cf0368Sopenharmony_ci    }
59614cf0368Sopenharmony_ci
59714cf0368Sopenharmony_ci    std::shared_ptr<Parcel> parcel = std::make_shared<Parcel>();
59814cf0368Sopenharmony_ci    auto buffer = malloc(val.size());
59914cf0368Sopenharmony_ci    if (buffer == nullptr) {
60014cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "malloc error in tlv read. tag=%{public}hu", head.tag);
60114cf0368Sopenharmony_ci        return false;
60214cf0368Sopenharmony_ci    }
60314cf0368Sopenharmony_ci    auto err = memcpy_s(buffer, val.size(), val.data(), val.size());
60414cf0368Sopenharmony_ci    if (err != EOK) {
60514cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "memcpy_s error in tlv read want. tag=%{public}hu", head.tag);
60614cf0368Sopenharmony_ci        return false;
60714cf0368Sopenharmony_ci    }
60814cf0368Sopenharmony_ci    if (!parcel->ParseFrom((uintptr_t)buffer, head.len)) {
60914cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "ParseFrom error in tlv read want. tag=%{public}hu", head.tag);
61014cf0368Sopenharmony_ci        return false;
61114cf0368Sopenharmony_ci    }
61214cf0368Sopenharmony_ci    auto want = AAFwk::Want::Unmarshalling(*parcel);
61314cf0368Sopenharmony_ci    if (want == nullptr) {
61414cf0368Sopenharmony_ci        LOG_ERROR(UDMF_FRAMEWORK, "Unmarshalling want error in tlv read. tag=%{public}hu", head.tag);
61514cf0368Sopenharmony_ci        return false;
61614cf0368Sopenharmony_ci    }
61714cf0368Sopenharmony_ci    output = std::shared_ptr<OHOS::AAFwk::Want>(want);
61814cf0368Sopenharmony_ci    return true;
61914cf0368Sopenharmony_ci}
62014cf0368Sopenharmony_ci} // namespace TLVUtil
62114cf0368Sopenharmony_ci} // namespace OHOS
622