예제 #1
0
        /// <summary>
        /// Обновить список подписок
        /// </summary>
        private void UpdateSubscriptions()
        {
            SubscriptionsUnit       subs = _configuration.SubscriptionsUnit;
            List <SubscriptionView> rows = new List <SubscriptionView>();
            SubscriptionView        row  = new SubscriptionView();

            row.ParameterName  = "Потоков";
            row.ParameterValue = subs.Threads.ToString();
            rows.Add(row);

            for (int i = 0; i < subs.SubObjects.Count; i++)
            {
                ConfigurationUnit item = subs.SubObjects[i];
                row = new SubscriptionView {
                    ParameterName = "TCP-сервер", ParameterValue = item.Name
                };
                rows.Add(row);

                foreach (var(key, value) in item.Parameters)
                {
                    row = new SubscriptionView {
                        ParameterName = key, ParameterValue = value
                    };
                    rows.Add(row);
                }

                foreach (var(key, value) in item.SubObjects.SelectMany(subItem => subItem.Parameters))
                {
                    row = new SubscriptionView {
                        ParameterName = key, ParameterValue = value
                    };
                    rows.Add(row);
                }
            }

            dataSubsriptions.DataSource            = rows;
            dataSubsriptions.Columns[0].HeaderText = "Параметр";
            dataSubsriptions.Columns[0].Width      = 150;
            dataSubsriptions.Columns[1].HeaderText = "Значение";
            dataSubsriptions.Columns[1].Width      = 150;
        }
예제 #2
0
        public void EditSubscription()
        {
            textThreads.Text = Subscription.Threads.ToString();

            if (Subscription.SubObjects.Count == 0)
            {
                ConfigurationUnit item = new ConfigurationUnit();
                item.Parameters.Add("Port", "0");
                Subscription.SubObjects.Add(item);
            }

            foreach (ConfigurationUnit item in Subscription.SubObjects)
            {
                foreach (KeyValuePair <string, string> parameter in item.Parameters)
                {
                    if (parameter.Key == "Port")
                    {
                        textPort.Text = parameter.Value ?? "";
                    }
                }
            }

            ShowDialog();
        }
예제 #3
0
        /// <summary>
        /// Создать новую конфигурацию
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void createConfigurationMenuItem_Click(object sender, EventArgs e)
        {
            bool canCreate = false;

            // Создание нового экземпляра конфигурации
            if (!_modified)
            {
                canCreate = true;
            }
            else
            {
                DialogResult result = MessageBox.Show("Отменить все внесенные изменения в текущую конфигурацию?", "Внимание!",
                                                      MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    canCreate = true;
                }
            }

            if (canCreate)
            {
                _cfgFileName   = "";
                _modified      = false;
                _configuration = new Parser();
                ConfigurationUnit tcpServer = new ConfigurationUnit();
                tcpServer.Parameters.Add("Port", "0");
                tcpServer.Name = "TcpServer";
                _configuration.SubscriptionsUnit.SubObjects.Add(tcpServer);

                ResetForm(); // Устанавливаем все элементы формы в начальное состояние

                _statusBarMessage = "Создана новая конфигурация";
                statusBar1.Text   = _statusBarMessage;
                _logger.Info(_statusBarMessage);
            }
        }
