diff --git a/SweetLib.Demo.Console/Program.cs b/SweetLib.Demo.Console/Program.cs index 6da4911..b7e4391 100644 --- a/SweetLib.Demo.Console/Program.cs +++ b/SweetLib.Demo.Console/Program.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using SweetLib.Classes.Storer; using SweetLib.Utils.Logger; +using SweetLib.Utils.Logger.Message; namespace SweetLib.Demo.Console { @@ -21,6 +24,10 @@ namespace SweetLib.Demo.Console Logger.Error("Error :("); System.Console.ReadLine(); + + var f = Path.GetTempFileName(); + var ini = new IniFileStorer(f); + System.Console.WriteLine(ini.ReadString("sec","key")); } } } diff --git a/SweetLib.Demo.Console/Properties/AssemblyInfo.cs b/SweetLib.Demo.Console/Properties/AssemblyInfo.cs index 2dae91b..561580b 100644 --- a/SweetLib.Demo.Console/Properties/AssemblyInfo.cs +++ b/SweetLib.Demo.Console/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.19.0")] -[assembly: AssemblyFileVersion("1.0.19.0")] +[assembly: AssemblyVersion("1.0.21.0")] +[assembly: AssemblyFileVersion("1.0.21.0")] diff --git a/SweetLib/Classes/Exception/RegistryStorerException.cs b/SweetLib/Classes/Exception/RegistryStorerException.cs index c2cf14c..aed90c9 100644 --- a/SweetLib/Classes/Exception/RegistryStorerException.cs +++ b/SweetLib/Classes/Exception/RegistryStorerException.cs @@ -1,9 +1,21 @@ -namespace SweetLib.Classes.Exception +using SweetLib.Classes.Storer; + +namespace SweetLib.Classes.Exception { + /// + /// Exception thrown by . + /// public class RegistryStorerException : System.Exception { + /// + /// Creates a new . + /// public RegistryStorerException(){} + /// + /// Creates a new . + /// + /// Exception message. public RegistryStorerException(string message):base(message) {} } } diff --git a/SweetLib/Classes/Storer/IStorer.cs b/SweetLib/Classes/Storer/IStorer.cs index f1c0505..0c5f258 100644 --- a/SweetLib/Classes/Storer/IStorer.cs +++ b/SweetLib/Classes/Storer/IStorer.cs @@ -1,23 +1,80 @@ namespace SweetLib.Classes.Storer { + /// + /// Interface, which provides several methods to store simple data. + /// public interface IStorer { + /// + /// Reads a string value. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// Default value, if this value does not exist. + /// Value of the in . string ReadString(string section, string key, string defaultValue = ""); + /// + /// Reads an integer value. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// Default value, if this value does not exist. + /// Value of the in . int ReadInteger(string section, string key, int defaultValue = 0); + /// + /// Reads a bool value. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// Default value, if this value does not exist. + /// Value of the in . bool ReadBool(string section, string key, bool defaultValue = false); + /// + /// Checks, if a key exists inside a section. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// True, if is found inside . bool HasKey(string section, string key); + /// + /// Writes a string value. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// Value to be stored. void WriteString(string section, string key, string value); + /// + /// Writes an integer value. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// Value to be stored. void WriteInteger(string section, string key, int value); + /// + /// Writes a bool value. + /// + /// Represents the section in which the data is stored. + /// Represents the key of the stored data. + /// Value to be stored. void WriteBool(string section, string key, bool value); + /// + /// Deletes a key inside a . + /// + /// Represents the section in which the data is stored. + /// Represents the key to be deleted. void DeleteKey(string section, string key); + /// + /// Deletes a section with all its keys. + /// + /// Represents the section to be deleted. void DeleteSection(string section); } } diff --git a/SweetLib/Classes/Storer/IniFileStorer.cs b/SweetLib/Classes/Storer/IniFileStorer.cs index f913813..c0e77ff 100644 --- a/SweetLib/Classes/Storer/IniFileStorer.cs +++ b/SweetLib/Classes/Storer/IniFileStorer.cs @@ -3,16 +3,26 @@ using System.Text; namespace SweetLib.Classes.Storer { + /// + /// Implementation of an interface which stores the data inside an ini file. + /// public class IniFileStorer : IStorer { + /// + /// Ini file path. + /// public string FileName { get; } [DllImport("kernel32", CharSet = CharSet.Unicode)] - static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath); + private static extern long WritePrivateProfileString(string section, string key, string value, string filePath); [DllImport("kernel32", CharSet = CharSet.Unicode)] - static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); + private static extern int GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder value, int size, string filePath); + /// + /// Creates a new instance of with a specified file name. + /// + /// The file name of the ini file. public IniFileStorer(string fileName) { FileName = fileName; diff --git a/SweetLib/Classes/Storer/RegistryStorer.cs b/SweetLib/Classes/Storer/RegistryStorer.cs index 8803232..a04aac2 100644 --- a/SweetLib/Classes/Storer/RegistryStorer.cs +++ b/SweetLib/Classes/Storer/RegistryStorer.cs @@ -3,24 +3,45 @@ using SweetLib.Classes.Exception; namespace SweetLib.Classes.Storer { + /// + /// Implementation of an interface which stores the data inside the registry. + /// + /// + /// Sections will be interpreted as subkeys on registry level. + /// public class RegistryStorer : IStorer { - public RegistryKey BaseRegistryKey { get; } + /// + /// The base registry key in which will be operated. + /// + public RegistryKey OperatingRegistryKey { get; } + /// + /// Creates a new instance of with a specified application name. + /// + /// The applications base name. This will be used as name for a sub key inside the software key below the base key. + /// + /// This will use current user as the base key. + /// public RegistryStorer(string appName) : this(Registry.CurrentUser, appName) { } + /// + /// Creates a new instance of with a specified application name. + /// + /// Provide a key of , e.G. Registry.CurrentUser. + /// The applications base name. This will be used as name for a sub key inside the software key below the base key. public RegistryStorer(RegistryKey baseRegistryKey, string appName) { baseRegistryKey = baseRegistryKey.CreateSubKey("SOFTWARE"); - BaseRegistryKey = baseRegistryKey?.CreateSubKey(appName); + OperatingRegistryKey = baseRegistryKey?.CreateSubKey(appName); - if (BaseRegistryKey == null) + if (OperatingRegistryKey == null) throw new RegistryStorerException("Unable to create registriy key."); } public string ReadString(string section, string key, string defaultValue = "") { - var localRegKey = BaseRegistryKey.OpenSubKey(section); + var localRegKey = OperatingRegistryKey.OpenSubKey(section); return (string)localRegKey?.GetValue(key.ToUpper()); } @@ -45,7 +66,7 @@ namespace SweetLib.Classes.Storer public void WriteString(string section, string key, string value) { - var localRegKey = BaseRegistryKey.CreateSubKey(section); + var localRegKey = OperatingRegistryKey.CreateSubKey(section); localRegKey?.SetValue(key.ToUpper(), value); } @@ -61,13 +82,13 @@ namespace SweetLib.Classes.Storer public void DeleteKey(string section, string key) { - var localRegKey = BaseRegistryKey.CreateSubKey(section); + var localRegKey = OperatingRegistryKey.CreateSubKey(section); localRegKey?.DeleteValue(key); } public void DeleteSection(string section) { - BaseRegistryKey.DeleteSubKey(section); + OperatingRegistryKey.DeleteSubKey(section); } } } diff --git a/SweetLib/Properties/AssemblyInfo.cs b/SweetLib/Properties/AssemblyInfo.cs index 430144b..cdc736e 100644 --- a/SweetLib/Properties/AssemblyInfo.cs +++ b/SweetLib/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.21.0")] -[assembly: AssemblyFileVersion("1.0.21.0")] +[assembly: AssemblyVersion("0.1.23.0")] +[assembly: AssemblyFileVersion("0.1.23.0")] diff --git a/SweetLib/Utils/Logger/Logger.cs b/SweetLib/Utils/Logger/Logger.cs index a6ea578..daa682d 100644 --- a/SweetLib/Utils/Logger/Logger.cs +++ b/SweetLib/Utils/Logger/Logger.cs @@ -4,6 +4,9 @@ using SweetLib.Utils.Logger.Message; namespace SweetLib.Utils.Logger { + /// + /// Enum which contains the several log levels. + /// [Flags] public enum LogLevel { @@ -14,25 +17,55 @@ namespace SweetLib.Utils.Logger Warn = 1 << 3, Error = 1 << 4, - All = Int32.MaxValue, + All = Int32.MaxValue, }; + /// + /// Global logger class providing several methods to log events by the application. + /// + /// + /// As a will be used. You can change this to any other implementation at any time while runtime. + /// Default log levels are set as bitflags in . + /// public static class Logger { + /// + /// The global log level. Only messages with the set will be procedered. + /// public static LogLevel GlobalLogLevel { get; set; } = LogLevel.Info | LogLevel.Warn | LogLevel.Error; + /// + /// The default which will be used for any logging action, if no custom is set as parameter. + /// public static ILogMemory DefaultLogMemory = new ArchivableConsoleLogMemory(); + /// + /// Will log a message into the global . + /// + /// The log level of this message. + /// The message to log. public static void Log(LogLevel logLevel, string message) { Log(logLevel, message, DefaultLogMemory); } + /// + /// Will log a message into the provided . + /// + /// The log level of this message. + /// /// The message to log. + /// The to store the into. public static void Log(LogLevel logLevel, string message, ILogMemory logMemory) { Log(new LogMessage(logLevel, message), logMemory); } + /// + /// Will log a message into the provided . + /// + /// A object to store. + /// The to store the into. + /// In general use cases you should either use one of the or methods which will generate a call to this method. public static void Log(LogMessage message, ILogMemory logMemory) { if (message == null) @@ -47,26 +80,46 @@ namespace SweetLib.Utils.Logger logMemory.Remember(message); } + /// + /// Will log a message with the log level. + /// + /// Message to log. public static void Trace(string message) { Log(LogLevel.Trace, message); } + /// + /// Will log a message with the log level. + /// + /// Message to log. public static void Debug(string message) { Log(LogLevel.Debug, message); } + /// + /// Will log a message with the log level. + /// + /// Message to log. public static void Info(string message) { Log(LogLevel.Info, message); } + /// + /// Will log a message with the log level. + /// + /// Message to log. public static void Warn(string message) { Log(LogLevel.Warn, message); } + /// + /// Will log a message with the log level. + /// + /// Message to log. public static void Error(string message) { Log(LogLevel.Error, message); diff --git a/SweetLib/Utils/Logger/Memory/ILogMemory.cs b/SweetLib/Utils/Logger/Memory/ILogMemory.cs index 96aef66..4f59112 100644 --- a/SweetLib/Utils/Logger/Memory/ILogMemory.cs +++ b/SweetLib/Utils/Logger/Memory/ILogMemory.cs @@ -2,12 +2,28 @@ namespace SweetLib.Utils.Logger.Memory { + /// + /// Interface for a class to store and proceed objects. + /// public interface ILogMemory { + /// + /// Adds a into the . + /// + /// to be stored. void Remember(LogMessage message); + /// + /// Removes a from the . + /// + /// to be removed. + /// This might not have any effect depending on the implementation. void Forget(LogMessage message); + /// + /// Saves all remembered objects into a persistent file. + /// + /// File name to store the objects. void Archive(string fullFileName); } } diff --git a/SweetLib/Utils/Logger/Message/LogMessage.cs b/SweetLib/Utils/Logger/Message/LogMessage.cs index 7c840e6..978dc17 100644 --- a/SweetLib/Utils/Logger/Message/LogMessage.cs +++ b/SweetLib/Utils/Logger/Message/LogMessage.cs @@ -3,16 +3,39 @@ using System.Globalization; namespace SweetLib.Utils.Logger.Message { + /// + /// contains all event log data which should be logged in as a single log message. + /// public class LogMessage : IFormattable { + /// + /// The of this event log. + /// public LogLevel LogLevel { get; } + /// + /// The message of this event log. + /// public string Message { get; } + /// + /// The date and time of this event log. + /// public DateTime LogDateTime { get; } + /// + /// Creates a new instance. will be the . + /// + /// The log level of this event log. + /// The message of this event log. public LogMessage(LogLevel logLevel, string message) : this(logLevel, message, DateTime.Now) { } + /// + /// Creates a new instance. + /// + /// The log level of this event log. + /// The message of this event log. + /// The of this event log. public LogMessage(LogLevel logLevel, string message, DateTime logDateTime) { if (message == null) @@ -26,12 +49,22 @@ namespace SweetLib.Utils.Logger.Message LogDateTime = logDateTime; } + /// + /// Generates a formatted of this event log. will be used to format this event log. + /// + /// A formated of this event log. public override string ToString() { return ToString(LogMessageFormatter.DefaultFormatString, CultureInfo.CurrentCulture); } - public string ToString(string format, IFormatProvider formatProvider) + /// + /// Generates a formatted of this event log with a given format. + /// + /// The format to be used. See for more format information. + /// Optional, an interface to be used while formatting if needed. + /// A formated of this event log. + public string ToString(string format, IFormatProvider formatProvider = null) { return LogMessageFormatter.Instance.Format(format, this, formatProvider); } diff --git a/SweetLib/Utils/Logger/Message/LogMessageFormatter.cs b/SweetLib/Utils/Logger/Message/LogMessageFormatter.cs index 2c0187c..85befa7 100644 --- a/SweetLib/Utils/Logger/Message/LogMessageFormatter.cs +++ b/SweetLib/Utils/Logger/Message/LogMessageFormatter.cs @@ -3,6 +3,10 @@ using System.Globalization; namespace SweetLib.Utils.Logger.Message { + /// + /// A which is used to format objects. + /// + /// This class implements a singleton pattern. public class LogMessageFormatter : ICustomFormatter { @@ -10,10 +14,16 @@ namespace SweetLib.Utils.Logger.Message private static object Locker { get; } = new object(); - public static LogMessageFormatter FormatterInstance { get; set; } + /// + /// Accesses the global instance of the . + /// + private static LogMessageFormatter FormatterInstance { get; set; } public static string DefaultFormatString { get; set; } = $"[{CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern} - {CultureInfo.CurrentCulture.DateTimeFormat.LongTimePattern}] (LL): V"; + /// + /// The default format string which is used to format objects, if no custom format string is provided. + /// public static LogMessageFormatter Instance { get @@ -32,10 +42,20 @@ namespace SweetLib.Utils.Logger.Message } } + /// + /// Formats a object. + /// + /// The format string. If , will be used. + /// The object to be formatted. + /// Optional, an interface to be used while formatting if needed. + /// A formatted of the . + /// + /// If is not a object, it will either be returned the formatted string implemented by the type of , if is implemented by it, or the result." + /// public string Format(string format, object arg, IFormatProvider formatProvider) { if (format == null) - throw new ArgumentNullException(nameof(format)); + format = DefaultFormatString; if (arg == null) throw new ArgumentNullException(nameof(arg));