public Package Read()
{
var mainStream = new FileStream(path, FileMode.Open, FileAccess.Read);
using (var reader = new BinaryReader(mainStream, new UTF8Encoding(), true))
{
// Check for v13 package headers
mainStream.Seek(-8, SeekOrigin.End);
Int32 headerSize = reader.ReadInt32();
byte[] signature = reader.ReadBytes(4);
if (Package.Signature.SequenceEqual(signature))
{
mainStream.Seek(-headerSize, SeekOrigin.End);
return ReadPackageV13(mainStream, reader);
}
// Check for v10 package headers
mainStream.Seek(0, SeekOrigin.Begin);
signature = reader.ReadBytes(4);
Int32 version;
if (Package.Signature.SequenceEqual(signature))
{
version = reader.ReadInt32();
if (version == 10)
{
return ReadPackageV10(mainStream, reader);
}
}
// Check for v9 and v7 package headers
mainStream.Seek(0, SeekOrigin.Begin);
version = reader.ReadInt32();
if (version == 7 || version == 9)
{
return ReadPackageV7(mainStream, reader);
}
throw new InvalidDataException("No valid signature found in package file");
}
}
}