예제 #4
0
        /// <summary>
        /// Enter the Config REPL
        /// </summary>
        internal static void Interactive()
        {
            ConfigurationUnit Configuration = new ConfigurationUnit();
            String            Choice;

ListConfig:
            new PragmaChoice("1", "Ada Version", Configuration.AdaVersion).WriteLine();
            new PragmaChoice("2", "Assertion Policy", Configuration.AssertionPolicy).WriteLine();
            new PragmaChoice("3", "Assume No Invalid Values", Configuration.AssumeNoInvalidValues).WriteLine();
            new PragmaChoice("4", "Elaboration Checks", Configuration.ElaborationChecks).WriteLine();
            new PragmaChoice("5", "Extensions Allowed", Configuration.ExtensionsAllowed).WriteLine();
            new PragmaChoice("6", "Fast Math", Configuration.FastMath).WriteLine();
            new PragmaChoice("7", "Source File Name", Configuration.SourceFileNames).WriteLine();
            new PragmaChoice("8", "Wide Character Encoding", Configuration.WideCharacterEncoding).WriteLine();
            // No, License was not forgotten. Rather, it is modified through another command.
            new Choice("Q", "Quit").Write();
            new Choice("S", "Save").Write();
            new Choice("SQ", "Save & Quit").WriteLine();
EnterChoice:
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write(" Enter Choice: ");
            Console.ResetColor();
            Choice = Console.ReadLine();
            switch (Choice.ToUpper())
            {
            case "Q":
                return;

            case "S":
            case "SQ":
                Configuration.Save();
                Console.WriteLine(" Configuration Saved ");
                if (Choice == "SQ")
                {
                    goto case "Q";
                }
                goto EnterChoice;

            case "1":             // Ada Version
                new Choice("1", "Ada1983").Write();
                new Choice("2", "Ada1995").Write();
                new Choice("3", "Ada2005").Write();
                new Choice("4", "Ada2012").Write();
                new Choice("C", "Cancel").WriteLine();
EnterAdaChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.AdaVersion = AdaVersion.Ada1983;
                    break;

                case "2":
                    Configuration.AdaVersion = AdaVersion.Ada1995;
                    break;

                case "3":
                    Configuration.AdaVersion = AdaVersion.Ada2005;
                    break;

                case "4":
                    Configuration.AdaVersion = AdaVersion.Ada2012;
                    break;

                default:
                    goto EnterAdaChoice;
                }
                goto ListConfig;

            case "2":             // Assertion Policy
                new Choice("1", "Check Globally").Write();
                new Choice("2", "Disable Globally").Write();
                new Choice("3", "Ignore Globally").Write();
                new Choice("4", "Specific Policies").Write();
                new Choice("C", "Cancel").WriteLine();
EnterAssertionPolicyChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.AssertionPolicy = new AssertionPolicy(PolicyIdentifier.Check);
                    break;

                case "2":
                    Configuration.AssertionPolicy = new AssertionPolicy(PolicyIdentifier.Disable);
                    break;

                case "3":
                    Configuration.AssertionPolicy = new AssertionPolicy(PolicyIdentifier.Ignore);
                    break;

                case "4":
                    Dictionary <String, PolicyIdentifier> Policies;
                    if (Configuration.AssertionPolicy.Policies != null)
                    {
                        Policies = new Dictionary <String, PolicyIdentifier>(Configuration.AssertionPolicy.Policies);
                    }
                    else
                    {
                        Policies = new Dictionary <String, PolicyIdentifier>();
                    }
ListAssertionMarks:
                    foreach (KeyValuePair <String, PolicyIdentifier> policy in Policies)
                    {
                        Console.Write(" " + policy.Key + " => ");
                        switch (policy.Value)
                        {
                        case PolicyIdentifier.Check:
                            Console.WriteLine("Check");
                            break;

                        case PolicyIdentifier.Disable:
                            Console.WriteLine("Disable");
                            break;

                        case PolicyIdentifier.Ignore:
                            Console.WriteLine("Ignore");
                            break;

                        case PolicyIdentifier.Suppressible:
                            Console.WriteLine("Suppressible");
                            break;
                        }
                    }
EnterAssertionMarkChoice:
                    new Choice("V", "View").Write();
                    new Choice("D", "Done").WriteLine();
                    Console.Write(" Enter Choice or Policy Name: ");
                    Choice = Console.ReadLine().ToUpper();
                    switch (Choice)
                    {
                    case "V":
                        goto ListAssertionMarks;

                    case "D":
                        Configuration.AssertionPolicy = new AssertionPolicy(Policies);
                        goto ListConfig;

                    default:
                        // The choice is actually a Policy Mark, so create a new entry
                        String PolicyMark = Choice;
                        new Choice("1", "Check").Write();
                        new Choice("2", "Disable").Write();
                        new Choice("3", "Ignore").Write();
                        new Choice("4", "Suppressible").Write();
                        new Choice("R", "Remove").Write();
                        new Choice("C", "Cancel").WriteLine();
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(" Enter Choice: ");
                        Console.ResetColor();
                        Choice = Console.ReadLine().ToUpper();
                        switch (Choice)
                        {
                        case "C":
                            goto ListAssertionMarks;

                        case "R":
                            Policies.Remove(PolicyMark);
                            goto EnterAssertionMarkChoice;

                        case "1":
                            if (Policies.ContainsKey(PolicyMark))
                            {
                                Policies[PolicyMark] = PolicyIdentifier.Check;
                            }
                            else
                            {
                                Policies.Add(PolicyMark, PolicyIdentifier.Check);
                            }
                            goto EnterAssertionMarkChoice;

                        case "2":
                            if (Policies.ContainsKey(PolicyMark))
                            {
                                Policies[PolicyMark] = PolicyIdentifier.Disable;
                            }
                            else
                            {
                                Policies.Add(PolicyMark, PolicyIdentifier.Disable);
                            }
                            goto EnterAssertionMarkChoice;

                        case "3":
                            if (Policies.ContainsKey(PolicyMark))
                            {
                                Policies[PolicyMark] = PolicyIdentifier.Ignore;
                            }
                            else
                            {
                                Policies.Add(PolicyMark, PolicyIdentifier.Ignore);
                            }
                            goto EnterAssertionMarkChoice;

                        case "4":
                            if (Policies.ContainsKey(PolicyMark))
                            {
                                Policies[PolicyMark] = PolicyIdentifier.Suppressible;
                            }
                            else
                            {
                                Policies.Add(PolicyMark, PolicyIdentifier.Suppressible);
                            }
                            goto EnterAssertionMarkChoice;
                        }
                        goto EnterAssertionMarkChoice;
                    }

                default:
                    goto EnterAssertionPolicyChoice;
                }
                goto ListConfig;

            case "3":             // Assume No Invalid Values
                new Choice("1", "On").Write();
                new Choice("2", "Off").Write();
                new Choice("C", "Cancel").WriteLine();
EnterAssumeNoInvalidValuesChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.AssumeNoInvalidValues = AssumeNoInvalidValues.On;
                    break;

                case "2":
                    Configuration.AssumeNoInvalidValues = AssumeNoInvalidValues.Off;
                    break;

                default:
                    goto EnterAssumeNoInvalidValuesChoice;
                }
                goto ListConfig;

            case "4":             // Elaboration Checks
                new Choice("1", "Dynamic").Write();
                new Choice("2", "Static").Write();
                new Choice("C", "Cancel").WriteLine();
EnterElaborationChecksChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.ElaborationChecks = ElaborationChecks.Dynamic;
                    break;

                case "2":
                    Configuration.ElaborationChecks = ElaborationChecks.Static;
                    break;

                default:
                    goto EnterElaborationChecksChoice;
                }
                goto ListConfig;

            case "5":             // Extensions Allowed
                new Choice("1", "On").Write();
                new Choice("2", "Off").Write();
                new Choice("C", "Cancel").WriteLine();
EnterExtensionsAllowedChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.ExtensionsAllowed = ExtensionsAllowed.On;
                    break;

                case "2":
                    Configuration.ExtensionsAllowed = ExtensionsAllowed.Off;
                    break;

                default:
                    goto EnterExtensionsAllowedChoice;
                }
                goto ListConfig;

            case "6":             //Fast Math
                new Choice("1", "Proper").Write();
                new Choice("2", "Fast").Write();
                new Choice("C", "Cancel").WriteLine();
EnterFastMathChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.FastMath = false;
                    break;

                case "2":
                    Configuration.FastMath = true;
                    break;

                default:
                    goto EnterFastMathChoice;
                }
                goto ListConfig;

            case "7":             //Source File Name
ListSourceFileConfig:
                new Choice("1", "Spec File Name").Write();
                new Choice("2", "Body File Name").Write();
                new Choice("3", "Subunit File Name").Write();
                new Choice("D", "Done").WriteLine();
EnterSourceFileNameChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "D":
                    goto ListConfig;

                case "1":
                    if (Configuration.SourceFileNames.SpecFileName is null)
                    {
                        Configuration.SourceFileNames.SpecFileName = new SpecFileName();
                    }
ListSpecFileChoice:
                    new Choice("1", "Spec File Name").Write();
                    new Choice("2", "Casing").Write();
                    new Choice("3", "Dot Replacement").Write();
                    new Choice("D", "Done").WriteLine();
