Very early SevenZip WIP version
This commit is contained in:
128
ROMVault2/SupportedFiles/SevenZip/Structure/FileInfo.cs
Normal file
128
ROMVault2/SupportedFiles/SevenZip/Structure/FileInfo.cs
Normal file
@@ -0,0 +1,128 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace ROMVault2.SupportedFiles.SevenZip.Structure
|
||||
{
|
||||
public class FileInfo
|
||||
{
|
||||
public string[] Names;
|
||||
public bool[] EmptyStreamFlags;
|
||||
public bool[] EmptyFileFlags;
|
||||
public uint[] Attributes;
|
||||
|
||||
public void Read(BinaryReader br)
|
||||
{
|
||||
Util.log("Begin : ReadFileInfo", 1);
|
||||
|
||||
ulong size = br.ReadEncodedUInt64();
|
||||
Names = new string[size];
|
||||
|
||||
ulong numEmptyFiles = 0;
|
||||
|
||||
for (; ; )
|
||||
{
|
||||
HeaderProperty hp = (HeaderProperty)br.ReadByte();
|
||||
Util.log("HeaderProperty = " + hp);
|
||||
if (hp == HeaderProperty.kEnd)
|
||||
{
|
||||
Util.log("End : ReadFileInfo", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
ulong bytessize = br.ReadEncodedUInt64();
|
||||
switch (hp)
|
||||
{
|
||||
case HeaderProperty.kName:
|
||||
if (br.ReadByte() != 0)
|
||||
throw new Exception("Cannot be external");
|
||||
|
||||
Util.log("Looping Names Begin " + size, 1);
|
||||
for (ulong i = 0; i < size; i++)
|
||||
{
|
||||
Names[i] = br.ReadName();
|
||||
Util.log("enteries[" + i + "]=" + Names[i]);
|
||||
}
|
||||
Util.log("Looping Names End " + size, -1);
|
||||
continue;
|
||||
|
||||
case HeaderProperty.kEmptyStream:
|
||||
Util.log("reading EmptyStreamFlags Total=" + size);
|
||||
EmptyStreamFlags = Util.ReadBoolFlags(br, (ulong)Names.Length);
|
||||
for (ulong i = 0; i < size; i++)
|
||||
if (EmptyStreamFlags[i]) numEmptyFiles++;
|
||||
continue;
|
||||
|
||||
case HeaderProperty.kEmptyFile:
|
||||
Util.log("reading numEmptyFilesFlags Total=" + numEmptyFiles);
|
||||
EmptyFileFlags = Util.ReadBoolFlags(br, numEmptyFiles);
|
||||
continue;
|
||||
|
||||
case HeaderProperty.kWinAttributes:
|
||||
Util.log("skipping bytes " + bytessize);
|
||||
Attributes = Util.ReadUInt32Def(br, size);
|
||||
continue;
|
||||
|
||||
case HeaderProperty.kLastWriteTime:
|
||||
Util.log("skipping bytes " + bytessize);
|
||||
br.ReadBytes((int)bytessize);
|
||||
continue;
|
||||
|
||||
case HeaderProperty.kDummy:
|
||||
Util.log("skipping bytes " + bytessize);
|
||||
br.ReadBytes((int)bytessize);
|
||||
continue;
|
||||
|
||||
default:
|
||||
throw new Exception(hp.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Write(BinaryWriter bw)
|
||||
{
|
||||
bw.Write((byte)HeaderProperty.kFilesInfo);
|
||||
bw.WriteEncodedUInt64((UInt64)Names.Length);
|
||||
|
||||
|
||||
byte[] namebyte;
|
||||
using (MemoryStream nameMem = new MemoryStream())
|
||||
{
|
||||
using (BinaryWriter nameBw = new BinaryWriter(nameMem))
|
||||
{
|
||||
nameBw.Write((byte)0); //not external
|
||||
foreach (string name in Names)
|
||||
nameBw.WriteName(name);
|
||||
|
||||
namebyte = new byte[nameMem.Length];
|
||||
nameMem.Position = 0;
|
||||
nameMem.Read(namebyte, 0, namebyte.Length);
|
||||
}
|
||||
}
|
||||
|
||||
bw.Write((byte)HeaderProperty.kName);
|
||||
bw.WriteEncodedUInt64((UInt64)namebyte.Length);
|
||||
bw.Write(namebyte);
|
||||
|
||||
if (EmptyStreamFlags != null)
|
||||
{
|
||||
|
||||
bw.Write((byte)HeaderProperty.kEmptyStream);
|
||||
Util.WriteBoolFlags(bw, EmptyStreamFlags);
|
||||
}
|
||||
|
||||
if (EmptyFileFlags != null)
|
||||
{
|
||||
bw.Write((byte)HeaderProperty.kEmptyFile);
|
||||
Util.WriteBoolFlags(bw, EmptyFileFlags);
|
||||
}
|
||||
|
||||
if (Attributes != null)
|
||||
{
|
||||
bw.Write((byte)HeaderProperty.kWinAttributes);
|
||||
Util.WriteUint32Def(bw, Attributes);
|
||||
}
|
||||
|
||||
bw.Write((byte)HeaderProperty.kEnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user