using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; namespace RomCheater.Serialization { public interface ISearchResultWriter { void WriteResult(uint address, TValue value) where TValue : IConvertible; } public class SearchResultWriter : SerializationWriter, ISearchResultWriter { private int ResultsWritten = 0; //public SearchResultWriter() : base() { } public SearchResultWriter(int resultCount, Guid guid) : base(resultCount, guid) { WriteHeader(guid); } //public SearchResultWriter(string filename, Guid guid) : base(CreateFileName(filename,guid), guid) { WriteHeader(guid); } //public SearchResultWriter(string filename, int resultCount, Guid guid) : base(filename, resultCount, guid, false) { WriteHeader(guid); } //public SearchResultWriter(string filename, int resultCount, Guid guid, bool delete) : base(filename, resultCount, guid, delete) { WriteHeader(guid); } #region ISearchResultWriter members public void WriteResult(uint address, TValue value) where TValue : IConvertible { try { Type t = typeof(TValue); binWriter.Write(address); switch (t.Name.ToLower()) { case "byte": binWriter.Write(Convert.ToByte(value)); break; case "sbyte": binWriter.Write(Convert.ToSByte(value)); break; case "uint16": binWriter.Write(Convert.ToUInt16(value)); break; case "int16": binWriter.Write(Convert.ToInt16(value)); break; case "uint32": binWriter.Write(Convert.ToUInt32(value)); break; case "int32": binWriter.Write(Convert.ToInt32(value)); break; case "uint64": binWriter.Write(Convert.ToUInt64(value)); break; case "int64": binWriter.Write(Convert.ToInt64(value)); break; } ResultsWritten++; } catch (Exception ex) { throw ex; } } #endregion private void WriteHeader(Guid guid) { try { // write magic: SRD binWriter.Write(Encoding.UTF8.GetBytes("SRD")); if (guid == Guid.Empty) { binWriter.Write((int)1); } else { binWriter.Write((int)2); // related guid - length binWriter.Write(guid.ToByteArray().Length); // related guid - data binWriter.Write(guid.ToByteArray()); } // write count (int) binWriter.Write(ResultCount); } catch (Exception ex) { throw ex; } } protected override void Dispose(bool disposing) { try { base.Dispose(disposing); // ensure ResultCount and ResultsWritten are equal if (ResultCount != ResultsWritten) { string message = string.Format("ResultCount does not match ResultsWritten: 0x{0:x8} != 0x{1:x8} -- offset: 0x{2:x8}", ResultCount, ResultsWritten, ResultCount - ResultsWritten); Logging.logger.Error.WriteLine(message); throw new InvalidOperationException(message); } } catch (Exception ex) { throw ex; } } } }