using System; using SabreTools.Helper.Data; namespace SabreTools.Helper.Dats { public class Filter { #region Private instance variables private string _gameName; private string _notGameName; private string _romName; private string _notRomName; private string _romType; private string _notRomType; private long _sizeGreaterThanOrEqual; private long _sizeLessThanOrEqual; private long _sizeEqualTo; private string _crc; private string _notCrc; private string _md5; private string _notMd5; private string _sha1; private string _notSha1; private ItemStatus _itemStatus; private ItemStatus _itemNotStatus; private MachineType _machineType; private MachineType _machineNotType; #endregion /// /// Create an empty Filter object /// public Filter() { _gameName = null; _notGameName = null; _romName = null; _notRomName = null; _romType = null; _notRomType = null; _sizeGreaterThanOrEqual = -1; _sizeLessThanOrEqual = -1; _sizeEqualTo = -1; _crc = null; _notCrc = null; _md5 = null; _notMd5 = null; _sha1 = null; _notSha1 = null; _itemStatus = ItemStatus.NULL; _itemNotStatus = ItemStatus.NULL; } /// /// Create a populated Filter object /// /// Name of the game to match (can use asterisk-partials) /// Name of the rom to match (can use asterisk-partials) /// Type of the rom to match /// Find roms greater than or equal to this size /// Find roms less than or equal to this size /// Find roms equal to this size /// CRC of the rom to match (can use asterisk-partials) /// MD5 of the rom to match (can use asterisk-partials) /// SHA-1 of the rom to match (can use asterisk-partials) /// Select roms with the given status /// Select games with the given type /// Name of the game to match (can use asterisk-partials) /// Name of the rom to match (can use asterisk-partials) /// Type of the rom to match /// CRC of the rom to match (can use asterisk-partials) /// MD5 of the rom to match (can use asterisk-partials) /// SHA-1 of the rom to match (can use asterisk-partials) /// Select roms without the given status /// Select games without the given type public Filter(string gamename, string romname, string romtype, long sgt, long slt, long seq, string crc, string md5, string sha1, ItemStatus itemStatus, MachineType machineType, string notgamename, string notromname, string notromtype, string notcrc, string notmd5, string notsha1, ItemStatus itemNotStatus, MachineType machineNotType) { _gameName = gamename; _notGameName = notgamename; _romName = romname; _notRomName = notromname; _romType = romtype; _notRomType = notromtype; _sizeGreaterThanOrEqual = sgt; _sizeLessThanOrEqual = slt; _sizeEqualTo = seq; _crc = crc; _notCrc = notcrc; _md5 = md5; _notMd5 = notmd5; _sha1 = sha1; _notSha1 = notsha1; _itemStatus = itemStatus; _itemNotStatus = itemNotStatus; _machineType = machineType; _machineNotType = machineNotType; } /// /// Check to see if a DatItem passes the filter /// /// DatItem to check /// Logger object for file and console output /// True if the file passed the filter, false otherwise public bool ItemPasses(DatItem item, Logger logger) { // Take care of Rom and Disk specific differences if (item.Type == ItemType.Rom) { Rom rom = (Rom)item; // Filter on status if (_itemStatus != ItemStatus.NULL && rom.ItemStatus != _itemStatus) { return false; } if (_itemNotStatus != ItemStatus.NULL && rom.ItemStatus == _itemNotStatus) { return false; } // Filter on machine type if (_machineType != MachineType.NULL && rom.Machine.MachineType != _machineType) { return false; } if (_machineNotType != MachineType.NULL && rom.Machine.MachineType == _machineNotType) { return false; } // Filter on rom size if (_sizeEqualTo != -1 && rom.Size != _sizeEqualTo) { return false; } else { if (_sizeGreaterThanOrEqual != -1 && rom.Size < _sizeGreaterThanOrEqual) { return false; } if (_sizeLessThanOrEqual != -1 && rom.Size > _sizeLessThanOrEqual) { return false; } } // Filter on CRC if (!String.IsNullOrEmpty(_crc)) { if (_crc.StartsWith("*") && _crc.EndsWith("*")) { if (!rom.CRC.ToLowerInvariant().Contains(_crc.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_crc.StartsWith("*")) { if (!rom.CRC.EndsWith(_crc.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_crc.EndsWith("*")) { if (!rom.CRC.StartsWith(_crc.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(rom.CRC, _crc, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notCrc)) { if (_notCrc.StartsWith("*") && _notCrc.EndsWith("*")) { if (rom.CRC.ToLowerInvariant().Contains(_notCrc.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notCrc.StartsWith("*")) { if (rom.CRC.EndsWith(_notCrc.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notCrc.EndsWith("*")) { if (rom.CRC.StartsWith(_notCrc.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(rom.CRC, _notCrc, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } // Filter on MD5 if (!String.IsNullOrEmpty(_md5)) { if (_md5.StartsWith("*") && _md5.EndsWith("*")) { if (!rom.MD5.ToLowerInvariant().Contains(_md5.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_md5.StartsWith("*")) { if (!rom.MD5.EndsWith(_md5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_md5.EndsWith("*")) { if (!rom.MD5.StartsWith(_md5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(rom.MD5, _md5, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notMd5)) { if (_notMd5.StartsWith("*") && _notMd5.EndsWith("*")) { if (rom.MD5.ToLowerInvariant().Contains(_notMd5.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notMd5.StartsWith("*")) { if (rom.MD5.EndsWith(_notMd5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notMd5.EndsWith("*")) { if (rom.MD5.StartsWith(_notMd5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(rom.MD5, _notMd5, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } // Filter on SHA1 if (!String.IsNullOrEmpty(_sha1)) { if (_sha1.StartsWith("*") && _sha1.EndsWith("*")) { if (!rom.SHA1.ToLowerInvariant().Contains(_sha1.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_sha1.StartsWith("*")) { if (!rom.SHA1.EndsWith(_sha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_sha1.EndsWith("*")) { if (!rom.SHA1.StartsWith(_sha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(rom.SHA1, _sha1, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notSha1)) { if (_notSha1.StartsWith("*") && _notSha1.EndsWith("*")) { if (rom.SHA1.ToLowerInvariant().Contains(_notSha1.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notSha1.StartsWith("*")) { if (rom.SHA1.EndsWith(_notSha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notSha1.EndsWith("*")) { if (rom.SHA1.StartsWith(_notSha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(rom.SHA1, _notSha1, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } } else if (item.Type == ItemType.Disk) { Disk rom = (Disk)item; // Filter on status if (_itemStatus != ItemStatus.NULL && rom.ItemStatus != _itemStatus) { return false; } if (_itemNotStatus != ItemStatus.NULL && rom.ItemStatus == _itemNotStatus) { return false; } // Filter on MD5 if (!String.IsNullOrEmpty(_md5)) { if (_md5.StartsWith("*") && _md5.EndsWith("*")) { if (!rom.MD5.ToLowerInvariant().Contains(_md5.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_md5.StartsWith("*")) { if (!rom.MD5.EndsWith(_md5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_md5.EndsWith("*")) { if (!rom.MD5.StartsWith(_md5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(rom.MD5, _md5, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notMd5)) { if (_notMd5.StartsWith("*") && _notMd5.EndsWith("*")) { if (rom.MD5.ToLowerInvariant().Contains(_notMd5.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notMd5.StartsWith("*")) { if (rom.MD5.EndsWith(_notMd5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notMd5.EndsWith("*")) { if (rom.MD5.StartsWith(_notMd5.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(rom.MD5, _notMd5, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } // Filter on SHA1 if (!String.IsNullOrEmpty(_sha1)) { if (_sha1.StartsWith("*") && _sha1.EndsWith("*")) { if (!rom.SHA1.ToLowerInvariant().Contains(_sha1.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_sha1.StartsWith("*")) { if (!rom.SHA1.EndsWith(_sha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_sha1.EndsWith("*")) { if (!rom.SHA1.StartsWith(_sha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(rom.SHA1, _sha1, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notSha1)) { if (_notSha1.StartsWith("*") && _notSha1.EndsWith("*")) { if (rom.SHA1.ToLowerInvariant().Contains(_notSha1.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notSha1.StartsWith("*")) { if (rom.SHA1.EndsWith(_notSha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notSha1.EndsWith("*")) { if (rom.SHA1.StartsWith(_notSha1.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(rom.SHA1, _notSha1, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } } // Filter on game name if (!String.IsNullOrEmpty(_gameName)) { if (_gameName.StartsWith("*") && _gameName.EndsWith("*")) { if (!item.Machine.Name.ToLowerInvariant().Contains(_gameName.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_gameName.StartsWith("*")) { if (!item.Machine.Name.EndsWith(_gameName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_gameName.EndsWith("*")) { if (!item.Machine.Name.StartsWith(_gameName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(item.Machine.Name, _gameName, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notGameName)) { if (_notGameName.StartsWith("*") && _notGameName.EndsWith("*")) { if (item.Machine.Name.ToLowerInvariant().Contains(_notGameName.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notGameName.StartsWith("*")) { if (item.Machine.Name.EndsWith(_notGameName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notGameName.EndsWith("*")) { if (item.Machine.Name.StartsWith(_notGameName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(item.Machine.Name, _notGameName, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } // Filter on rom name if (!String.IsNullOrEmpty(_romName)) { if (_romName.StartsWith("*") && _romName.EndsWith("*")) { if (!item.Name.ToLowerInvariant().Contains(_romName.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_romName.StartsWith("*")) { if (!item.Name.EndsWith(_romName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_romName.EndsWith("*")) { if (!item.Name.StartsWith(_romName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (!String.Equals(item.Name, _romName, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } if (!String.IsNullOrEmpty(_notRomName)) { if (_notRomName.StartsWith("*") && _notRomName.EndsWith("*")) { if (item.Name.ToLowerInvariant().Contains(_notRomName.ToLowerInvariant().Replace("*", ""))) { return false; } } else if (_notRomName.StartsWith("*")) { if (item.Name.EndsWith(_notRomName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else if (_notRomName.EndsWith("*")) { if (item.Name.StartsWith(_notRomName.Replace("*", ""), StringComparison.InvariantCultureIgnoreCase)) { return false; } } else { if (String.Equals(item.Name, _notRomName, StringComparison.InvariantCultureIgnoreCase)) { return false; } } } // Filter on rom type if (String.IsNullOrEmpty(_romType) && String.IsNullOrEmpty(_notRomType) && item.Type != ItemType.Rom && item.Type != ItemType.Disk) { return false; } if (!String.IsNullOrEmpty(_romType) && !String.Equals(item.Type.ToString(), _romType, StringComparison.InvariantCultureIgnoreCase)) { return false; } if (!String.IsNullOrEmpty(_notRomType) && String.Equals(item.Type.ToString(), _notRomType, StringComparison.InvariantCultureIgnoreCase)) { return false; } return true; } } }