misc fixes, improvements, new features

This commit is contained in:
Michael Becker 2023-04-17 08:03:07 -04:00
parent 673b78b8d5
commit 58b272b873
9 changed files with 183 additions and 7 deletions

View File

@ -364,12 +364,25 @@ namespace MBS.Framework
Initialized = true;
}
public event ApplicationActivatedEventHandler BeforeActivated;
protected virtual void OnBeforeActivated(ApplicationActivatedEventArgs e)
{
BeforeActivated?.Invoke(this, e);
}
public event ApplicationActivatedEventHandler Activated;
protected virtual void OnActivated(ApplicationActivatedEventArgs e)
{
Activated?.Invoke(this, e);
}
public event ApplicationActivatedEventHandler AfterActivated;
protected virtual void OnAfterActivated(ApplicationActivatedEventArgs e)
{
AfterActivated?.Invoke(this, e);
}
protected virtual int StartInternal()
{
CommandLine cline = new CommandLine();
@ -413,14 +426,61 @@ namespace MBS.Framework
}
ApplicationActivatedEventArgs e = new ApplicationActivatedEventArgs(true, ApplicationActivationType.CommandLineLaunch, cline);
if (CommandLine.Options["help"]?.Value is bool && ((bool)CommandLine.Options["help"]?.Value) == true)
{
if (ShowCommandLineHelp(out int resultCode))
{
return resultCode;
}
}
if (cline.Command != null && cline.Command.ActivationDelegate != null)
{
OnBeforeActivated(e);
if (!e.Success)
{
Console.WriteLine(String.Format("Try '{0} --help' for more information.", ShortName));
return e.ExitCode;
}
// use the activation delegate instead of calling OnActivated
cline.Command.ActivationDelegate(e);
if (!e.Success)
{
Console.WriteLine(String.Format("Try '{0} --help' for more information.", ShortName));
return e.ExitCode;
}
OnAfterActivated(e);
if (!e.Success)
{
Console.WriteLine(String.Format("Try '{0} --help' for more information.", ShortName));
return e.ExitCode;
}
}
else
{
OnBeforeActivated(e);
if (!e.Success)
{
Console.WriteLine(String.Format("Try '{0} --help' for more information.", ShortName));
return e.ExitCode;
}
OnActivated(e);
if (!e.Success)
{
Console.WriteLine(String.Format("Try '{0} --help' for more information.", ShortName));
return e.ExitCode;
}
OnAfterActivated(e);
if (!e.Success)
{
Console.WriteLine(String.Format("Try '{0} --help' for more information.", ShortName));
return e.ExitCode;
}
}
return e.ExitCode;
}
@ -428,12 +488,32 @@ namespace MBS.Framework
protected void PrintUsageStatement(CommandLineCommand command = null)
{
string shortOptionPrefix = CommandLine.ShortOptionPrefix ?? "-";
string longOptionPrefix = CommandLine.LongOptionPrefix ?? "--";
Console.Write("usage: {0} ", ShortName);
foreach (CommandLineOption option in CommandLine.Options)
{
PrintUsageStatementOption(option);
}
if (CommandLine.HelpTextPrefix != null)
{
Console.WriteLine();
Console.WriteLine();
Console.WriteLine(CommandLine.HelpTextPrefix);
}
Console.WriteLine();
bool printDescriptions = true;
if (printDescriptions)
{
foreach (CommandLineOption option in CommandLine.Options)
{
Console.WriteLine(" {0}{1}", option.Abbreviation != '\0' ? String.Format("{0}{1}, {2}{3}", shortOptionPrefix, option.Abbreviation, longOptionPrefix, option.Name) : String.Format("{0}{1}", longOptionPrefix, option.Name), option.Description == null ? null : String.Format(" - {0}", option.Description));
}
}
// Console.Write("[<global-options...>]");
if (command != null)
@ -462,6 +542,12 @@ namespace MBS.Framework
}
}
}
if (CommandLine.HelpTextSuffix != null)
{
Console.WriteLine();
Console.WriteLine(CommandLine.HelpTextSuffix);
}
}
private void PrintUsageStatementOption(CommandLineOption option)
@ -543,6 +629,10 @@ namespace MBS.Framework
index++;
option.Value = args[index];
}
else
{
option.Value = true;
}
if (list != null)
list.Add(option);
@ -573,6 +663,10 @@ namespace MBS.Framework
// option.Value = args[index];
option.Value = value;
}
else
{
option.Value = true;
}
list.Add(option);
}
else
@ -832,5 +926,13 @@ namespace MBS.Framework
{
_settings[id] = value;
}
protected virtual bool ShowCommandLineHelp(out int resultCode)
{
// bash: cd returns 2 if --help is specified OR invalid option selected, 1 if file not found
PrintUsageStatement();
resultCode = 2;
return true;
}
}
}

View File

