diff options
author | Thomas Leyh <leyh.thomas@web.de> | 2016-07-24 08:14:18 +0200 |
---|---|---|
committer | Thomas Leyh <leyh.thomas@web.de> | 2016-07-24 08:14:18 +0200 |
commit | ced3d03bdb3ce866d832e03fb212865140905a9a (patch) | |
tree | 2a16c2063a46d3c354ce1585029dda3124f6ad93 /V3/Data/Internal/SaveGameManager.cs | |
parent | 0394dccaf06e1009e591a6ff4d645895574724c1 (diff) | |
download | V3-ced3d03bdb3ce866d832e03fb212865140905a9a.tar.gz V3-ced3d03bdb3ce866d832e03fb212865140905a9a.tar.bz2 |
Diffstat (limited to 'V3/Data/Internal/SaveGameManager.cs')
-rw-r--r-- | V3/Data/Internal/SaveGameManager.cs | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/V3/Data/Internal/SaveGameManager.cs b/V3/Data/Internal/SaveGameManager.cs new file mode 100644 index 0000000..1c52b50 --- /dev/null +++ b/V3/Data/Internal/SaveGameManager.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Serialization; +using System.Xml.Serialization; + +namespace V3.Data.Internal +{ + /// <summary> + /// Default implementation if ISaveGameManager. + /// </summary> + // 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)); + + /// <summary> + /// Creates a new SaveGameManager. The save game directory must already + /// be created. + /// </summary> + public SaveGameManager(IPathManager pathManager) + { + mPathManager = pathManager; + } + + /// <summary> + /// Creates and persists a new save game of the given data with the + /// title. + /// </summary> + /// <param name="gameState">the data to store</param> + 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(); + } + + /// <summary> + /// Loads all available save games and returns them ordered by the + /// creation date. + /// </summary> + /// <returns>a list of all available save games, orderd by creation + /// data</returns> + public List<ISaveGame> GetSaveGames() + { + var saveGames = new List<ISaveGame>(); + 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"; + } + } +} |