--- trunk/RomCheater/Serialization/SearchResultReader.cs 2012/06/21 05:14:38 401 +++ trunk/RomCheater/Serialization/SearchResultReader.cs 2012/06/21 07:13:04 403 @@ -2,10 +2,124 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using RomCheater.Docking.MemorySearch; namespace RomCheater.Serialization { - public class SearchResultReader + public interface ISearchResultReader { + void CurrentAddress(out uint Address); + uint CurrentAddress(); + void CurrentResult<TValue>(out TValue Value); + TValue CurrentResult<TValue>(); + + bool ReadCurrentAddess { get; } + bool ReadCurrentValue { get; } + + } + public class SearchResultReader : SerializationReader, ISearchResultReader + { + public SearchResultReader() : base() { ReadHeader(); } + + private void ReadHeader() + { + try + { + // SRD (string) + string magic = Encoding.UTF8.GetString(binReader.ReadBytes(3)); + string SRD = "SRD"; + if (magic != SRD) + { + throw new InvalidOperationException(string.Format("Encountered unexpected magic: {0} expected: {1}", magic, SRD)); + } + // version (int) + int version = binReader.ReadInt32(); + if (version != 1) + { + throw new InvalidOperationException(string.Format("Encountered unexpected version: {0} expected: {1}", version, 1)); + } + // resultcount + int resultcount = binReader.ReadInt32(); + if (resultcount == 0) + { + throw new InvalidOperationException(string.Format("Result Count is zero")); + } + ResultCount = resultcount; + } + catch (System.IO.EndOfStreamException) { } + } + #region ISearchResultReader members + public bool ReadCurrentAddess { get; private set; } + public bool ReadCurrentValue { get; private set; } + public uint CurrentAddress() + { + uint Address = 0; + CurrentAddress(out Address); + return Address; + } + public void CurrentAddress(out uint Address) + { + Address = 0; + try + { + if (ReadCurrentAddess && !ReadCurrentValue) + { + throw new InvalidOperationException("Cannot read Current Address because the current Value has not been read. Please call CurrentResult<TValue>() first."); + } + Address = binReader.ReadUInt32(); + ReadCurrentAddess = true; + ReadCurrentValue = false; + } + catch (System.IO.EndOfStreamException) { } + } + public TValue CurrentResult<TValue>() + { + TValue Value = default(TValue); + CurrentResult<TValue>(out Value); + return Value; + } + public void CurrentResult<TValue>(out TValue Value) + { + Value = default(TValue); + if (!ReadCurrentAddess) + { + throw new InvalidOperationException("Cannot read Current Value because the current Address has not been read. Please call CurrentAddress() first."); + } + try + { + Type t = typeof(TValue); + switch (t.Name.ToLower()) + { + case "byte": + Value = (TValue)Convert.ChangeType(binReader.ReadByte(), typeof(TValue)); + break; + case "sbyte": + Value = (TValue)Convert.ChangeType(binReader.ReadSByte(), typeof(TValue)); + break; + case "uint16": + Value = (TValue)Convert.ChangeType(binReader.ReadUInt16(), typeof(TValue)); + break; + case "int16": + Value = (TValue)Convert.ChangeType(binReader.ReadInt16(), typeof(TValue)); + break; + case "uint32": + Value = (TValue)Convert.ChangeType(binReader.ReadUInt32(), typeof(TValue)); + break; + case "int32": + Value = (TValue)Convert.ChangeType(binReader.ReadInt32(), typeof(TValue)); + break; + case "uint64": + Value = (TValue)Convert.ChangeType(binReader.ReadUInt64(), typeof(TValue)); + break; + case "int64": + Value = (TValue)Convert.ChangeType(binReader.ReadInt64(), typeof(TValue)); + break; + } + ReadCurrentValue = true; + ReadCurrentAddess = false; + } + catch (System.IO.EndOfStreamException) { } + } + #endregion } } |