@ -25,6 +25,8 @@ namespace MBS.Framework
{
public class ApplicationActivatedEventArgs : EventArgs
{
public bool Success { get; set; } = true;
public bool FirstRun { get; } = true;
public CommandLine CommandLine { get; } = null;
public int ExitCode { get; set; } = 0;

8
MBS.Framework/ArrayExtensions.cs Executable file → Normal file
View File

@ -93,5 +93,13 @@ namespace MBS.Framework
}
return true;
}
public static T[] Concat<T>(T[] array1, T[] array2)
{
T[] array3 = new T[array1.Length + array2.Length];
Array.Copy(array1, 0, array3, 0, array1.Length);
Array.Copy(array2, 0, array3, array1.Length, array2.Length);
return array3;
}
}
}

View File

@ -26,6 +26,33 @@ namespace MBS.Framework.Collections
{
public static class ExtensionMethods
{
public static bool ContainsAny<T>(this IEnumerable enumerable, T[] item)
{
foreach (object item1 in enumerable)
{
foreach (T item2 in item)
{
if (item1 is T)
{
if (item1.Equals(item2))
return true;
}
}
}
return false;
}
public static bool ContainsAny<T>(this System.Collections.Generic.IEnumerable<T> enumerable, T[] item)
{
foreach (T item1 in enumerable)
{
foreach (T item2 in item)
{
if (item1.Equals(item2))
return true;
}
}
return false;
}
public static T[] ToArray<T>(this IEnumerable enumerable) where T : class
{
System.Collections.Generic.List<T> list = new System.Collections.Generic.List<T>();

View File

@ -43,6 +43,15 @@ namespace MBS.Framework.Collections.Generic
_dict.Add(handle, obj);
}
public bool ContainsObject(TObject obj)
{
return _dict.ContainsValue2(obj);
}
public bool ContainsHandle(THandle handle)
{
return _dict.ContainsValue1(handle);
}
public bool Contains(TObject obj)
{
return _dict.ContainsValue2(obj);

View File

@ -39,6 +39,9 @@ namespace MBS.Framework
public CommandLineParser Parser { get; set; } = null;
public string HelpTextPrefix { get; set; } = null;
public string HelpTextSuffix { get; set; } = null;
public CommandLineOption.CommandLineOptionCollection Options { get; } = new CommandLineOption.CommandLineOptionCollection();
public CommandLineCommand.CommandLineCommandCollection Commands { get; } = new CommandLineCommand.CommandLineCommandCollection();
public CommandLineCommand Command { get; internal set; } = null;

View File

@ -23,8 +23,17 @@ namespace MBS.Framework
{
public enum CommandLineOptionValueType
{
/// <summary>
/// The option accepts no values.
/// </summary>
None = 0,
/// <summary>
/// The option accepts a single value.
/// </summary>
Single = 1,
/// <summary>
/// The option accepts multiple values.
/// </summary>
Multiple = 2
}
}

View File

@ -161,7 +161,9 @@ namespace MBS.Framework
}
private const string DefaultAlphabet = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public const string DefaultAlphabet = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public const string DefaultAlphabetNoSpecialChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static readonly CryptoRandom Random = new CryptoRandom();
/// <summary>
///

View File

@ -97,6 +97,7 @@ namespace MBS.Framework
}
private static object available_assemblies_lock = new object();
private static Assembly[] mvarAvailableAssemblies = null;
/// <summary>
/// Gets the available assemblies in the given search paths, or the current application directory if no search paths are specified.
@ -105,7 +106,7 @@ namespace MBS.Framework
/// <param name="searchPaths">An array of <see cref="string" /> paths to search in.</param>
public static Assembly[] GetAvailableAssemblies(string[] searchPaths = null)
{
if (mvarAvailableAssemblies == null)
if (mvarAvailableAssemblies == null || searchPaths != null)
{
List<Assembly> list = new List<Assembly>();
@ -139,27 +140,40 @@ namespace MBS.Framework
Assembly asm = Assembly.LoadFile(FileName);
list.Add(asm);
}
catch
catch (Exception ex)
{
}
}
}
if (searchPaths == null)
{
mvarAvailableAssemblies = list.ToArray();
}
else
{
return list.ToArray();
}
}
return mvarAvailableAssemblies;
}
private static Type[] mvarAvailableTypes = null;
public static Type[] GetAvailableTypes(Type[] inheritsFrom = null)
public static Type[] GetAvailableTypes(Type[] inheritsFrom = null, Assembly[] additionalAssemblies = null)
{
if (mvarAvailableTypes == null)
{
List<Type> types = new List<Type>();
Assembly[] asms = GetAvailableAssemblies();
for (int iAsm = 0; iAsm < asms.Length; iAsm++)
List<Assembly> listAsms = new List<Assembly>(asms);
if (additionalAssemblies != null)
{
Assembly asm = asms[iAsm];
listAsms.AddRange(additionalAssemblies);
}
for (int iAsm = 0; iAsm < listAsms.Count; iAsm++)
{
Assembly asm = listAsms[iAsm];
Type[] types1 = null;
try
{