196279301Sopenharmony_ci/*
296279301Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
396279301Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
496279301Sopenharmony_ci * you may not use this file except in compliance with the License.
596279301Sopenharmony_ci * You may obtain a copy of the License at
696279301Sopenharmony_ci *
796279301Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
896279301Sopenharmony_ci *
996279301Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1096279301Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1196279301Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1296279301Sopenharmony_ci * See the License for the specific language governing permissions and
1396279301Sopenharmony_ci * limitations under the License.
1496279301Sopenharmony_ci */
1596279301Sopenharmony_ci
1696279301Sopenharmony_ci#define LOG_TAG "Blob"
1796279301Sopenharmony_ci
1896279301Sopenharmony_ci#include "blob.h"
1996279301Sopenharmony_ci#include <securec.h>
2096279301Sopenharmony_ci
2196279301Sopenharmony_cinamespace OHOS {
2296279301Sopenharmony_cinamespace DistributedKv {
2396279301Sopenharmony_ciBlob::Blob() { }
2496279301Sopenharmony_ci
2596279301Sopenharmony_ciBlob::Blob(const Blob &blob)
2696279301Sopenharmony_ci{
2796279301Sopenharmony_ci    blob_ = blob.Data();
2896279301Sopenharmony_ci}
2996279301Sopenharmony_ci
3096279301Sopenharmony_ciBlob::Blob(Blob &&blob)
3196279301Sopenharmony_ci{
3296279301Sopenharmony_ci    blob_.swap(blob.blob_);
3396279301Sopenharmony_ci}
3496279301Sopenharmony_ci
3596279301Sopenharmony_ciBlob &Blob::operator=(const Blob &blob)
3696279301Sopenharmony_ci{
3796279301Sopenharmony_ci    // Self-assignment detection
3896279301Sopenharmony_ci    if (&blob == this) {
3996279301Sopenharmony_ci        return *this;
4096279301Sopenharmony_ci    }
4196279301Sopenharmony_ci
4296279301Sopenharmony_ci    blob_ = blob.Data();
4396279301Sopenharmony_ci
4496279301Sopenharmony_ci    return *this;
4596279301Sopenharmony_ci}
4696279301Sopenharmony_ci
4796279301Sopenharmony_ciBlob &Blob::operator=(Blob &&blob)
4896279301Sopenharmony_ci{
4996279301Sopenharmony_ci    // Self-assignment detection
5096279301Sopenharmony_ci    if (&blob == this) {
5196279301Sopenharmony_ci        return *this;
5296279301Sopenharmony_ci    }
5396279301Sopenharmony_ci
5496279301Sopenharmony_ci    blob_.swap(blob.blob_);
5596279301Sopenharmony_ci
5696279301Sopenharmony_ci    return *this;
5796279301Sopenharmony_ci}
5896279301Sopenharmony_ci
5996279301Sopenharmony_ciBlob::Blob(const char *str, size_t n)
6096279301Sopenharmony_ci    : blob_()
6196279301Sopenharmony_ci{
6296279301Sopenharmony_ci    if (str != nullptr) {
6396279301Sopenharmony_ci        blob_ = std::vector<uint8_t>(str, str + n);
6496279301Sopenharmony_ci    }
6596279301Sopenharmony_ci}
6696279301Sopenharmony_ci
6796279301Sopenharmony_ciBlob::Blob(const std::string &str)
6896279301Sopenharmony_ci    : blob_(str.begin(), str.end())
6996279301Sopenharmony_ci{
7096279301Sopenharmony_ci}
7196279301Sopenharmony_ci
7296279301Sopenharmony_ciBlob::Blob(const char *str)
7396279301Sopenharmony_ci    : blob_()
7496279301Sopenharmony_ci{
7596279301Sopenharmony_ci    if (str != nullptr) {
7696279301Sopenharmony_ci        blob_ = std::vector<uint8_t>(str, str + strlen(str));
7796279301Sopenharmony_ci    }
7896279301Sopenharmony_ci}
7996279301Sopenharmony_ci
8096279301Sopenharmony_ciBlob::Blob(const std::vector<uint8_t> &bytes)
8196279301Sopenharmony_ci    : blob_(bytes)
8296279301Sopenharmony_ci{
8396279301Sopenharmony_ci}
8496279301Sopenharmony_ci
8596279301Sopenharmony_ciBlob::Blob(std::vector<uint8_t> &&bytes)
8696279301Sopenharmony_ci    : blob_(std::move(bytes))
8796279301Sopenharmony_ci{
8896279301Sopenharmony_ci}
8996279301Sopenharmony_ci
9096279301Sopenharmony_ciconst std::vector<uint8_t> &Blob::Data() const
9196279301Sopenharmony_ci{
9296279301Sopenharmony_ci    return blob_;
9396279301Sopenharmony_ci}
9496279301Sopenharmony_ci
9596279301Sopenharmony_cisize_t Blob::Size() const
9696279301Sopenharmony_ci{
9796279301Sopenharmony_ci    return blob_.size();
9896279301Sopenharmony_ci}
9996279301Sopenharmony_ci
10096279301Sopenharmony_ciint Blob::RawSize() const
10196279301Sopenharmony_ci{
10296279301Sopenharmony_ci    return sizeof(int) + blob_.size();
10396279301Sopenharmony_ci}
10496279301Sopenharmony_ci
10596279301Sopenharmony_cibool Blob::Empty() const
10696279301Sopenharmony_ci{
10796279301Sopenharmony_ci    return blob_.empty();
10896279301Sopenharmony_ci}
10996279301Sopenharmony_ci
11096279301Sopenharmony_ciuint8_t Blob::operator[](size_t n) const
11196279301Sopenharmony_ci{
11296279301Sopenharmony_ci    if (n >= Size()) {
11396279301Sopenharmony_ci        return 0;
11496279301Sopenharmony_ci    }
11596279301Sopenharmony_ci    return blob_[n];
11696279301Sopenharmony_ci}
11796279301Sopenharmony_ci
11896279301Sopenharmony_cibool Blob::operator==(const Blob &blob) const
11996279301Sopenharmony_ci{
12096279301Sopenharmony_ci    return blob_ == blob.blob_;
12196279301Sopenharmony_ci}
12296279301Sopenharmony_ci
12396279301Sopenharmony_civoid Blob::Clear()
12496279301Sopenharmony_ci{
12596279301Sopenharmony_ci    blob_.clear();
12696279301Sopenharmony_ci}
12796279301Sopenharmony_ci
12896279301Sopenharmony_cistd::string Blob::ToString() const
12996279301Sopenharmony_ci{
13096279301Sopenharmony_ci    std::string str(blob_.begin(), blob_.end());
13196279301Sopenharmony_ci    return str;
13296279301Sopenharmony_ci}
13396279301Sopenharmony_ci
13496279301Sopenharmony_ciint Blob::Compare(const Blob &blob) const
13596279301Sopenharmony_ci{
13696279301Sopenharmony_ci    if (blob_ < blob.blob_) {
13796279301Sopenharmony_ci        return -1;
13896279301Sopenharmony_ci    }
13996279301Sopenharmony_ci    if (blob_ == blob.blob_) {
14096279301Sopenharmony_ci        return 0;
14196279301Sopenharmony_ci    }
14296279301Sopenharmony_ci    return 1;
14396279301Sopenharmony_ci}
14496279301Sopenharmony_ci
14596279301Sopenharmony_cibool Blob::StartsWith(const Blob &blob) const
14696279301Sopenharmony_ci{
14796279301Sopenharmony_ci    size_t len = blob.Size();
14896279301Sopenharmony_ci    if (Size() < len) {
14996279301Sopenharmony_ci        return false;
15096279301Sopenharmony_ci    }
15196279301Sopenharmony_ci
15296279301Sopenharmony_ci    for (size_t i = 0; i < len; ++i) {
15396279301Sopenharmony_ci        if (blob_[i] != blob.blob_[i]) {
15496279301Sopenharmony_ci            return false;
15596279301Sopenharmony_ci        }
15696279301Sopenharmony_ci    }
15796279301Sopenharmony_ci    return true;
15896279301Sopenharmony_ci}
15996279301Sopenharmony_ci
16096279301Sopenharmony_ci/* write blob size and data to memory buffer. return error when bufferLeftSize not enough. */
16196279301Sopenharmony_cibool Blob::WriteToBuffer(uint8_t *&cursorPtr, int &bufferLeftSize) const
16296279301Sopenharmony_ci{
16396279301Sopenharmony_ci    if (cursorPtr == nullptr || bufferLeftSize < static_cast<int>(blob_.size() + sizeof(int))) {
16496279301Sopenharmony_ci        return false;
16596279301Sopenharmony_ci    }
16696279301Sopenharmony_ci    *reinterpret_cast<int32_t *>(cursorPtr) = static_cast<int32_t>(blob_.size());
16796279301Sopenharmony_ci    bufferLeftSize -= sizeof(int32_t);
16896279301Sopenharmony_ci    cursorPtr += sizeof(int32_t);
16996279301Sopenharmony_ci    errno_t err = memcpy_s(cursorPtr, bufferLeftSize, blob_.data(), blob_.size());
17096279301Sopenharmony_ci    if (err != EOK) {
17196279301Sopenharmony_ci        return false;
17296279301Sopenharmony_ci    }
17396279301Sopenharmony_ci    cursorPtr += blob_.size();
17496279301Sopenharmony_ci    bufferLeftSize -= blob_.size();
17596279301Sopenharmony_ci    return true;
17696279301Sopenharmony_ci}
17796279301Sopenharmony_ci
17896279301Sopenharmony_ci/* read a blob from memory buffer. */
17996279301Sopenharmony_cibool Blob::ReadFromBuffer(const uint8_t *&cursorPtr, int &bufferLeftSize)
18096279301Sopenharmony_ci{
18196279301Sopenharmony_ci    if (cursorPtr == nullptr || bufferLeftSize < static_cast<int>(sizeof(int))) {
18296279301Sopenharmony_ci        return false;
18396279301Sopenharmony_ci    }
18496279301Sopenharmony_ci    int blobSize = *reinterpret_cast<const int *>(cursorPtr);
18596279301Sopenharmony_ci    bufferLeftSize -= sizeof(int) + blobSize;
18696279301Sopenharmony_ci    if (blobSize < 0 || bufferLeftSize < 0) {
18796279301Sopenharmony_ci        return false;
18896279301Sopenharmony_ci    }
18996279301Sopenharmony_ci    cursorPtr += sizeof(int);
19096279301Sopenharmony_ci    blob_ = std::vector<uint8_t>(cursorPtr, cursorPtr + blobSize);
19196279301Sopenharmony_ci    cursorPtr += blobSize;
19296279301Sopenharmony_ci    return true;
19396279301Sopenharmony_ci}
19496279301Sopenharmony_ci}  // namespace DistributedKv
19596279301Sopenharmony_ci}  // namespace OHOS
196