private void UpdateEntries(DdtFileEntry parent, ref long runningOffset, ref int runningFileIndex) { var subEntryCount = -parent.SubEntryCountOrFileSize; for (var i = 0; i < subEntryCount; i++) { var entry = parent.SubEntries[i]; if (entry.SubEntryCountOrFileSize >= 0) { entry.NextDirectoryOffsetOrFileOffset = (int)(runningOffset / Alignment); runningOffset += (long)Files[runningFileIndex].FileSize; if (runningOffset % Alignment > 0) { runningOffset += Alignment - runningOffset % Alignment; } runningFileIndex++; } } for (var i = 0; i < subEntryCount; i++) { var entry = parent.SubEntries[i]; if (entry.SubEntryCountOrFileSize < 0) { UpdateEntries(entry, ref runningOffset, ref runningFileIndex); } } }
public DDTIMG(Stream ddtInput, Stream imgInput) { _ddtStream = ddtInput; _imgStream = imgInput; using (var br = new BinaryReaderX(ddtInput, true)) { Header = new DdtFileEntry { PathOffset = br.ReadUInt32(), NextDirectoryOffsetOrFileOffset = br.ReadInt32(), SubEntryCountOrFileSize = br.ReadInt32() }; ReadEntries(Header, br, string.Empty); } }
private void WriteEntries(DdtFileEntry parent, BinaryWriterX bwDdt, BinaryWriterX bwImg, ref int runningFileIndex) { var subEntryCount = -parent.SubEntryCountOrFileSize; for (var i = 0; i < subEntryCount; i++) { var entry = parent.SubEntries[i]; bwDdt.Write(entry.PathOffset); bwDdt.Write(entry.NextDirectoryOffsetOrFileOffset); bwDdt.Write(entry.SubEntryCountOrFileSize); } for (var i = 0; i < subEntryCount; i++) { // TODO: Adjust parent.SubEntries[i].PathOffset if we ever allow changes to the directory tree //bw.BaseStream.Position = parent.SubEntries[i].PathOffset; bwDdt.Write(Encoding.GetEncoding("EUC-JP").GetBytes(parent.SubEntries[i].Name)); bwDdt.Write((byte)0x0); } bwDdt.WriteAlignment(4); for (var i = 0; i < subEntryCount; i++) { var entry = parent.SubEntries[i]; if (entry.SubEntryCountOrFileSize >= 0) { var fileInfo = Files[runningFileIndex]; fileInfo.FileData.CopyTo(bwImg.BaseStream); bwImg.WriteAlignment((int)Alignment); runningFileIndex++; } } for (var i = 0; i < subEntryCount; i++) { var entry = parent.SubEntries[i]; if (entry.SubEntryCountOrFileSize < 0) { WriteEntries(entry, bwDdt, bwImg, ref runningFileIndex); } } }
private void ReadEntries(DdtFileEntry parent, BinaryReaderX br, string directory) { var subEntryCount = -parent.SubEntryCountOrFileSize; parent.SubEntries = new List <DdtFileEntry>(); br.BaseStream.Position = parent.NextDirectoryOffsetOrFileOffset; for (var i = 0; i < subEntryCount; i++) { var entry = new DdtFileEntry { PathOffset = br.ReadUInt32(), NextDirectoryOffsetOrFileOffset = br.ReadInt32(), SubEntryCountOrFileSize = br.ReadInt32() }; parent.SubEntries.Add(entry); } for (var i = 0; i < subEntryCount; i++) { br.BaseStream.Position = parent.SubEntries[i].PathOffset; var c = br.ReadByte(); var name = new List <byte>(); while (c != 0x0) { name.Add(c); c = br.ReadByte(); } parent.SubEntries[i].Name = Encoding.GetEncoding("EUC-JP").GetString(name.ToArray()); } for (var i = 0; i < subEntryCount; i++) { var entry = parent.SubEntries[i]; if (entry.SubEntryCountOrFileSize >= 0) { Files.Add(new DdtFileInfo { Entry = entry, FileName = $"{directory}\\{entry.Name}".TrimStart('\\'), FileData = new SubStream(_imgStream, entry.NextDirectoryOffsetOrFileOffset * Alignment, entry.SubEntryCountOrFileSize), State = ArchiveFileState.Archived }); } } for (var i = 0; i < subEntryCount; i++) { var nextDirectory = directory; var entry = parent.SubEntries[i]; if (entry.SubEntryCountOrFileSize < 0) { nextDirectory += "\\" + entry.Name; ReadEntries(entry, br, nextDirectory); } } }