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