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/FileInfo.cs
2015-03-18 08:48:48 -05:00

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);
}
}
}