• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2024 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 #ifndef SIGNATRUETOOLS_BYTEBUFFER_H
16 #define SIGNATRUETOOLS_BYTEBUFFER_H
17 
18 #include <memory>
19 #include <string>
20 
21 #include "export_define.h"
22 
23 namespace OHOS {
24 namespace SignatureTools {
25 
26 enum ReadFileErrorCode {
27     DEST_BUFFER_IS_NULL = -1,
28     FILE_IS_CLOSE = -2,
29     MMAP_COPY_FAILED = -3,
30     READ_OFFSET_OUT_OF_RANGE = -4,
31     MMAP_FAILED = -5,
32     MMAP_PARAM_INVALID = -6,
33 };
34 /*
35 * The underlying storage structure of ByteBuffer is an array, and all operations are based on that array.
36 * ByteBuffer is in its initial state and also in a write state after creation
37 *
38 * 1. Several position related member variables in the ByteBuffer class
39 * Mark: Read the starting position of the data to facilitate subsequent rollback to that position
40 * Position: Where to start reading or writing
41 * Limit: When reading the status, it indicates how much data is actually stored;
42 * Equal to capacity when writing status
43 * Capacity: represents the capacity of ByteBuffer, which is the maximum number of bytes that can be stored
44 *
45 * Bool hasRemaining(); Is there any data between position and limit
46 * Uint32_t remaining() const; Return the number of bytes between position and limit
47 *
48 * 2. Set ByteBuffer from writer state to read state: limit is set to position value, position is set to zero
49 * Void flip();
50 *
51 * 3. If you want to write or overwrite again, you can call clear() or compact()
52 * Void clear()// Reset to initial state: mark=-1, position=0, limit=capacity
53 * Void compact()// Copy the data between position and limit to the starting position at index 0,
54 * then move the position to the next position of this data segment and set the limit value to capacity
55 */
56 class ByteBuffer {
57 public:
58     DLL_EXPORT ByteBuffer();
59     DLL_EXPORT explicit ByteBuffer(int32_t bufferCapacity);
60     DLL_EXPORT ByteBuffer(const char* arr, int32_t length);
61     DLL_EXPORT ByteBuffer(const ByteBuffer& other);
62     DLL_EXPORT ~ByteBuffer();
63     DLL_EXPORT ByteBuffer& operator=(const ByteBuffer& other);
64     DLL_EXPORT bool GetInt64(int64_t& value);
65     DLL_EXPORT bool GetInt64(int32_t index, int64_t& value);
66     DLL_EXPORT bool GetUInt32(uint32_t& value);
67     DLL_EXPORT bool GetUInt32(int32_t index, uint32_t& value);
68     DLL_EXPORT bool GetInt32(int32_t& value);
69     DLL_EXPORT bool GetInt32(int32_t index, int32_t& value);
70     DLL_EXPORT bool GetUInt16(uint16_t& value);
71     DLL_EXPORT bool GetUInt16(int32_t index, uint16_t& value);
72     DLL_EXPORT bool GetInt16(int16_t& value);
73     DLL_EXPORT bool GetInt16(int32_t index, int16_t& value);
74     DLL_EXPORT bool GetUInt8(uint8_t& value);
75     DLL_EXPORT bool GetUInt8(int32_t index, uint8_t& value);
76     DLL_EXPORT bool GetInt8(int8_t& value);
77     DLL_EXPORT bool GetInt8(int32_t index, int8_t& value);
78     DLL_EXPORT void PutUInt8(uint8_t value);
79     DLL_EXPORT void PutUInt16(uint16_t value);
80     DLL_EXPORT void PutUInt32(uint32_t value);
81     DLL_EXPORT void PutInt16(int16_t value);
82     DLL_EXPORT void PutInt16(int32_t offset, int16_t value);
83     DLL_EXPORT void PutInt32(int32_t value);
84     DLL_EXPORT void PutInt32(int32_t offset, int32_t value);
85     DLL_EXPORT void PutInt64(int64_t value);
86     DLL_EXPORT void PutByte(int32_t offset, char value);
87     DLL_EXPORT void PutData(const char data[], int32_t len);
88     DLL_EXPORT void PutData(int8_t data[], int32_t len);
89     DLL_EXPORT void PutData(int32_t offset, const char data[], int32_t len);
90     DLL_EXPORT void PutData(int32_t offset, const int8_t data[], int32_t len);
91     DLL_EXPORT void PutData(int32_t offset, const char data[], int32_t len, int32_t type);
92     DLL_EXPORT void PutByte(char value);
93     DLL_EXPORT void Put(const ByteBuffer& byteBuffer);
94     DLL_EXPORT void GetData(char data[], uint32_t len);
95     DLL_EXPORT void GetData(int32_t offset, int8_t data[], uint32_t len);
96     DLL_EXPORT void GetByte(int8_t data[], int32_t len);
97     DLL_EXPORT void ClearData();
98     DLL_EXPORT int32_t GetCapacity() const;
99     DLL_EXPORT int32_t GetPosition() const;
100     DLL_EXPORT int32_t GetLimit() const;
101     DLL_EXPORT const char* GetBufferPtr() const;
102     DLL_EXPORT void SetPosition(int32_t pos);
103     DLL_EXPORT void SetLimit(int32_t lim);
104     DLL_EXPORT void SetCapacity(int32_t cap);
105     DLL_EXPORT ByteBuffer& Slice();
106     DLL_EXPORT ByteBuffer& slice_for_codesigning();
107     DLL_EXPORT ByteBuffer* Duplicate();
108     DLL_EXPORT int32_t Remaining() const;
109     DLL_EXPORT bool HasRemaining() const;
110     DLL_EXPORT void Clear();
111     DLL_EXPORT ByteBuffer& Flip();
112     // to the beginning of the cache area; Switch to write state
113     DLL_EXPORT bool IsEqual(const ByteBuffer& other);
114     DLL_EXPORT bool IsEqual(const std::string& other);
115     DLL_EXPORT void Rewind();
116     DLL_EXPORT ByteBuffer& RewindHap();
117     DLL_EXPORT std::string ToString();
118 
119 private:
120     void Init(int32_t bufferCapacity);
121     bool CheckInputForGettingData(int32_t index, int32_t dataLen);
122 
123 private:
124     static const int32_t MAX_PRINT_LENGTH;
125     static const int32_t HEX_PRINT_LENGTH;
126     std::shared_ptr<char> buffer;
127     int32_t position = 0;
128     int32_t limit = 0;
129     int32_t capacity = 0;
130 };
131 } // namespace SignatureTools
132 } // namespace OHOS
133 #endif // SIGNATRUETOOLS_BYTEBUFFER_H
134