diff --git a/Yura/Archive/ArchiveFile.cs b/Yura/Archive/ArchiveFile.cs index f50e2e3..1200c2a 100644 --- a/Yura/Archive/ArchiveFile.cs +++ b/Yura/Archive/ArchiveFile.cs @@ -28,13 +28,6 @@ public ArchiveFile(string path) /// The content of the file public abstract byte[] Read(ArchiveRecord record); - /// - /// Writes the data to a file in the archive - /// - /// The file record, must be an existing record - /// The data to write - public abstract void Write(ArchiveRecord record, byte[] data); - /// /// Gets the specialisation mask of a record /// @@ -42,11 +35,6 @@ public ArchiveFile(string path) /// The specialisation mask public abstract uint GetSpecialisationMask(ArchiveRecord record); - /// - /// Whether the archive implementation supports writing - /// - public abstract bool CanWrite { get; } - /// /// Gets or sets the file list /// diff --git a/Yura/Archive/DefianceArchive.cs b/Yura/Archive/DefianceArchive.cs index be0446f..3a0006c 100644 --- a/Yura/Archive/DefianceArchive.cs +++ b/Yura/Archive/DefianceArchive.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using StreamReader = Yura.IO.StreamReader; @@ -71,8 +70,6 @@ public override IReadOnlyList Records } } - public override bool CanWrite => false; - public override byte[] Read(ArchiveRecord record) { var file = record as DefianceRecord; @@ -88,11 +85,6 @@ public override byte[] Read(ArchiveRecord record) return bytes; } - public override void Write(ArchiveRecord record, byte[] data) - { - throw new NotImplementedException(); - } - public override uint GetSpecialisationMask(ArchiveRecord record) { // defiance does not use specialisation diff --git a/Yura/Archive/DeusExArchive.cs b/Yura/Archive/DeusExArchive.cs index a5cc598..8196343 100644 --- a/Yura/Archive/DeusExArchive.cs +++ b/Yura/Archive/DeusExArchive.cs @@ -82,8 +82,6 @@ public override IReadOnlyList Records } } - public override bool CanWrite => false; - public override byte[] Read(ArchiveRecord record) { var file = record as DeusExRecord; @@ -108,11 +106,6 @@ public override byte[] Read(ArchiveRecord record) return bytes; } - public override void Write(ArchiveRecord record, byte[] data) - { - throw new NotImplementedException(); - } - public override uint GetSpecialisationMask(ArchiveRecord record) { var file = record as DeusExRecord; diff --git a/Yura/Archive/LegendArchive.cs b/Yura/Archive/LegendArchive.cs index c93b493..7a0c0fd 100644 --- a/Yura/Archive/LegendArchive.cs +++ b/Yura/Archive/LegendArchive.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using StreamReader = Yura.IO.StreamReader; namespace Yura.Archive @@ -79,8 +78,6 @@ public override IReadOnlyList Records } } - public override bool CanWrite => true; - public override byte[] Read(ArchiveRecord record) { var file = record as LegendRecord; @@ -115,91 +112,6 @@ public override byte[] Read(ArchiveRecord record) return bytes; } - public override void Write(ArchiveRecord record, byte[] data) - { - var file = record as LegendRecord; - - // find offset to write the file - var offset = FindFirstSpace(data.Length, file); - - file.Offset = (uint)(offset >> 11); - file.Size = (uint)data.Length; - - var bigfile = (file.Offset << 11) / _alignment; - - // find right bigfile - var name = Path.GetFileNameWithoutExtension(_file); - var filename = Path.GetDirectoryName(_file) + Path.DirectorySeparatorChar + name + "." + bigfile.ToString("000"); - - // write the file data - var stream = File.OpenWrite(filename); - - stream.Position = offset % _alignment; - stream.Write(data); - - stream.Close(); - - // update file header - stream = File.OpenWrite(_file); - - // find position of record in header - stream.Position = 4 + (_files.Count * 4) + (_files.IndexOf(file) * 16); - - var size = BitConverter.GetBytes(file.Size); - stream.Write(size); - - var bOffset = BitConverter.GetBytes(file.Offset); - stream.Write(bOffset); - - stream.Close(); - } - - public long FindFirstSpace(int size, ArchiveRecord ignore) - { - // order records by offset - var records = _files.Where(x => x != ignore).OrderBy(x => x.Offset).ToList(); - - for (int i = 0; i < records.Count; i++) - { - var record = records[i]; - - // get first free position - var offset = (record.Offset << 11) + record.Size; - - // find next aligned offset - while ((offset & 2047) != 0) offset++; - - var end = offset + size; - var bigfile = (record.Offset << 11) / _alignment; - - if (i >= records.Count - 1) - { - for (int j = 0; j < 10; j++) - { - if (end < (bigfile + 1) * _alignment) - { - return offset; - } - - bigfile++; - offset = (uint)(bigfile * _alignment); - - if (bigfile > 999) break; - } - - break; - } - - // check if file fits - if (end < records[i + 1].Offset << 11 && end < (bigfile + 1) * _alignment) - { - return offset; - } - } - - throw new Exception("Failed to find space in bigfile"); - } - public override uint GetSpecialisationMask(ArchiveRecord record) { var file = record as LegendRecord; diff --git a/Yura/Archive/TigerArchive.cs b/Yura/Archive/TigerArchive.cs index dea1c52..d4fe167 100644 --- a/Yura/Archive/TigerArchive.cs +++ b/Yura/Archive/TigerArchive.cs @@ -120,8 +120,6 @@ public override IReadOnlyList Records } } - public override bool CanWrite => false; - public override byte[] Read(ArchiveRecord record) { var file = record as TigerRecord; @@ -144,11 +142,6 @@ public override byte[] Read(ArchiveRecord record) return bytes; } - public override void Write(ArchiveRecord record, byte[] data) - { - throw new NotImplementedException(); - } - public override uint GetSpecialisationMask(ArchiveRecord record) { var file = record as TigerRecord; diff --git a/Yura/MainWindow.xaml b/Yura/MainWindow.xaml index 4ec968c..4b4c482 100644 --- a/Yura/MainWindow.xaml +++ b/Yura/MainWindow.xaml @@ -69,9 +69,7 @@ - + diff --git a/Yura/MainWindow.xaml.cs b/Yura/MainWindow.xaml.cs index 0e046a9..07c3c07 100644 --- a/Yura/MainWindow.xaml.cs +++ b/Yura/MainWindow.xaml.cs @@ -38,8 +38,6 @@ public partial class MainWindow : Window private TextureFormat _textureFormat; private Game _currentGame; - private List _currentFolder; - // the current open bigfile private ArchiveFile _bigfile; @@ -230,8 +228,6 @@ public void SwitchDirectory(string path, string selectedFile = null) PathBox.Text = bigfile + "\\" + path; } - _currentFolder = files; - ShowFiles(files, selectedFile); } @@ -549,48 +545,6 @@ private void SearchBox_KeyDown(object sender, KeyEventArgs e) // TODO clear selection in directory view } } - - private void FileView_Drop(object sender, DragEventArgs e) - { - if (_bigfile == null || !_bigfile.CanWrite) - { - return; - } - - if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - - foreach (var file in files) - { - // currently only support replacing file, so find the current file record in the folder - var filename = Path.GetFileName(file); - var record = _currentFolder.FirstOrDefault(x => x.Name != null && Path.GetFileName(x.Name) == filename); - - if (record == null) - { - MessageBox.Show("Unable to add file, make sure a file exists with same name in the current folder.", "Failed to add file", MessageBoxButton.OK, MessageBoxImage.Error); - return; - } - - try - { - // read file and write into archive, bigfile implementation will take care of - // finding an offset and writing it - var data = File.ReadAllBytes(file); - - _bigfile.Write(record, data); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Failed to add file", MessageBoxButton.OK, MessageBoxImage.Error); - return; - } - } - - MessageBox.Show($"{files.Length} files added", "Files added", MessageBoxButton.OK, MessageBoxImage.Information); - } - } } public class DirectoryViewFolder