Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Dispatcher / MessageFilterTable.cs / 1 / MessageFilterTable.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System; using System.ServiceModel.Channels; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.ServiceModel.Diagnostics; using System.Runtime.Serialization; [DataContract] public class MessageFilterTable: IMessageFilterTable { Dictionary filterTypeMappings; Dictionary filters; SortedBuffer tables; int defaultPriority; public MessageFilterTable() : this(0) { } public MessageFilterTable(int defaultPriority) { Init(defaultPriority); } [OnDeserializing] private void OnDeserializing(StreamingContext context) { Init(0); } void Init(int defaultPriority) { CreateEmptyTables(); this.defaultPriority = defaultPriority; } public TFilterData this[MessageFilter filter] { get { return this.filters[filter]; } set { if(this.ContainsKey(filter)) { int p = this.GetPriority(filter); this.Remove(filter); this.Add(filter, value, p); } else { this.Add(filter, value, this.defaultPriority); } } } public int Count { get { return this.filters.Count; } } [DataMember] public int DefaultPriority { get { return this.defaultPriority; } set { this.defaultPriority = value; } } [DataMember] Entry[] Entries { get { Entry[] entries = new Entry[Count]; int i = 0; foreach (KeyValuePair item in this.filters) { entries[i++] = new Entry(item.Key, item.Value, GetPriority(item.Key)); } return entries; } set { for (int i = 0; i < value.Length; ++i) { Entry e = value[i]; Add(e.filter, e.data, e.priority); } } } public bool IsReadOnly { get { return false; } } public ICollection Keys { get { return this.filters.Keys; } } public ICollection Values { get { return this.filters.Values; } } public void Add(MessageFilter filter, TFilterData data) { this.Add(filter, data, this.defaultPriority); } public void Add(MessageFilter filter, TFilterData data, int priority) { if(filter == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter"); } if(this.filters.ContainsKey(filter)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("filter", SR.GetString(SR.FilterExists)); } #pragma warning suppress 56506 // [....], PreSharp generates a false warning here Type filterType = filter.GetType(); Type tableType = null; IMessageFilterTable table = null; if(this.filterTypeMappings.TryGetValue(filterType, out tableType)) { for(int i = 0; i < this.tables.Count; ++i) { if(this.tables[i].priority == priority && this.tables[i].table.GetType().Equals(tableType)) { table = this.tables[i].table; break; } } if(table == null) { table = CreateFilterTable(filter); ValidateTable(table); if(!table.GetType().Equals(tableType)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.FilterTableTypeMismatch))); } table.Add(filter, data); this.tables.Add(new FilterTableEntry(priority, table)); } else { table.Add(filter, data); } } else { table = CreateFilterTable(filter); ValidateTable(table); this.filterTypeMappings.Add(filterType, table.GetType()); FilterTableEntry entry = new FilterTableEntry(priority, table); int idx = this.tables.IndexOf(entry); if(idx >= 0) { table = this.tables[idx].table; } else { this.tables.Add(entry); } table.Add(filter, data); } this.filters.Add(filter, data); } public void Add(KeyValuePair item) { this.Add(item.Key, item.Value); } public void Clear() { this.filters.Clear(); this.tables.Clear(); } public bool Contains(KeyValuePair item) { return ((ICollection >)this.filters).Contains(item); } public bool ContainsKey(MessageFilter filter) { return this.filters.ContainsKey(filter); } public void CopyTo(KeyValuePair [] array, int arrayIndex) { ((ICollection >)this.filters).CopyTo(array, arrayIndex); } void CreateEmptyTables() { this.filterTypeMappings = new Dictionary (); this.filters = new Dictionary (); this.tables = new SortedBuffer (); } protected virtual IMessageFilterTable CreateFilterTable(MessageFilter filter) { IMessageFilterTable ft = filter.CreateFilterTable (); if (ft == null) return new SequentialMessageFilterTable (); return ft; } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } public IEnumerator > GetEnumerator() { return ((ICollection >)this.filters).GetEnumerator(); } public int GetPriority(MessageFilter filter) { TFilterData d = this.filters[filter]; for(int i = 0; i < this.tables.Count; ++i) { if(this.tables[i].table.ContainsKey(filter)) { return this.tables[i].priority; } } throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new InvalidOperationException(SR.GetString(SR.FilterTableInvalidForLookup))); } public bool GetMatchingValue(Message message, out TFilterData data) { bool dataSet = false; int pri = int.MinValue; data = default(TFilterData); for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && dataSet) { break; } pri = this.tables[i].priority; if(this.tables[i].table.GetMatchingValue(message, out data)) { if(dataSet) { throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, null), message); } dataSet = true; } } return dataSet; } internal bool GetMatchingValue(Message message, out TFilterData data, out bool addressMatched) { bool dataSet = false; int pri = int.MinValue; data = default(TFilterData); addressMatched = false; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && dataSet) { break; } pri = this.tables[i].priority; bool matchResult; IMessageFilterTable table = this.tables[i].table; AndMessageFilterTable andTable = table as AndMessageFilterTable ; if (andTable != null) { bool addressResult; matchResult = andTable.GetMatchingValue(message, out data, out addressResult); addressMatched |= addressResult; } else { matchResult = table.GetMatchingValue(message, out data); } if(matchResult) { if(dataSet) { throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, null), message); } addressMatched = true; dataSet = true; } } return dataSet; } public bool GetMatchingValue(MessageBuffer buffer, out TFilterData data) { bool dataSet = false; int pri = int.MinValue; data = default(TFilterData); for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && dataSet) { break; } pri = this.tables[i].priority; if(this.tables[i].table.GetMatchingValue(buffer, out data)) { if(dataSet) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, null)); } dataSet = true; } } return dataSet; } public bool GetMatchingValues(Message message, ICollection results) { if (results == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results"); } int count = results.Count; int pri = int.MinValue; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && count != results.Count) { break; } pri = this.tables[i].priority; this.tables[i].table.GetMatchingValues(message, results); } return count != results.Count; } public bool GetMatchingValues(MessageBuffer buffer, ICollection results) { if (results == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results"); } int count = results.Count; int pri = int.MinValue; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && count != results.Count) { break; } pri = this.tables[i].priority; this.tables[i].table.GetMatchingValues(buffer, results); } return count != results.Count; } public bool GetMatchingFilter(Message message, out MessageFilter filter) { MessageFilter f; int pri = int.MinValue; filter = null; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && filter != null) { break; } pri = this.tables[i].priority; if(this.tables[i].table.GetMatchingFilter(message, out f)) { if(filter == null) { filter = f; } else { Collection c = new Collection (); c.Add(filter); c.Add(f); throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, c), message); } } } return filter != null; } public bool GetMatchingFilter(MessageBuffer buffer, out MessageFilter filter) { MessageFilter f; int pri = int.MinValue; filter = null; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && filter != null) { break; } pri = this.tables[i].priority; if(this.tables[i].table.GetMatchingFilter(buffer, out f)) { if(filter == null) { filter = f; } else { Collection c = new Collection (); c.Add(filter); c.Add(f); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, c)); } } } return filter != null; } public bool GetMatchingFilters(Message message, ICollection results) { if (results == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results"); } int count = results.Count; int pri = int.MinValue; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if(pri > this.tables[i].priority && count != results.Count) { break; } pri = this.tables[i].priority; this.tables[i].table.GetMatchingFilters(message, results); } return count != results.Count; } public bool GetMatchingFilters(MessageBuffer buffer, ICollection results) { if (results == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results"); } int count = results.Count; int pri = int.MinValue; for(int i = 0; i < this.tables.Count; ++i) { // Watch for the end of a bucket if (pri > this.tables[i].priority && count != results.Count) { break; } pri = this.tables[i].priority; this.tables[i].table.GetMatchingFilters(buffer, results); } return count != results.Count; } public bool Remove(MessageFilter filter) { for(int i = 0; i < this.tables.Count; ++i) { if(this.tables[i].table.Remove(filter)) { if(this.tables[i].table.Count == 0) { this.tables.RemoveAt(i); } return this.filters.Remove(filter); } } return false; } public bool Remove(KeyValuePair item) { if(((ICollection >)this.filters).Contains(item)) { return this.Remove(item.Key); } return false; } public bool TryGetValue(MessageFilter filter, out TFilterData data) { return this.filters.TryGetValue(filter, out data); } void ValidateTable(IMessageFilterTable table) { Type t = this.GetType(); if(t.IsInstanceOfType(table)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.FilterBadTableType))); } } /////////////////////////////////////////////////// struct FilterTableEntry { internal IMessageFilterTable table; internal int priority; internal FilterTableEntry(int pri, IMessageFilterTable t) { this.priority = pri; this.table = t; } } class TableEntryComparer : IComparer { public TableEntryComparer() {} public int Compare(FilterTableEntry x, FilterTableEntry y) { // Highest priority first int p = y.priority.CompareTo(x.priority); if(p != 0) { return p; } return x.table.GetType().FullName.CompareTo(y.table.GetType().FullName); } public bool Equals(FilterTableEntry x, FilterTableEntry y) { // Highest priority first int p = y.priority.CompareTo(x.priority); if(p != 0) { return false; } return x.table.GetType().FullName.Equals(y.table.GetType().FullName); } public int GetHashCode(FilterTableEntry table) { return table.GetHashCode(); } } [DataContract] class Entry { [DataMember(IsRequired = true)] internal MessageFilter filter; [DataMember(IsRequired = true)] internal TFilterData data; [DataMember(IsRequired = true)] internal int priority; internal Entry(MessageFilter f, TFilterData d, int p) { filter = f; data = d; priority = p; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EventRouteFactory.cs
- Mapping.cs
- RelationshipEntry.cs
- PenLineJoinValidation.cs
- WebWorkflowRole.cs
- LicFileLicenseProvider.cs
- DispatcherProcessingDisabled.cs
- TcpTransportElement.cs
- basevalidator.cs
- KnownBoxes.cs
- DbConnectionStringCommon.cs
- AsmxEndpointPickerExtension.cs
- FaultDescriptionCollection.cs
- PeerNameRegistration.cs
- TimeManager.cs
- DateRangeEvent.cs
- Assert.cs
- SqlCommandBuilder.cs
- GorillaCodec.cs
- TransformConverter.cs
- DrawingGroup.cs
- AutomationPropertyInfo.cs
- CodeTypeDeclarationCollection.cs
- WaitHandleCannotBeOpenedException.cs
- XmlQueryOutput.cs
- __Filters.cs
- TraceLevelHelper.cs
- DocumentGridPage.cs
- InputBuffer.cs
- CodeVariableReferenceExpression.cs
- ScriptComponentDescriptor.cs
- InteropTrackingRecord.cs
- XmlNamespaceManager.cs
- HebrewNumber.cs
- BinaryFormatterWriter.cs
- EntityTypeEmitter.cs
- XmlUtil.cs
- MatrixAnimationUsingPath.cs
- FunctionImportElement.cs
- Drawing.cs
- SkewTransform.cs
- TreeViewBindingsEditor.cs
- ProcessMessagesAsyncResult.cs
- MaterialGroup.cs
- ObjectItemConventionAssemblyLoader.cs
- StylusCaptureWithinProperty.cs
- ToolStripItemRenderEventArgs.cs
- EditorZoneDesigner.cs
- LicenseProviderAttribute.cs
- DispatchWrapper.cs
- ConfigurationProviderException.cs
- MatrixCamera.cs
- SiteMapDataSourceView.cs
- PagePropertiesChangingEventArgs.cs
- StorageBasedPackageProperties.cs
- DataGridViewSelectedRowCollection.cs
- XmlValidatingReaderImpl.cs
- TextRunCacheImp.cs
- DependsOnAttribute.cs
- TabletCollection.cs
- FlowDocumentPaginator.cs
- ProcessHost.cs
- CounterSampleCalculator.cs
- DataGridViewRowsAddedEventArgs.cs
- TemplateNameScope.cs
- MemoryPressure.cs
- BaseAsyncResult.cs
- OleDbReferenceCollection.cs
- _NegotiateClient.cs
- SevenBitStream.cs
- UseManagedPresentationBindingElementImporter.cs
- X509CertificateValidationMode.cs
- DataControlPagerLinkButton.cs
- PageAdapter.cs
- SerialPort.cs
- GCHandleCookieTable.cs
- IPAddress.cs
- MetadataProperty.cs
- NetworkAddressChange.cs
- Pen.cs
- RouteParser.cs
- RadioButton.cs
- RecordsAffectedEventArgs.cs
- PolygonHotSpot.cs
- DefaultAsyncDataDispatcher.cs
- MatrixTransform.cs
- DesignerActionMethodItem.cs
- filewebresponse.cs
- ColorTransform.cs
- RewritingProcessor.cs
- KeyInfo.cs
- Comparer.cs
- XmlTextAttribute.cs
- BindingBase.cs
- SmtpDigestAuthenticationModule.cs
- XpsFont.cs
- Graphics.cs
- ViewRendering.cs
- ProjectionPathBuilder.cs
- ListBoxChrome.cs