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
16#ifndef SIGNATRUETOOLS_ZIP_ENTRY_HEADER_H
17#define SIGNATRUETOOLS_ZIP_ENTRY_HEADER_H
18
19#include <string>
20
21#include "byte_buffer.h"
22
23namespace OHOS {
24namespace SignatureTools {
25/**
26 * resolve zip ZipEntryHeader data
27 * end of central dir signature    4 bytes  (0x06054b50)
28 * number of this disk             2 bytes
29 * number of the disk with the
30 * start of the central directory  2 bytes
31 * total number of entries in the
32 * central directory on this disk  2 bytes
33 * total number of entries in
34 * the central directory           2 bytes
35 * size of the central directory   4 bytes
36 * offset of start of central
37 * directory with respect to
38 * the starting disk number        4 bytes
39 * .ZIP file comment length        2 bytes
40 * .ZIP file comment       (variable size)
41 */
42class ZipEntryHeader {
43public:
44    /* ZipEntryHeader invariable bytes length */
45    static constexpr int HEADER_LENGTH = 30;
46
47    /* 4 bytes , entry header signature */
48    static constexpr int SIGNATURE = 0x04034b50;
49
50    /**
51     * get Zip Entry Header
52     *
53     * @param bytes ZipEntryHeader bytes
54     * @return ZipEntryHeader
55     * @throws ZipException read entry header exception
56     */
57    static ZipEntryHeader* GetZipEntryHeader(const std::string& bytes);
58
59    void ReadFileName(const std::string& bytes);
60
61    void ReadExtra(const std::string& bytes);
62
63    std::string ToBytes();
64
65    static int GetHeaderLength();
66
67    static int GetSIGNATURE();
68
69    short GetVersion();
70
71    void SetVersion(short version);
72
73    short GetFlag();
74
75    void SetFlag(short flag);
76
77    short GetMethod();
78
79    void SetMethod(short method);
80
81    short GetLastTime();
82
83    void SetLastTime(short lastTime);
84
85    short GetLastDate();
86
87    void SetLastDate(short lastDate);
88
89    int GetCrc32();
90
91    void SetCrc32(int crc32);
92
93    uint32_t GetCompressedSize();
94
95    void SetCompressedSize(uint32_t compressedSize);
96
97    uint32_t GetUnCompressedSize();
98
99    void SetUnCompressedSize(uint32_t unCompressedSize);
100
101    uint16_t GetFileNameLength();
102
103    void SetFileNameLength(uint16_t fileNameLength);
104
105    uint16_t GetExtraLength();
106
107    void SetExtraLength(uint16_t extraLength);
108
109    std::string GetFileName() const;
110
111    void SetFileName(const std::string& fileName);
112
113    std::string GetExtraData() const;
114
115    void SetExtraData(const std::string& extraData);
116
117    uint32_t GetLength();
118
119    void SetLength(uint32_t length);
120
121private:
122    /* 2 bytes */
123    short m_version = 0;
124
125    /* 2 bytes */
126    short m_flag = 0;
127
128    /* 2 bytes */
129    short m_method = 0;
130
131    /* 2 bytes */
132    short m_lastTime = 0;
133
134    /* 2 bytes */
135    short m_lastDate = 0;
136
137    /* 4 bytes */
138    int m_crc32 = 0;
139
140    /* 4 bytes */
141    uint32_t m_compressedSize = 0;
142
143    /* 4 bytes */
144    uint32_t m_unCompressedSize = 0;
145
146    /* 2 bytes */
147    uint16_t m_fileNameLength = 0;
148
149    /* 2 bytes */
150    uint16_t m_extraLength = 0;
151
152    /* n bytes */
153    std::string m_fileName;
154
155    /* n bytes */
156    std::string m_extraData;
157
158    uint32_t m_length = 0;
159};
160} // namespace SignatureTools
161} // namespace OHOS
162#endif // SIGNATRUETOOLS_ZIP_ENTRY_HEADER_H