2016-10-26 21:02:01 -07:00
using System ;
2017-01-11 17:27:25 -08:00
using System.Collections.Generic ;
2020-08-20 14:36:36 -07:00
2019-01-08 17:40:28 -08:00
using SabreTools.Library.Data ;
2020-07-30 22:51:33 -07:00
using SabreTools.Library.DatFiles ;
2019-01-08 17:40:28 -08:00
using SabreTools.Library.DatItems ;
2020-07-15 09:41:59 -07:00
using SabreTools.Library.Tools ;
2016-10-26 21:02:01 -07:00
2020-07-30 22:51:33 -07:00
namespace SabreTools.Library.Filtering
2016-10-26 21:02:01 -07:00
{
2019-01-08 17:40:28 -08:00
/// <summary>
/// Represents the filtering operations that need to be performed on a set of items, usually a DAT
/// </summary>
2020-07-18 21:35:17 -07:00
/// TODO: Can clever use of Filtering allow for easier external splitting methods?
2019-01-11 13:44:29 -08:00
public class Filter
2019-01-08 17:40:28 -08:00
{
2020-08-20 14:36:36 -07:00
#region Fields
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
#region Machine Filters
2020-08-20 14:36:36 -07:00
#region Common
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude machine names
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > MachineName { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
/// <summary>
2020-07-18 21:35:17 -07:00
/// Include or exclude machine comments
2020-07-15 09:41:59 -07:00
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Comment { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-15 09:41:59 -07:00
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude machine descriptions
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > MachineDescription { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
/// <summary>
2020-07-18 21:35:17 -07:00
/// Include or exclude machine years
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Year { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude machine manufacturers
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Manufacturer { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude machine publishers
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Publisher { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude machine categories
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Category { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude machine romof
2020-07-15 09:41:59 -07:00
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > RomOf { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude machine cloneof
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > CloneOf { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude machine sampleof
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > SampleOf { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
2020-08-20 14:36:36 -07:00
#endregion
#region AttractMode
2020-07-18 21:35:17 -07:00
/// <summary>
2020-08-20 14:36:36 -07:00
/// Include or exclude machine players
2020-07-18 21:35:17 -07:00
/// </summary>
2020-08-20 14:36:36 -07:00
public FilterItem < string > Players { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
2020-08-20 14:36:36 -07:00
/// Include or exclude machine rotation
2020-07-18 21:35:17 -07:00
/// </summary>
2020-08-20 14:36:36 -07:00
public FilterItem < string > Rotation { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-15 09:41:59 -07:00
/// <summary>
2020-08-20 14:36:36 -07:00
/// Include or exclude machine control
2020-07-15 09:41:59 -07:00
/// </summary>
2020-08-20 14:36:36 -07:00
public FilterItem < string > Control { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
2020-08-20 14:36:36 -07:00
/// Include or exclude machine support status
2020-07-18 21:35:17 -07:00
/// </summary>
2020-08-20 14:36:36 -07:00
public FilterItem < string > SupportStatus { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
2020-08-20 14:36:36 -07:00
/// Include or exclude machine display count
2020-07-18 21:35:17 -07:00
/// </summary>
2020-08-20 14:36:36 -07:00
public FilterItem < string > DisplayCount { get ; private set ; } = new FilterItem < string > ( ) ;
/// <summary>
/// Include or exclude machine display type
/// </summary>
public FilterItem < string > DisplayType { get ; private set ; } = new FilterItem < string > ( ) ;
/// <summary>
/// Include or exclude machine buttons
/// </summary>
public FilterItem < string > Buttons { get ; private set ; } = new FilterItem < string > ( ) ;
#endregion
#region ListXML
/// <summary>
/// Include or exclude machine source file
/// </summary>
public FilterItem < string > SourceFile { get ; private set ; } = new FilterItem < string > ( ) ;
/// <summary>
/// Include or exclude items with the "Runnable" tag
/// </summary>
public FilterItem < bool? > Runnable { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-07-18 21:35:17 -07:00
2020-07-26 23:39:33 -07:00
/// <summary>
/// Include or exclude machine devices
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Devices { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-26 23:39:33 -07:00
/// <summary>
/// Include or exclude machine slotoptions
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > SlotOptions { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-26 23:39:33 -07:00
2020-07-18 21:35:17 -07:00
// TODO: Machine.Infos - List<KeyValuePair<string, string>>
/// <summary>
/// Include or exclude machine types
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < MachineType > MachineTypes { get ; private set ; } = new FilterItem < MachineType > ( ) { Positive = MachineType . NULL , Negative = MachineType . NULL } ;
2020-07-15 09:41:59 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#region Logiqx
/// <summary>
/// Include or exclude machine board
/// </summary>
public FilterItem < string > Board { get ; private set ; } = new FilterItem < string > ( ) ;
/// <summary>
/// Include or exclude machine rebuildto
/// </summary>
public FilterItem < string > RebuildTo { get ; private set ; } = new FilterItem < string > ( ) ;
#endregion
#region SoftwareList
/// <summary>
/// Include or exclude items with the "Supported" tag
/// </summary>
public FilterItem < bool? > Supported { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
#endregion
#endregion // Machine Filters
2020-07-15 09:41:59 -07:00
#region DatItem Filters
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude item types
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > ItemTypes { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude item names
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > ItemName { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
// TODO: DatItem.Features - List<KeyValuePair<string, string>>
/// <summary>
/// Include or exclude part names
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > PartName { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-08 17:40:28 -08:00
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-18 21:35:17 -07:00
/// Include or exclude part interfaces
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > PartInterface { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude area names
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > AreaName { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude area sizes
/// </summary>
/// <remarks>Positive means "Greater than or equal", Negative means "Less than or equal", Neutral means "Equal"</remarks>
2020-08-17 23:09:35 -07:00
public FilterItem < long? > AreaSize { get ; private set ; } = new FilterItem < long? > ( ) { Positive = null , Negative = null , Neutral = null } ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude items with the "Default" tag
2019-01-11 13:43:59 -08:00
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < bool? > Default { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude descriptions
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Description { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
/// <summary>
/// Include or exclude item sizes
/// </summary>
/// <remarks>Positive means "Greater than or equal", Negative means "Less than or equal", Neutral means "Equal"</remarks>
2020-08-17 23:09:35 -07:00
public FilterItem < long > Size { get ; private set ; } = new FilterItem < long > ( ) { Positive = - 1 , Negative = - 1 , Neutral = - 1 } ;
2020-07-15 09:41:59 -07:00
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude CRC32 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > CRC { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-08 17:40:28 -08:00
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude MD5 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > MD5 { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
#if NET_FRAMEWORK
2020-06-05 22:26:44 -07:00
/// <summary>
/// Include or exclude RIPEMD160 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > RIPEMD160 { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-15 09:41:59 -07:00
#endif
2020-06-05 22:26:44 -07:00
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude SHA-1 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > SHA1 { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude SHA-256 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > SHA256 { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude SHA-384 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > SHA384 { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude SHA-512 hashes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > SHA512 { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude merge tags
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > MergeTag { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude regions
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Region { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude indexes
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Index { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude items with the "Writable" tag
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < bool? > Writable { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude items with the "Writable" tag
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < bool? > Optional { get ; private set ; } = new FilterItem < bool? > ( ) { Neutral = null } ;
2019-01-11 13:43:59 -08:00
/// <summary>
/// Include or exclude item statuses
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < ItemStatus > Status { get ; private set ; } = new FilterItem < ItemStatus > ( ) { Positive = ItemStatus . NULL , Negative = ItemStatus . NULL } ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude languages
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Language { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude dates
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Date { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude bioses
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Bios { get ; private set ; } = new FilterItem < string > ( ) ;
2020-07-18 21:35:17 -07:00
/// <summary>
/// Include or exclude offsets
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < string > Offset { get ; private set ; } = new FilterItem < string > ( ) ;
2019-01-11 13:43:59 -08:00
2020-07-28 17:00:19 -07:00
/// <summary>
/// Include or exclude offsets
/// </summary>
2020-08-17 23:09:35 -07:00
public FilterItem < bool? > Inverted { get ; private set ; } = new FilterItem < bool? > ( ) ;
2020-07-28 17:00:19 -07:00
2020-07-15 09:41:59 -07:00
#endregion
2020-07-18 21:35:17 -07:00
#region Manipulation Flags
2020-07-15 09:41:59 -07:00
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-15 09:41:59 -07:00
/// Clean all names to WoD standards
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public bool Clean { get ; set ; }
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-15 09:41:59 -07:00
/// Set Machine Description from Machine Name
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public bool DescriptionAsName { get ; set ; }
/// <summary>
/// Include romof and cloneof when filtering machine names
/// </summary>
public bool IncludeOfInGame { get ; set ; }
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-15 09:41:59 -07:00
/// Internally split a DatFile
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public SplitType InternalSplit { get ; set ; }
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-15 09:41:59 -07:00
/// Remove all unicode characters
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public bool RemoveUnicode { get ; set ; }
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-18 21:35:17 -07:00
/// Include root directory when determing trim sizes
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public string Root { get ; set ; }
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-18 21:35:17 -07:00
/// Change all machine names to "!"
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public bool Single { get ; set ; }
2019-01-11 13:43:59 -08:00
/// <summary>
2020-07-18 21:35:17 -07:00
/// Trim total machine and item name to not exceed NTFS limits
2019-01-11 13:43:59 -08:00
/// </summary>
2020-07-18 21:35:17 -07:00
public bool Trim { get ; set ; }
2019-01-08 17:40:28 -08:00
2020-07-15 09:41:59 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#endregion // Fields
2019-01-08 17:40:28 -08:00
#region Instance methods
2020-07-18 21:35:17 -07:00
#region Filter Population
/// <summary>
/// Populate the filters object using a set of key:value filters
/// </summary>
/// <param name="filters">List of key:value where ~key/!key is negated</param>
public void PopulateFromList ( List < string > filters )
{
foreach ( string filterPair in filters )
{
2020-07-22 10:05:35 -07:00
// If we don't even have a possible filter pair
if ( ! filterPair . Contains ( ":" ) )
{
Globals . Logger . Warning ( $"'{filterPair}` is not a valid filter string. Valid filter strings are of the form 'key:value'. Please refer to README.1ST or the help feature for more details." ) ;
continue ;
}
2020-07-18 21:35:17 -07:00
string filterPairTrimmed = filterPair . Trim ( '"' , ' ' , '\t' ) ;
bool negate = filterPairTrimmed . StartsWith ( "!" )
| | filterPairTrimmed . StartsWith ( "~" )
| | filterPairTrimmed . StartsWith ( "not-" ) ;
filterPairTrimmed = filterPairTrimmed . TrimStart ( '!' , '~' ) ;
filterPairTrimmed = filterPairTrimmed . StartsWith ( "not-" ) ? filterPairTrimmed . Substring ( 4 ) : filterPairTrimmed ;
string filterFieldString = filterPairTrimmed . Split ( ':' ) [ 0 ] . ToLowerInvariant ( ) . Trim ( '"' , ' ' , '\t' ) ;
string filterValue = filterPairTrimmed . Substring ( filterFieldString . Length + 1 ) . Trim ( '"' , ' ' , '\t' ) ;
Field filterField = filterFieldString . AsField ( ) ;
SetFilter ( filterField , filterValue , negate ) ;
}
}
/// <summary>
/// Set multiple filters from key
/// </summary>
/// <param name="key">Key for the filter to be set</param>
/// <param name="values">List of values for the filter</param>
/// <param name="negate">True if negative filter, false otherwise</param>
public void SetFilter ( Field key , List < string > values , bool negate )
{
foreach ( string value in values )
{
SetFilter ( key , value , negate ) ;
}
}
/// <summary>
/// Set a single filter from key
/// </summary>
/// <param name="key">Key for the filter to be set</param>
/// <param name="value">Value of the filter</param>
/// <param name="negate">True if negative filter, false otherwise</param>
public void SetFilter ( Field key , string value , bool negate )
{
switch ( key )
{
#region Machine Filters
2020-08-20 14:36:36 -07:00
#region Common
2020-07-18 21:35:17 -07:00
case Field . MachineName :
if ( negate )
MachineName . NegativeSet . Add ( value ) ;
else
MachineName . PositiveSet . Add ( value ) ;
break ;
case Field . Comment :
if ( negate )
Comment . NegativeSet . Add ( value ) ;
else
Comment . PositiveSet . Add ( value ) ;
break ;
case Field . Description :
if ( negate )
MachineDescription . NegativeSet . Add ( value ) ;
else
MachineDescription . PositiveSet . Add ( value ) ;
break ;
case Field . Year :
if ( negate )
Year . NegativeSet . Add ( value ) ;
else
Year . PositiveSet . Add ( value ) ;
break ;
case Field . Manufacturer :
if ( negate )
Manufacturer . NegativeSet . Add ( value ) ;
else
Manufacturer . PositiveSet . Add ( value ) ;
break ;
case Field . Publisher :
if ( negate )
Publisher . NegativeSet . Add ( value ) ;
else
Publisher . PositiveSet . Add ( value ) ;
break ;
case Field . Category :
if ( negate )
Category . NegativeSet . Add ( value ) ;
else
Category . PositiveSet . Add ( value ) ;
break ;
case Field . RomOf :
if ( negate )
RomOf . NegativeSet . Add ( value ) ;
else
RomOf . PositiveSet . Add ( value ) ;
break ;
case Field . CloneOf :
if ( negate )
CloneOf . NegativeSet . Add ( value ) ;
else
CloneOf . PositiveSet . Add ( value ) ;
break ;
case Field . SampleOf :
if ( negate )
SampleOf . NegativeSet . Add ( value ) ;
else
SampleOf . PositiveSet . Add ( value ) ;
break ;
2020-08-20 15:39:32 -07:00
case Field . MachineType :
if ( negate )
MachineTypes . Negative | = value . AsMachineType ( ) ;
else
MachineTypes . Positive | = value . AsMachineType ( ) ;
break ;
2020-08-20 14:36:36 -07:00
#endregion
#region AttractMode
case Field . Players :
if ( negate )
Players . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-20 14:36:36 -07:00
Players . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-20 14:36:36 -07:00
case Field . Rotation :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-20 14:36:36 -07:00
Rotation . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-20 14:36:36 -07:00
Rotation . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-20 14:36:36 -07:00
case Field . Control :
if ( negate )
Control . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-20 14:36:36 -07:00
Control . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-20 14:36:36 -07:00
case Field . SupportStatus :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-20 14:36:36 -07:00
SupportStatus . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-20 14:36:36 -07:00
SupportStatus . PositiveSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
break ;
2020-08-20 14:36:36 -07:00
case Field . DisplayCount :
2020-07-18 21:35:17 -07:00
if ( negate )
2020-08-20 14:36:36 -07:00
DisplayCount . NegativeSet . Add ( value ) ;
2020-07-18 21:35:17 -07:00
else
2020-08-20 14:36:36 -07:00
DisplayCount . PositiveSet . Add ( value ) ;
break ;
case Field . DisplayType :
if ( negate )
DisplayType . NegativeSet . Add ( value ) ;
else
DisplayType . PositiveSet . Add ( value ) ;
break ;
case Field . Buttons :
if ( negate )
Buttons . NegativeSet . Add ( value ) ;
else
Buttons . PositiveSet . Add ( value ) ;
break ;
#endregion
#region ListXML
case Field . SourceFile :
if ( negate )
SourceFile . NegativeSet . Add ( value ) ;
else
SourceFile . PositiveSet . Add ( value ) ;
break ;
case Field . Runnable :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
Runnable . Neutral = false ;
else
Runnable . Neutral = true ;
2020-07-18 21:35:17 -07:00
break ;
2020-07-26 23:39:33 -07:00
case Field . Devices :
if ( negate )
Devices . NegativeSet . Add ( value ) ;
else
Devices . PositiveSet . Add ( value ) ;
break ;
case Field . SlotOptions :
if ( negate )
SlotOptions . NegativeSet . Add ( value ) ;
else
SlotOptions . PositiveSet . Add ( value ) ;
break ;
2020-07-18 21:35:17 -07:00
#endregion
2020-08-20 14:36:36 -07:00
#region Logiqx
case Field . Board :
if ( negate )
Board . NegativeSet . Add ( value ) ;
else
Board . PositiveSet . Add ( value ) ;
break ;
case Field . RebuildTo :
if ( negate )
RebuildTo . NegativeSet . Add ( value ) ;
else
RebuildTo . PositiveSet . Add ( value ) ;
break ;
#endregion
#region SoftwareList
case Field . Supported :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
Supported . Neutral = false ;
else
Supported . Neutral = true ;
break ;
#endregion
#endregion // Machine Filters
2020-07-18 21:35:17 -07:00
#region DatItem Filters
case Field . ItemType :
if ( value . AsItemType ( ) = = null )
return ;
if ( negate )
ItemTypes . NegativeSet . Add ( value ) ;
else
ItemTypes . PositiveSet . Add ( value ) ;
break ;
case Field . Name :
if ( negate )
ItemName . NegativeSet . Add ( value ) ;
else
ItemName . PositiveSet . Add ( value ) ;
break ;
case Field . PartName :
if ( negate )
PartName . NegativeSet . Add ( value ) ;
else
PartName . PositiveSet . Add ( value ) ;
break ;
case Field . PartInterface :
if ( negate )
PartInterface . NegativeSet . Add ( value ) ;
else
PartInterface . PositiveSet . Add ( value ) ;
break ;
case Field . AreaName :
if ( negate )
AreaName . NegativeSet . Add ( value ) ;
else
AreaName . PositiveSet . Add ( value ) ;
break ;
case Field . AreaSize :
bool? asOperation = null ;
if ( value . StartsWith ( ">" ) )
asOperation = true ;
else if ( value . StartsWith ( "<" ) )
asOperation = false ;
else if ( value . StartsWith ( "=" ) )
asOperation = null ;
string areasizeString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( areasizeString , out long areasize ) )
return ;
// Equal
if ( asOperation = = null & & ! negate )
{
AreaSize . Neutral = areasize ;
}
// Not Equal
else if ( asOperation = = null & & negate )
{
AreaSize . Negative = areasize - 1 ;
AreaSize . Positive = areasize + 1 ;
}
// Greater Than or Equal
else if ( asOperation = = true & & ! negate )
{
AreaSize . Positive = areasize ;
}
// Strictly Less Than
else if ( asOperation = = true & & negate )
{
AreaSize . Negative = areasize - 1 ;
}
// Less Than or Equal
else if ( asOperation = = false & & ! negate )
{
AreaSize . Negative = areasize ;
}
// Strictly Greater Than
else if ( asOperation = = false & & negate )
{
AreaSize . Positive = areasize + 1 ;
}
break ;
case Field . Default :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
Default . Neutral = false ;
else
Default . Neutral = true ;
break ;
case Field . BiosDescription :
if ( negate )
Description . NegativeSet . Add ( value ) ;
else
Description . PositiveSet . Add ( value ) ;
break ;
case Field . Size :
bool? sOperation = null ;
if ( value . StartsWith ( ">" ) )
sOperation = true ;
else if ( value . StartsWith ( "<" ) )
sOperation = false ;
else if ( value . StartsWith ( "=" ) )
sOperation = null ;
string sizeString = value . TrimStart ( '>' , '<' , '=' ) ;
if ( ! Int64 . TryParse ( sizeString , out long size ) )
return ;
// Equal
if ( sOperation = = null & & ! negate )
{
Size . Neutral = size ;
}
// Not Equal
else if ( sOperation = = null & & negate )
{
Size . Negative = size - 1 ;
Size . Positive = size + 1 ;
}
// Greater Than or Equal
else if ( sOperation = = true & & ! negate )
{
Size . Positive = size ;
}
// Strictly Less Than
else if ( sOperation = = true & & negate )
{
Size . Negative = size - 1 ;
}
// Less Than or Equal
else if ( sOperation = = false & & ! negate )
{
Size . Negative = size ;
}
// Strictly Greater Than
else if ( sOperation = = false & & negate )
{
Size . Positive = size + 1 ;
}
break ;
case Field . CRC :
if ( negate )
CRC . NegativeSet . Add ( value ) ;
else
CRC . PositiveSet . Add ( value ) ;
break ;
case Field . MD5 :
if ( negate )
MD5 . NegativeSet . Add ( value ) ;
else
MD5 . PositiveSet . Add ( value ) ;
break ;
#if NET_FRAMEWORK
case Field . RIPEMD160 :
if ( negate )
RIPEMD160 . NegativeSet . Add ( value ) ;
else
RIPEMD160 . PositiveSet . Add ( value ) ;
break ;
#endif
case Field . SHA1 :
if ( negate )
SHA1 . NegativeSet . Add ( value ) ;
else
SHA1 . PositiveSet . Add ( value ) ;
break ;
case Field . SHA256 :
if ( negate )
SHA256 . NegativeSet . Add ( value ) ;
else
SHA256 . PositiveSet . Add ( value ) ;
break ;
case Field . SHA384 :
if ( negate )
SHA384 . NegativeSet . Add ( value ) ;
else
SHA384 . PositiveSet . Add ( value ) ;
break ;
case Field . SHA512 :
if ( negate )
SHA512 . NegativeSet . Add ( value ) ;
else
SHA512 . PositiveSet . Add ( value ) ;
break ;
case Field . Merge :
if ( negate )
MergeTag . NegativeSet . Add ( value ) ;
else
MergeTag . PositiveSet . Add ( value ) ;
break ;
case Field . Region :
if ( negate )
Region . NegativeSet . Add ( value ) ;
else
Region . PositiveSet . Add ( value ) ;
break ;
case Field . Index :
if ( negate )
Index . NegativeSet . Add ( value ) ;
else
Index . PositiveSet . Add ( value ) ;
break ;
case Field . Writable :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
Writable . Neutral = false ;
else
Writable . Neutral = true ;
break ;
case Field . Optional :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
Optional . Neutral = false ;
else
Optional . Neutral = true ;
break ;
case Field . Status :
if ( negate )
Status . Negative | = value . AsItemStatus ( ) ;
else
Status . Positive | = value . AsItemStatus ( ) ;
break ;
case Field . Language :
if ( negate )
Language . NegativeSet . Add ( value ) ;
else
Language . PositiveSet . Add ( value ) ;
break ;
case Field . Date :
if ( negate )
Date . NegativeSet . Add ( value ) ;
else
Date . PositiveSet . Add ( value ) ;
break ;
case Field . Bios :
if ( negate )
Bios . NegativeSet . Add ( value ) ;
else
Bios . PositiveSet . Add ( value ) ;
break ;
case Field . Offset :
if ( negate )
Offset . NegativeSet . Add ( value ) ;
else
Offset . PositiveSet . Add ( value ) ;
break ;
2020-07-28 17:00:19 -07:00
case Field . Inverted :
if ( negate | | value . Equals ( "false" , StringComparison . OrdinalIgnoreCase ) )
Inverted . Neutral = false ;
else
Inverted . Neutral = true ;
break ;
2020-07-18 21:35:17 -07:00
#endregion
}
}
#endregion
2020-07-15 09:41:59 -07:00
#endregion // Instance Methods
2019-01-08 17:40:28 -08:00
}
2016-10-26 21:02:01 -07:00
}