using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; using System.Xml.Serialization; namespace V3.Data.Internal { /// /// Default implementation if ISaveGameManager. /// // ReSharper disable once ClassNeverInstantiated.Global internal sealed class SaveGameManager : ISaveGameManager { private readonly IPathManager mPathManager; private const int CurrentVersion = 1; private readonly XmlSerializer mFormatter = new XmlSerializer(typeof(SaveGame)); /// /// Creates a new SaveGameManager. The save game directory must already /// be created. /// public SaveGameManager(IPathManager pathManager) { mPathManager = pathManager; } /// /// Creates and persists a new save game of the given data with the /// title. /// /// the data to store public void CreateSaveGame(GameState gameState) { var saveGame = new SaveGame(DateTime.Now, CurrentVersion, gameState); var fileName = GetUniqueFileName(); var stream = new FileStream(fileName, FileMode.Create, FileAccess.Write); mFormatter.Serialize(stream, saveGame); stream.Close(); } /// /// Loads all available save games and returns them ordered by the /// creation date. /// /// a list of all available save games, orderd by creation /// data public List GetSaveGames() { var saveGames = new List(); foreach (var file in Directory.GetFiles(mPathManager.SaveGameDirectory)) { var stream = new FileStream(file, FileMode.Open, FileAccess.Read); try { var saveGame = (ISaveGame)mFormatter.Deserialize(stream); if (saveGame.Version == CurrentVersion) saveGames.Add(saveGame); } catch (SerializationException) { // ignore so far } stream.Close(); } saveGames.Sort(); return saveGames; } private string GetUniqueFileName() { var index = 1; var fileName = GetFileName(index); while (File.Exists(fileName)) { index++; fileName = GetFileName(index); } return fileName; } private string GetFileName(int index) { return $"{mPathManager.SaveGameDirectory}/{index:000}.xml"; } } }