Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / CompMod / System / Diagnostics / ListenerElementsCollection.cs / 1 / ListenerElementsCollection.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System.Configuration; using System; using System.Reflection; using System.Globalization; using System.Xml; using System.Collections.Specialized; using System.Collections; using System.Security; using System.Security.Permissions; namespace System.Diagnostics { [ConfigurationCollection(typeof(ListenerElement))] internal class ListenerElementsCollection : ConfigurationElementCollection { new public ListenerElement this[string name] { get { return (ListenerElement) BaseGet(name); } } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.AddRemoveClearMap; } } protected override ConfigurationElement CreateNewElement() { return new ListenerElement(true); } protected override Object GetElementKey(ConfigurationElement element) { return ((ListenerElement) element).Name; } public TraceListenerCollection GetRuntimeObject() { TraceListenerCollection listeners = new TraceListenerCollection(); bool _isDemanded = false; foreach(ListenerElement element in this) { // At some point, we need to pull out adding/removing the 'default' DefaultTraceListener // code from here in favor of adding/not-adding after we load the config (in TraceSource // and in static Trace) if (!_isDemanded && !element._isAddedByDefault) { // Do a full damand; This will disable partially trusted code from hooking up listeners new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); _isDemanded = true; } listeners.Add(element.GetRuntimeObject()); } return listeners; } protected override void InitializeDefault() { InitializeDefaultInternal(); } internal void InitializeDefaultInternal() { ListenerElement defaultListener = new ListenerElement(false); defaultListener.Name = "Default"; defaultListener.TypeName = typeof(DefaultTraceListener).FullName; defaultListener._isAddedByDefault = true; this.BaseAdd(defaultListener); } protected override void BaseAdd(ConfigurationElement element) { ListenerElement listenerElement = element as ListenerElement; Debug.Assert((listenerElement != null), "adding elements other than ListenerElement to ListenerElementsCollection?"); if (listenerElement.Name.Equals("Default") && listenerElement.TypeName.Equals(typeof(DefaultTraceListener).FullName)) BaseAdd(listenerElement, false); else BaseAdd(listenerElement, ThrowOnDuplicate); } } // This is the collection used by the sharedListener section. It is only slightly different from ListenerElementsCollection. // The differences are that it does not allow remove and clear, and that the ListenerElements it creates do not allow // references. [ConfigurationCollection(typeof(ListenerElement), AddItemName = "add", CollectionType = ConfigurationElementCollectionType.BasicMap)] internal class SharedListenerElementsCollection : ListenerElementsCollection { public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override ConfigurationElement CreateNewElement() { return new ListenerElement(false); } protected override string ElementName { get { return "add"; } } } internal class ListenerElement : TypedElement { private static readonly ConfigurationProperty _propFilter = new ConfigurationProperty("filter", typeof(FilterElement), null, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propName = new ConfigurationProperty("name", typeof(string), null, ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey); private static readonly ConfigurationProperty _propOutputOpts = new ConfigurationProperty("traceOutputOptions", typeof(TraceOptions), TraceOptions.None, ConfigurationPropertyOptions.None); private ConfigurationProperty _propListenerTypeName; private bool _allowReferences; private Hashtable _attributes; internal bool _isAddedByDefault; static ListenerElement() { } public ListenerElement(bool allowReferences) : base(typeof(TraceListener)) { _allowReferences = allowReferences; ConfigurationPropertyOptions flags = ConfigurationPropertyOptions.None; if (!_allowReferences) flags |= ConfigurationPropertyOptions.IsRequired; _propListenerTypeName = new ConfigurationProperty("type", typeof(string), null, flags); _properties.Remove("type"); _properties.Add(_propListenerTypeName); _properties.Add(_propFilter); _properties.Add(_propName); _properties.Add(_propOutputOpts); } public Hashtable Attributes { get { if (_attributes == null) _attributes = new Hashtable(StringComparer.OrdinalIgnoreCase); return _attributes; } } [ConfigurationProperty("filter")] public FilterElement Filter { get { return (FilterElement) this[_propFilter]; } } [ConfigurationProperty("name", IsRequired = true, IsKey = true)] public string Name { get { return (string) this[_propName]; } set { this[_propName] = value; } } [ConfigurationProperty("traceOutputOptions", DefaultValue = (TraceOptions) TraceOptions.None)] public TraceOptions TraceOutputOptions { get { return (TraceOptions) this[_propOutputOpts]; } // This is useful when the OM becomes public. In the meantime, this can be utilized via reflection set { this[_propOutputOpts] = value; } } [ConfigurationProperty("type")] public override string TypeName { get { return (string) this[_propListenerTypeName]; } set { this[_propListenerTypeName] = value; } } public override bool Equals(object compareTo) { if (this.Name.Equals("Default") && this.TypeName.Equals(typeof(DefaultTraceListener).FullName)) { // This is a workaround to treat all DefaultTraceListener named 'Default' the same. // This is needed for the Config.Save to work properly as otherwise config base layers // above us would run into duplicate 'Default' listener element and perceive it as // error. ListenerElement compareToElem = compareTo as ListenerElement; return (compareToElem != null) && compareToElem.Name.Equals("Default") && compareToElem.TypeName.Equals(typeof(DefaultTraceListener).FullName); } else return base.Equals(compareTo); } public override int GetHashCode() { return base.GetHashCode(); } public TraceListener GetRuntimeObject() { if (_runtimeObject != null) return (TraceListener) _runtimeObject; try { string className = TypeName; if (String.IsNullOrEmpty(className)) { // Look it up in SharedListeners Debug.Assert(_allowReferences, "_allowReferences must be true if type name is null"); if (_attributes != null || ElementInformation.Properties[_propFilter.Name].ValueOrigin == PropertyValueOrigin.SetHere || TraceOutputOptions != TraceOptions.None || !String.IsNullOrEmpty(InitData)) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_listener_cant_have_properties, Name)); if (DiagnosticsConfiguration.SharedListeners == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); ListenerElement sharedListener = DiagnosticsConfiguration.SharedListeners[Name]; if (sharedListener == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); else { _runtimeObject = sharedListener.GetRuntimeObject(); return (TraceListener) _runtimeObject; } } else { // create a new one TraceListener newListener = (TraceListener) BaseGetRuntimeObject(); newListener.initializeData = InitData; newListener.Name = Name; newListener.SetAttributes(Attributes); newListener.TraceOutputOptions = TraceOutputOptions; if ((Filter != null) && (Filter.TypeName != null) && (Filter.TypeName.Length != 0)) newListener.Filter = Filter.GetRuntimeObject(); _runtimeObject = newListener; return newListener; } } catch (ArgumentException e) { throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_listener, Name), e); } } protected override bool OnDeserializeUnrecognizedAttribute(String name, String value) { ConfigurationProperty _propDynamic = new ConfigurationProperty(name, typeof(string), value); _properties.Add(_propDynamic); base[_propDynamic] = value; // Add them to the property bag Attributes.Add(name, value); return true; } internal void ResetProperties() { // blow away any UnrecognizedAttributes that we have deserialized earlier if (_attributes != null) { _attributes.Clear(); _properties.Clear(); _properties.Add(_propListenerTypeName); _properties.Add(_propFilter); _properties.Add(_propName); _properties.Add(_propOutputOpts); } } internal TraceListener RefreshRuntimeObject(TraceListener listener) { _runtimeObject = null; try { string className = TypeName; if (String.IsNullOrEmpty(className)) { // Look it up in SharedListeners and ask the sharedListener to refresh. Debug.Assert(_allowReferences, "_allowReferences must be true if type name is null"); if (_attributes != null || ElementInformation.Properties[_propFilter.Name].ValueOrigin == PropertyValueOrigin.SetHere || TraceOutputOptions != TraceOptions.None || !String.IsNullOrEmpty(InitData)) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_listener_cant_have_properties, Name)); if (DiagnosticsConfiguration.SharedListeners == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); ListenerElement sharedListener = DiagnosticsConfiguration.SharedListeners[Name]; if (sharedListener == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); else { _runtimeObject = sharedListener.RefreshRuntimeObject(listener); return (TraceListener) _runtimeObject; } } else { // We're the element with the type and initializeData info. First see if those two are the same as they were. // If not, create a whole new object, otherwise, just update the other properties. if (Type.GetType(className) != listener.GetType() || InitData != listener.initializeData) { // type or initdata changed return GetRuntimeObject(); } else { listener.SetAttributes(Attributes); listener.TraceOutputOptions = TraceOutputOptions; if (ElementInformation.Properties[_propFilter.Name].ValueOrigin == PropertyValueOrigin.SetHere) listener.Filter = Filter.RefreshRuntimeObject(listener.Filter); else listener.Filter = null; _runtimeObject = listener; return listener; } } } catch (ArgumentException e) { throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_listener, Name), e); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System.Configuration; using System; using System.Reflection; using System.Globalization; using System.Xml; using System.Collections.Specialized; using System.Collections; using System.Security; using System.Security.Permissions; namespace System.Diagnostics { [ConfigurationCollection(typeof(ListenerElement))] internal class ListenerElementsCollection : ConfigurationElementCollection { new public ListenerElement this[string name] { get { return (ListenerElement) BaseGet(name); } } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.AddRemoveClearMap; } } protected override ConfigurationElement CreateNewElement() { return new ListenerElement(true); } protected override Object GetElementKey(ConfigurationElement element) { return ((ListenerElement) element).Name; } public TraceListenerCollection GetRuntimeObject() { TraceListenerCollection listeners = new TraceListenerCollection(); bool _isDemanded = false; foreach(ListenerElement element in this) { // At some point, we need to pull out adding/removing the 'default' DefaultTraceListener // code from here in favor of adding/not-adding after we load the config (in TraceSource // and in static Trace) if (!_isDemanded && !element._isAddedByDefault) { // Do a full damand; This will disable partially trusted code from hooking up listeners new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); _isDemanded = true; } listeners.Add(element.GetRuntimeObject()); } return listeners; } protected override void InitializeDefault() { InitializeDefaultInternal(); } internal void InitializeDefaultInternal() { ListenerElement defaultListener = new ListenerElement(false); defaultListener.Name = "Default"; defaultListener.TypeName = typeof(DefaultTraceListener).FullName; defaultListener._isAddedByDefault = true; this.BaseAdd(defaultListener); } protected override void BaseAdd(ConfigurationElement element) { ListenerElement listenerElement = element as ListenerElement; Debug.Assert((listenerElement != null), "adding elements other than ListenerElement to ListenerElementsCollection?"); if (listenerElement.Name.Equals("Default") && listenerElement.TypeName.Equals(typeof(DefaultTraceListener).FullName)) BaseAdd(listenerElement, false); else BaseAdd(listenerElement, ThrowOnDuplicate); } } // This is the collection used by the sharedListener section. It is only slightly different from ListenerElementsCollection. // The differences are that it does not allow remove and clear, and that the ListenerElements it creates do not allow // references. [ConfigurationCollection(typeof(ListenerElement), AddItemName = "add", CollectionType = ConfigurationElementCollectionType.BasicMap)] internal class SharedListenerElementsCollection : ListenerElementsCollection { public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override ConfigurationElement CreateNewElement() { return new ListenerElement(false); } protected override string ElementName { get { return "add"; } } } internal class ListenerElement : TypedElement { private static readonly ConfigurationProperty _propFilter = new ConfigurationProperty("filter", typeof(FilterElement), null, ConfigurationPropertyOptions.None); private static readonly ConfigurationProperty _propName = new ConfigurationProperty("name", typeof(string), null, ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey); private static readonly ConfigurationProperty _propOutputOpts = new ConfigurationProperty("traceOutputOptions", typeof(TraceOptions), TraceOptions.None, ConfigurationPropertyOptions.None); private ConfigurationProperty _propListenerTypeName; private bool _allowReferences; private Hashtable _attributes; internal bool _isAddedByDefault; static ListenerElement() { } public ListenerElement(bool allowReferences) : base(typeof(TraceListener)) { _allowReferences = allowReferences; ConfigurationPropertyOptions flags = ConfigurationPropertyOptions.None; if (!_allowReferences) flags |= ConfigurationPropertyOptions.IsRequired; _propListenerTypeName = new ConfigurationProperty("type", typeof(string), null, flags); _properties.Remove("type"); _properties.Add(_propListenerTypeName); _properties.Add(_propFilter); _properties.Add(_propName); _properties.Add(_propOutputOpts); } public Hashtable Attributes { get { if (_attributes == null) _attributes = new Hashtable(StringComparer.OrdinalIgnoreCase); return _attributes; } } [ConfigurationProperty("filter")] public FilterElement Filter { get { return (FilterElement) this[_propFilter]; } } [ConfigurationProperty("name", IsRequired = true, IsKey = true)] public string Name { get { return (string) this[_propName]; } set { this[_propName] = value; } } [ConfigurationProperty("traceOutputOptions", DefaultValue = (TraceOptions) TraceOptions.None)] public TraceOptions TraceOutputOptions { get { return (TraceOptions) this[_propOutputOpts]; } // This is useful when the OM becomes public. In the meantime, this can be utilized via reflection set { this[_propOutputOpts] = value; } } [ConfigurationProperty("type")] public override string TypeName { get { return (string) this[_propListenerTypeName]; } set { this[_propListenerTypeName] = value; } } public override bool Equals(object compareTo) { if (this.Name.Equals("Default") && this.TypeName.Equals(typeof(DefaultTraceListener).FullName)) { // This is a workaround to treat all DefaultTraceListener named 'Default' the same. // This is needed for the Config.Save to work properly as otherwise config base layers // above us would run into duplicate 'Default' listener element and perceive it as // error. ListenerElement compareToElem = compareTo as ListenerElement; return (compareToElem != null) && compareToElem.Name.Equals("Default") && compareToElem.TypeName.Equals(typeof(DefaultTraceListener).FullName); } else return base.Equals(compareTo); } public override int GetHashCode() { return base.GetHashCode(); } public TraceListener GetRuntimeObject() { if (_runtimeObject != null) return (TraceListener) _runtimeObject; try { string className = TypeName; if (String.IsNullOrEmpty(className)) { // Look it up in SharedListeners Debug.Assert(_allowReferences, "_allowReferences must be true if type name is null"); if (_attributes != null || ElementInformation.Properties[_propFilter.Name].ValueOrigin == PropertyValueOrigin.SetHere || TraceOutputOptions != TraceOptions.None || !String.IsNullOrEmpty(InitData)) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_listener_cant_have_properties, Name)); if (DiagnosticsConfiguration.SharedListeners == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); ListenerElement sharedListener = DiagnosticsConfiguration.SharedListeners[Name]; if (sharedListener == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); else { _runtimeObject = sharedListener.GetRuntimeObject(); return (TraceListener) _runtimeObject; } } else { // create a new one TraceListener newListener = (TraceListener) BaseGetRuntimeObject(); newListener.initializeData = InitData; newListener.Name = Name; newListener.SetAttributes(Attributes); newListener.TraceOutputOptions = TraceOutputOptions; if ((Filter != null) && (Filter.TypeName != null) && (Filter.TypeName.Length != 0)) newListener.Filter = Filter.GetRuntimeObject(); _runtimeObject = newListener; return newListener; } } catch (ArgumentException e) { throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_listener, Name), e); } } protected override bool OnDeserializeUnrecognizedAttribute(String name, String value) { ConfigurationProperty _propDynamic = new ConfigurationProperty(name, typeof(string), value); _properties.Add(_propDynamic); base[_propDynamic] = value; // Add them to the property bag Attributes.Add(name, value); return true; } internal void ResetProperties() { // blow away any UnrecognizedAttributes that we have deserialized earlier if (_attributes != null) { _attributes.Clear(); _properties.Clear(); _properties.Add(_propListenerTypeName); _properties.Add(_propFilter); _properties.Add(_propName); _properties.Add(_propOutputOpts); } } internal TraceListener RefreshRuntimeObject(TraceListener listener) { _runtimeObject = null; try { string className = TypeName; if (String.IsNullOrEmpty(className)) { // Look it up in SharedListeners and ask the sharedListener to refresh. Debug.Assert(_allowReferences, "_allowReferences must be true if type name is null"); if (_attributes != null || ElementInformation.Properties[_propFilter.Name].ValueOrigin == PropertyValueOrigin.SetHere || TraceOutputOptions != TraceOptions.None || !String.IsNullOrEmpty(InitData)) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_listener_cant_have_properties, Name)); if (DiagnosticsConfiguration.SharedListeners == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); ListenerElement sharedListener = DiagnosticsConfiguration.SharedListeners[Name]; if (sharedListener == null) throw new ConfigurationErrorsException(SR.GetString(SR.Reference_to_nonexistent_listener, Name)); else { _runtimeObject = sharedListener.RefreshRuntimeObject(listener); return (TraceListener) _runtimeObject; } } else { // We're the element with the type and initializeData info. First see if those two are the same as they were. // If not, create a whole new object, otherwise, just update the other properties. if (Type.GetType(className) != listener.GetType() || InitData != listener.initializeData) { // type or initdata changed return GetRuntimeObject(); } else { listener.SetAttributes(Attributes); listener.TraceOutputOptions = TraceOutputOptions; if (ElementInformation.Properties[_propFilter.Name].ValueOrigin == PropertyValueOrigin.SetHere) listener.Filter = Filter.RefreshRuntimeObject(listener.Filter); else listener.Filter = null; _runtimeObject = listener; return listener; } } } catch (ArgumentException e) { throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_listener, Name), e); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataMemberConverter.cs
- MutexSecurity.cs
- ControlBuilder.cs
- ColorKeyFrameCollection.cs
- DrawingContext.cs
- EditorZone.cs
- PropertyMap.cs
- ClientConfigurationSystem.cs
- EventProviderWriter.cs
- JapaneseCalendar.cs
- XmlValidatingReaderImpl.cs
- PropertyValueChangedEvent.cs
- FormClosedEvent.cs
- DataContractJsonSerializer.cs
- StatusBarPanel.cs
- VisualBasicValue.cs
- EncodingInfo.cs
- DateRangeEvent.cs
- BasicKeyConstraint.cs
- PinnedBufferMemoryStream.cs
- RC2CryptoServiceProvider.cs
- GridViewCommandEventArgs.cs
- Subtree.cs
- GradientSpreadMethodValidation.cs
- InputScopeAttribute.cs
- HttpResponseInternalBase.cs
- SplashScreen.cs
- FlowDocumentReader.cs
- configsystem.cs
- TemplateComponentConnector.cs
- TypeSystemProvider.cs
- ReadWriteObjectLock.cs
- DataRecord.cs
- ProjectionPathBuilder.cs
- UInt64.cs
- SymbolMethod.cs
- PriorityRange.cs
- SqlInternalConnectionSmi.cs
- IApplicationTrustManager.cs
- QilIterator.cs
- XmlIgnoreAttribute.cs
- FormsAuthenticationEventArgs.cs
- TypeUtil.cs
- CaseInsensitiveComparer.cs
- RuntimeEnvironment.cs
- AspNetCompatibilityRequirementsAttribute.cs
- MDIWindowDialog.cs
- RootBrowserWindowProxy.cs
- XmlHierarchicalEnumerable.cs
- MultipleViewProviderWrapper.cs
- AttachmentCollection.cs
- UnsafeNativeMethods.cs
- AssociationTypeEmitter.cs
- ExtenderControl.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- SoapSchemaImporter.cs
- MediaPlayer.cs
- HttpDictionary.cs
- UpWmlMobileTextWriter.cs
- FilteredAttributeCollection.cs
- ServiceNotStartedException.cs
- ColorMap.cs
- FormClosingEvent.cs
- ByteRangeDownloader.cs
- Literal.cs
- XmlEntityReference.cs
- KeySplineConverter.cs
- VerticalAlignConverter.cs
- CalendarTable.cs
- TextContainerHelper.cs
- XsdBuildProvider.cs
- AttributeUsageAttribute.cs
- BitmapScalingModeValidation.cs
- FormatException.cs
- CssTextWriter.cs
- SystemFonts.cs
- DataGridClipboardCellContent.cs
- relpropertyhelper.cs
- EventRoute.cs
- AssemblyAssociatedContentFileAttribute.cs
- CommandBinding.cs
- DataObjectEventArgs.cs
- SoapMessage.cs
- SharedConnectionInfo.cs
- XmlTextAttribute.cs
- ColorConvertedBitmap.cs
- _ListenerResponseStream.cs
- BaseServiceProvider.cs
- RegularExpressionValidator.cs
- WindowsTab.cs
- httpstaticobjectscollection.cs
- DecimalAnimationBase.cs
- SoapSchemaMember.cs
- BoolExpressionVisitors.cs
- GlobalItem.cs
- ProbeDuplexAsyncResult.cs
- OutputCacheProfileCollection.cs
- PcmConverter.cs
- FormsAuthenticationUser.cs
- EntityRecordInfo.cs