diff --git a/NibblePoker.Application.ListComPort/ErrorCodes.cs b/NibblePoker.Application.ListComPort/ErrorCodes.cs index cc95726..48f0808 100644 --- a/NibblePoker.Application.ListComPort/ErrorCodes.cs +++ b/NibblePoker.Application.ListComPort/ErrorCodes.cs @@ -1,20 +1,20 @@ -namespace NibblePoker.Application.ListComPort; +namespace NibblePoker.Application.ListComPort { + public static class ErrorCodes { + public const int NoError = 0; -public static class ErrorCodes { - public const int NoError = 0; - - /* Fatal errors (1-9) */ - // Not needed in C# - - /* Internal argument parser errors (10-19) */ - public const int ArgumentParsingFailure = 10; - // ArgumentDefinitionFailure = 11 => Cannot happen due to the way options are declared. (Caught in development) - // ArgumentInitFailure = 12 => Cannot happen with "NibblePoker.Library.Arguments". - - /* External argument errors (20-29) */ - public const int NoPaddingValue = 20; - - /* Application & System errors (30-39) */ - // NoFriendlyNames = 30 => Causes problems with broad-range exit code checks. - public const int NoComPorts = 31; -} \ No newline at end of file + /* Fatal errors (1-9) */ + // Not needed in C# + + /* Internal argument parser errors (10-19) */ + public const int ArgumentParsingFailure = 10; + // ArgumentDefinitionFailure = 11 => Cannot happen due to the way options are declared. (Caught in development) + // ArgumentInitFailure = 12 => Cannot happen with "NibblePoker.Library.Arguments". + + /* External argument errors (20-29) */ + public const int NoPaddingValue = 20; + + /* Application & System errors (30-39) */ + // NoFriendlyNames = 30 => Causes problems with broad-range exit code checks. + public const int NoComPorts = 31; + } +} diff --git a/NibblePoker.Application.ListComPort/NibblePoker.Application.ListComPort.csproj b/NibblePoker.Application.ListComPort/NibblePoker.Application.ListComPort.csproj index 5022d56..390145d 100644 --- a/NibblePoker.Application.ListComPort/NibblePoker.Application.ListComPort.csproj +++ b/NibblePoker.Application.ListComPort/NibblePoker.Application.ListComPort.csproj @@ -2,9 +2,11 @@ Exe - net6.0-windows;net7.0-windows;net8.0-windows + net40;net6.0-windows;net7.0-windows;net8.0-windows + disable - enable + disable + NibblePoker.Application.ListComPort NibblePoker.Application.ListComPort 4.0.0 @@ -14,8 +16,6 @@ false Herwin Bozet (@NibblePoker) ..\NibblePoker.Packaging.ListComPort\Icons\lscom-v2-text-01.ico - Release - AnyCPU diff --git a/NibblePoker.Application.ListComPort/Program.cs b/NibblePoker.Application.ListComPort/Program.cs index c9bdf2b..e3d928e 100644 --- a/NibblePoker.Application.ListComPort/Program.cs +++ b/NibblePoker.Application.ListComPort/Program.cs @@ -4,204 +4,248 @@ using System.Linq; using NibblePoker.Library.Arguments; using NibblePoker.Library.ComPortWatcher; -namespace NibblePoker.Application.ListComPort; +namespace NibblePoker.Application.ListComPort { + internal static class Program { + private const string Version = "4.0.0"; -internal static class Program { - private const string Version = "4.0.0"; - - private static readonly Verb RootVerb = new Verb(""); - - private static readonly Option OptionShowAll = new('a', "show-all", "Display the complete port's name (Equal to '-dfn')"); - private static readonly Option OptionShowDevice = new('d', "show-device", "Displays the port's device name"); - private static readonly Option OptionDivider = new('D', "divider", "Uses the given string or char as a separator (Can be an empty string !)", OptionFlags.HasValue); - private static readonly Option OptionShowFriendly = new('f', "show-friendly", "Displays the port's friendly name"); - private static readonly Option OptionHelp = new('h', "help", "Display the help text", OptionFlags.StopsParsing); - private static readonly Option OptionHelpShort = new('H', "short-help", "Display the short help text", OptionFlags.StopsParsing); - private static readonly Option OptionShowNameRaw = new('n', "show-name-raw", "Displays the port's raw name (See remarks section)"); - private static readonly Option OptionNoPretty = new('P', "no-pretty", "Disables the pretty printing format (Equal to -D \" \""); - private static readonly Option OptionSort = new('s', "sort", "Sorts the port based on their raw names in an ascending order"); - private static readonly Option OptionSortReverse = new('S', "sort-reverse", "Sorts the port based on their raw names in a descending order"); - private static readonly Option OptionTabPadding = new('t', "tab-padding", "Use tabs for padding between the types of names (Overrides '-D')"); - private static readonly Option OptionVersion = new('v', "version", "Shows the utility's version number and other info"); - private static readonly Option OptionVersionOnly = new('V', "version-only", "Shows the utility's version number only (Overrides '-v')"); - - private static bool _shouldPrintRawNames = true; - private static bool _shouldPrintDeviceNames = false; - private static bool _shouldPrintFriendlyNames = false; - - private static string _paddingText = ""; + // ReSharper disable once InconsistentNaming + private static readonly Verb RootVerb = new Verb(null); - private static SortingOrder _sortingOrder = SortingOrder.None; - - private static int _exitCode = ErrorCodes.NoError; - - /// - /// Checks if the program is the only owner of its console. - /// This check is used to detect if the program was run from the exe/lnk or via a console. - /// - /// True if the process is the console's sole owner, False otherwise - private static bool IsProgramRunDirectly() { - return GetConsoleProcessList(new int[2], 2) <= 1; - } - - private static int Main(string[] args) { - try { - ArgumentsParser.ParseArguments(RootVerb.RegisterOption(OptionShowAll).RegisterOption(OptionShowDevice) - .RegisterOption(OptionDivider).RegisterOption(OptionShowFriendly).RegisterOption(OptionHelp) - .RegisterOption(OptionShowNameRaw).RegisterOption(OptionNoPretty).RegisterOption(OptionSort) - .RegisterOption(OptionSortReverse).RegisterOption(OptionTabPadding).RegisterOption(OptionVersion) - .RegisterOption(OptionVersionOnly), args); - } catch(Exceptions.ArgumentsException) { - Console.Error.WriteLine("Failed to parse the launch arguments, default options will be used."); - _exitCode = ErrorCodes.ArgumentParsingFailure; - RootVerb.Clear(); - } + private static readonly Option OptionShowAll = new Option('a', "show-all", + "Display the complete port's name (Equal to '-dfn')"); + private static readonly Option OptionShowDevice = new Option('d', "show-device", + "Displays the port's device name"); + private static readonly Option OptionShowFriendly = new Option('f', "show-friendly", + "Displays the port's friendly name"); + private static readonly Option OptionShowNameRaw = new Option('n', "show-name-raw", + "Displays the port's raw name (See remarks section)"); - if(OptionHelp.WasUsed() || OptionHelpShort.WasUsed()) { - Console.WriteLine(HelpText.GetFullHelpText(RootVerb, "lscom.exe", (uint)Console.BufferWidth - 1, 1, 2, false)); - - if(OptionHelp.WasUsed()) { - Console.WriteLine("\nRemarks:"); - Console.WriteLine(" * If '-d' or '-f' is used, the raw name will not be shown unless '-n' is used."); - Console.WriteLine(" * If '-D', '-t' or '-p' are used, the special separator between the raw and friendly name and the square brackets are not shown."); - Console.WriteLine(" * If the program is raw without going through a console, the options '-n' and '-f' will be used."); - Console.WriteLine(" * By default, the ports are sorted in the order they are provided by the registry, which is often chronological."); - Console.WriteLine(" * The 'raw name' refers to a port name. (e.g.: COM1, COM2, ...)"); - Console.WriteLine(" * The 'device name' refers to a port device path. (e.g.: \\Device\\Serial1, ...)"); - Console.WriteLine(" * The 'friendly name' refers to a port name as seen in the device manager. (e.g.: Communications Port, USB-SERIAL CH340, ...)"); - Console.WriteLine(" * Any result returned with an error code between 1-9 and 30-39 should be considered as invalid."); - Console.WriteLine(" * Any result returned with another error code is valid but probably not formatted properly."); + private static readonly Option OptionDivider = new Option('D', "divider", + "Uses the given string or char as a separator (Can be an empty string !)", OptionFlags.HasValue); + private static readonly Option OptionTabPadding = new Option('t', "tab-padding", + "Use tabs for padding between the types of names (Overrides '-D')"); + private static readonly Option OptionNoPretty = new Option('P', "no-pretty", + "Disables the pretty printing format (Equal to -D \" \""); + + private static readonly Option OptionSort = new Option('s', "sort", + "Sorts the port based on their raw names in an ascending order"); + private static readonly Option OptionSortReverse = new Option('S', "sort-reverse", + "Sorts the port based on their raw names in a descending order"); + + private static readonly Option OptionHelp = new Option('h', "help", + "Display the help text", OptionFlags.StopsParsing); + private static readonly Option OptionHelpShort = new Option('H', "short-help", + "Display the short help text", OptionFlags.StopsParsing); + private static readonly Option OptionVersion = new Option('v', "version", + "Shows the utility's version number and other info"); + private static readonly Option OptionVersionOnly = new Option('V', "version-only", + "Shows the utility's version number only (Overrides '-v')"); + + // ReSharper disable RedundantDefaultMemberInitializer + private static bool _shouldPrintRawNames = true; + private static bool _shouldPrintDeviceNames = false; + private static bool _shouldPrintFriendlyNames = false; + // ReSharper enable RedundantDefaultMemberInitializer + + private static string _paddingText = ""; + + private static SortingOrder _sortingOrder = SortingOrder.None; + + private static int _exitCode = ErrorCodes.NoError; + + /// + /// Checks if the program is the only owner of its console. + /// This check is used to detect if the program was run from the exe/lnk or via a console. + /// + /// True if the process is the console's sole owner, False otherwise + private static bool IsProgramRunDirectly() { + return GetConsoleProcessList(new int[2], 2) <= 1; + } + + private static int Main(string[] args) { + // Preparing & parsing launch arguments + try { + ArgumentsParser.ParseArguments(RootVerb.RegisterOption(OptionShowAll).RegisterOption(OptionShowDevice) + .RegisterOption(OptionDivider).RegisterOption(OptionShowFriendly).RegisterOption(OptionHelp) + .RegisterOption(OptionShowNameRaw).RegisterOption(OptionNoPretty).RegisterOption(OptionSort) + .RegisterOption(OptionSortReverse).RegisterOption(OptionTabPadding).RegisterOption(OptionVersion) + .RegisterOption(OptionVersionOnly), args); + } catch(Exceptions.ArgumentsException) { + Console.Error.WriteLine("Failed to parse the launch arguments, default options will be used."); + _exitCode = ErrorCodes.ArgumentParsingFailure; + RootVerb.Clear(); } - - return ErrorCodes.NoError; - } - - if(OptionVersionOnly.WasUsed()) { - Console.WriteLine(Version); - return ErrorCodes.NoError; - } - - if(OptionVersion.WasUsed()) { - Console.WriteLine("NibblePoker.Application.ListComPort (lscom) v" + Version); - Console.WriteLine(""); - Console.WriteLine("Dependencies:"); - Console.WriteLine("├─> NibblePoker.Library.Arguments v2.0.0"); - Console.WriteLine("├─> NibblePoker.Library.ComPortHelpers v" + Version); - Console.WriteLine("└─> NibblePoker.Library.RegistryHelpers v0.0.1"); - Console.WriteLine(""); - Console.WriteLine("GitHub repositories:"); - Console.WriteLine("├─> https://github.com/aziascreations/DotNet-Arguments"); - Console.WriteLine("├─> https://github.com/aziascreations/DotNet-ListComPort"); - Console.WriteLine("└─> https://github.com/aziascreations/DotNet-RegistryHelpers"); - Console.WriteLine(""); - Console.WriteLine("This software and all its libraries are released in the public domain under the CC0-1.0 license."); - return ErrorCodes.NoError; - } - - if(OptionShowDevice.WasUsed()) { - _shouldPrintRawNames = false; - _shouldPrintDeviceNames = true; - } - - if(OptionShowFriendly.WasUsed() || IsProgramRunDirectly()) { - _shouldPrintRawNames = false; - _shouldPrintFriendlyNames = true; - } - - if(OptionShowNameRaw.WasUsed() || IsProgramRunDirectly()) { - _shouldPrintRawNames = true; - } - - if(OptionShowAll.WasUsed()) { - _shouldPrintRawNames = true; - _shouldPrintFriendlyNames = true; - _shouldPrintDeviceNames = true; - } - - if(OptionSort.WasUsed()) { - _sortingOrder = SortingOrder.Ascending; - } - - if(OptionSortReverse.WasUsed()) { - _sortingOrder = SortingOrder.Descending; - } - - if(OptionNoPretty.WasUsed()) { - _paddingText = " "; - } - - if(OptionDivider.WasUsed()) { - _paddingText = OptionDivider.Arguments[0]; - } - - if(OptionTabPadding.WasUsed()) { - _paddingText = "\t"; - } - - // Application's code - - string rawToFriendlySeparator = " - "; - bool addDeviceBrackets = true; - - if(string.IsNullOrEmpty(_paddingText)) { - _paddingText = " "; - } else { - rawToFriendlySeparator = _paddingText; - addDeviceBrackets = false; - } - - if(!_shouldPrintRawNames && !_shouldPrintFriendlyNames && _shouldPrintDeviceNames) { - addDeviceBrackets = false; - } - - List comPortsInfo = ComPortHelper.GetComList(_shouldPrintFriendlyNames); - - if(comPortsInfo.Count > 0) { - comPortsInfo = _sortingOrder switch { - SortingOrder.Ascending => comPortsInfo.OrderBy(o => o.RawName).ToList(), - SortingOrder.Descending => comPortsInfo.OrderByDescending(o => o.RawName).ToList(), - _ => comPortsInfo - }; - - foreach(ComPortInfo comPortInfo in comPortsInfo) { - if(_shouldPrintRawNames) { - Console.Write(comPortInfo.RawName); + + // Processing exiting options + if(OptionHelp.WasUsed() || OptionHelpShort.WasUsed()) { + Console.WriteLine(HelpText.GetFullHelpText( + RootVerb, "lscom.exe", + (uint)Console.BufferWidth - 1, 1, 2, false)); + + if(OptionHelp.WasUsed()) { + Console.WriteLine("\nRemarks:"); + Console.WriteLine( + " * If '-d' or '-f' is used, the raw name will not be shown unless '-n' is used."); + Console.WriteLine( + " * If '-D', '-t' or '-p' are used, the special separator between the raw and friendly name and the square brackets are not shown."); + Console.WriteLine( + " * If the program is raw without going through a console, the options '-n' and '-f' will be used."); + Console.WriteLine( + " * By default, the ports are sorted in the order they are provided by the registry, which is often chronological."); + Console.WriteLine(" * The 'raw name' refers to a port name. (e.g.: COM1, COM2, ...)"); + Console.WriteLine( + " * The 'device name' refers to a port device path. (e.g.: \\Device\\Serial1, ...)"); + Console.WriteLine( + " * The 'friendly name' refers to a port name as seen in the device manager. (e.g.: Communications Port, USB-SERIAL CH340, ...)"); + Console.WriteLine( + " * Any result returned with an error code between 1-9 and 30-39 should be considered as invalid."); + Console.WriteLine( + " * Any result returned with another error code is valid but probably not formatted properly."); + } + + return ErrorCodes.NoError; + } + + if(OptionVersionOnly.WasUsed()) { + Console.WriteLine(Version); + return ErrorCodes.NoError; + } + + if(OptionVersion.WasUsed()) { + Console.WriteLine("NibblePoker.Application.ListComPort (lscom) v" + Version); + Console.WriteLine(""); + Console.WriteLine("Dependencies:"); + Console.WriteLine("├─> NibblePoker.Library.Arguments v2.0.0"); + Console.WriteLine("├─> NibblePoker.Library.ComPortHelpers v" + Version); + Console.WriteLine("└─> NibblePoker.Library.RegistryHelpers v1.0.0"); + Console.WriteLine(""); + Console.WriteLine("GitHub repositories:"); + Console.WriteLine("├─> https://github.com/aziascreations/DotNet-Arguments"); + Console.WriteLine("├─> https://github.com/aziascreations/DotNet-ListComPort"); + Console.WriteLine("└─> https://github.com/aziascreations/DotNet-RegistryHelpers"); + Console.WriteLine(""); + Console.WriteLine( + "This software and all its libraries are released in the public domain under the CC0-1.0 license."); + return ErrorCodes.NoError; + } + + // Processing parameter options + if(OptionShowDevice.WasUsed()) { + _shouldPrintRawNames = false; + _shouldPrintDeviceNames = true; + } + + if(OptionShowFriendly.WasUsed() || IsProgramRunDirectly()) { + _shouldPrintRawNames = false; + _shouldPrintFriendlyNames = true; + } + + if(OptionShowNameRaw.WasUsed() || IsProgramRunDirectly()) { + _shouldPrintRawNames = true; + } + + if(OptionShowAll.WasUsed()) { + _shouldPrintRawNames = true; + _shouldPrintFriendlyNames = true; + _shouldPrintDeviceNames = true; + } + + if(OptionSort.WasUsed()) { + _sortingOrder = SortingOrder.Ascending; + } + + if(OptionSortReverse.WasUsed()) { + _sortingOrder = SortingOrder.Descending; + } + + if(OptionNoPretty.WasUsed()) { + _paddingText = " "; + } + + if(OptionDivider.WasUsed()) { + _paddingText = OptionDivider.Arguments[0]; + } + + if(OptionTabPadding.WasUsed()) { + _paddingText = "\t"; + } + + // Application's code + string rawToFriendlySeparator = " - "; + bool addDeviceBrackets = true; + + if(string.IsNullOrEmpty(_paddingText)) { + _paddingText = " "; + } else { + rawToFriendlySeparator = _paddingText; + addDeviceBrackets = false; + } + + if(!_shouldPrintRawNames && !_shouldPrintFriendlyNames && _shouldPrintDeviceNames) { + addDeviceBrackets = false; + } + + List comPortsInfo = ComPortHelper.GetComList(_shouldPrintFriendlyNames); + + if(comPortsInfo.Count > 0) { + //comPortsInfo = _sortingOrder switch { + // SortingOrder.Ascending => comPortsInfo.OrderBy(o => o.RawName).ToList(), + // SortingOrder.Descending => comPortsInfo.OrderByDescending(o => o.RawName).ToList(), + // _ => comPortsInfo + //}; + switch(_sortingOrder) { + case SortingOrder.Ascending: + comPortsInfo = comPortsInfo.OrderBy(o => o.RawName).ToList(); + break; + case SortingOrder.Descending: + comPortsInfo = comPortsInfo.OrderByDescending(o => o.RawName).ToList(); + break; + case SortingOrder.None: + default: + break; + } + + foreach(ComPortInfo comPortInfo in comPortsInfo) { + if(_shouldPrintRawNames) { + Console.Write(comPortInfo.RawName); + + if(_shouldPrintFriendlyNames) { + Console.Write(rawToFriendlySeparator); + } + } if(_shouldPrintFriendlyNames) { - Console.Write(rawToFriendlySeparator); + Console.Write(comPortInfo.FriendlyName); } + + if((_shouldPrintRawNames || _shouldPrintFriendlyNames) && _shouldPrintDeviceNames) { + Console.Write(_paddingText); + } + + if(_shouldPrintDeviceNames) { + Console.Write((addDeviceBrackets ? "[" : "") + comPortInfo.DeviceName + + (addDeviceBrackets ? "]" : "")); + } + + Console.WriteLine(); } - - if(_shouldPrintFriendlyNames) { - Console.Write(comPortInfo.FriendlyName); - } - - if((_shouldPrintRawNames || _shouldPrintFriendlyNames) && _shouldPrintDeviceNames) { - Console.Write(_paddingText); - } - - if(_shouldPrintDeviceNames) { - Console.Write((addDeviceBrackets ? "[" : "") + comPortInfo.DeviceName + (addDeviceBrackets ? "]" : "")); - } - - Console.WriteLine(); + } else { + Console.Error.Write("No COM port could be found."); + _exitCode = ErrorCodes.NoComPorts; } - } else { - Console.Error.Write("No COM port could be found."); - _exitCode = ErrorCodes.NoComPorts; + + // Allows the program to be run from a shortcut without closing the console instantly. + if(IsProgramRunDirectly()) { + Console.Write("\nPress any key to continue..."); + Console.ReadKey(); + } + + return _exitCode; } - - // Allows the program to be run from a shortcut without closing the console instantly. - if(IsProgramRunDirectly()) { - Console.Write("\nPress any key to continue..."); - Console.ReadKey(); - } - - return _exitCode; + + // Imports "GetConsoleProcessList(...)" in order to know if the program was run via a shortcut or a CLI prompt. + // See: https://learn.microsoft.com/en-us/windows/console/getconsoleprocesslist + [System.Runtime.InteropServices.DllImport("kernel32.dll")] + private static extern int GetConsoleProcessList(int[] buffer, int size); } - - // Imports "GetConsoleProcessList(...)" in order to know if the program was run via a shortcut or CLI. - // See: https://learn.microsoft.com/en-us/windows/console/getconsoleprocesslist - [System.Runtime.InteropServices.DllImport("kernel32.dll")] - private static extern int GetConsoleProcessList(int[] buffer, int size); } diff --git a/NibblePoker.Library.ComPortHelpers/NibblePoker.Library.ComPortHelpers.csproj b/NibblePoker.Library.ComPortHelpers/NibblePoker.Library.ComPortHelpers.csproj index 6f7e4f8..13022b4 100644 --- a/NibblePoker.Library.ComPortHelpers/NibblePoker.Library.ComPortHelpers.csproj +++ b/NibblePoker.Library.ComPortHelpers/NibblePoker.Library.ComPortHelpers.csproj @@ -8,8 +8,6 @@ NibblePoker.Library.ComPortWatcher NibblePoker.Library.ComPortHelpers - Release - AnyCPU