EnterSpecFileChoice:
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write(" Enter Choice: ");
                    Console.ResetColor();
                    Choice = Console.ReadLine().ToUpper();
                    switch (Choice)
                    {
                    case "D":
                        goto ListSourceFileConfig;

                    case "1":
                        Console.Write(" Spec File Name: ");
                        Configuration.SourceFileNames.SpecFileName.UnitFileName = Console.ReadLine();
                        goto ListSpecFileChoice;

                    case "2":
                        new Choice("1", "Lowercase").Write();
                        new Choice("2", "Uppercase").Write();
                        new Choice("3", "Mixedcase").Write();
                        new Choice("C", "Cancel").WriteLine();
EnterSpecFileCasing:
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(" Enter Choice: ");
                        Console.ResetColor();
                        Choice = Console.ReadLine().ToUpper();
                        switch (Choice)
                        {
                        case "C":
                            goto ListSpecFileChoice;

                        case "1":
                            Configuration.SourceFileNames.SpecFileName.Casing = Casing.Lowercase;
                            break;

                        case "2":
                            Configuration.SourceFileNames.SpecFileName.Casing = Casing.Uppercase;
                            break;

                        case "3":
                            Configuration.SourceFileNames.SpecFileName.Casing = Casing.Mixedcase;
                            break;

                        default:
                            goto EnterSpecFileCasing;
                        }
                        goto ListSpecFileChoice;

                    case "3":
                        Console.Write(" Dot Replacement: ");
                        Configuration.SourceFileNames.SpecFileName.DotReplacement = Console.ReadLine();
                        goto ListSpecFileChoice;

                    default:
                        goto EnterSpecFileChoice;
                    }

                case "2":
                    if (Configuration.SourceFileNames.BodyFileName is null)
                    {
                        Configuration.SourceFileNames.BodyFileName = new BodyFileName();
                    }
ListBodyFileChoice:
                    new Choice("1", "Body File Name").Write();
                    new Choice("2", "Casing").Write();
                    new Choice("3", "Dot Replacement").Write();
                    new Choice("D", "Done").WriteLine();
EnterBodyFileChoice:
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write(" Enter Choice: ");
                    Console.ResetColor();
                    Choice = Console.ReadLine().ToUpper();
                    switch (Choice)
                    {
                    case "D":
                        goto ListSourceFileConfig;

                    case "1":
                        Console.Write(" Body File Name: ");
                        Configuration.SourceFileNames.BodyFileName.UnitFileName = Console.ReadLine();
                        goto ListBodyFileChoice;

                    case "2":
                        new Choice("1", "Lowercase").Write();
                        new Choice("2", "Uppercase").Write();
                        new Choice("3", "Mixedcase").Write();
                        new Choice("C", "Cancel").WriteLine();
EnterBodyFileCasing:
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(" Enter Choice: ");
                        Console.ResetColor();
                        Choice = Console.ReadLine().ToUpper();
                        switch (Choice)
                        {
                        case "C":
                            goto ListBodyFileChoice;

                        case "1":
                            Configuration.SourceFileNames.BodyFileName.Casing = Casing.Lowercase;
                            break;

                        case "2":
                            Configuration.SourceFileNames.BodyFileName.Casing = Casing.Uppercase;
                            break;

                        case "3":
                            Configuration.SourceFileNames.BodyFileName.Casing = Casing.Mixedcase;
                            break;

                        default:
                            goto EnterBodyFileCasing;
                        }
                        goto ListBodyFileChoice;

                    case "3":
                        Console.Write(" Dot Replacement: ");
                        Configuration.SourceFileNames.BodyFileName.DotReplacement = Console.ReadLine();
                        goto ListBodyFileChoice;

                    default:
                        goto EnterBodyFileChoice;
                    }

                case "3":
                    if (Configuration.SourceFileNames.SubunitFileName is null)
                    {
                        Configuration.SourceFileNames.SubunitFileName = new SubunitFileName();
                    }
ListSubunitFileChoice:
                    new Choice("1", "Subunit File Name").Write();
                    new Choice("2", "Casing").Write();
                    new Choice("3", "Dot Replacement").Write();
                    new Choice("D", "Done").WriteLine();
