Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Diagnostics / Eventing / Reader / ProviderMetadataCachedInformation.cs / 1305376 / ProviderMetadataCachedInformation.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: ProviderMetadataCachedInformation ** ** Purpose: ** This internal class exposes a limited set of cached Provider ** metadata information. It is meant to support the Metadata ** ============================================================*/ using System; using System.Globalization; using System.Collections.Generic; using System.Threading; using System.Timers; using System.Security.Permissions; using Microsoft.Win32; namespace System.Diagnostics.Eventing.Reader { // // this class does not expose underlying Provider metadata objects. Instead it // exposes a limited set of Provider metadata information from the cache. The reason // for this is so the cache can easily Dispose the metadata object without worrying // about who is using it. // internal class ProviderMetadataCachedInformation { private Dictionarycache; private int maximumCacheSize; private EventLogSession session; private string logfile; private class ProviderMetadataId { private string providerName; private CultureInfo cultureInfo; public ProviderMetadataId(string providerName, CultureInfo cultureInfo) { this.providerName = providerName; this.cultureInfo = cultureInfo; } public override bool Equals(object obj) { ProviderMetadataId rhs = obj as ProviderMetadataId; if (rhs == null) return false; if (this.providerName.Equals(rhs.providerName) && (cultureInfo == rhs.cultureInfo)) return true; return false; } public override int GetHashCode() { return this.providerName.GetHashCode() ^ cultureInfo.GetHashCode(); } public string ProviderName { get { return providerName; } } public CultureInfo TheCultureInfo { get { return cultureInfo; } } } private class CacheItem { private ProviderMetadata pm; private DateTime theTime; public CacheItem(ProviderMetadata pm) { this.pm = pm; theTime = DateTime.Now; } public DateTime TheTime { get { return theTime; } set { theTime = value; } } public ProviderMetadata ProviderMetadata { get { return pm; } } } public ProviderMetadataCachedInformation(EventLogSession session, string logfile, int maximumCacheSize) { Debug.Assert(session != null); this.session = session; this.logfile = logfile; cache = new Dictionary (); this.maximumCacheSize = maximumCacheSize; } private bool IsCacheFull() { return cache.Count == maximumCacheSize; } private bool IsProviderinCache(ProviderMetadataId key) { return cache.ContainsKey(key); } private void DeleteCacheEntry(ProviderMetadataId key) { if (!IsProviderinCache(key)) return; CacheItem value = cache[key]; cache.Remove(key); value.ProviderMetadata.Dispose(); } private void AddCacheEntry(ProviderMetadataId key, ProviderMetadata pm) { if (IsCacheFull()) FlushOldestEntry(); CacheItem value = new CacheItem(pm); cache.Add(key, value); return; } private void FlushOldestEntry() { double maxPassedTime = -10; DateTime timeNow = DateTime.Now; ProviderMetadataId keyToDelete = null; //get the entry in the cache which was not accessed for the longest time. foreach (KeyValuePair kvp in cache) { //the time difference (in ms) between the timeNow and the last used time of each entry TimeSpan timeDifference = timeNow.Subtract(kvp.Value.TheTime); //for the "unused" items (with ReferenceCount == 0) -> can possible be deleted. if (timeDifference.TotalMilliseconds >= maxPassedTime) { maxPassedTime = timeDifference.TotalMilliseconds; keyToDelete = kvp.Key; } } if (keyToDelete != null) DeleteCacheEntry(keyToDelete); } private static void UpdateCacheValueInfoForHit(CacheItem cacheItem) { cacheItem.TheTime = DateTime.Now; } private ProviderMetadata GetProviderMetadata(ProviderMetadataId key) { if (!IsProviderinCache(key)) { ProviderMetadata pm; try { pm = new ProviderMetadata(key.ProviderName, this.session, key.TheCultureInfo, this.logfile); } catch (EventLogNotFoundException) { pm = new ProviderMetadata(key.ProviderName, this.session, key.TheCultureInfo); } AddCacheEntry(key, pm); return pm; } else { CacheItem cacheItem = cache[key]; ProviderMetadata pm = cacheItem.ProviderMetadata; // // check Provider metadata to be sure it's hasn't been // uninstalled since last time it was used. // try { pm.CheckReleased(); UpdateCacheValueInfoForHit(cacheItem); } catch (EventLogException) { DeleteCacheEntry(key); try { pm = new ProviderMetadata(key.ProviderName, this.session, key.TheCultureInfo, this.logfile); } catch (EventLogNotFoundException) { pm = new ProviderMetadata(key.ProviderName, this.session, key.TheCultureInfo); } AddCacheEntry(key, pm); } return pm; } } // marking as TreatAsSafe because just passing around a reference to an EventLogHandle is safe. [System.Security.SecuritySafeCritical] public string GetFormatDescription(string ProviderName, EventLogHandle eventHandle) { lock (this) { ProviderMetadataId key = new ProviderMetadataId(ProviderName, CultureInfo.CurrentCulture); try { ProviderMetadata pm = GetProviderMetadata(key); return NativeWrapper.EvtFormatMessageRenderName(pm.Handle, eventHandle, UnsafeNativeMethods.EvtFormatMessageFlags.EvtFormatMessageEvent); } catch (EventLogNotFoundException) { return null; } } } public string GetFormatDescription(string ProviderName, EventLogHandle eventHandle, string[] values) { lock (this) { ProviderMetadataId key = new ProviderMetadataId(ProviderName, CultureInfo.CurrentCulture); ProviderMetadata pm = GetProviderMetadata(key); try { return NativeWrapper.EvtFormatMessageFormatDescription(pm.Handle, eventHandle, values); } catch (EventLogNotFoundException) { return null; } } } // marking as TreatAsSafe because just passing around a reference to an EventLogHandle is safe. [System.Security.SecuritySafeCritical] public string GetLevelDisplayName(string ProviderName, EventLogHandle eventHandle) { lock (this) { ProviderMetadataId key = new ProviderMetadataId(ProviderName, CultureInfo.CurrentCulture); ProviderMetadata pm = GetProviderMetadata(key); return NativeWrapper.EvtFormatMessageRenderName(pm.Handle, eventHandle, UnsafeNativeMethods.EvtFormatMessageFlags.EvtFormatMessageLevel); } } // marking as TreatAsSafe because just passing around a reference to an EventLogHandle is safe. [System.Security.SecuritySafeCritical] public string GetOpcodeDisplayName(string ProviderName, EventLogHandle eventHandle) { lock (this) { ProviderMetadataId key = new ProviderMetadataId(ProviderName, CultureInfo.CurrentCulture); ProviderMetadata pm = GetProviderMetadata(key); return NativeWrapper.EvtFormatMessageRenderName(pm.Handle, eventHandle, UnsafeNativeMethods.EvtFormatMessageFlags.EvtFormatMessageOpcode); } } // marking as TreatAsSafe because just passing around a reference to an EventLogHandle is safe. [System.Security.SecuritySafeCritical] public string GetTaskDisplayName(string ProviderName, EventLogHandle eventHandle) { lock (this) { ProviderMetadataId key = new ProviderMetadataId(ProviderName, CultureInfo.CurrentCulture); ProviderMetadata pm = GetProviderMetadata(key); return NativeWrapper.EvtFormatMessageRenderName(pm.Handle, eventHandle, UnsafeNativeMethods.EvtFormatMessageFlags.EvtFormatMessageTask); } } // marking as TreatAsSafe because just passing around a reference to an EventLogHandle is safe. [System.Security.SecuritySafeCritical] public IEnumerable GetKeywordDisplayNames(string ProviderName, EventLogHandle eventHandle) { lock (this) { ProviderMetadataId key = new ProviderMetadataId(ProviderName, CultureInfo.CurrentCulture); ProviderMetadata pm = GetProviderMetadata(key); return NativeWrapper.EvtFormatMessageRenderKeywords(pm.Handle, eventHandle, UnsafeNativeMethods.EvtFormatMessageFlags.EvtFormatMessageKeyword); } } } } // 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
- QueryReaderSettings.cs
- IsolatedStorageFile.cs
- DataSysAttribute.cs
- VoiceChangeEventArgs.cs
- DateTimeConstantAttribute.cs
- CreationContext.cs
- ObjectDataSource.cs
- XmlChildEnumerator.cs
- TypeElementCollection.cs
- SmtpTransport.cs
- IgnoreSection.cs
- TrackingServices.cs
- WindowsListBox.cs
- HtmlWindow.cs
- MergePropertyDescriptor.cs
- StatusBar.cs
- CompilationUtil.cs
- TreeNodeStyle.cs
- HelpKeywordAttribute.cs
- ZipIOModeEnforcingStream.cs
- XmlNodeChangedEventManager.cs
- VariableAction.cs
- PolyLineSegmentFigureLogic.cs
- DocumentGridPage.cs
- ClientTargetSection.cs
- FormatConvertedBitmap.cs
- StyleSelector.cs
- SystemException.cs
- XmlChildNodes.cs
- PropertyGridView.cs
- AuthorizationRuleCollection.cs
- EmptyElement.cs
- JoinTreeSlot.cs
- ToggleButton.cs
- TriggerCollection.cs
- JsonReaderDelegator.cs
- ScrollContentPresenter.cs
- DataObject.cs
- DateTimeConstantAttribute.cs
- BadImageFormatException.cs
- ExceptionUtil.cs
- SafeNativeMethods.cs
- KeyValueConfigurationCollection.cs
- ProcessInfo.cs
- AssociationSetMetadata.cs
- StylusShape.cs
- PlanCompilerUtil.cs
- TagMapInfo.cs
- AccessDataSourceView.cs
- Padding.cs
- DataGrid.cs
- FontStyleConverter.cs
- SoapMessage.cs
- SafeCoTaskMem.cs
- HuffCodec.cs
- SymLanguageType.cs
- SpnegoTokenProvider.cs
- DataSourceBooleanViewSchemaConverter.cs
- ProfileService.cs
- ActivationServices.cs
- IntegrationExceptionEventArgs.cs
- GenerateTemporaryTargetAssembly.cs
- RoleGroupCollection.cs
- CodeSnippetCompileUnit.cs
- EntityDataSourceWrapperCollection.cs
- CursorConverter.cs
- EntityDataSourceColumn.cs
- QueryContinueDragEventArgs.cs
- sqlpipe.cs
- XXXOnTypeBuilderInstantiation.cs
- PathGradientBrush.cs
- TransportConfigurationTypeElementCollection.cs
- DbProviderFactoriesConfigurationHandler.cs
- TextTreeInsertUndoUnit.cs
- GroupDescription.cs
- VectorCollectionValueSerializer.cs
- WindowsTab.cs
- MetabaseSettings.cs
- sqlser.cs
- SmiRecordBuffer.cs
- StackSpiller.cs
- xsdvalidator.cs
- AppSettingsExpressionBuilder.cs
- ToolStripSplitStackLayout.cs
- MethodAccessException.cs
- PointHitTestResult.cs
- ZipIOExtraFieldElement.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- FirstQueryOperator.cs
- brushes.cs
- SessionConnectionReader.cs
- ConditionalExpression.cs
- SafeWaitHandle.cs
- ToolStripItemClickedEventArgs.cs
- SafeLocalMemHandle.cs
- EntityDataSourceReferenceGroup.cs
- ArrayList.cs
- StorageAssociationSetMapping.cs
- ProfileEventArgs.cs
- PolyLineSegmentFigureLogic.cs