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