Mercurial > vba-clojure
comparison src/win32/7zip/7z/CPP/7zip/Archive/GZip/GZipIn.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:8ced16adf2e1 | 1:f9f4f1b99eed |
---|---|
1 // Archive/GZipIn.cpp | |
2 | |
3 #include "StdAfx.h" | |
4 | |
5 #include "GZipIn.h" | |
6 | |
7 #include "Common/Defs.h" | |
8 #include "Common/MyCom.h" | |
9 #include "Windows/Defs.h" | |
10 | |
11 #include "../../Common/StreamUtils.h" | |
12 | |
13 extern "C" | |
14 { | |
15 #include "../../../../C/7zCrc.h" | |
16 } | |
17 | |
18 namespace NArchive { | |
19 namespace NGZip { | |
20 | |
21 HRESULT CInArchive::ReadBytes(ISequentialInStream *inStream, void *data, UInt32 size) | |
22 { | |
23 RINOK(ReadStream_FALSE(inStream, data, size)); | |
24 m_Position += size; | |
25 return S_OK; | |
26 } | |
27 | |
28 HRESULT CInArchive::ReadByte(ISequentialInStream *inStream, Byte &value, UInt32 &crc) | |
29 { | |
30 RINOK(ReadBytes(inStream, &value, 1)); | |
31 crc = CRC_UPDATE_BYTE(crc, value); | |
32 return S_OK; | |
33 } | |
34 | |
35 HRESULT CInArchive::ReadUInt16(ISequentialInStream *inStream, UInt16 &value, UInt32 &crc) | |
36 { | |
37 value = 0; | |
38 for (int i = 0; i < 2; i++) | |
39 { | |
40 Byte b; | |
41 RINOK(ReadByte(inStream, b, crc)); | |
42 value |= (UInt16(b) << (8 * i)); | |
43 } | |
44 return S_OK; | |
45 } | |
46 | |
47 HRESULT CInArchive::ReadUInt32(ISequentialInStream *inStream, UInt32 &value, UInt32 &crc) | |
48 { | |
49 value = 0; | |
50 for (int i = 0; i < 4; i++) | |
51 { | |
52 Byte b; | |
53 RINOK(ReadByte(inStream, b, crc)); | |
54 value |= (UInt32(b) << (8 * i)); | |
55 } | |
56 return S_OK; | |
57 } | |
58 | |
59 HRESULT CInArchive::ReadZeroTerminatedString(ISequentialInStream *inStream, AString &resString, UInt32 &crc) | |
60 { | |
61 resString.Empty(); | |
62 for (;;) | |
63 { | |
64 Byte c; | |
65 RINOK(ReadByte(inStream, c, crc)); | |
66 if (c == 0) | |
67 return S_OK; | |
68 resString += char(c); | |
69 } | |
70 } | |
71 | |
72 HRESULT CInArchive::ReadHeader(ISequentialInStream *inStream, CItem &item) | |
73 { | |
74 item.Clear(); | |
75 m_Position = 0; | |
76 | |
77 UInt16 signature; | |
78 UInt32 crc = CRC_INIT_VAL;; | |
79 RINOK(ReadUInt16(inStream, signature, crc)); | |
80 if (signature != kSignature) | |
81 return S_FALSE; | |
82 | |
83 RINOK(ReadByte(inStream, item.CompressionMethod, crc)); | |
84 RINOK(ReadByte(inStream, item.Flags, crc)); | |
85 RINOK(ReadUInt32(inStream, item.Time, crc)); | |
86 RINOK(ReadByte(inStream, item.ExtraFlags, crc)); | |
87 RINOK(ReadByte(inStream, item.HostOS, crc)); | |
88 | |
89 if (item.ExtraFieldIsPresent()) | |
90 { | |
91 UInt16 extraSize; | |
92 RINOK(ReadUInt16(inStream, extraSize, crc)); | |
93 item.Extra.SetCapacity(extraSize); | |
94 RINOK(ReadBytes(inStream, item.Extra, extraSize)); | |
95 crc = CrcUpdate(crc, item.Extra, extraSize); | |
96 } | |
97 if (item.NameIsPresent()) | |
98 RINOK(ReadZeroTerminatedString(inStream, item.Name, crc)); | |
99 if (item.CommentIsPresent()) | |
100 RINOK(ReadZeroTerminatedString(inStream, item.Comment, crc)); | |
101 if (item.HeaderCRCIsPresent()) | |
102 { | |
103 UInt16 headerCRC; | |
104 UInt32 dummy = 0; | |
105 RINOK(ReadUInt16(inStream, headerCRC, dummy)); | |
106 if ((UInt16)CRC_GET_DIGEST(crc) != headerCRC) | |
107 return S_FALSE; | |
108 } | |
109 return S_OK; | |
110 } | |
111 | |
112 HRESULT CInArchive::ReadPostHeader(ISequentialInStream *inStream, CItem &item) | |
113 { | |
114 UInt32 dummy = 0; | |
115 RINOK(ReadUInt32(inStream, item.FileCRC, dummy)); | |
116 return ReadUInt32(inStream, item.UnPackSize32, dummy); | |
117 } | |
118 | |
119 }} |