diff --git a/Player/Undo/UndoFormat.cs b/Player/Undo/UndoFormat.cs index 1c5608eaf..47690ae00 100644 --- a/Player/Undo/UndoFormat.cs +++ b/Player/Undo/UndoFormat.cs @@ -21,6 +21,8 @@ using System.IO; namespace MCGalaxy.Undo { + /// Retrieves and saves undo data in a particular format. + /// Note most formats only support retrieving undo data. public abstract class UndoFormat { protected const string undoDir = "extra/undo", prevUndoDir = "extra/undoPrevious"; @@ -76,29 +78,21 @@ namespace MCGalaxy.Undo { static void FilterEntries(Player p, string dir, string name, Vec3S32[] marks, DateTime start, bool highlight, ref bool FoundUser) { - string path = Path.Combine(dir, name); - if (!Directory.Exists(path)) return; - string[] files = Directory.GetFiles(path); - Array.Sort(files, CompareFiles); + string[] files = GetFiles(dir, name); + if (files == null || files.Length == 0) return; UndoEntriesArgs args = new UndoEntriesArgs(p, start); for (int i = files.Length - 1; i >= 0; i--) { - path = files[i]; - string file = Path.GetFileName(path); - if (file.Length == 0 || file[0] < '0' || file[0] > '9') - continue; - - UndoFormat format = null; - if (path.EndsWith(TxtFormat.Ext)) format = TxtFormat; - if (path.EndsWith(BinFormat.Ext)) format = BinFormat; - if (path.EndsWith(NewFormat.Ext)) format = NewFormat; + string path = files[i]; + if (path == null) continue; + UndoFormat format = GetFormat(path); if (format == null) continue; using (Stream s = File.OpenRead(path)) { if (highlight) { DoHighlight(s, format, args); } else { - DoUndo(s, format, args); + DoUndo(s, format, args); } if (args.Stop) break; } @@ -106,6 +100,28 @@ namespace MCGalaxy.Undo { FoundUser = true; } + static string[] GetFiles(string dir, string name) { + string path = Path.Combine(dir, name); + if (!Directory.Exists(path)) return null; + + string[] files = Directory.GetFiles(path); + Array.Sort(files, CompareFiles); + + for (int i = 0; i < files.Length; i++) { + name = Path.GetFileName(files[i]); + if (name.Length == 0 || name[0] < '0' || name[0] > '9') + files[i] = null; + } + return files; + } + + static UndoFormat GetFormat(string file) { + if (file.EndsWith(TxtFormat.Ext)) return TxtFormat; + if (file.EndsWith(BinFormat.Ext)) return BinFormat; + if (file.EndsWith(NewFormat.Ext)) return NewFormat; + return null; + } + static int CompareFiles(string a, string b) { a = Path.GetFileNameWithoutExtension(a); b = Path.GetFileNameWithoutExtension(b); @@ -133,7 +149,7 @@ namespace MCGalaxy.Undo { buffer.CheckIfSend(true); } - public static void DoUndo(Stream s, UndoFormat format, UndoEntriesArgs args) { + public static void DoUndo(Stream s, UndoFormat format, UndoEntriesArgs args) { Level lvl = args.Player == null ? null : args.Player.level; BufferedBlockSender buffer = new BufferedBlockSender(lvl); string lastMap = null;