private void ParseElement(BinaryWriter writer, Dna.StructDecl fileStruct, Dna.ElementDecl memoryElement, long structOffset) { long elementOffset; Dna.ElementDecl elementOld = GetFileElement(fileStruct, memoryElement, out elementOffset); if (elementOld != null) { Dna.StructDecl typeStructOld = _fileDna.GetStruct(memoryElement.Type.Name); int arrayLength = elementOld.NameInfo.ArrayLength; for (int i = 0; i < arrayLength; i++) { long subStructOffset = structOffset + i * typeStructOld.Type.Length + elementOffset; ParseStruct(writer, memoryElement.Type.Struct, typeStructOld, subStructOffset); } } }
protected Dna.ElementDecl GetFileElement(Dna.StructDecl fileStruct, Dna.ElementDecl lookupElement, out long elementOffset) { elementOffset = 0; foreach (Dna.ElementDecl element in fileStruct.Elements) { if (element.NameInfo.Equals(lookupElement.NameInfo)) { if (element.Type.Name.Equals(lookupElement.Type.Name)) { return(element); } break; } elementOffset += _fileDna.GetElementSize(element); } return(null); }
protected long GetFileElement(Dna.StructDecl firstStruct, Dna.ElementDecl lookupElement, long data, out Dna.ElementDecl found) { foreach (Dna.ElementDecl element in firstStruct.Elements) { if (element.Name.Equals(lookupElement.Name)) { if (element.Type.Name.Equals(lookupElement.Type.Name)) { found = element; return(data); } found = null; return(0); } data += _fileDna.GetElementSize(element); } found = null; return(0); }
protected void WriteElement(BinaryWriter writer, Dna.StructDecl fileStruct, Dna.ElementDecl memoryElement, long structOffset) { bool brokenDna = (Flags & FileFlags.BrokenDna) != 0; int elementOffset; Dna.ElementDecl fileElement = fileStruct.FindElement(_fileDna, brokenDna, memoryElement.NameInfo, out elementOffset); ChunkReader.BaseStream.Position = structOffset + elementOffset; if (fileElement == null) { int elementLength = _memoryDna.GetElementSize(memoryElement); writer.BaseStream.Position += elementLength; } else if (fileElement.NameInfo.Name[0] == '*') { SafeSwapPtr(writer, ChunkReader); } else if (fileElement.Type.Name.Equals(memoryElement.Type.Name)) { int elementLength = _fileDna.GetElementSize(fileElement); if (elementLength != _memoryDna.GetElementSize(memoryElement)) { throw new InvalidDataException(); } byte[] mem = new byte[elementLength]; ChunkReader.Read(mem, 0, elementLength); writer.Write(mem); } else { throw new InvalidDataException(); //GetElement(arrayLen, lookupType, type, data, strcData); } }
protected void GetMatchingFileDna(Dna.StructDecl dna, Dna.ElementDecl lookupElement, BinaryWriter strcData, long data, bool fixupPointers) { // find the matching memory dna data // to the file being loaded. Fill the // memory with the file data... foreach (Dna.ElementDecl element in dna.Elements) { int eleLen = _fileDna.GetElementSize(element); if ((_flags & FileFlags.BrokenDna) != 0) { if (element.Type.Name.Equals("short") && element.Name.Name.Equals("int")) { eleLen = 0; } } if (lookupElement.Name.Equals(element.Name)) { int arrayLen = element.Name.ArraySizeNew; MemoryStream dataStream = new MemoryStream(_fileBuffer, false); dataStream.Position = data; BinaryReader dataReader = new BinaryReader(dataStream); if (element.Name.Name[0] == '*') { SafeSwapPtr(strcData, dataReader); if (fixupPointers) { if (arrayLen > 1) { throw new NotImplementedException(); } else { if (element.Name.Name[1] == '*') { throw new NotImplementedException(); } else { //_chunkPointerFixupArray.Add(strcData.BaseStream.Position); } } } else { //Console.WriteLine("skipped {0} {1} : {2:X}", element.Type.Name, element.Name.Name, strcData.BaseStream.Position); } } else if (element.Type.Name.Equals(lookupElement.Type.Name)) { byte[] mem = new byte[eleLen]; dataReader.Read(mem, 0, eleLen); strcData.Write(mem); } else { throw new NotImplementedException(); //GetElement(arrayLen, lookupType, type, data, strcData); } dataReader.Dispose(); dataStream.Dispose(); break; } data += eleLen; } }