1 //-----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //-----------------------------------------------------------------------------
4 namespace System.ServiceModel.Dispatcher
8 using System.ServiceModel;
9 using System.ServiceModel.Channels;
11 class PrefixEndpointAddressMessageFilterTable<TFilterData> : EndpointAddressMessageFilterTable<TFilterData>
13 UriPrefixTable<CandidateSet> toHostTable;
14 UriPrefixTable<CandidateSet> toNoHostTable;
16 public PrefixEndpointAddressMessageFilterTable()
21 protected override void InitializeLookupTables()
23 this.toHostTable = new UriPrefixTable<CandidateSet>();
24 this.toNoHostTable = new UriPrefixTable<CandidateSet>();
27 public override void Add(MessageFilter filter, TFilterData data)
31 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
34 Add((PrefixEndpointAddressMessageFilter)filter, data);
37 public override void Add(EndpointAddressMessageFilter filter, TFilterData data)
41 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
44 Fx.Assert("EndpointAddressMessageFilter cannot be added to PrefixEndpointAddressMessageFilterTable");
45 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException("EndpointAddressMessageFilter cannot be added to PrefixEndpointAddressMessageFilterTable"));
48 public void Add(PrefixEndpointAddressMessageFilter filter, TFilterData data)
52 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
55 this.filters.Add(filter, data);
57 // Create the candidate
58 byte[] mask = BuildMask(filter.HeaderLookup);
59 Candidate can = new Candidate(filter, data, mask, filter.HeaderLookup);
60 this.candidates.Add(filter, can);
62 #pragma warning suppress 56506 // [....], PrefixEndpointAddressMessageFilter.Address can never be null
63 Uri soapToAddress = filter.Address.Uri;
66 if (!TryMatchCandidateSet(soapToAddress, filter.IncludeHostNameInComparison, out cset))
68 cset = new CandidateSet();
69 GetAddressTable(filter.IncludeHostNameInComparison).RegisterUri(soapToAddress, GetComparisonMode(filter.IncludeHostNameInComparison), cset);
71 cset.candidates.Add(can);
73 IncrementQNameCount(cset, filter.Address);
76 HostNameComparisonMode GetComparisonMode(bool includeHostNameInComparison)
78 return includeHostNameInComparison ? HostNameComparisonMode.Exact : HostNameComparisonMode.StrongWildcard;
81 UriPrefixTable<CandidateSet> GetAddressTable(bool includeHostNameInComparison)
83 return includeHostNameInComparison ? this.toHostTable : this.toNoHostTable;
86 internal override bool TryMatchCandidateSet(Uri to, bool includeHostNameInComparison, out CandidateSet cset)
88 return GetAddressTable(includeHostNameInComparison).TryLookupUri(to, GetComparisonMode(includeHostNameInComparison), out cset);
91 protected override void ClearLookupTables()
93 this.toHostTable = new UriPrefixTable<EndpointAddressMessageFilterTable<TFilterData>.CandidateSet>();
94 this.toNoHostTable = new UriPrefixTable<EndpointAddressMessageFilterTable<TFilterData>.CandidateSet>();
97 public override bool Remove(MessageFilter filter)
101 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
104 PrefixEndpointAddressMessageFilter pFilter = filter as PrefixEndpointAddressMessageFilter;
107 return Remove(pFilter);
113 public override bool Remove(EndpointAddressMessageFilter filter)
117 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
120 Fx.Assert("EndpointAddressMessageFilter cannot be removed from PrefixEndpointAddressMessageFilterTable");
121 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException("EndpointAddressMessageFilter cannot be removed from PrefixEndpointAddressMessageFilterTable"));
124 public bool Remove(PrefixEndpointAddressMessageFilter filter)
128 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
131 if (!this.filters.Remove(filter))
136 Candidate can = this.candidates[filter];
137 #pragma warning suppress 56506 // [....], PrefixEndpointAddressMessageFilter.Address can never be null
138 Uri soapToAddress = filter.Address.Uri;
140 CandidateSet cset = null;
141 if (TryMatchCandidateSet(soapToAddress, filter.IncludeHostNameInComparison, out cset))
143 if (cset.candidates.Count == 1)
145 GetAddressTable(filter.IncludeHostNameInComparison).UnregisterUri(soapToAddress, GetComparisonMode(filter.IncludeHostNameInComparison));
149 DecrementQNameCount(cset, filter.Address);
152 cset.candidates.Remove(can);
155 this.candidates.Remove(filter);