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