/// <summary>
        /// Converts the specified <paramref name="source"/>, a <see cref="StringBuilder"/> type, to an <see cref="IConfigurationGroup"/>.
        /// </summary>
        /// <param name="source">The object, a <see cref="StringBuilder"/> type, to convert into an <see cref="IConfigurationGroup"/>.</param>
        /// <returns>The object converted into an <see cref="IConfigurationGroup"/>.</returns>
        public IConfigurationGroup Deserialize(StringBuilder source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (source.Length == 0)
            {
                throw new ArgumentNullException(nameof(source), $"Parameter {nameof(source)} cannot be an empty string.");
            }
            IConfigurationGroup rootGroup = null;

            using (var sr = new System.IO.StringReader(source.ToString()))
            {
                using (var xr = System.Xml.XmlReader.Create(sr))
                {
                    while (xr.Read())
                    {
                        if (xr.IsStartElement(_XmlElementGroupName_))
                        {
                            // process group
                            var key = xr.GetAttribute(_XmlElementGroupKeyName_);
                            if (rootGroup == null)
                            {
                                rootGroup = new ConfigurationGroup(key);
                                rootGroup.ClearDirty();
                                rootGroup.ClearNew();
                            }
                            ProcessGroup(xr, rootGroup, rootGroup);
                        }
                    }
                }
            }
            rootGroup.ClearDirty();
            rootGroup.ClearNew();
            return(rootGroup);
        }
Пример #2
0
        /// <summary>
        /// Converts the specified <paramref name="source"/>, a <see cref="StringBuilder"/> type, to an <see cref="IConfigurationGroup"/>.
        /// </summary>
        /// <param name="source">The object, a <see cref="StringBuilder"/> type, to convert into an <see cref="IConfigurationGroup"/>.</param>
        /// <param name="includeSubgroups">True to scan group names for the Group Name Separator and create sub groups; otherwise, false will ignore the Group Name Separator and use the entire string as the group name.</param>
        /// <param name="isClassicIni">if <b>true</b> the <paramref name="source"/> format will be interpreted as classic INI, {key}={value}; otherwise, <b>false</b> will interpret the file using the custom triple entry INI format, {key}={type}={value}</param>
        /// <returns>The object converted into an <see cref="IConfigurationGroup"/>.</returns>
        public IConfigurationGroup Deserialize(StringBuilder source, bool includeSubgroups, bool isClassicIni)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (source.Length == 0)
            {
                throw new ArgumentNullException(nameof(source), $"Parameter {nameof(source)} cannot be an empty string.");
            }
            IConfigurationGroup rootGroup    = new ConfigurationGroup("");
            IConfigurationGroup currentGroup = rootGroup;
            string candidateRootGroupName    = null;

            foreach (var line in from x in source.ToString().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                     select x.Trim())
            {
                if (line.StartsWith(_IniGroupNameStartCharacter_) && line.EndsWith(_IniGroupNameStopCharacter_))
                {
                    // process group
                    var groupFullName = line.Substring(1, line.Length - 2);
                    if (includeSubgroups)
                    {
                        var possibleRootGroup = groupFullName;
                        if (possibleRootGroup.Contains(_IniGroupNameSeparator_))
                        {
                            possibleRootGroup = possibleRootGroup.Substring(0, line.IndexOf(_IniGroupNameSeparator_) - 1);
                        }
                        if (candidateRootGroupName == null)
                        {
                            candidateRootGroupName = possibleRootGroup;
                        }
                        else if (candidateRootGroupName != possibleRootGroup)
                        {
                            candidateRootGroupName = "";
                        }
                        //
                        currentGroup = ConfigurationShared.FindGroup(rootGroup, groupFullName, _IniGroupNameSeparator_);
                    }
                    else
                    {
                        var newGroup = new ConfigurationGroup(groupFullName, !includeSubgroups);
                        rootGroup.Add(newGroup);
                        currentGroup = newGroup;
                    }
                    if (currentGroup == null)
                    {
                        currentGroup = rootGroup;
                    }
                }
                else
                {
                    // process item
                    if (currentGroup == null)
                    {
                        throw new InvalidOperationException($"There is no current configuration group. Somehow the group name was missed. Check the parameter {nameof(source)} for corruption or bad form.");
                    }
                    currentGroup.Items.Add(DeserializeItem(new StringBuilder(line), isClassicIni));
                }
            }
            if (!string.IsNullOrWhiteSpace(candidateRootGroupName))
            {
                ((IConfigurationGroupAdvanced)rootGroup).SetKey(candidateRootGroupName);
            }
            // check for subgroup with same name as root group
            var foundSubGroup = (from x in rootGroup
                                 where x.Key == rootGroup.Key
                                 select x).FirstOrDefault();

            if (foundSubGroup != null)
            {
                rootGroup = foundSubGroup;
                (rootGroup as IConfigurationGroupAdvanced).Parent = null;
            }
            //
            if ((rootGroup.Count == 1) && (rootGroup.ContainsKey(rootGroup.Key)) && (rootGroup[rootGroup.Key].Key == rootGroup.Key))
            {
            }
            //
            rootGroup.ClearDirty();
            rootGroup.ClearNew();
            return(rootGroup);
        }