e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
215 lines
7.2 KiB
C#
215 lines
7.2 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="ConfigurationSectionGroupCollection.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Configuration {
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.Runtime.Serialization;
|
|
using System.Security.Permissions;
|
|
|
|
[Serializable()]
|
|
public sealed class ConfigurationSectionGroupCollection : NameObjectCollectionBase {
|
|
|
|
private MgmtConfigurationRecord _configRecord;
|
|
private ConfigurationSectionGroup _configSectionGroup;
|
|
|
|
//
|
|
// Create the collection of all section groups in the section group.
|
|
//
|
|
internal ConfigurationSectionGroupCollection(MgmtConfigurationRecord configRecord, ConfigurationSectionGroup configSectionGroup) :
|
|
base(StringComparer.Ordinal) {
|
|
_configRecord = configRecord;
|
|
_configSectionGroup = configSectionGroup;
|
|
|
|
foreach (DictionaryEntry de in _configRecord.SectionGroupFactories) {
|
|
FactoryId factoryId = (FactoryId) de.Value;
|
|
if (factoryId.Group == _configSectionGroup.SectionGroupName) {
|
|
BaseAdd(factoryId.Name, factoryId.Name);
|
|
}
|
|
}
|
|
}
|
|
|
|
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
|
|
public override void GetObjectData(SerializationInfo info, StreamingContext context) {
|
|
base.GetObjectData(info, context);
|
|
}
|
|
|
|
//
|
|
// Remove the collection from configuration system, and remove all entries
|
|
// in the base collection so that enumeration will return an empty collection.
|
|
//
|
|
internal void DetachFromConfigurationRecord() {
|
|
_configRecord = null;
|
|
BaseClear();
|
|
}
|
|
|
|
private void VerifyIsAttachedToConfigRecord() {
|
|
if (_configRecord == null) {
|
|
throw new InvalidOperationException(SR.GetString(SR.Config_cannot_edit_configurationsectiongroup_when_not_attached));
|
|
}
|
|
}
|
|
|
|
//
|
|
// Public Properties
|
|
//
|
|
|
|
// Indexer via name
|
|
public ConfigurationSectionGroup this[string name] {
|
|
get {
|
|
return Get(name);
|
|
}
|
|
}
|
|
|
|
// Indexer via integer index.
|
|
public ConfigurationSectionGroup this[int index] {
|
|
get {
|
|
return Get(index);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Public methods
|
|
//
|
|
|
|
//
|
|
// Add a new section group to the collection. This will result in a new declaration and definition.
|
|
//
|
|
// It is an error if the section already exists.
|
|
//
|
|
public void Add(string name, ConfigurationSectionGroup sectionGroup) {
|
|
VerifyIsAttachedToConfigRecord();
|
|
_configRecord.AddConfigurationSectionGroup(_configSectionGroup.SectionGroupName, name, sectionGroup);
|
|
BaseAdd(name, name);
|
|
}
|
|
|
|
//
|
|
// Remove all section groups from the collection.
|
|
//
|
|
public void Clear() {
|
|
VerifyIsAttachedToConfigRecord();
|
|
|
|
//
|
|
// If this is the root section group, do not require the location section to be written
|
|
// to the file.
|
|
//
|
|
if (_configSectionGroup.IsRoot) {
|
|
_configRecord.RemoveLocationWriteRequirement();
|
|
}
|
|
|
|
string[] allKeys = BaseGetAllKeys();
|
|
foreach (string key in allKeys) {
|
|
Remove(key);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Return the number of section groups in the collection.
|
|
//
|
|
public override int Count {
|
|
get {
|
|
return base.Count;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Copy all section groups to an array.
|
|
//
|
|
public void CopyTo(ConfigurationSectionGroup[] array, int index) {
|
|
if (array == null) {
|
|
throw new ArgumentNullException("array");
|
|
}
|
|
|
|
int c = Count;
|
|
if (array.Length < c + index) {
|
|
throw new ArgumentOutOfRangeException("index");
|
|
}
|
|
|
|
for (int i = 0, j = index; i < c; i++, j++) {
|
|
array[j] = Get(i);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the section group at a given index.
|
|
//
|
|
public ConfigurationSectionGroup Get(int index) {
|
|
return Get(GetKey(index));
|
|
}
|
|
|
|
//
|
|
// Get the section group with a given name.
|
|
//
|
|
public ConfigurationSectionGroup Get(string name) {
|
|
VerifyIsAttachedToConfigRecord();
|
|
|
|
// validate name
|
|
if (String.IsNullOrEmpty(name))
|
|
throw ExceptionUtil.ParameterNullOrEmpty("name");
|
|
|
|
// prevent GetConfig from returning config not in this collection
|
|
if (name.IndexOf('/') >= 0)
|
|
return null;
|
|
|
|
// get the section group
|
|
string configKey = BaseConfigurationRecord.CombineConfigKey(_configSectionGroup.SectionGroupName, name);
|
|
return _configRecord.GetSectionGroup(configKey);
|
|
}
|
|
|
|
// Get an enumerator
|
|
public override IEnumerator GetEnumerator() {
|
|
int c = Count;
|
|
for (int i = 0; i < c; i++) {
|
|
yield return this[i];
|
|
}
|
|
}
|
|
|
|
// Get the string key at a given index.
|
|
public string GetKey(int index) {
|
|
return (string) BaseGetKey(index);
|
|
}
|
|
|
|
// Return the string keys of the collection.
|
|
public override KeysCollection Keys {
|
|
get {
|
|
return base.Keys;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Remove the declaration and definition of a section in this config file, including any
|
|
// location sections in the file. This will also remove any descendant sections and
|
|
// section groups.
|
|
//
|
|
// Note that if the section group is declared in a parent, we still remove the declaration and
|
|
// definition, and the instance of ConfigurationSectionGroup will be detached from the collection.
|
|
// However, the collection will still have a ConfigurationSectionGroup of that name in the collection,
|
|
// only it will have the value of the immediate parent.
|
|
//
|
|
public void Remove(string name) {
|
|
VerifyIsAttachedToConfigRecord();
|
|
|
|
_configRecord.RemoveConfigurationSectionGroup(_configSectionGroup.SectionGroupName, name);
|
|
|
|
//
|
|
// Remove the section from the collection if it is no longer in the list of all SectionGroupFactories.
|
|
//
|
|
string configKey = BaseConfigurationRecord.CombineConfigKey(_configSectionGroup.SectionGroupName, name);
|
|
if (!_configRecord.SectionFactories.Contains(configKey)) {
|
|
BaseRemove(name);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Remove the section at that index.
|
|
//
|
|
public void RemoveAt(int index) {
|
|
VerifyIsAttachedToConfigRecord();
|
|
|
|
Remove(GetKey(index));
|
|
}
|
|
}
|
|
}
|