using System; using SabreTools.Library.Data; using SabreTools.Library.DatItems; namespace SabreTools.Library.DatFiles { /// /// Represents statistical data associated with a DAT /// public class DatStats { #region Private instance variables /// /// Object used to lock stats updates /// private object _lockObject = new object(); #endregion #region Publicly facing variables /// /// Statistics writing format /// public StatReportFormat ReportFormat { get; set; } = StatReportFormat.None; /// /// Overall item count /// public long Count { get; set; } = 0; /// /// Number of Archive items /// public long ArchiveCount { get; set; } = 0; /// /// Number of BiosSet items /// public long BiosSetCount { get; set; } = 0; /// /// Number of Disk items /// public long DiskCount { get; set; } = 0; /// /// Number of Release items /// public long ReleaseCount { get; set; } = 0; /// /// Number of Rom items /// public long RomCount { get; set; } = 0; /// /// Number of Sample items /// public long SampleCount { get; set; } = 0; /// /// Number of machines /// /// Special count only used by statistics output public long GameCount { get; set; } = 0; /// /// Total uncompressed size /// public long TotalSize { get; set; } = 0; /// /// Number of items with a CRC hash /// public long CRCCount { get; set; } = 0; /// /// Number of items with an MD5 hash /// public long MD5Count { get; set; } = 0; /// /// Number of items with a SHA-1 hash /// public long SHA1Count { get; set; } = 0; /// /// Number of items with a SHA-256 hash /// public long SHA256Count { get; set; } = 0; /// /// Number of items with a SHA-384 hash /// public long SHA384Count { get; set; } = 0; /// /// Number of items with a SHA-512 hash /// public long SHA512Count { get; set; } = 0; /// /// Number of items with the baddump status /// public long BaddumpCount { get; set; } = 0; /// /// Number of items with the good status /// public long GoodCount { get; set; } = 0; /// /// Number of items with the nodump status /// public long NodumpCount { get; set; } = 0; /// /// Number of items with the verified status /// public long VerifiedCount { get; set; } = 0; #endregion #region Instance Methods /// /// Add to the statistics given a DatItem /// /// Item to add info from public void AddItem(DatItem item) { // No matter what the item is, we increate the count lock (_lockObject) { this.Count += 1; // Now we do different things for each item type switch (item.ItemType) { case ItemType.Archive: this.ArchiveCount += 1; break; case ItemType.BiosSet: this.BiosSetCount += 1; break; case ItemType.Disk: this.DiskCount += 1; if (((Disk)item).ItemStatus != ItemStatus.Nodump) { this.MD5Count += (String.IsNullOrWhiteSpace(((Disk)item).MD5) ? 0 : 1); this.SHA1Count += (String.IsNullOrWhiteSpace(((Disk)item).SHA1) ? 0 : 1); this.SHA256Count += (String.IsNullOrWhiteSpace(((Disk)item).SHA256) ? 0 : 1); this.SHA384Count += (String.IsNullOrWhiteSpace(((Disk)item).SHA384) ? 0 : 1); this.SHA512Count += (String.IsNullOrWhiteSpace(((Disk)item).SHA512) ? 0 : 1); } this.BaddumpCount += (((Disk)item).ItemStatus == ItemStatus.BadDump ? 1 : 0); this.GoodCount += (((Disk)item).ItemStatus == ItemStatus.Good ? 1 : 0); this.NodumpCount += (((Disk)item).ItemStatus == ItemStatus.Nodump ? 1 : 0); this.VerifiedCount += (((Disk)item).ItemStatus == ItemStatus.Verified ? 1 : 0); break; case ItemType.Release: this.ReleaseCount += 1; break; case ItemType.Rom: this.RomCount += 1; if (((Rom)item).ItemStatus != ItemStatus.Nodump) { this.TotalSize += ((Rom)item).Size; this.CRCCount += (String.IsNullOrWhiteSpace(((Rom)item).CRC) ? 0 : 1); this.MD5Count += (String.IsNullOrWhiteSpace(((Rom)item).MD5) ? 0 : 1); this.SHA1Count += (String.IsNullOrWhiteSpace(((Rom)item).SHA1) ? 0 : 1); this.SHA256Count += (String.IsNullOrWhiteSpace(((Rom)item).SHA256) ? 0 : 1); this.SHA384Count += (String.IsNullOrWhiteSpace(((Rom)item).SHA384) ? 0 : 1); this.SHA512Count += (String.IsNullOrWhiteSpace(((Rom)item).SHA512) ? 0 : 1); } this.BaddumpCount += (((Rom)item).ItemStatus == ItemStatus.BadDump ? 1 : 0); this.GoodCount += (((Rom)item).ItemStatus == ItemStatus.Good ? 1 : 0); this.NodumpCount += (((Rom)item).ItemStatus == ItemStatus.Nodump ? 1 : 0); this.VerifiedCount += (((Rom)item).ItemStatus == ItemStatus.Verified ? 1 : 0); break; case ItemType.Sample: this.SampleCount += 1; break; } } } /// /// Add statistics from another DatStats object /// /// DatStats object to add from public void AddStats(DatStats stats) { this.Count += stats.Count; this.ArchiveCount += stats.ArchiveCount; this.BiosSetCount += stats.BiosSetCount; this.DiskCount += stats.DiskCount; this.ReleaseCount += stats.ReleaseCount; this.RomCount += stats.RomCount; this.SampleCount += stats.SampleCount; this.GameCount += stats.GameCount; this.TotalSize += stats.TotalSize; // Individual hash counts this.CRCCount += stats.CRCCount; this.MD5Count += stats.MD5Count; this.SHA1Count += stats.SHA1Count; this.SHA256Count += stats.SHA256Count; this.SHA384Count += stats.SHA384Count; this.SHA512Count += stats.SHA512Count; // Individual status counts this.BaddumpCount += stats.BaddumpCount; this.GoodCount += stats.GoodCount; this.NodumpCount += stats.NodumpCount; this.VerifiedCount += stats.VerifiedCount; } /// /// Remove from the statistics given a DatItem /// /// Item to remove info for public void RemoveItem(DatItem item) { // No matter what the item is, we increate the count lock (_lockObject) { this.Count -= 1; // Now we do different things for each item type switch (item.ItemType) { case ItemType.Archive: this.ArchiveCount -= 1; break; case ItemType.BiosSet: this.BiosSetCount -= 1; break; case ItemType.Disk: this.DiskCount -= 1; if (((Disk)item).ItemStatus != ItemStatus.Nodump) { this.MD5Count -= (String.IsNullOrWhiteSpace(((Disk)item).MD5) ? 0 : 1); this.SHA1Count -= (String.IsNullOrWhiteSpace(((Disk)item).SHA1) ? 0 : 1); this.SHA256Count -= (String.IsNullOrWhiteSpace(((Disk)item).SHA256) ? 0 : 1); this.SHA384Count -= (String.IsNullOrWhiteSpace(((Disk)item).SHA384) ? 0 : 1); this.SHA512Count -= (String.IsNullOrWhiteSpace(((Disk)item).SHA512) ? 0 : 1); } this.BaddumpCount -= (((Disk)item).ItemStatus == ItemStatus.BadDump ? 1 : 0); this.GoodCount -= (((Disk)item).ItemStatus == ItemStatus.Good ? 1 : 0); this.NodumpCount -= (((Disk)item).ItemStatus == ItemStatus.Nodump ? 1 : 0); this.VerifiedCount -= (((Disk)item).ItemStatus == ItemStatus.Verified ? 1 : 0); break; case ItemType.Release: this.ReleaseCount -= 1; break; case ItemType.Rom: this.RomCount -= 1; if (((Rom)item).ItemStatus != ItemStatus.Nodump) { this.TotalSize -= ((Rom)item).Size; this.CRCCount -= (String.IsNullOrWhiteSpace(((Rom)item).CRC) ? 0 : 1); this.MD5Count -= (String.IsNullOrWhiteSpace(((Rom)item).MD5) ? 0 : 1); this.SHA1Count -= (String.IsNullOrWhiteSpace(((Rom)item).SHA1) ? 0 : 1); this.SHA256Count -= (String.IsNullOrWhiteSpace(((Rom)item).SHA256) ? 0 : 1); this.SHA384Count -= (String.IsNullOrWhiteSpace(((Rom)item).SHA384) ? 0 : 1); this.SHA512Count -= (String.IsNullOrWhiteSpace(((Rom)item).SHA512) ? 0 : 1); } this.BaddumpCount -= (((Rom)item).ItemStatus == ItemStatus.BadDump ? 1 : 0); this.GoodCount -= (((Rom)item).ItemStatus == ItemStatus.Good ? 1 : 0); this.NodumpCount -= (((Rom)item).ItemStatus == ItemStatus.Nodump ? 1 : 0); this.VerifiedCount -= (((Rom)item).ItemStatus == ItemStatus.Verified ? 1 : 0); break; case ItemType.Sample: this.SampleCount -= 1; break; } } } /// /// Reset all statistics /// public void Reset() { this.Count = 0; this.ArchiveCount = 0; this.BiosSetCount = 0; this.DiskCount = 0; this.ReleaseCount = 0; this.RomCount = 0; this.SampleCount = 0; this.GameCount = 0; this.TotalSize = 0; this.CRCCount = 0; this.MD5Count = 0; this.SHA1Count = 0; this.SHA256Count = 0; this.SHA384Count = 0; this.SHA512Count = 0; this.BaddumpCount = 0; this.GoodCount = 0; this.NodumpCount = 0; this.VerifiedCount = 0; } #endregion // Instance Methods } }