Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Dispatcher / ActionMessageFilterTable.cs / 1 / ActionMessageFilterTable.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.ServiceModel.Diagnostics;
using System.Runtime.Serialization;
[DataContract]
internal class ActionMessageFilterTable : IMessageFilterTable
{
Dictionary filters;
Dictionary> actions;
List always;
public ActionMessageFilterTable()
{
Init();
}
void Init()
{
this.filters = new Dictionary();
this.actions = new Dictionary>();
this.always = new List();
}
public TFilterData this[MessageFilter filter]
{
get
{
return this.filters[filter];
}
set
{
if(this.filters.ContainsKey(filter))
{
this.filters[filter] = value;
}
else
{
this.Add(filter, value);
}
}
}
public int Count
{
get
{
return this.filters.Count;
}
}
[DataMember(IsRequired = true)]
Entry[] Entries
{
get
{
Entry[] entries = new Entry[Count];
int i = 0;
foreach (KeyValuePair item in filters)
entries[i++] = new Entry(item.Key, item.Value);
return entries;
}
set
{
Init();
for(int i = 0; i < value.Length; ++i)
Add(value[i].filter, value[i].data);
}
}
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(ActionMessageFilter filter, TFilterData data)
{
if(filter == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
}
this.filters.Add(filter, data);
List filters;
#pragma warning suppress 56506 // [....], Actions will never be null
if(filter.Actions.Count == 0)
{
this.always.Add(filter);
}
else
{
for(int i = 0; i < filter.Actions.Count; ++i)
{
if(!this.actions.TryGetValue(filter.Actions[i], out filters))
{
filters = new List();
this.actions.Add(filter.Actions[i], filters);
}
filters.Add(filter);
}
}
}
public void Add(MessageFilter filter, TFilterData data)
{
if(filter == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
}
Add((ActionMessageFilter)filter, data);
}
public void Add(KeyValuePair item)
{
Add(item.Key, item.Value);
}
public void Clear()
{
this.filters.Clear();
this.actions.Clear();
this.always.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);
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public IEnumerator> GetEnumerator()
{
return ((ICollection>)this.filters).GetEnumerator();
}
MessageFilter InnerMatch(Message message)
{
string act = message.Headers.Action;
if(act == null)
{
act = string.Empty;
}
List filters;
if(this.actions.TryGetValue(act, out filters))
{
if(this.always.Count + filters.Count > 1)
{
List tmp = new List(filters);
tmp.AddRange(this.always);
Collection matches = new Collection(tmp);
throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, matches), message);
}
return filters[0];
}
if(this.always.Count > 1)
{
Collection matches = new Collection(new List(this.always));
throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches), null, matches), message);
}
else if(this.always.Count == 1)
{
return this.always[0];
}
return null;
}
void InnerMatch(Message message, ICollection results)
{
for(int i = 0; i < this.always.Count; ++i)
{
results.Add(this.always[i]);
}
string act = message.Headers.Action;
if(act == null)
{
act = string.Empty;
}
List filters;
if(this.actions.TryGetValue(act, out filters))
{
for(int i = 0; i < filters.Count; ++i)
{
results.Add(filters[i]);
}
}
}
void InnerMatchData(Message message, ICollection results)
{
for(int i = 0; i < this.always.Count; ++i)
{
results.Add(this.filters[this.always[i]]);
}
string act = message.Headers.Action;
if(act == null)
{
act = string.Empty;
}
List filters;
if(this.actions.TryGetValue(act, out filters))
{
for(int i = 0; i < filters.Count; ++i)
{
results.Add(this.filters[filters[i]]);
}
}
}
public bool GetMatchingValue(Message message, out TFilterData data)
{
if (message == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
}
MessageFilter f = InnerMatch(message);
if(f == null)
{
data = default(TFilterData);
return false;
}
data = this.filters[f];
return true;
}
public bool GetMatchingValue(MessageBuffer messageBuffer, out TFilterData data)
{
if (messageBuffer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("messageBuffer");
}
MessageFilter f = null;
Message msg = messageBuffer.CreateMessage();
try
{
f = InnerMatch(msg);
}
finally
{
msg.Close();
}
if(f == null)
{
data = default(TFilterData);
return false;
}
data = this.filters[f];
return true;
}
public bool GetMatchingFilter(Message message, out MessageFilter filter)
{
if (message == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
}
filter = InnerMatch(message);
return filter != null;
}
public bool GetMatchingFilter(MessageBuffer messageBuffer, out MessageFilter filter)
{
if (messageBuffer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("messageBuffer");
}
Message msg = messageBuffer.CreateMessage();
try
{
filter = InnerMatch(msg);
return filter != null;
}
finally
{
msg.Close();
}
}
public bool GetMatchingFilters(Message message, ICollection results)
{
if (message == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
}
if (results == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results");
}
int count = results.Count;
InnerMatch(message, results);
return count != results.Count;
}
public bool GetMatchingFilters(MessageBuffer messageBuffer, ICollection results)
{
if (messageBuffer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("messageBuffer");
}
if (results == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results");
}
Message msg = messageBuffer.CreateMessage();
try
{
int count = results.Count;
InnerMatch(msg, results);
return count != results.Count;
}
finally
{
msg.Close();
}
}
public bool GetMatchingValues(Message message, ICollection results)
{
if (message == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
}
if (results == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results");
}
int count = results.Count;
InnerMatchData(message, results);
return count != results.Count;
}
public bool GetMatchingValues(MessageBuffer messageBuffer, ICollection results)
{
if (messageBuffer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("messageBuffer");
}
if (results == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("results");
}
Message msg = messageBuffer.CreateMessage();
try
{
int count = results.Count;
InnerMatchData(msg, results);
return count != results.Count;
}
finally
{
msg.Close();
}
}
public bool Remove(ActionMessageFilter filter)
{
if(filter == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
}
if(this.filters.Remove(filter))
{
#pragma warning suppress 56506 // [....], ActionMessageFilter.Actions can never be null
if(filter.Actions.Count == 0)
{
this.always.Remove(filter);
}
else
{
List filters;
for(int i = 0; i < filter.Actions.Count; ++i)
{
#pragma warning suppress 56506 // [....], PreSharp generates a false error here
filters = this.actions[filter.Actions[i]];
#pragma warning suppress 56506 // [....], filters can never be null
if(filters.Count == 1)
{
this.actions.Remove(filter.Actions[i]);
}
else
{
filters.Remove(filter);
}
}
}
return true;
}
return false;
}
public bool Remove(MessageFilter filter)
{
if(filter == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("filter");
}
ActionMessageFilter aFilter = filter as ActionMessageFilter;
if(aFilter != null)
{
return Remove(aFilter);
}
return false;
}
public bool Remove(KeyValuePair item)
{
if(((ICollection>)this.filters).Contains(item))
{
return Remove(item.Key);
}
return false;
}
public bool TryGetValue(MessageFilter filter, out TFilterData data)
{
return this.filters.TryGetValue(filter, out data);
}
[DataContract]
class Entry
{
[DataMember(IsRequired = true)]
internal MessageFilter filter;
[DataMember(IsRequired = true)]
internal TFilterData data;
internal Entry(MessageFilter f, TFilterData d)
{
filter = f;
data = d;
}
}
}
}
// 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
- ReflectTypeDescriptionProvider.cs
- SimpleMailWebEventProvider.cs
- XmlDocumentSurrogate.cs
- SineEase.cs
- BoundPropertyEntry.cs
- RegistrySecurity.cs
- DiffuseMaterial.cs
- TextViewSelectionProcessor.cs
- DataKeyArray.cs
- NotEqual.cs
- xdrvalidator.cs
- EnumConverter.cs
- CompilerGeneratedAttribute.cs
- ZeroOpNode.cs
- DecoratedNameAttribute.cs
- TextTreeTextBlock.cs
- WindowsContainer.cs
- ObjectDataSourceEventArgs.cs
- SerTrace.cs
- WorkflowView.cs
- TreeWalkHelper.cs
- SecureEnvironment.cs
- SystemIPGlobalStatistics.cs
- ProofTokenCryptoHandle.cs
- CollectionViewProxy.cs
- DocComment.cs
- InternalConfigRoot.cs
- InternalTypeHelper.cs
- DefaultDiscoveryService.cs
- Merger.cs
- ConnectionOrientedTransportBindingElement.cs
- BindingExpressionUncommonField.cs
- VisualBasic.cs
- AttachedPropertyDescriptor.cs
- ResourceWriter.cs
- SHA512.cs
- HtmlTable.cs
- InternalCache.cs
- CallbackValidatorAttribute.cs
- PointUtil.cs
- EventlogProvider.cs
- IIS7WorkerRequest.cs
- TableDetailsCollection.cs
- LabelEditEvent.cs
- DataGridViewBand.cs
- RequestQueryParser.cs
- Style.cs
- X509Extension.cs
- CheckPair.cs
- UserNameSecurityTokenAuthenticator.cs
- AsyncOperation.cs
- ConnectionsZoneDesigner.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- Clipboard.cs
- Point.cs
- VariableQuery.cs
- RegisterResponseInfo.cs
- MembershipSection.cs
- KeyFrames.cs
- ContentElementAutomationPeer.cs
- ImpersonateTokenRef.cs
- QilGenerator.cs
- GlobalizationSection.cs
- PropertyValueUIItem.cs
- FrameworkElement.cs
- ZipArchive.cs
- ScrollChangedEventArgs.cs
- PreservationFileWriter.cs
- TraceHandler.cs
- StaticResourceExtension.cs
- PageThemeBuildProvider.cs
- SymbolEqualComparer.cs
- ObjectDataSourceView.cs
- BulletChrome.cs
- SHA384CryptoServiceProvider.cs
- TypeName.cs
- NamespaceEmitter.cs
- TraceLevelStore.cs
- SrgsDocumentParser.cs
- JournalEntryStack.cs
- HeaderUtility.cs
- _AuthenticationState.cs
- TextParagraph.cs
- RepeatBehavior.cs
- StateRuntime.cs
- CheckBoxFlatAdapter.cs
- ConfigurationHandlersInstallComponent.cs
- Tablet.cs
- ResourceSet.cs
- ServiceDurableInstanceContextProvider.cs
- CodeDirectoryCompiler.cs
- ClassData.cs
- ExpandSegment.cs
- XmlName.cs
- LinqDataSourceHelper.cs
- MapPathBasedVirtualPathProvider.cs
- ImageMetadata.cs
- PrincipalPermission.cs
- BooleanFunctions.cs
- EventDescriptor.cs