129 lines
4.4 KiB
C#
129 lines
4.4 KiB
C#
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|