117fd14ceSopenharmony_ci/* 217fd14ceSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 317fd14ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 417fd14ceSopenharmony_ci * you may not use this file except in compliance with the License. 517fd14ceSopenharmony_ci * You may obtain a copy of the License at 617fd14ceSopenharmony_ci * 717fd14ceSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 817fd14ceSopenharmony_ci * 917fd14ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1017fd14ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1117fd14ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1217fd14ceSopenharmony_ci * See the License for the specific language governing permissions and 1317fd14ceSopenharmony_ci * limitations under the License. 1417fd14ceSopenharmony_ci */ 1517fd14ceSopenharmony_ci 1617fd14ceSopenharmony_ci#include "hc_parcel.h" 1717fd14ceSopenharmony_ci#include "securec.h" 1817fd14ceSopenharmony_ci#include "hc_types.h" 1917fd14ceSopenharmony_ci 2017fd14ceSopenharmony_ciconst int PARCEL_DEFAULT_INCREASE_STEP = 16; 2117fd14ceSopenharmony_ciconst uint32_t PARCEL_UINT_MAX = 0xffffffffU; 2217fd14ceSopenharmony_ci 2317fd14ceSopenharmony_ciHcParcel CreateParcel(uint32_t size, uint32_t allocUnit) 2417fd14ceSopenharmony_ci{ 2517fd14ceSopenharmony_ci HcParcel parcel; 2617fd14ceSopenharmony_ci (void)memset_s(&parcel, sizeof(parcel), 0, sizeof(parcel)); 2717fd14ceSopenharmony_ci parcel.allocUnit = allocUnit; 2817fd14ceSopenharmony_ci if (parcel.allocUnit == 0) { 2917fd14ceSopenharmony_ci parcel.allocUnit = PARCEL_DEFAULT_INCREASE_STEP; 3017fd14ceSopenharmony_ci } 3117fd14ceSopenharmony_ci if (size > 0) { 3217fd14ceSopenharmony_ci parcel.data = (char *)HcMalloc(size, 0); 3317fd14ceSopenharmony_ci if (parcel.data != NULL) { 3417fd14ceSopenharmony_ci parcel.length = size; 3517fd14ceSopenharmony_ci } 3617fd14ceSopenharmony_ci } 3717fd14ceSopenharmony_ci return parcel; 3817fd14ceSopenharmony_ci} 3917fd14ceSopenharmony_ci 4017fd14ceSopenharmony_civoid DeleteParcel(HcParcel *parcel) 4117fd14ceSopenharmony_ci{ 4217fd14ceSopenharmony_ci if (parcel == NULL) { 4317fd14ceSopenharmony_ci return; 4417fd14ceSopenharmony_ci } 4517fd14ceSopenharmony_ci 4617fd14ceSopenharmony_ci if (parcel->data != NULL) { 4717fd14ceSopenharmony_ci HcFree(parcel->data); 4817fd14ceSopenharmony_ci parcel->data = 0; 4917fd14ceSopenharmony_ci } 5017fd14ceSopenharmony_ci parcel->length = 0; 5117fd14ceSopenharmony_ci parcel->beginPos = 0; 5217fd14ceSopenharmony_ci parcel->endPos = 0; 5317fd14ceSopenharmony_ci} 5417fd14ceSopenharmony_ci 5517fd14ceSopenharmony_civoid ClearParcel(HcParcel *parcel) 5617fd14ceSopenharmony_ci{ 5717fd14ceSopenharmony_ci if (parcel != NULL) { 5817fd14ceSopenharmony_ci parcel->beginPos = 0; 5917fd14ceSopenharmony_ci parcel->endPos = 0; 6017fd14ceSopenharmony_ci } 6117fd14ceSopenharmony_ci} 6217fd14ceSopenharmony_ci 6317fd14ceSopenharmony_civoid ResetParcel(HcParcel *parcel, uint32_t size, uint32_t allocUnit) 6417fd14ceSopenharmony_ci{ 6517fd14ceSopenharmony_ci if (parcel != NULL) { 6617fd14ceSopenharmony_ci DeleteParcel(parcel); 6717fd14ceSopenharmony_ci HcParcel newParcel = CreateParcel(size, allocUnit); 6817fd14ceSopenharmony_ci (void)memcpy_s(parcel, sizeof(HcParcel), &newParcel, sizeof(HcParcel)); 6917fd14ceSopenharmony_ci } 7017fd14ceSopenharmony_ci} 7117fd14ceSopenharmony_ci 7217fd14ceSopenharmony_ciuint32_t GetParcelDataSize(const HcParcel *parcel) 7317fd14ceSopenharmony_ci{ 7417fd14ceSopenharmony_ci if (parcel == NULL) { 7517fd14ceSopenharmony_ci return 0; 7617fd14ceSopenharmony_ci } 7717fd14ceSopenharmony_ci if (parcel->endPos >= parcel->beginPos) { 7817fd14ceSopenharmony_ci return parcel->endPos - parcel->beginPos; 7917fd14ceSopenharmony_ci } 8017fd14ceSopenharmony_ci return 0; 8117fd14ceSopenharmony_ci} 8217fd14ceSopenharmony_ci 8317fd14ceSopenharmony_ciconst char *GetParcelData(const HcParcel *parcel) 8417fd14ceSopenharmony_ci{ 8517fd14ceSopenharmony_ci if (parcel == NULL) { 8617fd14ceSopenharmony_ci return NULL; 8717fd14ceSopenharmony_ci } 8817fd14ceSopenharmony_ci return parcel->data + parcel->beginPos; 8917fd14ceSopenharmony_ci} 9017fd14ceSopenharmony_ci 9117fd14ceSopenharmony_ciconst char *GetParcelLastChar(const HcParcel *parcel) 9217fd14ceSopenharmony_ci{ 9317fd14ceSopenharmony_ci if (parcel == NULL || GetParcelDataSize(parcel) == 0) { 9417fd14ceSopenharmony_ci return NULL; 9517fd14ceSopenharmony_ci } 9617fd14ceSopenharmony_ci return parcel->data + parcel->endPos - 1; 9717fd14ceSopenharmony_ci} 9817fd14ceSopenharmony_ci 9917fd14ceSopenharmony_ciHcBool ParcelReadWithoutPopData(HcParcel *parcel, void *dst, uint32_t dataSize) 10017fd14ceSopenharmony_ci{ 10117fd14ceSopenharmony_ci#ifdef IS_BIG_ENDIAN 10217fd14ceSopenharmony_ci HcBool ret = ParcelReadRevert(parcel, dst, dataSize); 10317fd14ceSopenharmony_ci#else 10417fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, dataSize); 10517fd14ceSopenharmony_ci#endif 10617fd14ceSopenharmony_ci if (ret == HC_TRUE) { 10717fd14ceSopenharmony_ci parcel->beginPos -= dataSize; 10817fd14ceSopenharmony_ci } 10917fd14ceSopenharmony_ci return ret; 11017fd14ceSopenharmony_ci} 11117fd14ceSopenharmony_ci 11217fd14ceSopenharmony_ciHcBool ParcelRead(HcParcel *parcel, void *dst, uint32_t dataSize) 11317fd14ceSopenharmony_ci{ 11417fd14ceSopenharmony_ci errno_t rc; 11517fd14ceSopenharmony_ci if (parcel == NULL || dst == NULL || dataSize == 0) { 11617fd14ceSopenharmony_ci return HC_FALSE; 11717fd14ceSopenharmony_ci } 11817fd14ceSopenharmony_ci if (parcel->beginPos > PARCEL_UINT_MAX - dataSize) { 11917fd14ceSopenharmony_ci return HC_FALSE; 12017fd14ceSopenharmony_ci } 12117fd14ceSopenharmony_ci if (parcel->beginPos + dataSize > parcel->endPos) { 12217fd14ceSopenharmony_ci return HC_FALSE; 12317fd14ceSopenharmony_ci } 12417fd14ceSopenharmony_ci rc = memmove_s(dst, dataSize, parcel->data + parcel->beginPos, dataSize); 12517fd14ceSopenharmony_ci if (rc != EOK) { 12617fd14ceSopenharmony_ci return HC_FALSE; 12717fd14ceSopenharmony_ci } 12817fd14ceSopenharmony_ci parcel->beginPos += dataSize; 12917fd14ceSopenharmony_ci return HC_TRUE; 13017fd14ceSopenharmony_ci} 13117fd14ceSopenharmony_ci 13217fd14ceSopenharmony_ciHcBool ParcelEraseBlock(HcParcel *parcel, uint32_t start, uint32_t dataSize, void *dst) 13317fd14ceSopenharmony_ci{ 13417fd14ceSopenharmony_ci errno_t rc; 13517fd14ceSopenharmony_ci if (parcel == NULL || dst == NULL || dataSize == 0) { 13617fd14ceSopenharmony_ci return HC_FALSE; 13717fd14ceSopenharmony_ci } 13817fd14ceSopenharmony_ci if (start > PARCEL_UINT_MAX - dataSize) { 13917fd14ceSopenharmony_ci return HC_FALSE; 14017fd14ceSopenharmony_ci } 14117fd14ceSopenharmony_ci uint32_t parcelSizeOrg = GetParcelDataSize(parcel); 14217fd14ceSopenharmony_ci if (parcelSizeOrg < start + dataSize) { 14317fd14ceSopenharmony_ci return HC_FALSE; 14417fd14ceSopenharmony_ci } 14517fd14ceSopenharmony_ci char *beginCopy = parcel->data + parcel->beginPos + start; 14617fd14ceSopenharmony_ci uint32_t copySize = parcelSizeOrg - start - dataSize; 14717fd14ceSopenharmony_ci 14817fd14ceSopenharmony_ci rc = memmove_s(dst, dataSize, beginCopy, dataSize); 14917fd14ceSopenharmony_ci if (rc != EOK) { 15017fd14ceSopenharmony_ci return HC_FALSE; 15117fd14ceSopenharmony_ci } 15217fd14ceSopenharmony_ci if (copySize != 0) { 15317fd14ceSopenharmony_ci rc = memmove_s(beginCopy, copySize, beginCopy + dataSize, copySize); 15417fd14ceSopenharmony_ci if (rc != EOK) { 15517fd14ceSopenharmony_ci return HC_FALSE; 15617fd14ceSopenharmony_ci } 15717fd14ceSopenharmony_ci } 15817fd14ceSopenharmony_ci parcel->endPos -= dataSize; 15917fd14ceSopenharmony_ci return HC_TRUE; 16017fd14ceSopenharmony_ci} 16117fd14ceSopenharmony_ci 16217fd14ceSopenharmony_ciHcBool ParcelReadRevert(HcParcel *parcel, void *dst, uint32_t dataSize) 16317fd14ceSopenharmony_ci{ 16417fd14ceSopenharmony_ci if (ParcelRead(parcel, dst, dataSize)) { 16517fd14ceSopenharmony_ci DataRevert(dst, dataSize); 16617fd14ceSopenharmony_ci return HC_TRUE; 16717fd14ceSopenharmony_ci } else { 16817fd14ceSopenharmony_ci return HC_FALSE; 16917fd14ceSopenharmony_ci } 17017fd14ceSopenharmony_ci} 17117fd14ceSopenharmony_ci 17217fd14ceSopenharmony_ciHcBool ParcelWriteRevert(HcParcel *parcel, const void *src, uint32_t dataSize) 17317fd14ceSopenharmony_ci{ 17417fd14ceSopenharmony_ci errno_t rc; 17517fd14ceSopenharmony_ci void *srcCopy = HcMalloc(dataSize, 0); 17617fd14ceSopenharmony_ci if (srcCopy == NULL) { 17717fd14ceSopenharmony_ci return HC_FALSE; 17817fd14ceSopenharmony_ci } 17917fd14ceSopenharmony_ci rc = memmove_s(srcCopy, dataSize, src, dataSize); 18017fd14ceSopenharmony_ci if (rc != EOK) { 18117fd14ceSopenharmony_ci HcFree(srcCopy); 18217fd14ceSopenharmony_ci return HC_FALSE; 18317fd14ceSopenharmony_ci } 18417fd14ceSopenharmony_ci DataRevert(srcCopy, dataSize); 18517fd14ceSopenharmony_ci HcBool ret = ParcelWrite(parcel, srcCopy, dataSize); 18617fd14ceSopenharmony_ci HcFree(srcCopy); 18717fd14ceSopenharmony_ci return ret; 18817fd14ceSopenharmony_ci} 18917fd14ceSopenharmony_ci 19017fd14ceSopenharmony_ciHcBool ParcelReadInt32(HcParcel *parcel, int *dst) 19117fd14ceSopenharmony_ci{ 19217fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(int)); 19317fd14ceSopenharmony_ci} 19417fd14ceSopenharmony_ci 19517fd14ceSopenharmony_ciHcBool ParcelReadUint32(HcParcel *parcel, uint32_t *dst) 19617fd14ceSopenharmony_ci{ 19717fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(uint32_t)); 19817fd14ceSopenharmony_ci} 19917fd14ceSopenharmony_ci 20017fd14ceSopenharmony_ciHcBool ParcelReadInt16(HcParcel *parcel, short *dst) 20117fd14ceSopenharmony_ci{ 20217fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(short)); 20317fd14ceSopenharmony_ci} 20417fd14ceSopenharmony_ci 20517fd14ceSopenharmony_ciHcBool ParcelReadUint16(HcParcel *parcel, uint16_t *dst) 20617fd14ceSopenharmony_ci{ 20717fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(uint16_t)); 20817fd14ceSopenharmony_ci} 20917fd14ceSopenharmony_ci 21017fd14ceSopenharmony_ciHcBool ParcelReadInt8(HcParcel *parcel, char *dst) 21117fd14ceSopenharmony_ci{ 21217fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(char)); 21317fd14ceSopenharmony_ci} 21417fd14ceSopenharmony_ci 21517fd14ceSopenharmony_ciHcBool ParcelReadUint8(HcParcel *parcel, uint8_t *dst) 21617fd14ceSopenharmony_ci{ 21717fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(uint8_t)); 21817fd14ceSopenharmony_ci} 21917fd14ceSopenharmony_ci 22017fd14ceSopenharmony_ciHcBool ParcelReadUint64(HcParcel *parcel, uint64_t *dst) 22117fd14ceSopenharmony_ci{ 22217fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(uint64_t)); 22317fd14ceSopenharmony_ci} 22417fd14ceSopenharmony_ci 22517fd14ceSopenharmony_ciHcBool ParcelReadInt64(HcParcel *parcel, int64_t *dst) 22617fd14ceSopenharmony_ci{ 22717fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(int64_t)); 22817fd14ceSopenharmony_ci} 22917fd14ceSopenharmony_ci 23017fd14ceSopenharmony_cistatic HcBool ParcelRealloc(HcParcel *parcel, uint32_t size) 23117fd14ceSopenharmony_ci{ 23217fd14ceSopenharmony_ci if (parcel->length >= size) { 23317fd14ceSopenharmony_ci return HC_FALSE; 23417fd14ceSopenharmony_ci } 23517fd14ceSopenharmony_ci char *newData = (char *)HcMalloc(size, 0); 23617fd14ceSopenharmony_ci if (newData == NULL) { 23717fd14ceSopenharmony_ci return HC_FALSE; 23817fd14ceSopenharmony_ci } 23917fd14ceSopenharmony_ci if (memcpy_s(newData, size, parcel->data, parcel->length) != EOK) { 24017fd14ceSopenharmony_ci HcFree(newData); 24117fd14ceSopenharmony_ci return HC_FALSE; 24217fd14ceSopenharmony_ci } 24317fd14ceSopenharmony_ci HcFree(parcel->data); 24417fd14ceSopenharmony_ci parcel->data = newData; 24517fd14ceSopenharmony_ci parcel->length = size; 24617fd14ceSopenharmony_ci return HC_TRUE; 24717fd14ceSopenharmony_ci} 24817fd14ceSopenharmony_ci 24917fd14ceSopenharmony_cistatic HcBool ParcelIncrease(HcParcel *parcel, uint32_t size) 25017fd14ceSopenharmony_ci{ 25117fd14ceSopenharmony_ci if (parcel == NULL || size == 0) { 25217fd14ceSopenharmony_ci return HC_FALSE; 25317fd14ceSopenharmony_ci } 25417fd14ceSopenharmony_ci if (parcel->data == NULL) { 25517fd14ceSopenharmony_ci if (parcel->length != 0) { 25617fd14ceSopenharmony_ci return HC_FALSE; 25717fd14ceSopenharmony_ci } 25817fd14ceSopenharmony_ci *parcel = CreateParcel(size, parcel->allocUnit); 25917fd14ceSopenharmony_ci if (parcel->data == NULL) { 26017fd14ceSopenharmony_ci return HC_FALSE; 26117fd14ceSopenharmony_ci } else { 26217fd14ceSopenharmony_ci return HC_TRUE; 26317fd14ceSopenharmony_ci } 26417fd14ceSopenharmony_ci } else { 26517fd14ceSopenharmony_ci return ParcelRealloc(parcel, size); 26617fd14ceSopenharmony_ci } 26717fd14ceSopenharmony_ci} 26817fd14ceSopenharmony_ci 26917fd14ceSopenharmony_cistatic void ParcelRecycle(HcParcel *parcel) 27017fd14ceSopenharmony_ci{ 27117fd14ceSopenharmony_ci if (parcel == NULL) { 27217fd14ceSopenharmony_ci return; 27317fd14ceSopenharmony_ci } 27417fd14ceSopenharmony_ci if (parcel->data == NULL || parcel->beginPos < parcel->allocUnit) { 27517fd14ceSopenharmony_ci return; 27617fd14ceSopenharmony_ci } 27717fd14ceSopenharmony_ci 27817fd14ceSopenharmony_ci uint32_t contentSize = parcel->endPos - parcel->beginPos; 27917fd14ceSopenharmony_ci if (contentSize > 0) { 28017fd14ceSopenharmony_ci if (memmove_s(parcel->data, parcel->endPos - parcel->beginPos, 28117fd14ceSopenharmony_ci parcel->data + parcel->beginPos, parcel->endPos - parcel->beginPos) != EOK) { 28217fd14ceSopenharmony_ci } 28317fd14ceSopenharmony_ci } 28417fd14ceSopenharmony_ci parcel->beginPos = 0; 28517fd14ceSopenharmony_ci parcel->endPos = contentSize; 28617fd14ceSopenharmony_ci} 28717fd14ceSopenharmony_ci 28817fd14ceSopenharmony_cistatic uint32_t GetParcelIncreaseSize(HcParcel *parcel, uint32_t newSize) 28917fd14ceSopenharmony_ci{ 29017fd14ceSopenharmony_ci if (parcel == NULL || parcel->allocUnit == 0) { 29117fd14ceSopenharmony_ci return 0; 29217fd14ceSopenharmony_ci } 29317fd14ceSopenharmony_ci if (newSize % parcel->allocUnit) { 29417fd14ceSopenharmony_ci return (newSize / parcel->allocUnit + 1) * parcel->allocUnit; 29517fd14ceSopenharmony_ci } else { 29617fd14ceSopenharmony_ci return (newSize / parcel->allocUnit) * parcel->allocUnit; 29717fd14ceSopenharmony_ci } 29817fd14ceSopenharmony_ci} 29917fd14ceSopenharmony_ci 30017fd14ceSopenharmony_ciHcBool ParcelWrite(HcParcel *parcel, const void *src, uint32_t dataSize) 30117fd14ceSopenharmony_ci{ 30217fd14ceSopenharmony_ci errno_t rc; 30317fd14ceSopenharmony_ci if (parcel == NULL || src == NULL || dataSize == 0) { 30417fd14ceSopenharmony_ci return HC_FALSE; 30517fd14ceSopenharmony_ci } 30617fd14ceSopenharmony_ci if (parcel->endPos > PARCEL_UINT_MAX - dataSize) { 30717fd14ceSopenharmony_ci return HC_FALSE; 30817fd14ceSopenharmony_ci } 30917fd14ceSopenharmony_ci if (parcel->endPos + dataSize > parcel->length) { 31017fd14ceSopenharmony_ci ParcelRecycle(parcel); 31117fd14ceSopenharmony_ci if (parcel->endPos + dataSize > parcel->length) { 31217fd14ceSopenharmony_ci uint32_t newSize = GetParcelIncreaseSize(parcel, parcel->endPos + dataSize); 31317fd14ceSopenharmony_ci if (!ParcelIncrease(parcel, newSize)) { 31417fd14ceSopenharmony_ci return HC_FALSE; 31517fd14ceSopenharmony_ci } 31617fd14ceSopenharmony_ci } 31717fd14ceSopenharmony_ci } 31817fd14ceSopenharmony_ci rc = memmove_s(parcel->data + parcel->endPos, dataSize, src, dataSize); 31917fd14ceSopenharmony_ci if (rc != EOK) { 32017fd14ceSopenharmony_ci return HC_FALSE; 32117fd14ceSopenharmony_ci } 32217fd14ceSopenharmony_ci parcel->endPos += dataSize; 32317fd14ceSopenharmony_ci return HC_TRUE; 32417fd14ceSopenharmony_ci} 32517fd14ceSopenharmony_ci 32617fd14ceSopenharmony_ciHcBool ParcelWriteInt32(HcParcel *parcel, int src) 32717fd14ceSopenharmony_ci{ 32817fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 32917fd14ceSopenharmony_ci} 33017fd14ceSopenharmony_ci 33117fd14ceSopenharmony_ciHcBool ParcelWriteUint32(HcParcel *parcel, uint32_t src) 33217fd14ceSopenharmony_ci{ 33317fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 33417fd14ceSopenharmony_ci} 33517fd14ceSopenharmony_ci 33617fd14ceSopenharmony_ciHcBool ParcelWriteInt16(HcParcel *parcel, short src) 33717fd14ceSopenharmony_ci{ 33817fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 33917fd14ceSopenharmony_ci} 34017fd14ceSopenharmony_ci 34117fd14ceSopenharmony_ciHcBool ParcelWriteUint16(HcParcel *parcel, uint16_t src) 34217fd14ceSopenharmony_ci{ 34317fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 34417fd14ceSopenharmony_ci} 34517fd14ceSopenharmony_ci 34617fd14ceSopenharmony_ciHcBool ParcelWriteInt8(HcParcel *parcel, char src) 34717fd14ceSopenharmony_ci{ 34817fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 34917fd14ceSopenharmony_ci} 35017fd14ceSopenharmony_ci 35117fd14ceSopenharmony_ciHcBool ParcelWriteUint8(HcParcel *parcel, uint8_t src) 35217fd14ceSopenharmony_ci{ 35317fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 35417fd14ceSopenharmony_ci} 35517fd14ceSopenharmony_ci 35617fd14ceSopenharmony_ciHcBool ParcelWriteUint64(HcParcel *parcel, uint64_t src) 35717fd14ceSopenharmony_ci{ 35817fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 35917fd14ceSopenharmony_ci} 36017fd14ceSopenharmony_ci 36117fd14ceSopenharmony_ciHcBool ParcelWriteInt64(HcParcel *parcel, int64_t src) 36217fd14ceSopenharmony_ci{ 36317fd14ceSopenharmony_ci return ParcelWrite(parcel, &src, sizeof(src)); 36417fd14ceSopenharmony_ci} 36517fd14ceSopenharmony_ci 36617fd14ceSopenharmony_ciHcBool ParcelReadParcel(HcParcel *src, HcParcel *dst, uint32_t size, HcBool copy) 36717fd14ceSopenharmony_ci{ 36817fd14ceSopenharmony_ci if (src == NULL || dst == NULL) { 36917fd14ceSopenharmony_ci return HC_FALSE; 37017fd14ceSopenharmony_ci } 37117fd14ceSopenharmony_ci if (GetParcelDataSize(src) < size) { 37217fd14ceSopenharmony_ci return HC_FALSE; 37317fd14ceSopenharmony_ci } 37417fd14ceSopenharmony_ci if (!ParcelWrite(dst, (void *)GetParcelData(src), size)) { 37517fd14ceSopenharmony_ci return HC_FALSE; 37617fd14ceSopenharmony_ci } 37717fd14ceSopenharmony_ci 37817fd14ceSopenharmony_ci if (!copy) { 37917fd14ceSopenharmony_ci src->beginPos += size; 38017fd14ceSopenharmony_ci } 38117fd14ceSopenharmony_ci return HC_TRUE; 38217fd14ceSopenharmony_ci} 38317fd14ceSopenharmony_ci 38417fd14ceSopenharmony_ciHcBool ParcelCopy(HcParcel *src, HcParcel *dst) 38517fd14ceSopenharmony_ci{ 38617fd14ceSopenharmony_ci if (src == NULL || dst == NULL) { 38717fd14ceSopenharmony_ci return HC_FALSE; 38817fd14ceSopenharmony_ci } 38917fd14ceSopenharmony_ci if (GetParcelDataSize(src) == 0) { 39017fd14ceSopenharmony_ci return HC_TRUE; 39117fd14ceSopenharmony_ci } 39217fd14ceSopenharmony_ci return ParcelReadParcel(src, dst, GetParcelDataSize(src), HC_TRUE); 39317fd14ceSopenharmony_ci} 39417fd14ceSopenharmony_ci 39517fd14ceSopenharmony_civoid DataRevert(void *data, uint32_t length) 39617fd14ceSopenharmony_ci{ 39717fd14ceSopenharmony_ci if (data != NULL) { 39817fd14ceSopenharmony_ci uint8_t *pc = (uint8_t *) data; 39917fd14ceSopenharmony_ci uint32_t i = 0; 40017fd14ceSopenharmony_ci for (; i < length / 2; ++i) { /* half of the length */ 40117fd14ceSopenharmony_ci /* swap p[i] and p[length-i-1] */ 40217fd14ceSopenharmony_ci pc[i] ^= pc[length - i - 1]; 40317fd14ceSopenharmony_ci pc[length - i - 1] ^= pc[i]; 40417fd14ceSopenharmony_ci pc[i] ^= pc[length - i - 1]; 40517fd14ceSopenharmony_ci } 40617fd14ceSopenharmony_ci } 40717fd14ceSopenharmony_ci} 40817fd14ceSopenharmony_ci 40917fd14ceSopenharmony_ciHcBool ParcelReadInt32Revert(HcParcel *parcel, int32_t *dst) 41017fd14ceSopenharmony_ci{ 41117fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, sizeof(int)); 41217fd14ceSopenharmony_ci if (ret) { 41317fd14ceSopenharmony_ci DataRevert(dst, sizeof(int)); 41417fd14ceSopenharmony_ci } 41517fd14ceSopenharmony_ci return ret; 41617fd14ceSopenharmony_ci} 41717fd14ceSopenharmony_ci 41817fd14ceSopenharmony_ciHcBool ParcelReadUint32Revert(HcParcel *parcel, uint32_t *dst) 41917fd14ceSopenharmony_ci{ 42017fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, sizeof(uint32_t)); 42117fd14ceSopenharmony_ci if (ret) { 42217fd14ceSopenharmony_ci DataRevert(dst, sizeof(uint32_t)); 42317fd14ceSopenharmony_ci } 42417fd14ceSopenharmony_ci return ret; 42517fd14ceSopenharmony_ci} 42617fd14ceSopenharmony_ci 42717fd14ceSopenharmony_ciHcBool ParcelReadInt16Revert(HcParcel *parcel, short *dst) 42817fd14ceSopenharmony_ci{ 42917fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, sizeof(short)); 43017fd14ceSopenharmony_ci if (ret) { 43117fd14ceSopenharmony_ci DataRevert(dst, sizeof(short)); 43217fd14ceSopenharmony_ci } 43317fd14ceSopenharmony_ci return ret; 43417fd14ceSopenharmony_ci} 43517fd14ceSopenharmony_ci 43617fd14ceSopenharmony_ciHcBool ParcelReadUint16Revert(HcParcel *parcel, uint16_t *dst) 43717fd14ceSopenharmony_ci{ 43817fd14ceSopenharmony_ci if (parcel == NULL || dst == NULL) { 43917fd14ceSopenharmony_ci return HC_FALSE; 44017fd14ceSopenharmony_ci } 44117fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, sizeof(uint16_t)); 44217fd14ceSopenharmony_ci if (ret) { 44317fd14ceSopenharmony_ci DataRevert(dst, sizeof(uint16_t)); 44417fd14ceSopenharmony_ci } 44517fd14ceSopenharmony_ci return ret; 44617fd14ceSopenharmony_ci} 44717fd14ceSopenharmony_ci 44817fd14ceSopenharmony_ciHcBool ParcelReadInt8Revert(HcParcel *parcel, char *dst) 44917fd14ceSopenharmony_ci{ 45017fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(char)); 45117fd14ceSopenharmony_ci} 45217fd14ceSopenharmony_ci 45317fd14ceSopenharmony_ciHcBool ParcelReadUint8Revert(HcParcel *parcel, uint8_t *dst) 45417fd14ceSopenharmony_ci{ 45517fd14ceSopenharmony_ci return ParcelRead(parcel, dst, sizeof(uint8_t)); 45617fd14ceSopenharmony_ci} 45717fd14ceSopenharmony_ci 45817fd14ceSopenharmony_ciHcBool ParcelReadUint64Revert(HcParcel *parcel, uint64_t *dst) 45917fd14ceSopenharmony_ci{ 46017fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, sizeof(uint64_t)); 46117fd14ceSopenharmony_ci if (ret) { 46217fd14ceSopenharmony_ci DataRevert(dst, sizeof(uint64_t)); 46317fd14ceSopenharmony_ci } 46417fd14ceSopenharmony_ci return ret; 46517fd14ceSopenharmony_ci} 46617fd14ceSopenharmony_ci 46717fd14ceSopenharmony_ciHcBool ParcelReadInt64Revert(HcParcel *parcel, int64_t *dst) 46817fd14ceSopenharmony_ci{ 46917fd14ceSopenharmony_ci HcBool ret = ParcelRead(parcel, dst, sizeof(int64_t)); 47017fd14ceSopenharmony_ci if (ret) { 47117fd14ceSopenharmony_ci DataRevert(dst, sizeof(int64_t)); 47217fd14ceSopenharmony_ci } 47317fd14ceSopenharmony_ci return ret; 47417fd14ceSopenharmony_ci} 47517fd14ceSopenharmony_ci 47617fd14ceSopenharmony_ciHcBool ParcelWriteInt32Revert(HcParcel *parcel, int src) 47717fd14ceSopenharmony_ci{ 47817fd14ceSopenharmony_ci DataRevert(&src, sizeof(src)); 47917fd14ceSopenharmony_ci return ParcelWriteInt32(parcel, src); 48017fd14ceSopenharmony_ci} 48117fd14ceSopenharmony_ci 48217fd14ceSopenharmony_ciHcBool ParcelWriteUint32Revert(HcParcel *parcel, uint32_t src) 48317fd14ceSopenharmony_ci{ 48417fd14ceSopenharmony_ci DataRevert(&src, sizeof(src)); 48517fd14ceSopenharmony_ci return ParcelWriteUint32(parcel, src); 48617fd14ceSopenharmony_ci} 48717fd14ceSopenharmony_ci 48817fd14ceSopenharmony_ciHcBool ParcelWriteInt16Revert(HcParcel *parcel, short src) 48917fd14ceSopenharmony_ci{ 49017fd14ceSopenharmony_ci DataRevert(&src, sizeof(src)); 49117fd14ceSopenharmony_ci return ParcelWriteInt16(parcel, src); 49217fd14ceSopenharmony_ci} 49317fd14ceSopenharmony_ci 49417fd14ceSopenharmony_ciHcBool ParcelWriteUint16Revert(HcParcel *parcel, uint16_t src) 49517fd14ceSopenharmony_ci{ 49617fd14ceSopenharmony_ci DataRevert(&src, sizeof(src)); 49717fd14ceSopenharmony_ci return ParcelWriteUint16(parcel, src); 49817fd14ceSopenharmony_ci} 49917fd14ceSopenharmony_ci 50017fd14ceSopenharmony_ciHcBool ParcelWriteInt8Revert(HcParcel *parcel, char src) 50117fd14ceSopenharmony_ci{ 50217fd14ceSopenharmony_ci return ParcelWriteInt8(parcel, src); 50317fd14ceSopenharmony_ci} 50417fd14ceSopenharmony_ci 50517fd14ceSopenharmony_ciHcBool ParcelWriteUint8Revert(HcParcel *parcel, uint8_t src) 50617fd14ceSopenharmony_ci{ 50717fd14ceSopenharmony_ci return ParcelWriteUint8(parcel, src); 50817fd14ceSopenharmony_ci} 50917fd14ceSopenharmony_ci 51017fd14ceSopenharmony_ciHcBool ParcelWriteUint64Revert(HcParcel *parcel, uint64_t src) 51117fd14ceSopenharmony_ci{ 51217fd14ceSopenharmony_ci DataRevert(&src, sizeof(src)); 51317fd14ceSopenharmony_ci return ParcelWriteUint64(parcel, src); 51417fd14ceSopenharmony_ci} 51517fd14ceSopenharmony_ci 51617fd14ceSopenharmony_ciHcBool ParcelWriteInt64Revert(HcParcel *parcel, int64_t src) 51717fd14ceSopenharmony_ci{ 51817fd14ceSopenharmony_ci DataRevert(&src, sizeof(src)); 51917fd14ceSopenharmony_ci return ParcelWriteInt64(parcel, src); 52017fd14ceSopenharmony_ci} 52117fd14ceSopenharmony_ci 52217fd14ceSopenharmony_ciHcBool ParcelPopBack(HcParcel *parcel, uint32_t size) 52317fd14ceSopenharmony_ci{ 52417fd14ceSopenharmony_ci if (parcel != NULL && size > 0 && GetParcelDataSize(parcel) >= size) { 52517fd14ceSopenharmony_ci parcel->endPos -= size; 52617fd14ceSopenharmony_ci return HC_TRUE; 52717fd14ceSopenharmony_ci } 52817fd14ceSopenharmony_ci return HC_FALSE; 52917fd14ceSopenharmony_ci} 53017fd14ceSopenharmony_ci 53117fd14ceSopenharmony_ciHcBool ParcelPopFront(HcParcel *parcel, uint32_t size) 53217fd14ceSopenharmony_ci{ 53317fd14ceSopenharmony_ci if ((parcel != NULL) && (size > 0) && (GetParcelDataSize(parcel) >= size)) { 53417fd14ceSopenharmony_ci parcel->beginPos += size; 53517fd14ceSopenharmony_ci return HC_TRUE; 53617fd14ceSopenharmony_ci } 53717fd14ceSopenharmony_ci return HC_FALSE; 53817fd14ceSopenharmony_ci} 539