Skip to content

Commit 8cabe42

Browse files
committed
Update IStateManager interface to include the load method and drop unnecessary indexer. This drops support for GreenZone version 0 files, but that was 5 years ago and not really properly done anyway.
1 parent 8f01fb7 commit 8cabe42

File tree

6 files changed

+27
-83
lines changed

6 files changed

+27
-83
lines changed

src/BizHawk.Client.Common/movie/tasproj/IStateManager.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@ namespace BizHawk.Client.Common
66
{
77
public interface IStateManager : IDisposable
88
{
9-
/// <summary>
10-
/// Retrieves the savestate for the given frame,
11-
/// If this frame does not have a state currently, will return an empty array.false
12-
/// Try not to use this as it is not fast.
13-
/// </summary>
14-
/// <returns>A savestate for the given frame or an empty array if there isn't one</returns>
15-
byte[] this[int frame] { get; }
16-
179
ZwinderStateManagerSettings Settings { get; }
1810

1911
/// <summary>
@@ -60,6 +52,11 @@ public interface IStateManager : IDisposable
6052
/// </summary>
6153
void SaveStateHistory(BinaryWriter bw);
6254

55+
/// <summary>
56+
/// Deserializes the state of the instance that was persisted to disk
57+
/// </summary>
58+
void LoadStateHistory(BinaryReader br);
59+
6360
/// <summary>
6461
/// Enables the instance to be used. An instance of <see cref="IStateManager"/> should not
6562
/// be useable until this method is called

src/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ private void LoadTasprojExtras(ZipStateLoader bl)
154154
{
155155
try
156156
{
157-
TasStateManager = ZwinderStateManager.Create(br, settings, IsReserved);
157+
TasStateManager = new ZwinderStateManager(settings, IsReserved);
158+
TasStateManager.LoadStateHistory(br);
158159
}
159160
catch
160161
{

src/BizHawk.Client.Common/movie/tasproj/ZwinderStateManager.cs

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,6 @@ private ZwinderStateManager(ZwinderBuffer current, ZwinderBuffer recent, Zwinder
6363
RebuildReserved();
6464
}
6565

66-
public byte[] this[int frame]
67-
{
68-
get
69-
{
70-
var (f, dataStream) = GetStateClosestToFrame(frame);
71-
if (f != frame)
72-
{
73-
dataStream.Dispose();
74-
return NonState;
75-
}
76-
77-
var data = dataStream.ReadAllBytes();
78-
dataStream.Dispose();
79-
return data;
80-
}
81-
}
82-
8366
public ZwinderStateManagerSettings Settings { get; private set; }
8467

8568
public void UpdateSettings(ZwinderStateManagerSettings settings, bool keepOldStates = false)
@@ -523,32 +506,25 @@ public bool InvalidateAfter(int frame)
523506
return b1 || b2 || b3;
524507
}
525508

526-
public static ZwinderStateManager Create(BinaryReader br, ZwinderStateManagerSettings settings, Func<int, bool> reserveCallback)
509+
public void LoadStateHistory(BinaryReader br)
527510
{
528-
// Initial format had no version number, but I think it's a safe bet no valid file has buffer size 2^56 or more so this should work.
529511
int version = br.ReadByte();
512+
if (version == 0) throw new Exception("Unsupported GreenZone version.");
530513

531-
var current = ZwinderBuffer.Create(br, settings.Current(), version == 0);
532-
var recent = ZwinderBuffer.Create(br, settings.Recent());
533-
var gaps = ZwinderBuffer.Create(br, settings.GapFiller());
534-
535-
if (version == 0)
536-
settings.AncientStateInterval = br.ReadInt32();
537-
538-
var ret = new ZwinderStateManager(current, recent, gaps, reserveCallback, settings);
514+
_current.Load(br);
515+
_recent.Load(br);
516+
_gapFiller.Load(br);
539517

540518
var ancientCount = br.ReadInt32();
541519
for (var i = 0; i < ancientCount; i++)
542520
{
543521
var key = br.ReadInt32();
544522
var length = br.ReadInt32();
545523
var data = br.ReadBytes(length);
546-
ret._reserved.Add(key, data);
524+
_reserved.Add(key, data);
547525
}
548526

549-
ret.RebuildStateCache();
550-
551-
return ret;
527+
RebuildStateCache();
552528
}
553529

554530
public void SaveStateHistory(BinaryWriter bw)

src/BizHawk.Client.Common/rewind/ZwinderBuffer.cs

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Collections.Generic;
22
using System.IO;
33
using System.Linq;
4-
using System.Runtime.InteropServices;
54

65
using BizHawk.Common;
76

@@ -343,8 +342,12 @@ private void SaveStateBodyBinary(BinaryWriter writer)
343342
}
344343
}
345344

346-
private void LoadStateBodyBinary(BinaryReader reader)
345+
public void Load(BinaryReader reader)
347346
{
347+
int version = reader.ReadByte();
348+
if (version != 1)
349+
throw new InvalidOperationException("Bad format");
350+
348351
_firstStateIndex = 0;
349352
_nextStateIndex = reader.ReadInt32();
350353
long nextByte = 0;
@@ -359,43 +362,6 @@ private void LoadStateBodyBinary(BinaryReader reader)
359362
MemoryBlockUtils.CopySome(reader.BaseStream, _backingStore, nextByte);
360363
}
361364

362-
public static ZwinderBuffer Create(BinaryReader reader, RewindConfig rewindConfig, bool hackyV0 = false)
363-
{
364-
ZwinderBuffer ret;
365-
366-
// Initial format had no version number, but I think it's a safe bet no valid file has buffer size 2^56 or more so this should work.
367-
int version = hackyV0 ? 0 : reader.ReadByte();
368-
if (version == 0)
369-
{
370-
byte[] sizeArr = new byte[8];
371-
reader.Read(sizeArr, 1, 7);
372-
var size = MemoryMarshal.Read<long>(sizeArr);
373-
var sizeMask = reader.ReadInt64();
374-
var targetFrameLength = reader.ReadInt32();
375-
var useCompression = reader.ReadBoolean();
376-
ret = new ZwinderBuffer(new RewindConfig
377-
{
378-
BufferSize = (int)(size >> 20),
379-
UseFixedRewindInterval = false,
380-
TargetFrameLength = targetFrameLength,
381-
TargetRewindInterval = 5,
382-
AllowOutOfOrderStates = false,
383-
UseCompression = useCompression,
384-
});
385-
if (ret.Size != size || ret._sizeMask != sizeMask)
386-
{
387-
throw new InvalidOperationException("Bad format");
388-
}
389-
}
390-
else if (version == 1)
391-
ret = new ZwinderBuffer(rewindConfig);
392-
else
393-
throw new InvalidOperationException("Bad format");
394-
395-
ret.LoadStateBodyBinary(reader);
396-
return ret;
397-
}
398-
399365
private sealed class SaveStateStream : Stream, ISpanStream
400366
{
401367
/// <summary>

src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,9 +661,11 @@ private void StateHistoryIntegrityCheckMenuItem_Click(object sender, EventArgs e
661661
{
662662
MainForm.FrameAdvance();
663663

664-
byte[] greenZone = CurrentTasMovie.TasStateManager[Emulator.Frame];
665-
if (greenZone.Length > 0)
664+
if (CurrentTasMovie.TasStateManager.HasState(Emulator.Frame))
666665
{
666+
Stream greenStream = CurrentTasMovie.TasStateManager.GetStateClosestToFrame(Emulator.Frame).Value;
667+
byte[] greenZone = new byte[greenStream.Length];
668+
greenStream.Read(greenZone);
667669
byte[] state = StatableEmulator.CloneSavestate();
668670

669671
if (!state.SequenceEqual(greenZone))

src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ public void SaveCreateRoundTrip()
7171
var buff = ms.ToArray();
7272
var rms = new MemoryStream(buff, false);
7373

74-
var zw2 = ZwinderStateManager.Create(new BinaryReader(rms), zw.Settings, f => false);
74+
var zw2 = new ZwinderStateManager(zw.Settings, f => false);
75+
zw2.LoadStateHistory(new BinaryReader(rms));
7576

7677
// TODO: we could assert more things here to be thorough
7778
Assert.IsNotNull(zw2);
@@ -131,7 +132,8 @@ public void SaveCreateBufferRoundTrip()
131132
var ms = new MemoryStream();
132133
buff.SaveStateBinary(new BinaryWriter(ms));
133134
ms.Position = 0;
134-
var buff2 = ZwinderBuffer.Create(new BinaryReader(ms), config);
135+
var buff2 = new ZwinderBuffer(config);
136+
buff2.Load(new BinaryReader(ms));
135137

136138
Assert.AreEqual(buff.Size, buff2.Size);
137139
Assert.AreEqual(buff.Used, buff2.Used);

0 commit comments

Comments
 (0)