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#include "zip_entry_header.h"
17#include "signature_tools_log.h"
18
19namespace OHOS {
20namespace SignatureTools {
21ZipEntryHeader* ZipEntryHeader::GetZipEntryHeader(const std::string& bytes)
22{
23    ZipEntryHeader* entryHeader = new ZipEntryHeader();
24    ByteBuffer bf(bytes.c_str(), bytes.size());
25
26    int32_t entryHeaderInt32Value;
27    bf.GetInt32(entryHeaderInt32Value);
28    if (entryHeaderInt32Value != ZipEntryHeader::SIGNATURE) {
29        delete entryHeader;
30        SIGNATURE_TOOLS_LOGE("find zip entry head failed");
31        return nullptr;
32    }
33
34    int16_t entryHeaderInt16Value;
35    bf.GetInt16(entryHeaderInt16Value);
36    entryHeader->SetVersion(entryHeaderInt16Value);
37
38    bf.GetInt16(entryHeaderInt16Value);
39    entryHeader->SetFlag(entryHeaderInt16Value);
40
41    bf.GetInt16(entryHeaderInt16Value);
42    entryHeader->SetMethod(entryHeaderInt16Value);
43
44    bf.GetInt16(entryHeaderInt16Value);
45    entryHeader->SetLastTime(entryHeaderInt16Value);
46
47    bf.GetInt16(entryHeaderInt16Value);
48    entryHeader->SetLastDate(entryHeaderInt16Value);
49
50    bf.GetInt32(entryHeaderInt32Value);
51    entryHeader->SetCrc32(entryHeaderInt32Value);
52
53    uint32_t entryHeaderUInt32Value;
54    bf.GetUInt32(entryHeaderUInt32Value);
55    entryHeader->SetCompressedSize(entryHeaderUInt32Value);
56
57    bf.GetUInt32(entryHeaderUInt32Value);
58    entryHeader->SetUnCompressedSize(entryHeaderUInt32Value);
59
60    uint16_t entryHeaderUInt16Value;
61    bf.GetUInt16(entryHeaderUInt16Value);
62    entryHeader->SetFileNameLength(entryHeaderUInt16Value);
63
64    bf.GetUInt16(entryHeaderUInt16Value);
65    entryHeader->SetExtraLength(entryHeaderUInt16Value);
66
67    entryHeader->SetLength(HEADER_LENGTH + entryHeader->GetFileNameLength() + entryHeader->GetExtraLength());
68
69    return entryHeader;
70}
71
72void ZipEntryHeader::ReadFileName(const std::string& bytes)
73{
74    ByteBuffer bf(bytes.c_str(), bytes.size());
75    if (m_fileNameLength > 0) {
76        std::string nameBytes(m_fileNameLength, 0);
77        bf.GetData(&nameBytes[0], m_fileNameLength);
78        m_fileName = nameBytes;
79    }
80}
81
82void ZipEntryHeader::ReadExtra(const std::string& bytes)
83{
84    ByteBuffer bf(bytes.c_str(), bytes.size());
85    if (m_extraLength > 0) {
86        std::string extra(m_extraLength, 0);
87        bf.GetData(&extra[0], m_extraLength);
88        m_extraData = extra;
89    }
90}
91
92std::string ZipEntryHeader::ToBytes()
93{
94    ByteBuffer bf(m_length);
95
96    bf.PutInt32(SIGNATURE);
97    bf.PutInt16(m_version);
98    bf.PutInt16(m_flag);
99    bf.PutInt16(m_method);
100    bf.PutInt16(m_lastTime);
101    bf.PutInt16(m_lastDate);
102    bf.PutInt32(m_crc32);
103    bf.PutUInt32(m_compressedSize);
104    bf.PutUInt32(m_unCompressedSize);
105    bf.PutUInt16(m_fileNameLength);
106    bf.PutUInt16(m_extraLength);
107
108    if (m_fileNameLength > 0) {
109        bf.PutData(m_fileName.c_str(), m_fileName.size());
110    }
111    if (m_extraLength > 0) {
112        bf.PutData(m_extraData.c_str(), m_extraData.size());
113    }
114
115    return bf.ToString();
116}
117
118int ZipEntryHeader::GetHeaderLength()
119{
120    return HEADER_LENGTH;
121}
122
123int ZipEntryHeader::GetSIGNATURE()
124{
125    return SIGNATURE;
126}
127
128short ZipEntryHeader::GetVersion()
129{
130    return m_version;
131}
132
133void ZipEntryHeader::SetVersion(short version)
134{
135    m_version = version;
136}
137
138short ZipEntryHeader::GetFlag()
139{
140    return m_flag;
141}
142
143void ZipEntryHeader::SetFlag(short flag)
144{
145    m_flag = flag;
146}
147
148short ZipEntryHeader::GetMethod()
149{
150    return m_method;
151}
152
153void ZipEntryHeader::SetMethod(short method)
154{
155    m_method = method;
156}
157
158short ZipEntryHeader::GetLastTime()
159{
160    return m_lastTime;
161}
162
163void ZipEntryHeader::SetLastTime(short lastTime)
164{
165    m_lastTime = lastTime;
166}
167
168short ZipEntryHeader::GetLastDate()
169{
170    return m_lastDate;
171}
172
173void ZipEntryHeader::SetLastDate(short lastDate)
174{
175    m_lastDate = lastDate;
176}
177
178int ZipEntryHeader::GetCrc32()
179{
180    return m_crc32;
181}
182
183void ZipEntryHeader::SetCrc32(int crc32)
184{
185    m_crc32 = crc32;
186}
187
188uint32_t ZipEntryHeader::GetCompressedSize()
189{
190    return m_compressedSize;
191}
192
193void ZipEntryHeader::SetCompressedSize(uint32_t compressedSize)
194{
195    m_compressedSize = compressedSize;
196}
197
198uint32_t ZipEntryHeader::GetUnCompressedSize()
199{
200    return m_unCompressedSize;
201}
202
203void ZipEntryHeader::SetUnCompressedSize(uint32_t unCompressedSize)
204{
205    m_unCompressedSize = unCompressedSize;
206}
207
208uint16_t ZipEntryHeader::GetFileNameLength()
209{
210    return m_fileNameLength;
211}
212
213void ZipEntryHeader::SetFileNameLength(uint16_t fileNameLength)
214{
215    m_fileNameLength = fileNameLength;
216}
217
218uint16_t ZipEntryHeader::GetExtraLength()
219{
220    return m_extraLength;
221}
222
223void ZipEntryHeader::SetExtraLength(uint16_t extraLength)
224{
225    m_extraLength = extraLength;
226}
227
228std::string ZipEntryHeader::GetFileName() const
229{
230    return m_fileName;
231}
232
233void ZipEntryHeader::SetFileName(const std::string& fileName)
234{
235    m_fileName = fileName;
236}
237
238std::string ZipEntryHeader::GetExtraData() const
239{
240    return m_extraData;
241}
242
243void ZipEntryHeader::SetExtraData(const std::string& extraData)
244{
245    m_extraData = extraData;
246}
247
248uint32_t ZipEntryHeader::GetLength()
249{
250    return m_length;
251}
252
253void ZipEntryHeader::SetLength(uint32_t length)
254{
255    m_length = length;
256}
257} // namespace SignatureTools
258} // namespace OHOS