From c2d6186f61b5d25c530bb59a3ac03b14f8cc5f7e Mon Sep 17 00:00:00 2001 From: hzhuangxin01 Date: Mon, 18 Feb 2019 15:56:36 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=20=E5=A2=9E=E5=8A=A0=20ini=20.NET=20?= =?UTF-8?q?=E5=BA=93=202.=20=20=E5=A2=9E=E5=8A=A0ini=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=8A=9F=E8=83=BD=203.=20=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=97=A5=E5=BF=97=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=8E=A7=E5=88=B6=E5=8F=B0=E3=80=81=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E5=99=A8=E3=80=81=E6=96=87=E4=BB=B6=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + GeneratorCode/Configure/NConfig.cs | 121 ++ GeneratorCode/GeneratorCode.csproj | 8 +- GeneratorCode/Logs/NLog.cs | 491 +++++++ GeneratorCode/NLog.cs | 179 --- GeneratorCode/Program.cs | 19 +- GeneratorCode/config.ini | 57 + GeneratorCode/log.config | 7 - GeneratorCode/packages.config | 1 + ...trixSDK_OID4.csprojAssemblyReference.cache | Bin 56642 -> 81787 bytes packages/ini-parser.2.5.2/.signature.p7s | Bin 0 -> 9464 bytes .../ini-parser.2.5.2/ini-parser.2.5.2.nupkg | Bin 0 -> 38045 bytes .../lib/net20/INIFileParser.dll | Bin 0 -> 28672 bytes .../lib/net20/INIFileParser.dll.mdb | Bin 0 -> 11223 bytes .../lib/net20/INIFileParser.xml | 1181 +++++++++++++++++ 15 files changed, 1872 insertions(+), 193 deletions(-) create mode 100644 GeneratorCode/Configure/NConfig.cs create mode 100644 GeneratorCode/Logs/NLog.cs delete mode 100644 GeneratorCode/NLog.cs create mode 100644 GeneratorCode/config.ini delete mode 100644 GeneratorCode/log.config create mode 100644 packages/ini-parser.2.5.2/.signature.p7s create mode 100644 packages/ini-parser.2.5.2/ini-parser.2.5.2.nupkg create mode 100644 packages/ini-parser.2.5.2/lib/net20/INIFileParser.dll create mode 100644 packages/ini-parser.2.5.2/lib/net20/INIFileParser.dll.mdb create mode 100644 packages/ini-parser.2.5.2/lib/net20/INIFileParser.xml diff --git a/.gitignore b/.gitignore index d9d2d92..4d1eb44 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .vs/ /GeneratorCode/obj /GeneratorCode/bin/Debug +/TmatrixCodeGenerator/ \ No newline at end of file diff --git a/GeneratorCode/Configure/NConfig.cs b/GeneratorCode/Configure/NConfig.cs new file mode 100644 index 0000000..ced9a2e --- /dev/null +++ b/GeneratorCode/Configure/NConfig.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Timers; +using IniParser; +using IniParser.Model; +using JetBrains.Annotations; + +namespace GeneratorCode.Configure +{ + public static class NConfig + { + private static string _cfgFileName = @".\config.ini"; + + private static IniData _cfgData = null; + + public delegate void ConfigChangedHandle(); + + public static event ConfigChangedHandle OnConfigChanged; + + private static void ConfigChanged() + { + OnConfigChanged?.Invoke(); + } + + private static void LoadCfgFromFile() + { + try + { + if (!File.Exists(_cfgFileName)) + { + var fs = new FileStream(_cfgFileName, FileMode.Create, FileAccess.Write); + var ws = new StreamWriter(fs); + ws.WriteLine("; 应用程序配置文件\n"); + } + + FileIniDataParser iniPraser = new FileIniDataParser(); + iniPraser.Parser.Configuration.CommentString = ";"; + _cfgData = iniPraser.ReadFile(_cfgFileName); + //Trace.WriteLine(_cfgData); + } + catch (Exception e) + { + Trace.WriteLine(e.Message); + } + } + + public static void InitConfigure() + { + var cfgTask = new List(); + var appPath = Process.GetCurrentProcess().MainModule.FileName; + + Trace.WriteLine("Application: " + appPath); + Trace.WriteLine("Directory: " + Path.GetDirectoryName(appPath)); + Trace.WriteLine("File: " + Path.GetFileName(appPath)); + + var fw = new FileSystemWatcher(@"E:\", @"my.cfg") + { + NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite, + //Filter = _cfgFileName, + //Path = Path.GetDirectoryName(appPath), + IncludeSubdirectories = false, + }; + + fw.Changed += (sender, e) => + { + //if (Path.GetFileName(appPath) != _cfgFileName) return; + + lock (cfgTask) + { + if (cfgTask.Contains(e.FullPath)) return; + + cfgTask.Add(e.FullPath); + } + + var tm = new Timer(1000) { AutoReset = false }; + + tm.Elapsed += (obj, args) => + { + lock (cfgTask) + { + cfgTask.Remove(e.FullPath); + LoadCfgFromFile(); + ConfigChanged(); + // LogOut("File: " + e.FullPath + " ==> " + e.ChangeType.ToString() + "\n"); + } + }; + + tm.Start(); + }; + + fw.EnableRaisingEvents = true; + + LoadCfgFromFile(); + } + + public static T GetCfgValue([NotNull] string secName, [NotNull] string keyName, T defValue = default(T)) + { + var ret = defValue; + + if (_cfgData.Equals(null)) + { + return ret; + } + + try + { + ret = (T) Convert.ChangeType(_cfgData[secName][keyName], typeof(T)); + } + catch(Exception e) + { + Trace.WriteLine("[" + _cfgData[secName][keyName] + "] :" + e.Message); + ret = defValue; + throw(e); + } + + return ret; + } + } +} diff --git a/GeneratorCode/GeneratorCode.csproj b/GeneratorCode/GeneratorCode.csproj index 13b3f3c..6cd812b 100644 --- a/GeneratorCode/GeneratorCode.csproj +++ b/GeneratorCode/GeneratorCode.csproj @@ -34,6 +34,9 @@ 4 + + ..\packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll + Libs\itextsharp.dll @@ -53,7 +56,8 @@ - + + @@ -75,7 +79,7 @@ PreserveNewest - + PreserveNewest diff --git a/GeneratorCode/Logs/NLog.cs b/GeneratorCode/Logs/NLog.cs new file mode 100644 index 0000000..f242547 --- /dev/null +++ b/GeneratorCode/Logs/NLog.cs @@ -0,0 +1,491 @@ +using System; +using System.Collections.Concurrent; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading; +using GeneratorCode.Configure; +using JetBrains.Annotations; + +namespace GeneratorCode.Logs +{ + public enum NLogLevel + { + Fatal = 0, + Crash, + Error, + Warring, + Info, + Debug, + MaxLevel + } + + public enum CacheOptMode + { + Drop = 0, + Replease + } + + public class NLogConfig + { + private object _cfgLock = new object(); + public delegate void LogCfgChangedHandle(); + + public static event LogCfgChangedHandle OnLogCfgChanged; + + public NLogConfig() + { + LogConfig(); + NConfig.OnConfigChanged += () => { LogCfgChanged(); }; + } + + protected static void LogCfgChanged() + { + OnLogCfgChanged?.Invoke(); + } + + public NLogLevel LogLevel { get; set; } + public NLogLevel DefaultLevel { get; set; } + public bool AsyncMode { get; set; } + public bool ForceNewLine { get; set; } + + public bool EnConsole { get; set; } + public bool EnTrace { get; set; } + public bool EnDebug { get; set; } + public bool EnFile { get; set; } + + + public int MaxItemsCache { get; set; } + public CacheOptMode CacheMode { get; set; } + public int SleepTime { get; set; } + public int NumOutItems { get; set; } + + public string Path { get; set; } + public string FileNamePre { get; set; } + public bool EnSplitLog { get; set; } + public bool SplitByData { get; set; } + public int SplitBySize { get; set; } + public bool RoolbackFile { get; set; } + public int MaxFileNum { get; set; } + + public void LogConfig() + { + lock (_cfgLock) + { + LogLevel = (NLogLevel)NConfig.GetCfgValue("LogGlobal", "LogLevel", (int)NLogLevel.MaxLevel); + DefaultLevel = (NLogLevel)NConfig.GetCfgValue("LogGlobal", "DefaultLogLevel", (int)NLogLevel.Info); + AsyncMode = NConfig.GetCfgValue("LogGlobal", "AsyncMode", false); + ForceNewLine = NConfig.GetCfgValue("LogGlobal", "AutoForceNewLine", false); + + EnConsole = NConfig.GetCfgValue("LogOutput", "Console", true); + EnTrace = NConfig.GetCfgValue("LogOutput", "Trace", false); + EnDebug = NConfig.GetCfgValue("LogOutput", "Debug", true); + EnFile = NConfig.GetCfgValue("LogOutput", "File", false); + + if (AsyncMode) + { + MaxItemsCache = NConfig.GetCfgValue("AsyncLogSetting", "MaxItemsCache", 0); + + if (MaxItemsCache == 0) MaxItemsCache = int.MaxValue; + + CacheMode = (CacheOptMode)NConfig.GetCfgValue("AsyncLogSetting", "CacheFullOpts", (int)CacheOptMode.Drop); + SleepTime = NConfig.GetCfgValue("AsyncLogSetting", "ThreadSleep", 10); + NumOutItems = NConfig.GetCfgValue("AsyncLogSetting", "NumItemsOutEachTime", 10); + } + + if (EnFile) + { + Path = NConfig.GetCfgValue("FileLogSetting", "Path", @"./"); + FileNamePre = NConfig.GetCfgValue("FileLogSetting", "FileNamePrefix", ""); + EnSplitLog = NConfig.GetCfgValue("FileLogSetting", "AutoSplitFile", true); + + if (EnSplitLog) + { + SplitByData = NConfig.GetCfgValue("SplitFiles", "SplitByDate", true); + SplitBySize = NConfig.GetCfgValue("SplitFiles", "SplitBySize", 4); + RoolbackFile = NConfig.GetCfgValue("SplitFiles", "FileNameRollback", true); + MaxFileNum = NConfig.GetCfgValue("SplitFiles", "MaxFileNameNum", 10); + } + } + } + } + } + + public class NLogItem + { + public NLogItem(NLogLevel level = NLogLevel.Debug, + [NotNull] string logContent = "", + [NotNull] string fileName = "", + [NotNull] string funName = "", + int lineNo = 0, + DateTime? dt = null) + { + if (dt == null) + { + LogStamp = DateTime.Now; + } + else + { + LogStamp = (DateTime)dt; + } + + LogLevel = level; + LogContent = logContent; + CodeFile = fileName; + CodeFunction = funName; + CodeLine = lineNo; + } + + public DateTime LogStamp { get; set; } + public NLogLevel LogLevel { get; set; } + public string LogContent { get; set; } + public string CodeFile { get; set; } + public int CodeLine { get; set; } + public string CodeFunction { get; set; } + } + + public static class NLog + { + private static NLogConfig _logCfg; + private static readonly ConcurrentQueue _logItemCollection = new ConcurrentQueue(); + private static readonly object _logOutputLock = new object(); + private static string _logFileName = ""; + private static uint _logFileNum = 0; + private static StreamWriter _logSw = null; + + private static void CreateLogFileHead() + { + _logSw?.WriteLine("FileName: " + _logFileName); + _logSw?.WriteLine("CreateTime: " + string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now)); + _logSw?.WriteLine("Program: " + Process.GetCurrentProcess().MainModule.FileName); + _logSw?.WriteLine("PID: " + Process.GetCurrentProcess().Id); + _logSw?.WriteLine("Split Count: " + (_logFileNum - 1).ToString()); + _logSw?.WriteLine("--------------------------------------------------"); + _logSw?.Flush(); + } + + private static void ConfigInit() + { + if (_logCfg.EnFile) + { + _logFileName = string.Format("{0}{1}[{3:yyyy-MM-dd_HH-mm}][{4:d}]_{2}", + _logCfg.Path, + _logCfg.FileNamePre.Length > 0 ? _logCfg.FileNamePre + "_" : "", + Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule.FileName), + DateTime.Now, + Process.GetCurrentProcess().Id); + + if (_logCfg.EnSplitLog && _logCfg.RoolbackFile && _logCfg.MaxFileNum > 0) + { + _logFileName += $"_{_logFileNum:d3}"; + _logFileNum = Convert.ToUInt32((_logFileNum + 1) % _logCfg.MaxFileNum); + } + + _logFileName += ".log"; + + if (File.Exists(_logFileName)) + { + if (_logCfg.EnSplitLog) + { + File.Delete(_logFileName); + } + } + + _logSw = new StreamWriter(_logFileName, true); + CreateLogFileHead(); + } + } + + public static void NLog_Init() + { + _logCfg = new NLogConfig(); + + NLogConfig.OnLogCfgChanged += () => + { + _logSw?.Close(); + + _logCfg.LogConfig(); + + ConfigInit(); + }; + + ConfigInit(); + + var asynWork = new Thread(() => + { + uint cnt = 0; + + while (true) + { + var lastDt = DateTime.Now; + var tolOut = Math.Min(_logCfg.NumOutItems, _logItemCollection.Count); + + foreach (var val in Enumerable.Range(1, tolOut)) + { + if (_logItemCollection.TryDequeue(out var logItem)) + { + LogOutput(logItem); + } + } + + Thread.Sleep(_logCfg.SleepTime); + + // 每秒执行一次维护工作 + if ((++cnt % (1000 / _logCfg.SleepTime)) != 0) + { + continue; + } + + _logSw?.Flush(); + + if (_logCfg.EnSplitLog) + { + bool isNeedSplit = true; + + if (_logCfg.SplitByData && lastDt.Day != DateTime.Now.Day) + { + isNeedSplit = true; + } + else if (_logCfg.SplitBySize > 0 && (new FileInfo(_logFileName)).Length > _logCfg.SplitBySize * (1024 * 1024)) + { + isNeedSplit = true; + } + + if (isNeedSplit) + { + _logSw?.Close(); + _logSw?.Dispose(); + _logSw = null; + + string parttn = string.Format("*[{0:d3}]_{1}", + Process.GetCurrentProcess().Id, + Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule.FileName)); + + _logFileName = string.Format("{0}{1}[{3:yyyy-MM-dd_HH-mm}][{4:d}]_{2}", + _logCfg.Path, + _logCfg.FileNamePre.Length > 0 ? _logCfg.FileNamePre + "_" : "", + Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule.FileName), + DateTime.Now, + Process.GetCurrentProcess().Id); + + if (_logCfg.EnSplitLog && _logCfg.RoolbackFile && _logCfg.MaxFileNum > 0) + { + _logFileName += $"_{_logFileNum:d3}"; + parttn += $"_{_logFileNum:d3}"; + _logFileNum = Convert.ToUInt32((_logFileNum + 1) % _logCfg.MaxFileNum); + } + + _logFileName += ".log"; + parttn += ".log"; + + foreach (var f in Directory.GetFiles(_logCfg.Path, parttn, SearchOption.TopDirectoryOnly)) + { + File.Delete(f); + Trace.WriteLine("Delect Rollback log: " + f); + } + + _logSw = new StreamWriter(_logFileName, true); + CreateLogFileHead(); + } + } + } + }) + { + Name = "Log Async Output Thread", + IsBackground = true + }; + + asynWork.Start(); + } + + private static string LogLevelToString([NotNull] NLogLevel logLevel) + { + string[] level = { "F", "C", "E", "I", "W", "D" }; + + if ((int) logLevel < level.Length && (int) logLevel >= 0) + return level[(int) logLevel]; + return "U"; + } + + private static string LogFormat(NLogLevel logLevel, string logMsg, string fileName, string funName, int lineNo, + DateTime dt) + { + var msg = "[" + dt.ToString("yyyy-MM-dd HH:mm:ss.fff") + + "] [" + LogLevelToString(logLevel) + "] [" + Path.GetFileName(fileName) + "] - " + + funName + "(" + lineNo + "):" + logMsg; + return msg; + } + + private static void LogOutput(NLogItem logItem) + { + var msg = LogFormat(logItem.LogLevel, + logItem.LogContent, + logItem.CodeFile, + logItem.CodeFunction, + logItem.CodeLine, + logItem.LogStamp); + + if (_logCfg.ForceNewLine) + { + msg += Environment.NewLine; + } + + lock (_logOutputLock) + { + if (_logCfg.EnConsole) Console.Write(msg); + + if (_logCfg.EnDebug | _logCfg.EnTrace) + { + if (_logCfg.EnTrace) + Trace.Write(msg); + else + System.Diagnostics.Debug.WriteLine(msg); + } + + if (_logCfg.EnFile) + { + _logSw?.Write(msg); + } + } + } + + private static void LogOutput2(string logMsg) + { + lock (_logOutputLock) + { + if (_logCfg.EnConsole) Console.Write(logMsg); + + if (_logCfg.EnDebug | _logCfg.EnTrace) + { + if (_logCfg.EnTrace) + Trace.Write(logMsg); + else + System.Diagnostics.Debug.WriteLine(logMsg); + } + + if (_logCfg.EnFile) + { + _logSw?.Write(logMsg); + } + } + } + + public static void LogOut([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + if (NLogLevel.Debug >= _logCfg.LogLevel) return; + + if (_logCfg.AsyncMode) + { + if (_logItemCollection.Count >= _logCfg.MaxItemsCache) + { + if (_logCfg.CacheMode == CacheOptMode.Drop) + { + return; + } + else + { + NLogItem val; + _logItemCollection.TryDequeue(out val); + } + } + + var logItem = new NLogItem(_logCfg.DefaultLevel, logMsg, fileName, funName, lineNo, DateTime.Now); + _logItemCollection.Enqueue(logItem); + } + else + { + var logItem = new NLogItem(_logCfg.DefaultLevel, logMsg, fileName, funName, lineNo, DateTime.Now); + LogOutput(logItem); + } + } + + public static void LogOut(NLogLevel logLevel = NLogLevel.Info, + [NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + if (logLevel >= _logCfg.LogLevel) return; + + if (_logCfg.AsyncMode) + { + if (_logItemCollection.Count >= _logCfg.MaxItemsCache) + { + if (_logCfg.CacheMode == CacheOptMode.Drop) + { + return; + } + else + { + NLogItem val; + _logItemCollection.TryDequeue(out val); + } + } + + var logItem = new NLogItem(NLogLevel.Debug, logMsg, fileName, funName, lineNo, DateTime.Now); + _logItemCollection.Enqueue(logItem); + } + else + { + var logItem = new NLogItem(NLogLevel.Debug, logMsg, fileName, funName, lineNo, DateTime.Now); + LogOutput(logItem); + } + } + + #region LogOutputMethod + + public static void Debug([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + LogOut(NLogLevel.Debug, logMsg, fileName, funName, lineNo); + } + + public static void Warring([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + LogOut(NLogLevel.Warring, logMsg, fileName, funName, lineNo); + } + + public static void Info([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + LogOut(NLogLevel.Info, logMsg, fileName, funName, lineNo); + } + + public static void Error([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + LogOut(NLogLevel.Error, logMsg, fileName, funName, lineNo); + } + + public static void Crash([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + LogOut(NLogLevel.Crash, logMsg, fileName, funName, lineNo); + } + + public static void Fatal([NotNull] string logMsg = "", + [CallerFilePath] string fileName = "", + [CallerMemberName] string funName = "", + [CallerLineNumber] int lineNo = 0) + { + LogOut(NLogLevel.Fatal, logMsg, fileName, funName, lineNo); + } + + #endregion + } +} diff --git a/GeneratorCode/NLog.cs b/GeneratorCode/NLog.cs deleted file mode 100644 index 059a633..0000000 --- a/GeneratorCode/NLog.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Timers; -using JetBrains.Annotations; - -namespace GeneratorCode -{ - public enum NLogLevel - { - Fatal = 0, - Error, - Info, - Warring, - Debug - } - - public class LogConfigInfo : ConfigurationSection - { - [ConfigurationProperty("logLevel")] public int logLevel => int.Parse(string.Format("{0}", base["logLevel"])); - } - - public class NLog - { - public NLog() - { - var cfgTask = new List(); - - var fw = new FileSystemWatcher - { - NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite, - Filter = "my.cfg", - IncludeSubdirectories = false, - Path = @"E:\" - }; - - fw.Changed += (sender, e) => - { - lock (cfgTask) - { - if (cfgTask.Contains(e.FullPath)) return; - - cfgTask.Add(e.FullPath); - } - - var tm = new Timer(1000) { AutoReset = false }; - - tm.Elapsed += (obj, args) => - { - lock (cfgTask) - { - cfgTask.Remove(e.FullPath); - LogOut("File: " + e.FullPath + " ==> " + e.ChangeType.ToString() + "\n"); - var cfgMap = new ExeConfigurationFileMap - { - ExeConfigFilename = @".\log.config" - }; - - try - { - var v = ConfigurationManager.OpenMappedExeConfiguration(cfgMap, - ConfigurationUserLevel.None); - - var cfgGrp = v.GetSection("global") as LogConfigInfo; - - Trace.WriteLine("LogLevel: [" + cfgGrp.logLevel.ToString() + "]"); - } - catch (Exception exception) - { - Trace.WriteLine(exception.Message); - } - } - }; - - tm.Start(); - }; - - //FileSystemWatcher fw = new FileSystemWatcher(@"E:\", "*.cfg"); - - //fw.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.FileName; - ; - //fw.Changed += new FileSystemEventHandler(OnFileChanged); - //fw.Created += new FileSystemEventHandler(OnFileChanged); - //fw.Deleted += new FileSystemEventHandler(OnFileChanged); - - fw.EnableRaisingEvents = true; - } - - private string LogLevelToString([NotNull] NLogLevel logLevel) - { - string[] level = { "F", "E", "I", "W", "D" }; - - if ((int) logLevel < level.Length && (int) logLevel >= 0) - return level[(int) logLevel]; - return "U"; - } - - private string LogFormat(NLogLevel logLevel, string logMsg, string fileName, string funName, int lineNo) - { - var msg = "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") - + "] [" + LogLevelToString(logLevel) + "] [" + Path.GetFileName(fileName) + "] - " - + funName + "(" + lineNo + "):" + logMsg; - return msg; - } - - private void LogOutput(string logMsg) - { - var thisLock = new object(); - - lock (thisLock) - { - Console.Write(logMsg); - Trace.Write(logMsg); - } - } - - public void LogOut([NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - var msg = LogFormat(NLogLevel.Debug, logMsg, fileName, funName, lineNo); - LogOutput(msg); - } - - public void LogOut(NLogLevel logLevel = NLogLevel.Info, - [NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - var msg = LogFormat(logLevel, logMsg, fileName, funName, lineNo); - LogOutput(msg); - } - - public void Debug([NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - LogOut(NLogLevel.Debug, logMsg, fileName, funName, lineNo); - } - - public void Warring([NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - LogOut(NLogLevel.Warring, logMsg, fileName, funName, lineNo); - } - - public void Info([NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - LogOut(NLogLevel.Info, logMsg, fileName, funName, lineNo); - } - - public void Error([NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - LogOut(NLogLevel.Error, logMsg, fileName, funName, lineNo); - } - - public void Fatal([NotNull] string logMsg = "", - [CallerFilePath] string fileName = "", - [CallerMemberName] string funName = "", - [CallerLineNumber] int lineNo = 0) - { - LogOut(NLogLevel.Fatal, logMsg, fileName, funName, lineNo); - } - } -} diff --git a/GeneratorCode/Program.cs b/GeneratorCode/Program.cs index 78807df..c077877 100644 --- a/GeneratorCode/Program.cs +++ b/GeneratorCode/Program.cs @@ -1,6 +1,9 @@ using System; using System.IO; using System.Text; +using System.Threading; +using GeneratorCode.Configure; +using GeneratorCode.Logs; using Newtonsoft.Json; using TmatrixLibrary; @@ -15,8 +18,8 @@ namespace GeneratorCode image_type = new[] { false, false, false, true }; StartPageID = 0; key = "S0,O000,B0000,P000-255,D2018/12/31;CCAFBQMXYPOAOCIRK52S8QC8SO4A0AGA8Y"; - //filePath = "E:\\NetEase\\轨迹笔\\Sample\\123.pdf"; //"C:\\Works\\pdf\\123.pdf"; - filePath = "C:\\Works\\pdf\\123.pdf"; + filePath = "E:\\NetEase\\轨迹笔\\Sample\\123.pdf"; //"C:\\Works\\pdf\\123.pdf"; + //filePath = "C:\\Works\\pdf\\123.pdf"; sessionId = "4BD5D923-47EA-4DEF-A1CD-9B85B515B191"; } @@ -99,7 +102,10 @@ namespace GeneratorCode { private static int Main(string[] args) { - GeneratorParams inParams; + NConfig.InitConfigure(); + NLog.NLog_Init(); + //NLog myLog = new NLog(); + GeneratorParams inParams = null; RspMessage rspMsg; var tmObj = new TmatrixClass(); @@ -116,7 +122,7 @@ namespace GeneratorCode // "ZUE9BT0NJUks1MlM4UUM4U080QTBBR0E4WSIsImZpbGVQYXRoIjoiQzpc" + // "XFdvcmtzXFxwZGZcXDEyMy5wZGYiLCJTdGFydFBhZ2VJRCI6MCwic2Vzc" + // "2lvbklkIjoiNEJENUQ5MjMtNDdFQS00REVGLUExQ0QtOUI4NUI1MTVCMTkxIn0="; - + try { if (args.Length == 1) @@ -142,6 +148,7 @@ namespace GeneratorCode rspMsg = new RspMessage(""); var msg = rspMsg.FormatRspMessage(10, e.Message, 0); RspMessage.SendRspMessage(msg); + NLog.Crash(string.Format("[{0}]: ", (inParams == null) ? inParams.sessionId : "UnInit") + e.Message); return -(int) ErrCode.ERR_JSON_DECODE; } @@ -151,9 +158,11 @@ namespace GeneratorCode var jsInput = JsonConvert.SerializeObject(inParams); - Console.WriteLine("Input:\n" + jsInput); + NLog.Debug("Input:\n" + jsInput); //Console.WriteLine("Input:\n" + Convert.ToBase64String(Encoding.Default.GetBytes(jsInput))); + Console.Read(); + return 0; if (!File.Exists(inParams.filePath)) return -(int) ErrCode.ERR_FILE_NOTEXISTS; try diff --git a/GeneratorCode/config.ini b/GeneratorCode/config.ini new file mode 100644 index 0000000..a7d8690 --- /dev/null +++ b/GeneratorCode/config.ini @@ -0,0 +1,57 @@ +; 应用程序配置文件 + +;--------------------------------------- +; Log 相关配置 +; +[LogGlobal] +; log 打印等级 +LogLevel = 255 +; 默认日志打印等级 +DefaultLogLevel = 4 +; 使用异步日志输出模式,默认false +AsyncMode = true +; 是否在每条日志后加入换行 +AutoForceNewLine = false + +; 日志输出配置 +[LogOutput] +; 是否允许控制台输出, 默认 true +Console = true +; 是否允许在 Visual Studio 调试器中输出(Release 版本), 默认 false +Trace = true +; 是否允许在 Visual Studio 调试器中输出(Debug 版本), 默认 false +Debug = false +; 是否允许在文件中输出, 默认 false +File = true + +; 异步输出模式配置 +[AsyncLogSetting] +; 日志最大缓冲条数, 0:无限制 +MaxItemsCache = 1000 +; 日志缓存满后处理方法:0:丢弃, 1:覆盖最早一条 +CacheFullOpts = 0 +; 线程每次输出完成后休眠时间(毫秒) +ThreadSleep = 10 +; 线程每次最多处理日志条数 +NumItemsOutEachTime = 10 + +; 文件日志配置 +[FileLogSetting] +; 日志创建目录 +Path = .\ +; 日志文件名格式 +FileNamePrefix = +; 是否自动分割日志文件 +AutoSplitFile = true + +; 日志文件分割配置 +[SplitFiles] +; 是否根据日期改变自动创建新的日志文件 +SplitByDate = true +; 是否根据日志大小自动创建日志文件: +; 0:不需要, 大于0:日志大于(字节)后自动创建新文件 +SplitBySize = 4 +; 是否启动日志文件名自动回滚功能 +FileNameRollback = true +; 日志文件名回滚最大文件数 +MaxFileNameNum = 10 \ No newline at end of file diff --git a/GeneratorCode/log.config b/GeneratorCode/log.config deleted file mode 100644 index b4e5172..0000000 --- a/GeneratorCode/log.config +++ /dev/null @@ -1,7 +0,0 @@ - - - -
- - - \ No newline at end of file diff --git a/GeneratorCode/packages.config b/GeneratorCode/packages.config index 7f83af3..4f35d8e 100644 --- a/GeneratorCode/packages.config +++ b/GeneratorCode/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file diff --git a/TmatrixCodeGenerator/obj/Debug/TmatrixSDK_OID4.csprojAssemblyReference.cache b/TmatrixCodeGenerator/obj/Debug/TmatrixSDK_OID4.csprojAssemblyReference.cache index 0b24726b307538785f2d711b0639fa2a7c6cc135..be8a7d6e93eb3fdc6363bb2d54685dbfa3066df3 100644 GIT binary patch literal 81787 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 JOeBG}{|}5XB$@yK literal 56642 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 diff --git a/packages/ini-parser.2.5.2/.signature.p7s b/packages/ini-parser.2.5.2/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..d2a845c3e0e711a725995bf6d04be90455536765 GIT binary patch literal 9464 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 Kn$oRn%>M@q;!4^8 literal 0 HcmV?d00001 diff --git a/packages/ini-parser.2.5.2/ini-parser.2.5.2.nupkg b/packages/ini-parser.2.5.2/ini-parser.2.5.2.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..01037a4a8318ef7f727b5cc3a7194f4f51301266 GIT binary patch literal 38045 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

tX)>7@vR4_ z0EPLGCV7tvBSwvZ&@IWsM?{KvBw57)yj+?VJsptW{+PvG|4fzI-L^Lk$$H z$>bb$Tz-nvE18`u4hAzs(-OxcLBx3cX_R^kWcJM|dGQiqH_PIRcM1j{8MmM1xY3{1 zu6d+FBb+ThZo&5vIc>(~i!Y)xN`YyF(a|TBe$itQCiG*l__s8TeFI5f`8SAezxk9nLtea$2an|BYmN|{=>3G z&n?RvGZ!ShOl!Uk$u>O~k*~};JYOwtAhym`DI9sgWK z*|memgAX0v`0G;KqL(v$l=# ze#U^0vx#!6XmEZ)2>&&eE(c3=zl?_TQ8+E*zRYgifjV=`N;q4(<)KAMf!f?`12*>u z?Om62ZAsQ)x+sJ24kgHicvXF*{0aImr|#qZxRV~iRu)NLv`{t9iQjev&~lo z0B>Qfwo1>6%6Y+7L_IC<=GZ?L$JRuxr5$tqb-hL%Q-Jc**G7y*>l#iWkBGHKoD|m+ zjhcFXkLOcULzy*>7RMqxJCwH{_hJi#YJ3YggTK4G#GA(_N#?W?$xoY9$DQqwYUbo%7`K_a7{9c23T_cB(~*xbglw)w(2REc+? zyErVVoBU?ZMqqfVr^RI_>Kx$5`bG`-bEbU%jEYW=*t~cL`my zcxv6LSon5GCcTB?I*|G!`j8e)6Qd{B^}x{SljDQL`AqZUM!ICVA8R=2iK;J5T0hDt zbW(rpBaNfqBvW66)Id1vIRWY9?CD(aC?pK8u#5w)@< zVkDKhx27CMVO*Xbc#eDl38V75r3oKarOls1!h72x>+jECudsNEAfOZoPDU#vlk;cM zdw|7PL#)jGs-}h2o45QiL((;4$*KQ#rut|8fq(+TZ?7VwZ{I2~d2pH16MLj; zbMMmEM6p7jd*P~@ye^#|%jJGHKeH_YW>NkT%z z0h;EDFplvp3!)!s9%UuOE9$S6aJQ%?>>a{pBCNMKh5RGd`lI(t-E=cM9_n9v)Cgpr z=O3(3e{$^)M2LMDMviRGPE+?vmCAQISh?`oX9H)Z%-Ev93#NmQZVV%IAL1*^IIL9r z*DR+`*sTKkLoBCl*{$sR`L}f2g+e{dcHdn}0P0`ip8G96Eq?OD9-j0)?>DA{Rg`Py z)eFn%Wc!lRy|BiKv+_pH*1ZhNX~wyU;l{GL;|B54&qTRAoIQ~)Q!>k9L@UplOYsDi zsQmb~DiB!5qL#)wp&h3Y$vL^(ORC#efT2a8~S+ze*R`;49d#P-_py(H)~> zx{NHON&u03UxTHs+M);FPlJ*d$LZ^O=r?Hi&8N#NLCB{rhfH0#J_ueM%kchKeuz$y zH<;grmO;!CFy!LC;;mvkP^_DXPEgCJi)0x{m!h38`=Cp4bkGJUz)!H-H8^Dqp?f}9 zD?1R{5dM1(Ea5IPH1Jexe! z5tP$5N}x^-MrncJ#YNoM0WDxd!~;>tVAHZ`g9czQ$DVa_1j}y1AM%5vt3Zcv;Pfhx z0uGExc3yX-D3hCv6F&yRBEkZ4R3r=BlOWhlIVZUI!D;G;e2B6km7qA7#H)qi4H)_{ zf$mqq>YHWDA4Q2b-I$Op!Kgm$UXb|r1B8A!gF&B+YX*ZG{S>+?f)qAAyY+*ZHW>~h zMFlp)mkC9EHyyiegV4s%yEcM5MFmX8>4Rg(f{h%PH9F9`9icNX`4P|&_$5BTE5o;l zIzk1)yM=#7{|st__b2p2+U(zfzJ+z$*c-^zgbrMH4{i@48!K71%BFQwJ}m3n84K;2 z6=mIYIeff~x~a4LwCmLvZC7hhQ?_GB6_ld{;}H;K;zp$7VUAFcXSOf!Zk+>hbl3|x zpOfQmawvZ<@^0)ap-taqMp14@5i()EvA8DkUAQ&Tf#AGgy-k*7g)Wp#$3b#NfM&4K@pz|;f zSn0zJOcL0buzgr11ZgqL&?Q)Di9je8sQyFCtRlF6aaQOLu>E3zAOqx>$PTE_2NT(Z9GAR75Kd`=mP8+!Z9l9Bjks}-u83`|8cYOd= zSHtq7k{~c`_`<#6s1CUx6(rFf`i5qJRQ|;ufd{(Gd#PI{n5*qz*|tmfvnPq9a`v=X zQY6D2yA$3<{@s984gr-TDrmAnpu&J7yc!44OYw8}dx|h0vk35$&n}q4IaK zdOU;@=o!>K^mC~5LsxPV(C)e`k^}ng>IvdLjNbzxBt4KHoIb+qFSOrb)f-^jFlIi? z!x*5GEU%(`h9g-sMHWUN39;bq$`TEPsfcty^BWl;+=U^Dh=nBv_3HL~chp^Ds>4e5B}ml}}4lqcZ7a zX?hjwfrA209^Mz4xdJ>B8X_y&-bZd9mA)sx9XK~>73{l=^Xr|7(~Wi}Z@@AYwqfq~ z#i8u?!C~q5#>v5)$E^T9v^S+8SX?Hps+=aR6ToNArq`q4W7OXDGif_5+UGNsl|(iA zi`}>Ae=yJh*?b=$<_uq+^8^M8>h8l1oco_gxcS#HfxzYtrjBMnoE;%b4RvW|-n$?{ zcQJAv{|=G!N0cCbGt=J@dz{=|?C!$?nVGVh+nL*&JGk8i(qUtz{GHd$+{OOS$U=WD zaDU}@PA^yM-(o#IJy|?C?gayJhS*rO6&2L(LlQAtJGifWLzZ+o!n!7l>&2ca@_Yq|MORl>TX6CM@F4j(W zfs};Bz${8q>P%ooM+Zl+v4a^{!@=6ko5KtYL@{y#;v|{anbR@QgMkn$F2*k2U?8dz z7`WeEi?e#VSi1q=U?AuU_%1jR*uurp9{fld?CJ(&v3F$xTL7_G{!HCT2QC3cT)}r` z-OL@p)(&6^Di$OpF*{dBu(iF@&+Y)*o4Z)v$-WD8^hdNNCa{U4o7KGncdFT$yO{%} zt?%yv+{)G5^gb{Y6By9Y+yfA8GPHU_)8o4A_0fgLTtZdT@CTXSz$plS|o#?}tz zW?&QV`?Gg?x&m6<)l}We+VyvJf&a2WAT;-F1Qatfzi%QlN1%Nj9NoZH#vXTPyuoJX zK+q{OU@QVLnZS+?U@dD0Ge=KXu-M~AU{hl|JJ-94I=YydyMWys!6xQlCr1}IW1wwW z?mOqN9dg$})_^ECYYS_07vVo6Dc$G%%N0SOE}no)*SkD|tiMx&cE+x5iom1*%A1LM z3oE(Hn7c87HGhWEVrSuH;f8Rq0Y`2gCa{FNotwLhxsZdoyPJ!#9TWJmyNR8(sl2(j zx}&YRgOG!}ot*$MCcMCG+$`KI5Eh8Q-GBj0yBOP>1Gl#Ya|*Kl1G^5QH2yITrn0yGG238$Pxd7cm?z z9%I`|B=CSw(;?NCPlSNZ2YBXPAY{-i}O3saW5PmSh@MFzc8AzTqXI-)TBJVxeM z_5Mt8`*R-z8&w=N^AO9!jH9;_pVqM&uZ?t=UjK-6r{T)oi}{LE8ryLN88wLThMoWL zc%I_S2ADEaZFr76wqKFoBi`oJ>d*o~=?xSBtP6wnEqvDMfY}U{^ z9HZBWLj7a51I7Fi{zOpp=X#1~46o8JsiC0mK4?JoSzN6x9gOe#j>U<`6%s;y3jcs1 zLN?+86@&nt9YVbhoLYef!LXr2P~jgKMaY88VPK&_a8MAlKQn@|wO}=VjtqV_BqVkg zpqF_$AuIqKLfBY1SU6dLQ_Ql)u2%eBd>(94R?ckB4y@wR>^wHkk9jS$AQI9}QW6}p z+%oLij5@sD9BP^pnkqs_NZBE15|9v>CP)Z$RyGVY2pSp#Wn+0Ae@6NyZr$iR@gaoo zPOqODgWv$Y%-N7358z=mVBxW$HPqN}A=q~bBy1E(YfEbhAmADJk%K84Aq4;KG%_~E z9pIV)mrQ|6cR|a*Y|(A z_^2E}>UZ-0mKq@-%D*-M&@nI}Aap252nY!}1O$SrK*N2%CK04p6M52PbmfdyP`U6h zDXR4J{TY~#PTL6OGH9*@H<{g7u%U)7EIN823kf9@-zP4%;T%1Uo!jHx z=S9Kd+yk3$6vwK@OIhG)@-H>BHw0!ASWgVEv%+9b9 z+|Z%d6@`9!>mb=>%$0(7qm%K>!+!cGS00t|7TIO)wb58?JXgP$MkF}r!@51v;3Ge_ zG!8q;t;jKU-P{)J5X?P3{LGj9E;(PX^Jk~<+1x9`{V6L&K++NCbl!tCb8A}oy#XX> z)%A&mnsx29se7eGhfRIOBFT7Tw>c?0h=v57%Fr+%C{Ug$#2A7GbSf!22y_bz3k;+P z2>M+b`z{R!fdRfCq<1IKVDVsaq;_(vP7_B$*qBwG6%|orp4bnfL&)zgQ^68I@Phtz zhQE(Ppc_C?xoB-mU-k}HU0i+4k~%M3EN0l(#NACQBX^FcW1ox^;h^G5pV_?sbV?_V8nbl4( zbJC7@({&8lqRCOmW6LJH_LC!WTNG{tyg(kmk|*{)M_AHEq0_Xm9rEu}JKkC{SYa*& zZJ=;ibYi38IGhBMn_`e%KPLt@e#8|t8G~vj@*d`3IA>OTd3*KtrAiYc0^)m?ua9es zu92iza}SRpA#e~#2rR+RsSEpnfY@-V)xup(qQNowG2&lGF7p4?smsQ}24QDs11u~E z1em()ynjhTT>eiH1PIj#3>E-E=zb%JnyeT*_%ARbac2dn0oZ$Io&a$2-_7I8k98!0 zXqZ)&o(Lb2*&Y#o82cvmvW9ef56tb<;VVS^t1yXeW{Yx5~xz*JwvW?!l*2;)Hxoz)zCd`rMB+rQ9Z`7 zjD9LL$()n76~zQjt|XC*L|j5S`=V$>&{5i3Tj|7R!Qm`i?vz{hK5)x#Br#`QfQ{tC z_A%0$R;ygYmfKgx8@rJJH$HCE_=B|urTmg@8>F(ZlX6R?hTe;qaWDpAYg>DGjY+7hSO~%z?=u@$@EE$8tKjRbLXMIjgiACp#{ZbdA)ry9 zrG_9_cXRQ6?jl0qfw>C}g8C2h`wsR=X<$(xNbrb^@W9f500RT@{`G$l2-Y5A3!(m% zhJYdnentRwG<9|Q+ll~@_?-(ng6C&0Q{%e@!}V_&S$}o+&yId1dAC|fh_RTuxIu!0 z?-U}3^?`Un__KMlxg$7#iE^>y{CDNp{l~H#|9)BJI~BmNvJhzqFFexSY98^!4hk9; z!T_QBRYzzL9?6|zu0Sxbeukaoj;BKN@RnLALFf4&J zc&b;<#}nPrRq7oIVs*b5PzNhvWJoLN-Nx4tBcLVV zeru^}Q0aM2T}jOb0Er z^CzA{f@A)Upx6*hVBo?Q4d*+3LlMkN*Qi&d_CcVyEQMfia95UT)yVyBcfr(Sn3)1c!Xa5 z=(n3NBdgOARX-pj*y(p`h7^9`N;T<+B5@4?erETg9vP0NQQLQovI4LEAWj)|KXM^i z#NtD(qgBA%Nqtsx58IrD19cZ{Y@l%~uO-HeWy9>@5V*}ipc`A*HYH9qk4(}h^Je8j zx2aXTfWU{w4}PXS0G(#S=%hD@bN=mnOgKaQonP462eef8-{$PUoYa5XNsGCU8W?Q# zj5ZeqXYxjN(L+AZjs6{n5rXc`@Be_qo_}DW6T|_+mCcdO7Qy-_7XAazT&;}RnT`K2 zz?n^5nJw7>IJNta#r^@I|4A{0KM+s~A_3v~!=C{V5C-%=0zgD~c*|fE5G)819QF$} zf%U`-;_+{;CrZCcL7*eVe^vayT2Jn*hu>?;o$2t?a`?HlpxjmJemR7OK>Y(C?lJYa z`>ho;*CQ`q4x(=22pRs>t;&R#5(*S>Lu2OZsE$x!g;+(zt(L2bZvs=wIcntKgEHte zQa;)DRVr#dp$PpjcbhgtZ?Io69HE$?b8e@){TRb{#7iPkWr~ieolYtmHCSm$$$9D4 zX?_jch{1N1{Zi&YNt?EWKa;mdfxIbL{BWYm$-s$cR8}f3?Ljs*#B;=%TcKA?cU>WA zJZIEuRV`|u%svNC57ELDHiQBbc2`mKzu&g)Y*~LTW?Cmgl!%{++dFe z;c3_LKEmvxri>}QiW;qUf zN?0&{+-KALWB*?1_$E2*5DtIMy&np?qi#`?@JEW(b3bw*Tz}IA#72Wh^=tJucCrS7 zjRWz=@7Y8T4j>4*nYkB>jjN*rBzWqtimlX}v@tgD>>6DoTpkvc&43BSde%v!SGk*MY^OW`%3qQ?dk|Ik09OzJBJng2VM` zOSf<9vsB*@1tuCA$&%#Ide(+Iex~YCeCT%7L6#sc^fm0_y8}t4F>|ILYt zQ}37zQu`vVhnXZxY%lX+a&9j%&9csHmnUv>JHl&m)Y>DoeOqv@^H;0HbTG>a!3IM@ zuu1;f-)L+h*vP<1gx{m>j_kp@goI$7-jO}1e;Wh9vcUP5(jZu1dQbsPOAcHh1||SJ z^1VHHDFs5nhXLZ$|9vjOf>EdjD5Hd^aw?BCiBz~=&z&qO9n%2|>AKlRhLXbm7HC|k zkEF|em^bE6q#EC#(I_}3b7}-b2+)C`_rE6(2SgVF`0ZrSVB&{}%fS!cRWdWagpoHi zW7k-8l#YJ^Pa}XeVbRak6_p(vkslli2@d+Z5kd+~+k5K*N6p*b7~uR&!4i%x0E2o@ z46~8n+p+*5g!lWhy2~B+t7PtWM^FOP&M&9#cZNGy=HdpcTictfxf$C#-T88N$PDna z%wQSz>=1NWz>;eQ2&|l+)|@C&uNg%hHU$h?>lzkOAL&298WP<8cct+mxPK^(2GDEP zce0u8=qr}LsQc>z`0wiS0~S6|U1V%FI#YTu;OO$+akqaF0jMYqkle=ZZdQ&i);<8c z*{{COD-+$+(4;b?p)POkWO{Q^Q-D>N`P*Hs{icOe~PYd<= zs!hln(|5jZ7G9t0{B5tjd2Un@s(z5!wP3*7IhmYKuvQWwV-xLKQLdL_iQYJlozgg@ zFOu9L#?KHBtRgw?q^z~QO0xRSdtZA7t*1`vMHkaXIzFQ>6pxP>ht~=R5aWO-Fp{a` z{Om&f%X(*|$x}lp`K7+aHFrsNF@7><2kQ}JcWK1&;R(j%u@B#xMQzPuv=qN%V|s_} z8K|FgW+8%3FlgZM<>rn^eJpI#j4bkJ4<=Ybjt&nVY)cN|+I)d=;P_acr2#c?j%btA zY`Cz@aTI2B^@J9){yW}rtENp5&GSD@$>3T@aMgb#*#6GI!9(nSnL!{FSYwD`j(+wN zhz>*xqJj6o+TPgGoYm6W0zv^HhakYiF`~gh6T#xdt$!qnD1RPn`}RYS&7>>=lP@6) zcU_%SF@9{={5DWU1*F_OJu_Xc zTcsGH=G*##Yax9~j5((0n&&TlCA3#;Xfk;ua=GlL#Ym7DT;EGKmy}xIv{O#nfq;29 zHNUtXb2!Cb9r{)4OI&A1PHCqQX~QJ%_H?x#zp{-;T$hENY3bH%KHh2Ycrp%}|7bGj z>_nWCYp`!dKzo|;j8tS=eBVw4q@Szv@b;}nRH*y`Tq3;l@td?4O}nEZ#z(wgl~dCg zbe{vRC@%nD;Gf{-3s*Dw$Vx@>V(95a24UuZa7F)LpWJtDEjNVi4=?r)@B$uR0O_CL z<@tAP{y$w%=pYaOKw0wtazXhw$iY^fOdSp7%orDaqTt*ejgx9ng`jgedmNl?L^>@L zd#a7%kQt6VeQVDweKX6hY2C^P5oFEyOB3RNokD~!p92l-MR_L^;5Wqlyh%nzDu_F0 zk`qo2_w6n#QutT`yJ_Ee@%4oj?Cn)W#=d_(V81<)*1%6r#+Ui_G`;vVY^8VH&$%C- zzFuT46!qa-UqoTWE2JilN4LWQlV`QBM%?AmF4Po9~(O%_*>~U1x>|(?^XeGim@2);E9yHCYO_ADT z@+Y3Z7|K|c-EUPxo8(T7@aoIq`Q^ZR0tSie-yKj8{J$g%Er6B>h%iHlKIF;Y%@+j- z)h}2Am@xcbwzL_GtGB(W$vvi+I=MnY|%edpuL)V2pdND^d*zHB~+`SvcJ^%Ihv636bR`WJ%=@usqTq7=Q0pB$d1 z2{xpqZkE6|Js65p(-MnkT_ICcS{TOgvJ-bWZ0x%<)>A!GI=6j(A?MR^GWr8%diETq z7=2ak0?B>1-<_q@A{_Q*(E&iBztBcS=$1H7&1s%7J= zNiar8irF``_Bia{MN&mqI$u7WU*p4RpIiI*cAHVRE?HXx)_)*2IK#wkWr=Yx zfSvLHc5?j0PIc|$(rK|zl5JrnzS$|NU;nY(K>pXTC`CGNNFXZk@O>PzfNSNu{O{Tab_Qd8pkbal3C@a7iM zD>*;VZDw3PUlH22)F~wjztbL{)U&ldV!cBtD`{#tQ;%09-(TA?)M&0p2dX+(9&=4e zQ^AvbkYy&VAAK|HK^04KE8N)%uV;-=XpVMiQ0dRIr&!5#Ff zImwB=cQRpX--nsYwL2;=DrY585u18EKM_edjXS`6R!!{1Ky;pMq0~4gZ`*s7De%RB zR3Y>>72OwkLnBma0(GZjdbiR+ra5b=;FC%ltj69gt&_sg9)mpgN=>r@`VeSe!`#ps z+RI`@=m{}#}R-T^8(EFXmDAIzMaD>FdXv3TC2+`Zd%kD+(;92YmU zn=5eH_#VRW?j+FMJ&*nCBOAoO!#Thwdj5h?08(us))0nYX#i5mexfCC)BC45|F|ne z;CEi=-;5)W*Vx+lzf;iM<==)=uD`(PgNE*#6qi(biS(gm=$6XMAFM6se}mJ1iMM}w zlKktb2!0(>)RvyE0oYam3Afg+uOym1@?*^@iCSfNhsdkj>9(e%@cIGOfTYd#J>%NR zqL*uLhhB7Z2_bJX~H7VNpaKI4z z**-|ZZ(W<$o}|Dw-`E|e8D?@%&j|cJ)XHF0*6UyYA#cd8XtozB<0+D7!l`2JH#UI? zhx4!Gk6|KSb&iOaef4M87!|fHp+^8*lPoaD#XB#y`2g zvUW+*$Ga>Pf&psF)--F^$nGH_er^dJq`Z5J+eO1{jnOVDkzr_=8Wk z&zQ{a)Q`7TlrY3tlLrXT92pf1Z1c(Ejz7p(Sl+QazqZVP?l`jN5+bMXP?!hmTKVSQ zi0n0@PJSCVWk&j#tBjV5c?jp2K0ftSMh$9^!Wul5Lf1JQ_9nz7{D}iOi2#&3n|Co7 zHaytJoK2%ukXXQ@|I3egH6PMvM8i;fr6bYstzFgUoL{iTc}5|VtR+mW)zKD}@f#ly zj<;Z)BUK;1xy|0uq=-%;TkXOT&O;UKMSVR`G!bPmGP!DL`MJq@M(&)L_VMZde8p`V zsU|==_u{)>HvWKU;C6m6Axy}wET9!wTOd#x^C^(g&)5cjaFUCtIXVF@cOAlb?CKGf z{=}h5=Dq8!TC>V?reqzVymUEA)y@X->2_jrn#*r(smzUKNRQ<~z;-YkU_aC!`%J&` zVY=smprGzP$oFUedN6b`w{vA>xjX(U2n~gJzd?0cxO5>5tc%-GVM`y literal 0 HcmV?d00001 diff --git a/packages/ini-parser.2.5.2/lib/net20/INIFileParser.dll b/packages/ini-parser.2.5.2/lib/net20/INIFileParser.dll new file mode 100644 index 0000000000000000000000000000000000000000..d19e920fe8f8f14a9fed80b5c1b1731ca526159f GIT binary patch literal 28672 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 T<>XiA|0yN>f2IG0J@7vPT+0Cb literal 0 HcmV?d00001 diff --git a/packages/ini-parser.2.5.2/lib/net20/INIFileParser.dll.mdb b/packages/ini-parser.2.5.2/lib/net20/INIFileParser.dll.mdb new file mode 100644 index 0000000000000000000000000000000000000000..3c8c37e1473a511e99b162f3c201d097e5b7e344 GIT binary patch literal 11223 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 VSzdnuv%I>1Szg`2EU%v6{{sur&I|wm literal 0 HcmV?d00001 diff --git a/packages/ini-parser.2.5.2/lib/net20/INIFileParser.xml b/packages/ini-parser.2.5.2/lib/net20/INIFileParser.xml new file mode 100644 index 0000000..7d5e96b --- /dev/null +++ b/packages/ini-parser.2.5.2/lib/net20/INIFileParser.xml @@ -0,0 +1,1181 @@ + + + + INIFileParser + + + +

+ Asserts that a strings has no blank spaces. + + The string to be checked. + + + + + Represents an INI data parser for files. + + + + + Ctor + + + + + Ctor + + + + + + Implements reading ini data from a file. + + + Uses codification for the file. + + + Path to the file + + + + + Implements reading ini data from a file. + + + Path to the file + + + File's encoding. + + + + + Saves INI data to a file. + + + Creats an ASCII encoded file by default. + + + Path to the file. + + + IniData to be saved as an INI file. + + + + + Writes INI data to a text file. + + + Path to the file. + + + IniData to be saved as an INI file. + + + Specifies the encoding used to create the file. + + + + + Represents all data from an INI file + + + + + Represents all sections from an INI file + + + + + Initializes an empty IniData instance. + + + + + Initializes a new IniData instance using a previous + . + + + object containing the + data with the sections of the file + + + + + Configuration used to write an ini file with the proper + delimiter characters and data. + + + If the instance was created by a parser, + this instance is a copy of the used + by the parser (i.e. different objects instances) + If this instance is created programatically without using a parser, this + property returns an instance of + + + + + Global sections. Contains key/value pairs which are not + enclosed in any section (i.e. they are defined at the beginning + of the file, before any section. + + + + + Gets the instance + with the specified section name. + + + + + Gets or sets all the + for this IniData instance. + + + + + Used to mark the separation between the section name and the key name + when using . + + + Defaults to '.'. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + See property for more information. + + + + + Deletes all comments in all sections and key values + + + + + Merges the other iniData into this one by overwriting existing values. + Comments get appended. + + + IniData instance to merge into this. + If it is null this operation does nothing. + + + + + Attempts to retrieve a key, using a single string combining section and + key name. + + + The section and key name to retrieve, separated by . + + If key contains no separator, it is treated as a key in the section. + + Key may contain no more than one separator character. + + + If true is returned, is set to the value retrieved. Otherwise, is set + to an empty string. + + + True if key was found, otherwise false. + + + key contained multiple separators. + + + + + Retrieves a key using a single input string combining section and key name. + + + The section and key name to retrieve, separated by . + + If key contains no separator, it is treated as a key in the section. + + Key may contain no more than one separator character. + + + The key's value if it was found, otherwise null. + + + key contained multiple separators. + + + + + Merge the sections into this by overwriting this sections. + + + + + Merges the given global values into this globals by overwriting existing values. + + + + + Information associated to a key from an INI file. + Includes both the value and the comments associated to the key. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + from a previous instance of . + + + Data is deeply copied + + + The instance of the class + used to create the new instance. + + + + + Gets or sets the comment list associated to this key. + + + + + Gets or sets the value associated to this key. + + + + + Gets or sets the name of the key. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Represents a collection of Keydata. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a given + search comparer + + + Search comparer used to find the key by name in the collection + + + + + Initializes a new instance of the class + from a previous instance of . + + + Data from the original KeyDataCollection instance is deeply copied + + + The instance of the class + used to create the new instance. + + + + + Gets or sets the value of a concrete key. + + + If we try to assign the value of a key which doesn't exists, + a new key is added with the name and the value is assigned to it. + + + Name of the key + + + The string with key's value or null if the key was not found. + + + + + Return the number of keys in the collection + + + + + + Adds a new key to the collection + + + KeyData instance. + + + true if the key was added false if a key with the same name already exist + in the collection + + + + + Adds a new key with the specified name and value to the collection + + + Name of the new key to be added. + + + Value associated to the key. + + + true if the key was added false if a key with the same name already exist + in the collection. + + + + + Clears all comments of this section + + + + + Gets if a specifyed key name exists in the collection. + + Key name to search + true if a key with the specified name exists in the collectoin + false otherwise + + + + Retrieves the data for a specified key given its name + + Name of the key to retrieve. + + A instance holding + the key information or null if the key wasn't found. + + + + + Deletes all keys in this collection. + + + + + Deletes a previously existing key, including its associated data. + + The key to be removed. + + true if a key with the specified name was removed + false otherwise. + + + + + Sets the key data associated to a specified key. + + The new for the key. + + + + Allows iteration througt the collection. + + A strong-typed IEnumerator + + + + Implementation needed + + A weak-typed IEnumerator. + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Collection of KeyData for a given section + + + + + Information associated to a section in a INI File + Includes both the value and the comments associated to the key. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + from a previous instance of . + + + Data is deeply copied + + + The instance of the class + used to create the new instance. + + + Search comparer. + + + + + Deletes all comments in this section and key/value pairs + + + + + Deletes all the key-value pairs in this section. + + + + + Merges otherSection into this, adding new keys if they don't exists + or overwriting values if the key already exists. + Comments get appended. + + + Comments are also merged but they are always added, not overwritten. + + + + + + Gets or sets the name of the section. + + + The name of the section + + + + + Gets or sets the comment list associated to this section. + + + A list of strings. + + + + + Gets or sets the keys associated to this section. + + + A collection of KeyData objects. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Represents a collection of SectionData. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + StringComparer used when accessing section names + + + + + Initializes a new instance of the class + from a previous instance of . + + + Data is deeply copied + + + The instance of the class + used to create the new instance. + + + + Returns the number of SectionData elements in the collection + + + + + Gets the key data associated to a specified section name. + + An instance of as class + holding the key data from the current parsed INI data, or a null + value if the section doesn't exist. + + + + Creates a new section with empty data. + + + If a section with the same name exists, this operation has no effect. + + Name of the section to be created + true if the a new section with the specified name was added, + false otherwise + If the section name is not valid. + + + + Adds a new SectionData instance to the collection + + Data. + + + + Removes all entries from this collection + + + + + Gets if a section with a specified name exists in the collection. + + Name of the section to search + + true if a section with the specified name exists in the + collection false otherwise + + + + + Returns the section data from a specify section given its name. + + Name of the section. + + An instance of a class + holding the section data for the currently INI data + + + + + Sets the section data for given a section name. + + + The new instance. + + + + + + + true if the section with the specified name was removed, + false otherwise + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Data associated to this section + + + + + Configuration used to write an ini file with the proper + delimiter characters and data. + + + If the instance was created by a parser, + this instance is a copy of the used + by the parser (i.e. different objects instances) + If this instance is created programatically without using a parser, this + property returns an instance of + + + + + Formats a IniData structure to an string + + + + + Produces an string given + + The data to string. + Ini data. + + + + Configuration used by this formatter when converting IniData + to an string + + + + + Represents all data from an INI file exactly as the + class, but searching for sections and keys names is done with + a case insensitive search. + + + + + Initializes an empty IniData instance. + + + + + Initializes a new IniData instance using a previous + . + + + object containing the + data with the sections of the file + + + + + Copies an instance of the class + + Original + + + + Defines data for a Parser configuration object. + + With a configuration object you can redefine how the parser + will detect special items in the ini file by defining new regex + (e.g. you can redefine the comment regex so it just treat text as + a comment iff the comment caracter is the first in the line) + or changing the set of characters used to define elements in + the ini file (e.g. change the 'comment' caracter from ';' to '#') + You can also define how the parser should treat errors, or how liberal + or conservative should it be when parsing files with "strange" formats. + + + + Default values used if an instance of + is created without specifying a configuration. + + + By default the various delimiters for the data are setted: + ';' for one-line comments + '[' ']' for delimiting a section + '=' for linking key / value pairs + + An example of well formed data with the default values: + + ;section comment
+ [section] ; section comment
+
+ ; key comment
+ key = value ;key comment
+
+ ;key2 comment
+ key2 = value
+
+
+
+
+ + + Copy ctor. + + + Original instance to be copied. + + + + + Sets the char that defines the start of a section name. + + + Defaults to character '[' + + + + + Sets the char that defines the end of a section name. + + + Defaults to character ']' + + + + + Retrieving section / keys by name is done with a case-insensitive + search. + + + Defaults to false (case sensitive search) + + + + + Sets the char that defines the start of a comment. + A comment spans from the comment character to the end of the line. + + + Defaults to character ';' + + + + + Sets the string that defines the start of a comment. + A comment spans from the mirst matching comment string + to the end of the line. + + + Defaults to string ";" + + + + + Gets or sets the string to use as new line string when formating an IniData structure using a + IIniDataFormatter. Parsing an ini-file accepts any new line character (Unix/windows) + + + This allows to write a file with unix new line characters on windows (and vice versa) + + Defaults to value Environment.NewLine + + + + Sets the char that defines a value assigned to a key + + + Defaults to character '=' + + + + + Sets the string around KeyValuesAssignmentChar + + + Defaults to string ' ' + + + + + Allows having keys in the file that don't belong to any section. + i.e. allows defining keys before defining a section. + If set to false and keys without a section are defined, + the will stop with an error. + + + Defaults to true. + + + + + If set to false and the finds duplicate keys in a + section the parser will stop with an error. + If set to true, duplicated keys are allowed in the file. The value + of the duplicate key will be the last value asigned to the key in the file. + + + Defaults to false. + + + + + Only used if is also true + If set to true when the parser finds a duplicate key, it overrites + the previous value, so the key will always contain the value of the + last key readed in the file + If set to false the first readed value is preserved, so the key will + always contain the value of the first key readed in the file + + + Defaults to false. + + + + + Gets or sets a value indicating whether duplicate keys are concatenate + together by . + + + Defaults to false. + + + + + If true the instance will thrown an exception + if an error is found. + If false the parser will just stop execution and return a null value. + + + Defaults to true. + + + + + If set to false and the finds a duplicate section + the parser will stop with an error. + If set to true, duplicated sections are allowed in the file, but only a + element will be created in the + collection. + + + Defaults to false. + + + + + If set to false, the stop with a error if you try + to access a section that was not created previously and the parser will stop with an error. + If set to true, inexistents sections are created, always returning a valid + element. + + + Defaults to false. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + 2 + + + + + Responsible for parsing an string from an ini file, and creating + an structure. + + + + + Ctor + + + The parser uses a by default + + + + + Ctor + + + Parser's instance. + + + + + Configuration that defines the behaviour and constraints + that the parser must follow. + + + + + True is the parsing operation encounter any problem + + + + + Returns the list of errors found while parsing the ini file. + + + If the configuration option ThrowExceptionOnError is false it can contain one element + for each problem found while parsing; otherwise it will only contain the very same + exception that was raised. + + + + + Parses a string containing valid ini data + + + String with data + + + An instance with the data contained in + the correctly parsed an structured. + + + Thrown if the data could not be parsed + + + + + Checks if a given string contains a comment. + + + String with a line to be checked. + + + true if any substring from s is a comment, false otherwise. + + + + + Checks if a given string represents a section delimiter. + + + The string to be checked. + + + true if the string represents a section, false otherwise. + + + + + Checks if a given string represents a key / value pair. + + + The string to be checked. + + + true if the string represents a key / value pair, false otherwise. + + + + + Removes a comment from a string if exist, and returns the string without + the comment substring. + + + The string we want to remove the comments from. + + + The string s without comments. + + + + + Processes one line and parses the data found in that line + (section or key/value pair who may or may not have comments) + + The string with the line to process + + + + Proccess a string which contains an ini section. + + + The string to be processed + + + + + Processes a string containing an ini key/value pair. + + + The string to be processed + + + + + Extracts the key portion of a string containing a key/value pair.. + + + The string to be processed, which contains a key/value pair + + + The name of the extracted key. + + + + + Extracts the value portion of a string containing a key/value pair.. + + + The string to be processed, which contains a key/value pair + + + The name of the extracted value. + + + + + Abstract Method that decides what to do in case we are trying to add a duplicated key to a section + + + + + Adds a key to a concrete instance, checking + if duplicate keys are allowed in the configuration + + + Key name + + + Key's value + + + collection where the key should be inserted + + + Name of the section where the is contained. + Used only for logging purposes. + + + + + Temp list of comments + + + + + Tmp var with the name of the seccion which is being process + + + + + Represents an INI data parser for streams. + + + + + This instance will handle ini data parsing and writing + + + + + Ctor + + + + + Ctor + + + + + + Reads data in INI format from a stream. + + Reader stream. + + And instance with the readed ini data parsed. + + + Thrown if is null. + + + + + Writes the ini data to a stream. + + A write stream where the ini data will be stored + An instance. + + Thrown if is null. + + + + + Writes the ini data to a stream. + + A write stream where the ini data will be stored + An instance. + Formaterr instance that controls how the ini data is transformed to a string + + Thrown if is null. + + + + + Represents an INI data parser for strings. + + + + This class is deprecated and kept for backwards compatibility. + It's just a wrapper around class. + Please, replace your code. + + + + + This instance will handle ini data parsing and writing + + + + + Ctor + + + + + Ctor + + + + + + Parses a string containing data formatted as an INI file. + + The string containing the data. + + A new instance with the data parsed from the string. + + + + + Creates a string from the INI data. + + An instance. + + A formatted string with the contents of the + instance object. + + + + + Represents an error ococcurred while parsing data + + + +