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