public Read ( Stream input ) : void | ||
input | Stream | The input |
Результат | void |
public void Read(Stream input)
{
Reader = new BinaryReader(input);
FileSize = Reader.ReadUInt32();
if (FileSize == 0x55AA1234)
{
throw new InvalidDataException("Use ValvePak library to parse VPK files.\nSee https://github.com/SteamDatabase/ValvePak");
}
if (FileSize == CompiledShader.MAGIC)
{
throw new InvalidDataException("Use CompiledShader() class to parse compiled shader files.");
}
// TODO: Some real files seem to have different file size
if (FileSize != Reader.BaseStream.Length)
{
//throw new Exception(string.Format("File size does not match size specified in file. {0} != {1}", FileSize, Reader.BaseStream.Length));
}
HeaderVersion = Reader.ReadUInt16();
if (HeaderVersion != KnownHeaderVersion)
{
throw new InvalidDataException(string.Format("Bad header version. ({0} != expected {1})", HeaderVersion, KnownHeaderVersion));
}
Version = Reader.ReadUInt16();
var blockOffset = Reader.ReadUInt32();
var blockCount = Reader.ReadUInt32();
Reader.BaseStream.Position += blockOffset - 8; // 8 is 2 uint32s we just read
for (var i = 0; i < blockCount; i++)
{
var blockType = Encoding.UTF8.GetString(Reader.ReadBytes(4));
var block = ConstructFromType(blockType);
var position = Reader.BaseStream.Position;
// Offset is relative to current position
block.Offset = (uint)position + Reader.ReadUInt32();
block.Size = Reader.ReadUInt32();
block.Read(Reader, this);
Blocks.Add(block.GetChar(), block);
switch (block.GetChar())
{
case BlockType.REDI:
// Try to determine resource type by looking at first compiler indentifier
if (ResourceType == ResourceType.Unknown && EditInfo.Structs.ContainsKey(ResourceEditInfo.REDIStruct.SpecialDependencies))
{
var specialDeps = (SpecialDependencies)EditInfo.Structs[ResourceEditInfo.REDIStruct.SpecialDependencies];
if (specialDeps.List.Count > 0)
{
ResourceType = DetermineResourceTypeByCompilerIdentifier(specialDeps.List[0]);
}
}
break;
case BlockType.NTRO:
if (ResourceType == ResourceType.Unknown && IntrospectionManifest.ReferencedStructs.Count > 0)
{
switch (IntrospectionManifest.ReferencedStructs[0].Name)
{
case "VSoundEventScript_t":
ResourceType = ResourceType.SoundEventScript;
break;
case "CWorldVisibility":
ResourceType = ResourceType.WorldVisibility;
break;
}
}
break;
}
Reader.BaseStream.Position = position + 8;
}
}
Resource::Read ( string filename ) : void |
public void ReadBlocksWithMemoryStream() { var resources = new Dictionary<string, Resource>(); var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files"); var files = Directory.GetFiles(path, "*.*_c"); if (files.Length == 0) { Assert.Fail("There are no files to test."); } foreach (var file in files) { var resource = new Resource(); var fs = new FileStream(file, FileMode.Open, FileAccess.Read); var ms = new MemoryStream(); fs.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); resource.Read(ms); resources.Add(Path.GetFileName(file), resource); } VerifyResources(resources); }