diff --git a/BizHawk.Client.Common/BinarySaveStates.cs b/BizHawk.Client.Common/BinarySaveStates.cs index a706050524..c8e5f80a94 100644 --- a/BizHawk.Client.Common/BinarySaveStates.cs +++ b/BizHawk.Client.Common/BinarySaveStates.cs @@ -10,9 +10,12 @@ namespace BizHawk.Client.Common public const string Corestate = "Core"; public const string Framebuffer = "Framebuffer"; public const string Input = "Input Log"; + public const string CorestateText = "CoreText"; } - + /// + /// more accurately should be called ZipStateLoader, as it supports both text and binary core data + /// public class BinaryStateLoader : IDisposable { private bool isDisposed; @@ -36,11 +39,25 @@ namespace BizHawk.Client.Common } ZipFile zip; + Version ver; private BinaryStateLoader() { } + private void ReadVersion(Stream s) + { + // the "BizState 1.0" tag contains an integer in it describing the sub version. + if (s.Length == 0) + ver = new Version(1, 0, 0); // except for the first release, which doesn't + else + { + StreamReader sr = new StreamReader(s); + ver = new Version(1, 0, int.Parse(sr.ReadLine())); + } + Console.WriteLine("Read a zipstate of version {0}", ver.ToString()); + } + public static BinaryStateLoader LoadAndDetect(string Filename) { BinaryStateLoader ret = new BinaryStateLoader(); @@ -59,7 +76,7 @@ namespace BizHawk.Client.Common { ret.zip = new ZipFile(Filename); var e = ret.zip.GetEntry(BinaryStateFileNames.Versiontag); - if (e == null) + if (!ret.GetFileByName(BinaryStateFileNames.Versiontag, false, ret.ReadVersion)) { ret.zip.Close(); return null; @@ -93,9 +110,11 @@ namespace BizHawk.Client.Common } } - public void GetCoreState(Action callback) + public void GetCoreState(Action callbackBinary, Action callbackText) { - GetFileByName(BinaryStateFileNames.Corestate, true, callback); + if (!GetFileByName(BinaryStateFileNames.Corestate, false, callbackBinary) + && !GetFileByName(BinaryStateFileNames.CorestateText, false, callbackText)) + throw new Exception("Couldn't find Binary or Text savestate"); } public bool GetFrameBuffer(Action callback) @@ -113,6 +132,13 @@ namespace BizHawk.Client.Common { private readonly ZipOutputStream zip; + private void WriteVersion(Stream s) + { + StreamWriter sw = new StreamWriter(s); + sw.WriteLine("1"); // version 1.0.1 + sw.Flush(); + } + /// /// /// @@ -126,7 +152,7 @@ namespace BizHawk.Client.Common }; zip.SetLevel(0); - PutFileByName(BinaryStateFileNames.Versiontag, ss => { }); + PutFileByName(BinaryStateFileNames.Versiontag, WriteVersion); } void PutFileByName(string Name, Action callback) @@ -137,11 +163,16 @@ namespace BizHawk.Client.Common zip.CloseEntry(); } - public void PutCoreState(Action callback) + public void PutCoreStateBinary(Action callback) { PutFileByName(BinaryStateFileNames.Corestate, callback); } + public void PutCoreStateText(Action callback) + { + PutFileByName(BinaryStateFileNames.CorestateText, callback); + } + public void PutFrameBuffer(Action callback) { PutFileByName(BinaryStateFileNames.Framebuffer, callback); diff --git a/BizHawk.Client.Common/SavestateManager.cs b/BizHawk.Client.Common/SavestateManager.cs index f1e44982f5..bc7386afba 100644 --- a/BizHawk.Client.Common/SavestateManager.cs +++ b/BizHawk.Client.Common/SavestateManager.cs @@ -29,13 +29,24 @@ namespace BizHawk.Client.Common using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) using (BinaryStateSaver bs = new BinaryStateSaver(fs)) { - bs.PutCoreState( +#if true + bs.PutCoreStateBinary( delegate(Stream s) { BinaryWriter bw = new BinaryWriter(s); Global.Emulator.SaveStateBinary(bw); bw.Flush(); }); +#else + // this would put text states inside the zipfile + bs.PutCoreStateText( + delegate(Stream s) + { + StreamWriter sw = new StreamWriter(s); + Global.Emulator.SaveStateText(sw); + sw.Flush(); + }); +#endif if (Global.Config.SaveScreenshotWithStates) { bs.PutFrameBuffer( @@ -92,6 +103,11 @@ namespace BizHawk.Client.Common { BinaryReader br = new BinaryReader(s); Global.Emulator.LoadStateBinary(br); + }, + delegate(Stream s) + { + StreamReader sr = new StreamReader(s); + Global.Emulator.LoadStateText(sr); }); bw.GetFrameBuffer(