Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / _SpnDictionary.cs / 1 / _SpnDictionary.cs
/*++ Copyright (c) Microsoft Corporation Module Name: _SpnDictionary.cs Abstract: This internal class implements a static mutlithreaded dictionary for user-registered SPNs. An SPN is mapped based on a Uri prefix that contains scheme, host and port. Author: Alexei Vopilov 15-Nov-2003 Revision History: --*/ namespace System.Net { using System; using System.Collections; using System.Collections.Specialized; using System.Security.Permissions; internal class SpnDictionary : StringDictionary { // //A Hashtable can support one writer and multiple readers concurrently // private Hashtable m_SyncTable = Hashtable.Synchronized(new Hashtable()); // // internal SpnDictionary():base() { } // // // public override int Count { get { ExceptionHelper.WebPermissionUnrestricted.Demand(); return m_SyncTable.Count; } } // // We are thread safe // public override bool IsSynchronized { get { return true; } } // // Internal lookup, bypasses security checks // internal string InternalGet(string canonicalKey) { int lastLength = 0; string key = null; foreach (object o in m_SyncTable.Keys){ string s = (string) o; if(s != null && s.Length > lastLength){ if(String.Compare(s,0,canonicalKey,0,s.Length,StringComparison.OrdinalIgnoreCase) == 0){ lastLength = s.Length; key = s; } } } return (key != null) ? (string)m_SyncTable[key]: null; } internal void InternalSet(string canonicalKey, string spn) { m_SyncTable[canonicalKey] = spn; } // // Public lookup method // public override string this[string key] { get { key = GetCanonicalKey(key); return InternalGet(key); } set { key = GetCanonicalKey(key); InternalSet(key, value); } } // public override ICollection Keys { get { ExceptionHelper.WebPermissionUnrestricted.Demand(); return m_SyncTable.Keys; } } // public override object SyncRoot { [HostProtection(Synchronization=true)] get { ExceptionHelper.WebPermissionUnrestricted.Demand(); return m_SyncTable; } } // public override ICollection Values { get { ExceptionHelper.WebPermissionUnrestricted.Demand(); return m_SyncTable.Values; } } // public override void Add(string key, string value) { key = GetCanonicalKey(key); m_SyncTable.Add(key, value); } // public override void Clear() { ExceptionHelper.WebPermissionUnrestricted.Demand(); m_SyncTable.Clear(); } // public override bool ContainsKey(string key) { key = GetCanonicalKey(key); return m_SyncTable.ContainsKey(key); } // public override bool ContainsValue(string value) { ExceptionHelper.WebPermissionUnrestricted.Demand(); return m_SyncTable.ContainsValue(value); } // public override void CopyTo(Array array, int index) { ExceptionHelper.WebPermissionUnrestricted.Demand(); m_SyncTable.CopyTo(array, index); } // public override IEnumerator GetEnumerator() { ExceptionHelper.WebPermissionUnrestricted.Demand(); return m_SyncTable.GetEnumerator(); } // public override void Remove(string key) { key = GetCanonicalKey(key); m_SyncTable.Remove(key); } // // Private stuff: We want to serialize on updates on one thread // private static string GetCanonicalKey(string key) { if( key == null ) { throw new ArgumentNullException("key"); } try { Uri uri = new Uri(key); key = uri.GetParts(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.SafeUnescaped); new WebPermission(NetworkAccess.Connect, new Uri(key)).Demand(); } catch(UriFormatException e) { throw new ArgumentException(SR.GetString(SR.net_mustbeuri, "key"), "key", e); } return key; } } }
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ButtonChrome.cs
- MessagingDescriptionAttribute.cs
- SectionXmlInfo.cs
- DataGridRowsPresenter.cs
- AppLevelCompilationSectionCache.cs
- OpenFileDialog.cs
- XmlWriter.cs
- RuntimeArgumentHandle.cs
- ResourcePart.cs
- TerminateDesigner.cs
- EditorZoneBase.cs
- NameValueCollection.cs
- XsltException.cs
- StyleCollectionEditor.cs
- CharConverter.cs
- HeaderPanel.cs
- MetaModel.cs
- TextRangeAdaptor.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- XmlIncludeAttribute.cs
- ExtendedPropertyDescriptor.cs
- SmiEventStream.cs
- TransformerInfo.cs
- WebPartMinimizeVerb.cs
- MergePropertyDescriptor.cs
- SynchronizedReadOnlyCollection.cs
- WebServiceResponseDesigner.cs
- MetadataCache.cs
- IPGlobalProperties.cs
- Int64AnimationBase.cs
- CustomGrammar.cs
- ChannelManagerService.cs
- SelectionGlyph.cs
- PersonalizationState.cs
- HtmlMeta.cs
- ConnectionPointCookie.cs
- regiisutil.cs
- Trace.cs
- BuildManagerHost.cs
- CodeArrayIndexerExpression.cs
- PinnedBufferMemoryStream.cs
- ImageAutomationPeer.cs
- SoapDocumentMethodAttribute.cs
- VectorAnimation.cs
- Literal.cs
- GradientBrush.cs
- FieldDescriptor.cs
- PtsHost.cs
- EntityParameterCollection.cs
- CodeGotoStatement.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- ColorConvertedBitmap.cs
- MenuRendererClassic.cs
- ColumnClickEvent.cs
- SqlDataSourceSelectingEventArgs.cs
- QilLoop.cs
- WindowInteractionStateTracker.cs
- PostBackTrigger.cs
- ListViewSortEventArgs.cs
- BrushValueSerializer.cs
- BaseDataList.cs
- SpnEndpointIdentity.cs
- ComponentResourceManager.cs
- KeyNotFoundException.cs
- MimeFormatExtensions.cs
- XmlCustomFormatter.cs
- GlyphShapingProperties.cs
- ImageSourceConverter.cs
- SqlConnectionStringBuilder.cs
- ObjectTypeMapping.cs
- FormatConvertedBitmap.cs
- TdsParserHelperClasses.cs
- CriticalHandle.cs
- MappingModelBuildProvider.cs
- UDPClient.cs
- IsolatedStorageFilePermission.cs
- RawMouseInputReport.cs
- OleDbError.cs
- CodeEntryPointMethod.cs
- UIElementCollection.cs
- DebugView.cs
- ExtensionSimplifierMarkupObject.cs
- NumberSubstitution.cs
- Vector3DValueSerializer.cs
- ClientProxyGenerator.cs
- PathTooLongException.cs
- WorkflowValidationFailedException.cs
- Scheduling.cs
- StyleCollectionEditor.cs
- Line.cs
- FrameworkPropertyMetadata.cs
- Rfc2898DeriveBytes.cs
- ServiceOperationWrapper.cs
- Int16AnimationBase.cs
- JoinQueryOperator.cs
- httpserverutility.cs
- IOException.cs
- ValuePatternIdentifiers.cs
- DropShadowBitmapEffect.cs
- FlowDocumentReader.cs