EnterSubunitFileChoice:
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write(" Enter Choice: ");
                    Console.ResetColor();
                    Choice = Console.ReadLine().ToUpper();
                    switch (Choice)
                    {
                    case "D":
                        goto ListSourceFileConfig;

                    case "1":
                        Console.Write(" Subunit File Name: ");
                        Configuration.SourceFileNames.SubunitFileName.UnitFileName = Console.ReadLine();
                        goto ListSubunitFileChoice;

                    case "2":
                        new Choice("1", "Lowercase").Write();
                        new Choice("2", "Uppercase").Write();
                        new Choice("3", "Mixedcase").Write();
                        new Choice("C", "Cancel").WriteLine();
EnterSubunitFileCasing:
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(" Enter Choice: ");
                        Console.ResetColor();
                        Choice = Console.ReadLine().ToUpper();
                        switch (Choice)
                        {
                        case "C":
                            goto ListSubunitFileChoice;

                        case "1":
                            Configuration.SourceFileNames.SubunitFileName.Casing = Casing.Lowercase;
                            break;

                        case "2":
                            Configuration.SourceFileNames.SubunitFileName.Casing = Casing.Uppercase;
                            break;

                        case "3":
                            Configuration.SourceFileNames.SubunitFileName.Casing = Casing.Mixedcase;
                            break;

                        default:
                            goto EnterSubunitFileCasing;
                        }
                        goto ListSubunitFileChoice;

                    case "3":
                        Console.Write(" Dot Replacement: ");
                        Configuration.SourceFileNames.SubunitFileName.DotReplacement = Console.ReadLine();
                        goto ListSubunitFileChoice;

                    default:
                        goto EnterSubunitFileChoice;
                    }

                default:
                    goto EnterSourceFileNameChoice;
                }

            case "8":             //Wide Character Encoding
                new Choice("1", "Hex").Write();
                new Choice("2", "Upper").Write();
                new Choice("3", "Shift_JIS").Write();
                new Choice("4", "EUC").Write();
                new Choice("5", "UTF-8").Write();
                new Choice("6", "Brackets").Write();
                new Choice("C", "Cancel").WriteLine();
EnterWideCharacterEncodingChoice:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(" Enter Choice: ");
                Console.ResetColor();
                Choice = Console.ReadLine().ToUpper();
                switch (Choice)
                {
                case "C":
                    goto ListConfig;

                case "1":
                    Configuration.WideCharacterEncoding = WideCharacterEncoding.Hex;
                    break;

                case "2":
                    Configuration.WideCharacterEncoding = WideCharacterEncoding.Upper;
                    break;

                case "3":
                    Configuration.WideCharacterEncoding = WideCharacterEncoding.Shift_JIS;
                    break;

                case "4":
                    Configuration.WideCharacterEncoding = WideCharacterEncoding.EUC;
                    break;

                case "5":
                    Configuration.WideCharacterEncoding = WideCharacterEncoding.UTF8;
                    break;

                case "6":
                    Configuration.WideCharacterEncoding = WideCharacterEncoding.Brackets;
                    break;

                default:
                    goto EnterWideCharacterEncodingChoice;
                }
                goto ListConfig;

            default:
                goto EnterChoice;
            }
        }
예제 #5
0
 public void Constructor()
 {
     ConfigurationUnit ConfigurationUnit = new ConfigurationUnit();
 }
