using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace RomCheater.Serialization { public abstract class SerializationReader : ISerializationResultCount, IDisposable { private const string DEFAULT_FOLDER = "tmp"; private const string DEFAULT_FILENAME = "SerializedMemoryResults.tmp"; private static string DEFAULT_PATH = string.Format(@"{0}\{1}", DEFAULT_FOLDER, DEFAULT_FILENAME); public SerializationReader() : this(DEFAULT_PATH) { } protected SerializationReader(string filename) { FileName = filename; CreateReader(); } #region ISerializationResultCount members public int ResultCount { get; protected set; } #endregion private FileStream fileStream; protected BinaryReader binReader; protected string FileName { get; private set; } private void CreateReader() { fileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read); binReader = new BinaryReader(fileStream); } #region IDisposable Support // Track whether Dispose has been called. private bool disposed = false; // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { Dispose(true); // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if (!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (disposing) { // Dispose managed resources. //component.Dispose(); } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. // clean up any resources binReader.Close(); binReader = null; fileStream = null; // Note disposing has been done. disposed = true; } } // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~SerializationReader() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } #endregion } }