1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef BUFFER_JS_BUFFER_H
17#define BUFFER_JS_BUFFER_H
18
19#include <numeric>
20#include <string>
21#include <vector>
22
23#include "converter.h"
24#include "napi/native_api.h"
25#include "napi/native_node_api.h"
26#include "tools/log.h"
27
28namespace OHOS::buffer {
29class Buffer {
30public:
31    Buffer() = default;
32    virtual ~Buffer();
33    void Init(uint32_t size);
34    void Init(Buffer *buffer);
35    void Init(Buffer *pool, unsigned int poolOffset, unsigned int length);
36    void Init(uint8_t *buffer, unsigned int byteOffset, unsigned int length);
37
38    unsigned int GetLength();
39    void SetLength(unsigned int len);
40    unsigned int GetByteOffset();
41    int32_t Get(uint32_t index);
42    void Set(uint32_t index, uint8_t value);
43
44    void WriteInt32BE(int32_t value, uint32_t offset);
45    void WriteInt32LE(int32_t value, uint32_t offset);
46    void WriteUInt32BE(int32_t value, uint32_t offset);
47    void WriteUInt32LE(int32_t value, uint32_t offset);
48
49    void ReadBytes(uint8_t *data, uint32_t offset, uint32_t length);
50    void ReadBytesForArrayBuffer(void *data, uint32_t length);
51    int32_t ReadInt32BE(uint32_t offset);
52    int32_t ReadInt32LE(uint32_t offset);
53    uint32_t ReadUInt32BE(uint32_t offset);
54    uint32_t ReadUInt32LE(uint32_t offset);
55
56    unsigned int WriteString(std::string value, unsigned int size);
57    unsigned int WriteString(std::string value, unsigned int offset, unsigned int length);
58    unsigned int WriteString(std::u16string value, unsigned int offset, unsigned int length);
59    unsigned int WriteString(std::string value, unsigned int offset, unsigned int length, std::string encoding);
60
61    void SubBuffer(Buffer *tBuf, uint32_t start, uint32_t end);
62    uint32_t Copy(Buffer *tBuf, uint32_t tStart, uint32_t sStart, uint32_t sEnd);
63    int Compare(Buffer *tBuf, uint32_t targetStart, uint32_t sourceStart, uint32_t length);
64    int IndexOf(const char *data, uint32_t offset, uint32_t len, uint64_t &resultIndex);
65    int LastIndexOf(const char *data, uint32_t offset, uint32_t len);
66    std::string ToBase64(uint32_t start, uint32_t length);
67    std::string ToBase64Url(uint32_t start, uint32_t length);
68    static EncodingType GetEncodingType(std::string type);
69    void SetArray(std::vector<uint8_t> array, unsigned int offset = 0);
70    void FillBuffer(Buffer *buffer, unsigned int offset, unsigned int end);
71    void FillNumber(std::vector<uint8_t> numbers, unsigned int offset, unsigned int end);
72    void FillString(std::string value, unsigned int offset, unsigned int end, std::string encoding);
73
74private:
75    uint8_t *GetRaw();
76    bool WriteBytes(uint8_t *src, unsigned int size, uint8_t *dest);
77    void WriteBE(int32_t value, uint32_t bytes);
78    void WriteLE(int32_t value, uint32_t bytes);
79    uint32_t ReadBE(uint32_t bytes);
80    uint32_t ReadLE(uint32_t bytes);
81    std::string Utf16StrToStr(std::u16string value);
82    void WriteByte(uint8_t number, uint32_t offset);
83    void WriteStringLoop(std::string value, unsigned int offset, unsigned int end, unsigned int length);
84    void WriteStringLoop(std::u16string value, unsigned int offset, unsigned int end);
85    std::string GetString(std::string value, EncodingType encodingType);
86
87    uint8_t *raw_ {nullptr};
88    uint8_t data_[4] = {0};
89    unsigned int byteOffset_ {};
90    unsigned int length_ {};
91    bool needRelease_ {true};
92};
93} // namespace OHOS::Buffer
94#endif // BUFFER_JS_BUFFER_H
95