예제 #6
0
        /// <summary>
        /// Разбор конфигурационного файла на объекты
        /// </summary>
        /// <exception cref="NullReferenceException">Неверный формат конфигурационного файла</exception>
        public void Parse()
        {
            if (String.IsNullOrEmpty(_cfgFileName))
            {
                return;
            }

            List <ConfigurationUnit>  objectsList = new List <ConfigurationUnit>();
            Stack <ConfigurationUnit> subobjects  = new Stack <ConfigurationUnit>();
            bool              openedMainObject    = false;
            int               subObjectsCount     = 0;
            bool              closedSubObject     = true;
            string            line;
            ConfigurationUnit currConfigurationUnit = null;

            // Открываем файл конфигурации для чтения и читаем его построчно
            StreamReader reader = new StreamReader(_cfgFileName, System.Text.Encoding.Default);

            while ((line = reader.ReadLine()) != null)
            {
                line = line.Replace("\t", " ").Trim();

                if (line == "" || line.StartsWith("//") || line == "(")
                {
                    continue;
                }

                if (line.Contains("=") && currConfigurationUnit != null)
                {
                    // Разбираем параметры объекта по первому вхождению символа '='
                    int    separator = line.IndexOf('=');
                    string key       = line.Substring(0, separator);
                    string val       = line.Substring(separator + 1);
                    currConfigurationUnit.Parameters[key] = val;
                }
                else
                {
                    // Определяем тип операции с объектом
                    if (line == ")")
                    {
                        if (openedMainObject)
                        {
                            // Закрывем объект
                            if (subObjectsCount > 0)
                            {
                                // Закрываем подобъект
                                if (subObjectsCount > 1)
                                {
                                    // Забираем очередной подобъект из стека
                                    ConfigurationUnit topLevel = subobjects.Pop();
                                    topLevel.SubObjects.Add(currConfigurationUnit);
                                    currConfigurationUnit = topLevel;
                                    subObjectsCount--;
                                }
                                else
                                {
                                    // В стеке нет подобъектов, последний подобъект в переменной currObject
                                    ConfigurationUnit topLevel = objectsList[objectsList.Count - 1];
                                    objectsList.Remove(topLevel);
                                    topLevel.SubObjects.Add(currConfigurationUnit);
                                    currConfigurationUnit = topLevel;
                                    subObjectsCount--;
                                    closedSubObject = true;
                                }
                            }
                            else
                            {
                                // Закрываем главный объект
                                if (!closedSubObject)
                                {
                                    ConfigurationUnit sub = subobjects.Pop();
                                    currConfigurationUnit?.SubObjects.Add(sub);
                                    closedSubObject = true;
                                }
                                objectsList.Add(currConfigurationUnit);
                                currConfigurationUnit = null;
                                openedMainObject      = false;
                            }
                        }
                        else
                        {
                            // Нет созданных объектов
                            throw new NullReferenceException("Ошибка при разборе конфигурационного файла");
                        }
                    }
                    else
                    {
                        // Открываем объект
                        if (openedMainObject)
                        {
                            if (subObjectsCount == 0)
                            {
                                // Это главный объект, и подобъектов пока нет
                                // Сохраняем главный объект и создаем подобъект
                                objectsList.Add(currConfigurationUnit);
                                currConfigurationUnit = new ConfigurationUnit();
                                ConfigurationUnitType type = GetObjectType(line);
                                currConfigurationUnit.Name = line;
                                currConfigurationUnit.Type = type;
                                closedSubObject            = false;
                                subObjectsCount++;
                            }
                            else
                            {
                                // Это подобъект, сохроаняем его в стеке и создаем новый подобъект
                                subobjects.Push(currConfigurationUnit);
                                currConfigurationUnit = new ConfigurationUnit();
                                ConfigurationUnitType type = GetObjectType(line);
                                currConfigurationUnit.Name = line;
                                currConfigurationUnit.Type = type;
                                subObjectsCount++;
                                closedSubObject = false;
                            }
                        }
                        else
                        {
                            // Это главный объект
                            currConfigurationUnit = new ConfigurationUnit();
                            ConfigurationUnitType type = GetObjectType(line);
                            currConfigurationUnit.Name = line;
                            currConfigurationUnit.Type = type;
                            openedMainObject           = true;
                        }
                    }
                }
            }

            reader.Close();

            foreach (ConfigurationUnit item in objectsList)
            {
                switch (item.Type)
                {
                case ConfigurationUnitType.MillConfig:
                    MillConfigUnit = new MillConfigUnit(item);
                    break;

                case ConfigurationUnitType.Subscription:
                    SubscriptionsUnit = new SubscriptionsUnit(item);
                    break;

                case ConfigurationUnitType.DataBlock:
                    ListDataBlockUnits.Add(new DataBlockUnit(item));
                    break;

                case ConfigurationUnitType.Signal:
                    ListSignalUnits.Add(new SignalUnit(item));
                    break;

                case ConfigurationUnitType.Thread:
                    ListThreadUnits.Add(new ThreadUnit(item));
                    break;

                case ConfigurationUnitType.Rollgang:
                    ListRollgangUnits.Add(new RollgangUnit(item));
                    break;

                case ConfigurationUnitType.Label:
                    ListLabelUnits.Add(new LabelUnit(item));
                    break;

                case ConfigurationUnitType.Sensor:
                    ListSensorUnits.Add(new SensorUnit(item));
                    break;

                case ConfigurationUnitType.Stopper:
                    ListStopperUnits.Add(new StopperUnit(item));
                    break;

                case ConfigurationUnitType.LinearMoving:
                    ListLinearDisplacementUnits.Add(new LinearDisplacementUnit(item));
                    break;

                case ConfigurationUnitType.Deleter:
                    ListDeleterUnits.Add(new DeleterUnit(item));
                    break;

                case ConfigurationUnitType.Cage:
                    ListCagesUnits.Add(new CageUnit(item));
                    break;

                case ConfigurationUnitType.IngotParams:
                    ListIngotParametersUnits.Add(new IngotParametersUnit(item));
                    break;

                case ConfigurationUnitType.Connection:
                    ListConnectionStringUnits.Add(new ConnectionStringUnit(item));
                    break;

                case ConfigurationUnitType.Aggregate:
                    ListAggregateUnits.Add(new AggregateUnit(item));
                    break;

                case ConfigurationUnitType.TechnicalUnit:
                    ListTechnicalUnits.Add(new TechnicalUnit(item));
                    break;
                }
            }
        }