fix read+write mode binary loadstate exception bug?

This commit is contained in:
zeromus 2014-04-18 17:41:14 +00:00
parent 53d3abb4f6
commit 09daa3f939
2 changed files with 43 additions and 10 deletions

View File

@ -68,7 +68,8 @@ namespace BizHawk.Client.Common
if (Global.MovieSession.Movie.IsActive)
{
bl.GetLump(BinaryStateLump.Input, true, tr => succeed = Global.MovieSession.HandleMovieLoadState(tr));
bl.GetLump(BinaryStateLump.Input, true, tr => succeed = Global.MovieSession.HandleMovieLoadState_HackyStep1(tr));
bl.GetLump(BinaryStateLump.Input, true, tr => succeed = Global.MovieSession.HandleMovieLoadState_HackyStep2(tr));
if (!succeed)
{
return false;

View File

@ -199,7 +199,48 @@ namespace BizHawk.Client.Common
}
}
//TODO: maybe someone who understands more about what's going on here could rename these step1 and step2 into something more descriptive
public bool HandleMovieLoadState_HackyStep2(TextReader reader)
{
if (!Movie.IsActive)
{
return true;
}
if (ReadOnly)
{
}
else
{
string errorMsg;
//// fixme: this is evil (it causes crashes in binary states because InflaterInputStream can't have its position set, even to zero.
//((StreamReader)reader).BaseStream.Position = 0;
//((StreamReader)reader).DiscardBufferedData();
//edit: zero 18-apr-2014 - this was solved by HackyStep1 and HackyStep2, so that the zip stream can be re-acquired instead of needing its position reset
var result = Movie.ExtractInputLog(reader, out errorMsg);
if (!result)
{
Output(errorMsg);
return false;
}
}
return true;
}
public bool HandleMovieLoadState(TextReader reader)
{
if (!HandleMovieLoadState_HackyStep1(reader))
return false;
return HandleMovieLoadState_HackyStep2(reader);
}
public bool HandleMovieLoadState_HackyStep1(TextReader reader)
{
if (!Movie.IsActive)
{
@ -237,15 +278,6 @@ namespace BizHawk.Client.Common
Movie.SwitchToRecord();
}
// fixme: this is evil
((StreamReader)reader).BaseStream.Position = 0;
((StreamReader)reader).DiscardBufferedData();
var result = Movie.ExtractInputLog(reader, out errorMsg);
if (!result)
{
Output(errorMsg);
return false;
}
}
return true;