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