This repository has been archived on 2025-05-24. You can view files and clone it, but cannot push or open issues or pull requests.
Files
RomVault/ROMVault2/SupportedFiles/SevenZip/Structure/Header.cs
2015-03-18 08:48:48 -05:00

112 lines
3.8 KiB
C#

using System;
using System.IO;
using ROMVault2.SupportedFiles.SevenZip.Compress.LZMA;
namespace ROMVault2.SupportedFiles.SevenZip.Structure
{
public class Header
{
public StreamsInfo StreamsInfo;
public FileInfo FileInfo;
public void Read(BinaryReader br)
{
Util.log("Begin : ReadHeader", 1);
for (; ; )
{
HeaderProperty hp = (HeaderProperty)br.ReadByte();
Util.log("HeaderProperty = " + hp);
switch (hp)
{
case HeaderProperty.kMainStreamsInfo:
StreamsInfo = new StreamsInfo();
StreamsInfo.Read(br);
break;
case HeaderProperty.kFilesInfo:
FileInfo = new FileInfo();
FileInfo.Read(br);
break;
case HeaderProperty.kEnd:
Util.log("End : ReadHeader", -1);
return;
default:
throw new Exception(hp.ToString());
}
}
}
private void Write(BinaryWriter bw)
{
bw.Write((byte)HeaderProperty.kHeader);
StreamsInfo.Write(bw);
FileInfo.Write(bw);
bw.Write((byte)HeaderProperty.kEnd);
}
public void WriteHeader(BinaryWriter bw)
{
Write(bw);
}
public static ZipReturn ReadHeaderOrPackedHeader(Stream stream, long baseOffset, out Header header)
{
header = null;
Util.log("Begin : ReadHeaderOrPackedHeader", 1);
BinaryReader br = new BinaryReader(stream);
HeaderProperty hp = (HeaderProperty)br.ReadByte();
Util.log("HeaderProperty = " + hp);
switch (hp)
{
case HeaderProperty.kEncodedHeader:
{
StreamsInfo streamsInfo = new StreamsInfo();
streamsInfo.Read(br);
if (streamsInfo.Folders.Length > 1)
return ZipReturn.ZipUnsupportedCompression;
Folder firstFolder = streamsInfo.Folders[0];
if (firstFolder.Coders.Length > 1)
return ZipReturn.ZipUnsupportedCompression;
byte[] method = firstFolder.Coders[0].Method;
if (!(method.Length == 3 && method[0] == 3 && method[1] == 1 && method[2] == 1)) // LZMA
return ZipReturn.ZipUnsupportedCompression;
stream.Seek(baseOffset + (long)streamsInfo.PackPosition, SeekOrigin.Begin);
using (Decoder decoder = new Decoder())
{
decoder.SetDecoderProperties(firstFolder.Coders[0].Properties);
decoder.SetUpStream(stream);
ZipReturn zr = ReadHeaderOrPackedHeader(decoder, baseOffset, out header);
if (zr != ZipReturn.ZipGood)
return zr;
}
Util.log("End : ReadHeaderOrPackedHeader (Packed)", -1);
return ZipReturn.ZipGood;
}
case HeaderProperty.kHeader:
{
header = new Header();
header.Read(br);
Util.log("End : ReadHeaderOrPackedHeader (UnPacked)", -1);
return ZipReturn.ZipGood;
}
}
return ZipReturn.ZipCenteralDirError;
}
}
}