1bae4d13cSopenharmony_ci/* 2bae4d13cSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3bae4d13cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4bae4d13cSopenharmony_ci * you may not use this file except in compliance with the License. 5bae4d13cSopenharmony_ci * You may obtain a copy of the License at 6bae4d13cSopenharmony_ci * 7bae4d13cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8bae4d13cSopenharmony_ci * 9bae4d13cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10bae4d13cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11bae4d13cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bae4d13cSopenharmony_ci * See the License for the specific language governing permissions and 13bae4d13cSopenharmony_ci * limitations under the License. 14bae4d13cSopenharmony_ci */ 15bae4d13cSopenharmony_ci 16bae4d13cSopenharmony_ci#ifndef STREAM_BUFFER_H 17bae4d13cSopenharmony_ci#define STREAM_BUFFER_H 18bae4d13cSopenharmony_ci 19bae4d13cSopenharmony_ci#include <string> 20bae4d13cSopenharmony_ci#include <vector> 21bae4d13cSopenharmony_ci 22bae4d13cSopenharmony_ci#include "nocopyable.h" 23bae4d13cSopenharmony_ci#include "securec.h" 24bae4d13cSopenharmony_ci 25bae4d13cSopenharmony_ci#include "proto.h" 26bae4d13cSopenharmony_ci#include "sensor_errors.h" 27bae4d13cSopenharmony_ci 28bae4d13cSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_RUST 29bae4d13cSopenharmony_ci#include "rust_binding.h" 30bae4d13cSopenharmony_ci#endif // OHOS_BUILD_ENABLE_RUST 31bae4d13cSopenharmony_ci 32bae4d13cSopenharmony_ci#undef LOG_TAG 33bae4d13cSopenharmony_ci#define LOG_TAG "StreamBuffer" 34bae4d13cSopenharmony_ci 35bae4d13cSopenharmony_cinamespace OHOS { 36bae4d13cSopenharmony_cinamespace Sensors { 37bae4d13cSopenharmony_ciclass StreamBuffer { 38bae4d13cSopenharmony_cipublic: 39bae4d13cSopenharmony_ci StreamBuffer() = default; 40bae4d13cSopenharmony_ci explicit StreamBuffer(const StreamBuffer &buf); 41bae4d13cSopenharmony_ci virtual StreamBuffer &operator=(const StreamBuffer &other); 42bae4d13cSopenharmony_ci virtual ~StreamBuffer() = default; 43bae4d13cSopenharmony_ci void Reset(); 44bae4d13cSopenharmony_ci void Clean(); 45bae4d13cSopenharmony_ci bool Read(std::string &buf); 46bae4d13cSopenharmony_ci bool Read(StreamBuffer &buf); 47bae4d13cSopenharmony_ci bool Read(char *buf, size_t size); 48bae4d13cSopenharmony_ci bool Write(const std::string &buf); 49bae4d13cSopenharmony_ci bool Write(const StreamBuffer &buf); 50bae4d13cSopenharmony_ci virtual bool Write(const char *buf, size_t size); 51bae4d13cSopenharmony_ci const std::string &GetErrorStatusRemark() const; 52bae4d13cSopenharmony_ci bool ChkRWError() const; 53bae4d13cSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_RUST 54bae4d13cSopenharmony_ci bool SeekReadPos(size_t n); 55bae4d13cSopenharmony_ci bool IsEmpty() const; 56bae4d13cSopenharmony_ci size_t Size() const; 57bae4d13cSopenharmony_ci size_t UnreadSize() const; 58bae4d13cSopenharmony_ci size_t GetAvailableBufSize() const; 59bae4d13cSopenharmony_ci const char *Data() const; 60bae4d13cSopenharmony_ci const char *WriteBuf() const; 61bae4d13cSopenharmony_ci#endif // OHOS_BUILD_ENABLE_RUST 62bae4d13cSopenharmony_ci template<typename T> 63bae4d13cSopenharmony_ci bool Read(T &data); 64bae4d13cSopenharmony_ci template<typename T> 65bae4d13cSopenharmony_ci bool Write(const T &data); 66bae4d13cSopenharmony_ci template<typename T> 67bae4d13cSopenharmony_ci bool Read(std::vector<T> &data); 68bae4d13cSopenharmony_ci template<typename T> 69bae4d13cSopenharmony_ci bool Write(const std::vector<T> &data); 70bae4d13cSopenharmony_ci const char *ReadBuf() const; 71bae4d13cSopenharmony_ci 72bae4d13cSopenharmony_ci template<typename T> 73bae4d13cSopenharmony_ci StreamBuffer &operator >> (T &data); 74bae4d13cSopenharmony_ci template<typename T> 75bae4d13cSopenharmony_ci StreamBuffer &operator << (const T &data); 76bae4d13cSopenharmony_ci DISALLOW_MOVE(StreamBuffer); 77bae4d13cSopenharmony_ci 78bae4d13cSopenharmony_ciprotected: 79bae4d13cSopenharmony_ci bool Clone(const StreamBuffer &buf); 80bae4d13cSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_RUST 81bae4d13cSopenharmony_cipublic: 82bae4d13cSopenharmony_ci std::unique_ptr<RustStreamBuffer, void(*)(RustStreamBuffer*)> streamBufferPtr_ { StreamBufferCreate(), 83bae4d13cSopenharmony_ci StreamBufferDelete }; 84bae4d13cSopenharmony_ci#else 85bae4d13cSopenharmony_ci enum class ErrorStatus { 86bae4d13cSopenharmony_ci ERROR_STATUS_OK, 87bae4d13cSopenharmony_ci ERROR_STATUS_READ, 88bae4d13cSopenharmony_ci ERROR_STATUS_WRITE, 89bae4d13cSopenharmony_ci }; 90bae4d13cSopenharmony_ci ErrorStatus rwErrorStatus_ = ErrorStatus::ERROR_STATUS_OK; 91bae4d13cSopenharmony_ci size_t rCount_ { 0 }; 92bae4d13cSopenharmony_ci size_t wCount_ { 0 }; 93bae4d13cSopenharmony_ci size_t rPos_ { 0 }; 94bae4d13cSopenharmony_ci size_t wPos_ { 0 }; 95bae4d13cSopenharmony_ci char szBuff_[MAX_STREAM_BUF_SIZE + 1] = {}; 96bae4d13cSopenharmony_ci#endif // OHOS_BUILD_ENABLE_RUST 97bae4d13cSopenharmony_ci}; 98bae4d13cSopenharmony_ci 99bae4d13cSopenharmony_citemplate<typename T> 100bae4d13cSopenharmony_cibool StreamBuffer::Read(T &data) 101bae4d13cSopenharmony_ci{ 102bae4d13cSopenharmony_ci if (!Read(reinterpret_cast<char *>(&data), sizeof(data))) { 103bae4d13cSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_RUST 104bae4d13cSopenharmony_ci const char *s = StreamBufferGetErrorStatusRemark(streamBufferPtr_.get()); 105bae4d13cSopenharmony_ci SEN_HILOGE("[%{public}s] size:%{public}zu count:%{public}d", 106bae4d13cSopenharmony_ci s, sizeof(data), StreamBufferGetRcount(streamBufferPtr_.get()) + 1); 107bae4d13cSopenharmony_ci#else 108bae4d13cSopenharmony_ci SEN_HILOGE("%{public}s, size:%{public}zu, count:%{public}zu", 109bae4d13cSopenharmony_ci GetErrorStatusRemark().c_str(), sizeof(data), rCount_ + 1); 110bae4d13cSopenharmony_ci#endif // OHOS_BUILD_ENABLE_RUST 111bae4d13cSopenharmony_ci return false; 112bae4d13cSopenharmony_ci } 113bae4d13cSopenharmony_ci return true; 114bae4d13cSopenharmony_ci} 115bae4d13cSopenharmony_ci 116bae4d13cSopenharmony_citemplate<typename T> 117bae4d13cSopenharmony_cibool StreamBuffer::Write(const T &data) 118bae4d13cSopenharmony_ci{ 119bae4d13cSopenharmony_ci if (!Write(reinterpret_cast<const char *>(&data), sizeof(data))) { 120bae4d13cSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_RUST 121bae4d13cSopenharmony_ci const char *s = StreamBufferGetErrorStatusRemark(streamBufferPtr_.get()); 122bae4d13cSopenharmony_ci SEN_HILOGE("[%{public}s] size:%{public}zu,count:%{public}d", 123bae4d13cSopenharmony_ci s, sizeof(data), StreamBufferGetWcount(streamBufferPtr_.get()) + 1); 124bae4d13cSopenharmony_ci#else 125bae4d13cSopenharmony_ci SEN_HILOGE("%{public}s, size:%{public}zu, count:%{public}zu", 126bae4d13cSopenharmony_ci GetErrorStatusRemark().c_str(), sizeof(data), wCount_ + 1); 127bae4d13cSopenharmony_ci#endif // OHOS_BUILD_ENABLE_RUST 128bae4d13cSopenharmony_ci return false; 129bae4d13cSopenharmony_ci } 130bae4d13cSopenharmony_ci return true; 131bae4d13cSopenharmony_ci} 132bae4d13cSopenharmony_ci 133bae4d13cSopenharmony_citemplate<typename T> 134bae4d13cSopenharmony_cibool StreamBuffer::Read(std::vector<T> &data) 135bae4d13cSopenharmony_ci{ 136bae4d13cSopenharmony_ci size_t size = 0; 137bae4d13cSopenharmony_ci if (!Read(size)) { 138bae4d13cSopenharmony_ci SEN_HILOGE("Read vector size failed"); 139bae4d13cSopenharmony_ci return false; 140bae4d13cSopenharmony_ci } 141bae4d13cSopenharmony_ci if (size > MAX_VECTOR_SIZE) { 142bae4d13cSopenharmony_ci SEN_HILOGE("Vector size is invalid, size:%{public}zu", size); 143bae4d13cSopenharmony_ci return false; 144bae4d13cSopenharmony_ci } 145bae4d13cSopenharmony_ci for (size_t i = 0; i < size; i++) { 146bae4d13cSopenharmony_ci T val; 147bae4d13cSopenharmony_ci if (!Read(val)) { 148bae4d13cSopenharmony_ci SEN_HILOGE("Read vector data failed"); 149bae4d13cSopenharmony_ci return false; 150bae4d13cSopenharmony_ci } 151bae4d13cSopenharmony_ci data.push_back(val); 152bae4d13cSopenharmony_ci } 153bae4d13cSopenharmony_ci return true; 154bae4d13cSopenharmony_ci} 155bae4d13cSopenharmony_ci 156bae4d13cSopenharmony_citemplate<typename T> 157bae4d13cSopenharmony_cibool StreamBuffer::Write(const std::vector<T> &data) 158bae4d13cSopenharmony_ci{ 159bae4d13cSopenharmony_ci if (data.size() > INT32_MAX) { 160bae4d13cSopenharmony_ci SEN_HILOGE("Vector exceeds the max range"); 161bae4d13cSopenharmony_ci return false; 162bae4d13cSopenharmony_ci } 163bae4d13cSopenharmony_ci size_t size = data.size(); 164bae4d13cSopenharmony_ci if (!Write(size)) { 165bae4d13cSopenharmony_ci SEN_HILOGE("Write vector size failed"); 166bae4d13cSopenharmony_ci return false; 167bae4d13cSopenharmony_ci } 168bae4d13cSopenharmony_ci for (const auto &item : data) { 169bae4d13cSopenharmony_ci if (!Write(item)) { 170bae4d13cSopenharmony_ci SEN_HILOGE("Write vector data failed"); 171bae4d13cSopenharmony_ci return false; 172bae4d13cSopenharmony_ci } 173bae4d13cSopenharmony_ci } 174bae4d13cSopenharmony_ci return true; 175bae4d13cSopenharmony_ci} 176bae4d13cSopenharmony_ci 177bae4d13cSopenharmony_citemplate<typename T> 178bae4d13cSopenharmony_ciStreamBuffer &StreamBuffer::operator>>(T &data) 179bae4d13cSopenharmony_ci{ 180bae4d13cSopenharmony_ci if (!Read(data)) { 181bae4d13cSopenharmony_ci SEN_HILOGW("Read data failed"); 182bae4d13cSopenharmony_ci } 183bae4d13cSopenharmony_ci return *this; 184bae4d13cSopenharmony_ci} 185bae4d13cSopenharmony_ci 186bae4d13cSopenharmony_citemplate<typename T> 187bae4d13cSopenharmony_ciStreamBuffer &StreamBuffer::operator<<(const T &data) 188bae4d13cSopenharmony_ci{ 189bae4d13cSopenharmony_ci if (!Write(data)) { 190bae4d13cSopenharmony_ci SEN_HILOGW("Write data failed"); 191bae4d13cSopenharmony_ci } 192bae4d13cSopenharmony_ci return *this; 193bae4d13cSopenharmony_ci} 194bae4d13cSopenharmony_ci} // namespace Sensors 195bae4d13cSopenharmony_ci} // namespace OHOS 196bae4d13cSopenharmony_ci#endif // STREAM_BUFFER_H