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