示例#1
0
        public void LoadDefaultCSharpFromEmbedded(CLogConfigurationFile configFile)
        {
            Assembly clogUtilsAssembly = typeof(CLogTypeEncoder).Assembly;
            string   assemblyName      = clogUtilsAssembly.GetName().Name;

            using (Stream embeddedStream = clogUtilsAssembly.GetManifestResourceStream($"{assemblyName}.defaults.clog.cs"))
                using (StreamReader reader = new StreamReader(embeddedStream))
                {
                    string sourceCode = reader.ReadToEnd();
                    _traceEmittorX.SetSourceCode(sourceCode);
                }
        }
示例#2
0
        /// <summary>
        /// Based on the config files 'mark' bit, update type encoders to persist their usage metrics on save
        /// </summary>
        /// <param name="ret"></param>
        private static void RefreshTypeEncodersMarkBit(CLogConfigurationFile ret, bool markBit)
        {
            ret.MarkPhase = markBit;
            foreach (var t in ret.TypeEncoders.FlattendTypeEncoder)
            {
                t.MarkPhase = markBit;
            }

            foreach (var config in ret.ChainedConfigurations)
            {
                RefreshTypeEncodersMarkBit(config, markBit);
            }
        }
示例#3
0
        public void LoadCustomCSharp(string customTypeClogCSharpFile, CLogConfigurationFile configFile)
        {
            if (!File.Exists(customTypeClogCSharpFile))
            {
                CLogConsoleTrace.TraceLine(TraceType.Err, $"Custom C# file for custom decoder is missing.  Please create the file, or remove its reference from the config file");
                CLogConsoleTrace.TraceLine(TraceType.Err, $"                Missing File: {customTypeClogCSharpFile}");
                CLogConsoleTrace.TraceLine(TraceType.Err, $"      Defined In Config File: {configFile.FilePath}");
                throw new CLogEnterReadOnlyModeException("CustomCSharpFileMissing: " + customTypeClogCSharpFile, CLogHandledException.ExceptionType.UnableToOpenCustomDecoder, null);
            }

            string sourceCode = File.ReadAllText(customTypeClogCSharpFile);
            string sourceHash = Path.GetFileName(configFile.FilePath);

            _traceEmittorX.SetSourceCode(sourceCode);
        }
示例#4
0
        private static CLogConfigurationFile FromLoadedFile(string fileName, string json)
        {
            JsonSerializerSettings s = new JsonSerializerSettings();

            s.Context = new StreamingContext(StreamingContextStates.Other, json);

            CLogConfigurationFile ret = JsonConvert.DeserializeObject <CLogConfigurationFile>(json, s);

            ret.FilePath = fileName;
            ret.ChainedConfigurations = new List <CLogConfigurationFile>();

            if (!string.IsNullOrEmpty(ret.CustomTypeClogCSharpFile))
            {
                if (ret.CustomTypeClogCSharpFile == EmbeddedDefaultName)
                {
                    ret.TypeEncoders.LoadDefaultCSharpFromEmbedded(ret);
                }
                else
                {
                    string cSharp = Path.GetDirectoryName(fileName);
                    cSharp = Path.Combine(cSharp, ret.CustomTypeClogCSharpFile);
                    ret.TypeEncoders.LoadCustomCSharp(cSharp, ret);
                }
            }

            //
            // Do sanity checks on the input configuration file - look for common (and easy) to make mistakes
            //
            HashSet <string> macros = new HashSet <string>();

            foreach (var m in ret.SourceCodeMacros)
            {
                if (macros.Contains(m.MacroName))
                {
                    Console.WriteLine(
                        $"Macro {m.MacroName} specified multiple times - each macro may only be specified once in the config file");
                    throw new CLogEnterReadOnlyModeException("MultipleMacrosWithSameName", CLogHandledException.ExceptionType.MultipleMacrosWithSameName, null);
                }

                macros.Add(m.MacroName);
            }

            foreach (string downstream in ret.ChainedConfigFiles)
            {
                if (downstream == EmbeddedDefaultName)
                {
                    Assembly clogUtilsAssembly = typeof(CLogConfigurationFile).Assembly;
                    string   assemblyName      = clogUtilsAssembly.GetName().Name;
                    using (Stream embeddedStream = clogUtilsAssembly.GetManifestResourceStream($"{assemblyName}.defaults.clog_config"))
                        using (StreamReader reader = new StreamReader(embeddedStream))
                        {
                            string contents   = reader.ReadToEnd();
                            var    configFile = FromFileText(downstream, contents);
                            ret.ChainedConfigurations.Add(configFile);
                        }
                }
                else
                {
                    string root   = Path.GetDirectoryName(fileName);
                    string toOpen = Path.Combine(root, downstream);

                    if (!File.Exists(toOpen))
                    {
                        Console.WriteLine($"Chained config file {toOpen} not found");
                        throw new CLogEnterReadOnlyModeException("ChainedConfigFileNotFound", CLogHandledException.ExceptionType.UnableToOpenChainedConfigFile, null);
                    }

                    var configFile = FromFile(toOpen);
                    ret.ChainedConfigurations.Add(configFile);
                }
            }

            ret.InUseTypeEncoders = new CLogTypeEncoder();

            RefreshTypeEncodersMarkBit(ret, ret.MarkPhase);

            return(ret);
        }