162 lines
4.6 KiB
C#
162 lines
4.6 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Reflection;
|
|
|
|
using BizHawk.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Computers.Commodore64
|
|
{
|
|
static class SaveState
|
|
{
|
|
static public void SyncObject(Serializer ser, object obj)
|
|
{
|
|
BindingFlags defaultFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
|
|
MemberInfo[] members = obj.GetType().GetMembers(defaultFlags);
|
|
|
|
Bit refBit;
|
|
Boolean refBool;
|
|
Byte refByte;
|
|
ByteBuffer refByteBuffer;
|
|
Int16 refInt16;
|
|
Int32 refInt32;
|
|
IntBuffer refIntBuffer;
|
|
Int32 refPointX;
|
|
Int32 refPointY;
|
|
SByte refSByte;
|
|
UInt16 refUInt16;
|
|
UInt32 refUInt32;
|
|
Int32 refRectHeight;
|
|
Int32 refRectWidth;
|
|
|
|
foreach (MemberInfo member in members)
|
|
{
|
|
object currentValue = null;
|
|
bool fail = false;
|
|
FieldInfo fieldInfo = null;
|
|
PropertyInfo propInfo = null;
|
|
Type valueType = null;
|
|
|
|
if (member.MemberType == MemberTypes.Field)
|
|
{
|
|
fieldInfo = member.ReflectedType.GetField(member.Name, defaultFlags);
|
|
valueType = fieldInfo.FieldType;
|
|
currentValue = fieldInfo.GetValue(obj);
|
|
}
|
|
else
|
|
{
|
|
fail = true;
|
|
}
|
|
|
|
if (!fail)
|
|
{
|
|
if (valueType.IsArray)
|
|
{
|
|
}
|
|
|
|
if (currentValue != null)
|
|
{
|
|
switch (valueType.Name)
|
|
{
|
|
case "Bit":
|
|
refBit = (Bit)currentValue;
|
|
ser.Sync(member.Name, ref refBit);
|
|
currentValue = refBit;
|
|
break;
|
|
case "Boolean":
|
|
refBool = (Boolean)currentValue;
|
|
ser.Sync(member.Name, ref refBool);
|
|
currentValue = refBool;
|
|
break;
|
|
case "Byte":
|
|
refByte = (Byte)currentValue;
|
|
ser.Sync(member.Name, ref refByte);
|
|
currentValue = refByte;
|
|
break;
|
|
case "Byte[]":
|
|
refByteBuffer = new ByteBuffer((byte[])currentValue);
|
|
ser.Sync(member.Name, ref refByteBuffer);
|
|
currentValue = refByteBuffer.Arr;
|
|
break;
|
|
case "ByteBuffer":
|
|
refByteBuffer = (ByteBuffer)currentValue;
|
|
ser.Sync(member.Name, ref refByteBuffer);
|
|
currentValue = refByteBuffer;
|
|
break;
|
|
case "Int16":
|
|
refInt16 = (Int16)currentValue;
|
|
ser.Sync(member.Name, ref refInt16);
|
|
currentValue = refInt16;
|
|
break;
|
|
case "Int32":
|
|
refInt32 = (Int32)currentValue;
|
|
ser.Sync(member.Name, ref refInt32);
|
|
currentValue = refInt32;
|
|
break;
|
|
case "Int32[]":
|
|
refIntBuffer = new IntBuffer((int[])currentValue);
|
|
ser.Sync(member.Name, ref refIntBuffer);
|
|
currentValue = refIntBuffer.Arr;
|
|
break;
|
|
case "IntBuffer":
|
|
refIntBuffer = (IntBuffer)currentValue;
|
|
ser.Sync(member.Name, ref refIntBuffer);
|
|
currentValue = refIntBuffer;
|
|
break;
|
|
case "Point":
|
|
refPointX = ((Point)currentValue).X;
|
|
refPointY = ((Point)currentValue).Y;
|
|
ser.Sync(member.Name + "_X", ref refPointX);
|
|
ser.Sync(member.Name + "_Y", ref refPointY);
|
|
currentValue = new Point(refPointX, refPointY);
|
|
break;
|
|
case "Rectangle":
|
|
refPointX = ((Rectangle)currentValue).X;
|
|
refPointY = ((Rectangle)currentValue).Y;
|
|
refRectWidth = ((Rectangle)currentValue).Width;
|
|
refRectHeight = ((Rectangle)currentValue).Height;
|
|
ser.Sync(member.Name + "_X", ref refPointX);
|
|
ser.Sync(member.Name + "_Y", ref refPointY);
|
|
ser.Sync(member.Name + "_Height", ref refRectHeight);
|
|
ser.Sync(member.Name + "_Width", ref refRectWidth);
|
|
currentValue = new Rectangle(refPointX, refPointY, refRectWidth, refRectHeight);
|
|
break;
|
|
case "SByte":
|
|
refSByte = (SByte)currentValue;
|
|
ser.Sync(member.Name, ref refSByte);
|
|
currentValue = refSByte;
|
|
break;
|
|
case "UInt16":
|
|
refUInt16 = (UInt16)currentValue;
|
|
ser.Sync(member.Name, ref refUInt16);
|
|
currentValue = refUInt16;
|
|
break;
|
|
case "UInt32":
|
|
refUInt32 = (UInt32)currentValue;
|
|
ser.Sync(member.Name, ref refUInt32);
|
|
currentValue = refUInt32;
|
|
break;
|
|
default:
|
|
fail = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (member.MemberType == MemberTypes.Property)
|
|
{
|
|
if (propInfo.CanWrite && !fail)
|
|
{
|
|
MethodInfo setMethod = propInfo.GetSetMethod();
|
|
setMethod.Invoke(obj, new object[] { currentValue });
|
|
}
|
|
}
|
|
|
|
if (member.MemberType == MemberTypes.Field)
|
|
{
|
|
fieldInfo.SetValue(obj, currentValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|