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