| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Security
- {
- using System.Collections.Generic;
- using System.ServiceModel.Channels;
- using System.ServiceModel;
- using System.Runtime.Serialization;
- using System.ServiceModel.Security;
- using System.Xml;
- public class ScopedMessagePartSpecification
- {
- MessagePartSpecification channelParts;
- Dictionary<string, MessagePartSpecification> actionParts;
- Dictionary<string, MessagePartSpecification> readOnlyNormalizedActionParts;
- bool isReadOnly;
- public ScopedMessagePartSpecification()
- {
- this.channelParts = new MessagePartSpecification();
- this.actionParts = new Dictionary<string, MessagePartSpecification>();
- }
- public ICollection<string> Actions
- {
- get
- {
- return this.actionParts.Keys;
- }
- }
- public MessagePartSpecification ChannelParts
- {
- get
- {
- return this.channelParts;
- }
- }
- public bool IsReadOnly
- {
- get
- {
- return this.isReadOnly;
- }
- }
- public ScopedMessagePartSpecification(ScopedMessagePartSpecification other)
- : this()
- {
- if (other == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("other"));
- this.channelParts.Union(other.channelParts);
- if (other.actionParts != null)
- {
- foreach (string action in other.actionParts.Keys)
- {
- MessagePartSpecification p = new MessagePartSpecification();
- p.Union(other.actionParts[action]);
- this.actionParts[action] = p;
- }
- }
- }
- internal ScopedMessagePartSpecification(ScopedMessagePartSpecification other, bool newIncludeBody)
- : this(other)
- {
- this.channelParts.IsBodyIncluded = newIncludeBody;
- foreach (string action in this.actionParts.Keys)
- this.actionParts[action].IsBodyIncluded = newIncludeBody;
- }
- public void AddParts(MessagePartSpecification parts)
- {
- if (parts == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parts"));
- ThrowIfReadOnly();
- this.channelParts.Union(parts);
- }
- public void AddParts(MessagePartSpecification parts, string action)
- {
- if (action == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("action"));
- if (parts == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parts"));
- ThrowIfReadOnly();
- if (!this.actionParts.ContainsKey(action))
- this.actionParts[action] = new MessagePartSpecification();
- this.actionParts[action].Union(parts);
- }
- internal void AddParts(MessagePartSpecification parts, XmlDictionaryString action)
- {
- if (action == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("action"));
- AddParts(parts, action.Value);
- }
- internal bool IsEmpty()
- {
- bool result;
- if (!channelParts.IsEmpty())
- {
- result = false;
- }
- else
- {
- result = true;
- foreach (string action in this.Actions)
- {
- MessagePartSpecification parts;
- if (TryGetParts(action, true, out parts))
- {
- if (!parts.IsEmpty())
- {
- result = false;
- break;
- }
- }
- }
- }
- return result;
- }
- public bool TryGetParts(string action, bool excludeChannelScope, out MessagePartSpecification parts)
- {
- if (action == null)
- action = MessageHeaders.WildcardAction;
- parts = null;
- if (this.isReadOnly)
- {
- if (this.readOnlyNormalizedActionParts.ContainsKey(action))
- if (excludeChannelScope)
- parts = this.actionParts[action];
- else
- parts = this.readOnlyNormalizedActionParts[action];
- }
- else if (this.actionParts.ContainsKey(action))
- {
- MessagePartSpecification p = new MessagePartSpecification();
- p.Union(this.actionParts[action]);
- if (!excludeChannelScope)
- p.Union(this.channelParts);
- parts = p;
- }
- return parts != null;
- }
- internal void CopyTo(ScopedMessagePartSpecification target)
- {
- if (target == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("target");
- }
- target.ChannelParts.IsBodyIncluded = this.ChannelParts.IsBodyIncluded;
- foreach (XmlQualifiedName headerType in ChannelParts.HeaderTypes)
- {
- if (!target.channelParts.IsHeaderIncluded(headerType.Name, headerType.Namespace))
- {
- target.ChannelParts.HeaderTypes.Add(headerType);
- }
- }
- foreach (string action in this.actionParts.Keys)
- {
- target.AddParts(this.actionParts[action], action);
- }
- }
- public bool TryGetParts(string action, out MessagePartSpecification parts)
- {
- return this.TryGetParts(action, false, out parts);
- }
- public void MakeReadOnly()
- {
- if (!this.isReadOnly)
- {
- this.readOnlyNormalizedActionParts = new Dictionary<string, MessagePartSpecification>();
- foreach (string action in this.actionParts.Keys)
- {
- MessagePartSpecification p = new MessagePartSpecification();
- p.Union(this.actionParts[action]);
- p.Union(this.channelParts);
- p.MakeReadOnly();
- this.readOnlyNormalizedActionParts[action] = p;
- }
- this.isReadOnly = true;
- }
- }
- void ThrowIfReadOnly()
- {
- if (this.isReadOnly)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ObjectIsReadOnly)));
- }
- }
- }
|