public InstallHandler(BinaryReader stream, BackgroundWorkerEx worker)
{
worker?.ReportProgress(0, "Loading \"install\"...");
stream.ReadBytes(2); // IN
byte b1 = stream.ReadByte();
byte b2 = stream.ReadByte();
short numTags = stream.ReadInt16BE();
int numFiles = stream.ReadInt32BE();
int numMaskBytes = (numFiles + 7) / 8;
List<InstallTag> Tags = new List<InstallTag>();
for (int i = 0; i < numTags; i++)
{
InstallTag tag = new InstallTag();
tag.Name = stream.ReadCString();
tag.Type = stream.ReadInt16BE();
byte[] bits = stream.ReadBytes(numMaskBytes);
for (int j = 0; j < numMaskBytes; j++)
bits[j] = (byte)((bits[j] * 0x0202020202 & 0x010884422010) % 1023);
tag.Bits = new BitArray(bits);
Tags.Add(tag);
}
for (int i = 0; i < numFiles; i++)
{
InstallEntry entry = new InstallEntry();
entry.Name = stream.ReadCString();
entry.MD5 = stream.Read<MD5Hash>();
entry.Size = stream.ReadInt32BE();
InstallData.Add(entry);
entry.Tags = Tags.FindAll(tag => tag.Bits[i]);
worker?.ReportProgress((int)((i + 1) / (float)numFiles * 100));
}
}