BizHawk/EMU7800/Core/SerializationContext.cs

233 lines
5.7 KiB
C#

using System;
using System.IO;
namespace EMU7800.Core
{
/// <summary>
/// A context for serializing <see cref="MachineBase"/> objects.
/// </summary>
public class SerializationContext
{
#region Fields
readonly BinaryWriter _binaryWriter;
#endregion
public void Write(byte value)
{
_binaryWriter.Write(value);
}
public void Write(ushort value)
{
_binaryWriter.Write(value);
}
public void Write(int value)
{
_binaryWriter.Write(value);
}
public void Write(uint value)
{
_binaryWriter.Write(value);
}
public void Write(long value)
{
_binaryWriter.Write(value);
}
public void Write(ulong value)
{
_binaryWriter.Write(value);
}
public void Write(bool value)
{
_binaryWriter.Write(value);
}
public void Write(double value)
{
_binaryWriter.Write(value);
}
/*
public void Write(BufferElement bufferElement)
{
for (var i = 0; i < BufferElement.SIZE; i++)
Write(bufferElement[i]);
}
*/
public void Write(byte[] bytes)
{
_binaryWriter.Write(bytes.Length);
if (bytes.Length > 0)
_binaryWriter.Write(bytes);
}
public void Write(ushort[] ushorts)
{
var bytes = new byte[ushorts.Length << 1];
Buffer.BlockCopy(ushorts, 0, bytes, 0, bytes.Length);
Write(bytes);
}
public void Write(int[] ints)
{
var bytes = new byte[ints.Length << 2];
Buffer.BlockCopy(ints, 0, bytes, 0, bytes.Length);
Write(bytes);
}
public void Write(uint[] uints)
{
var bytes = new byte[uints.Length << 2];
Buffer.BlockCopy(uints, 0, bytes, 0, bytes.Length);
Write(bytes);
}
public void Write(bool[] booleans)
{
var bytes = new byte[booleans.Length];
for (var i = 0; i < bytes.Length; i++)
{
bytes[i] = (byte)(booleans[i] ? 0xff : 0x00);
}
Write(bytes);
}
public void Write(MachineBase m)
{
WriteTypeName(m);
m.GetObjectData(this);
}
public void Write(AddressSpace mem)
{
mem.GetObjectData(this);
}
public void Write(M6502 cpu)
{
cpu.GetObjectData(this);
}
public void Write(PIA pia)
{
pia.GetObjectData(this);
}
public void Write(TIA tia)
{
tia.GetObjectData(this);
}
public void Write(TIASound tiaSound)
{
tiaSound.GetObjectData(this);
}
public void Write(Maria maria)
{
maria.GetObjectData(this);
}
public void Write(Cart cart)
{
WriteTypeName(cart);
cart.GetObjectData(this);
}
public void Write(RAM6116 ram6116)
{
ram6116.GetObjectData(this);
}
public void Write(InputState inputState)
{
inputState.GetObjectData(this);
}
public void WriteVersion(int version)
{
Write(0x78000087);
Write(version);
}
public void WriteOptional(byte[] bytes)
{
var hasBytes = (bytes != null);
_binaryWriter.Write(hasBytes);
if (!hasBytes)
return;
_binaryWriter.Write(bytes.Length);
if (bytes.Length > 0)
_binaryWriter.Write(bytes);
}
public void WriteOptional(HSC7800 hsc7800)
{
var exist = (hsc7800 != null);
Write(exist);
if (!exist)
return;
hsc7800.GetObjectData(this);
}
public void WriteOptional(Bios7800 bios7800)
{
var exist = (bios7800 != null);
Write(exist);
if (!exist)
return;
bios7800.GetObjectData(this);
}
public void WriteOptional(PokeySound pokeySound)
{
var exist = (pokeySound != null);
Write(exist);
if (!exist)
return;
pokeySound.GetObjectData(this);
}
#region Constructors
private SerializationContext()
{
}
/// <summary>
/// Instantiates a new instance of <see cref="SerializationContext"/>.
/// </summary>
/// <param name="binaryWriter"/>
internal SerializationContext(BinaryWriter binaryWriter)
{
if (binaryWriter == null)
throw new ArgumentNullException("binaryWriter");
_binaryWriter = binaryWriter;
}
#endregion
#region Helpers
void WriteTypeName(object o)
{
if (o == null)
throw new Emu7800SerializationException("Type unexpectedly null.");
var typeName = o.GetType().FullName;
if (string.IsNullOrWhiteSpace(typeName))
throw new Emu7800SerializationException("Unable to discover type name.");
_binaryWriter.Write(typeName);
}
#endregion
}
}