//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ namespace System.ServiceModel.Configuration { using System.Collections.Generic; using System.Configuration; using System.Globalization; using System.Runtime; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.Text; using System.Xml; sealed partial class UnrecognizedPolicyAssertionElement : BindingElementExtensionElement { XmlQualifiedName wsdlBinding; ICollection bindingAsserions; IDictionary> operationAssertions; IDictionary> messageAssertions; public override Type BindingElementType { get { return typeof(UnrecognizedAssertionsBindingElement); } } public override void CopyFrom(ServiceModelExtensionElement from) { base.CopyFrom(from); UnrecognizedPolicyAssertionElement source = (UnrecognizedPolicyAssertionElement)from; #pragma warning suppress 56506 //markg; base.CopyFrom() checks for 'from' being null this.wsdlBinding = source.wsdlBinding; this.bindingAsserions = source.bindingAsserions; this.operationAssertions = source.operationAssertions; this.messageAssertions = source.messageAssertions; } protected internal override BindingElement CreateBindingElement() { return new UnrecognizedAssertionsBindingElement(XmlQualifiedName.Empty, null); } protected internal override void InitializeFrom(BindingElement bindingElement) { base.InitializeFrom(bindingElement); UnrecognizedAssertionsBindingElement binding = (UnrecognizedAssertionsBindingElement)bindingElement; this.wsdlBinding = binding.WsdlBinding; this.bindingAsserions = binding.BindingAsserions; this.operationAssertions = binding.OperationAssertions; this.messageAssertions = binding.MessageAssertions; } protected override bool SerializeToXmlElement(XmlWriter writer, String elementName) { XmlDocument document = new XmlDocument(); if (writer != null && this.bindingAsserions != null && this.bindingAsserions.Count > 0) { int indent = 1; XmlWriterSettings settings = WriterSettings(writer); Fx.Assert(this.wsdlBinding != null, ""); WriteComment(SR.GetString(SR.UnrecognizedBindingAssertions1, this.wsdlBinding.Namespace), indent, writer, settings); WriteComment(String.Format(CultureInfo.InvariantCulture, "", this.wsdlBinding.Name), indent, writer, settings); indent++; foreach (XmlElement assertion in this.bindingAsserions) { WriteComment(ToString(assertion, document), indent, writer, settings); } if (this.operationAssertions == null || this.operationAssertions.Count == 0) return true; foreach (OperationDescription operation in this.operationAssertions.Keys) { WriteComment(String.Format(CultureInfo.InvariantCulture, "", operation.Name), indent, writer, settings); indent++; foreach (XmlElement assertion in this.operationAssertions[operation]) { WriteComment(ToString(assertion, document), indent, writer, settings); } if (this.messageAssertions == null || this.messageAssertions.Count == 0) return true; foreach (MessageDescription message in operation.Messages) { ICollection assertions; if (this.messageAssertions.TryGetValue(message, out assertions)) { if (message.Direction == MessageDirection.Input) WriteComment("", indent, writer, settings); else if (message.Direction == MessageDirection.Output) WriteComment("", indent, writer, settings); foreach (XmlElement assertion in assertions) { WriteComment(ToString(assertion, document), indent + 1, writer, settings); } } } } return true; } return false; } protected override void Unmerge(ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode) { if (sourceElement is UnrecognizedPolicyAssertionElement) { this.wsdlBinding = ((UnrecognizedPolicyAssertionElement)sourceElement).wsdlBinding; this.bindingAsserions = ((UnrecognizedPolicyAssertionElement)sourceElement).bindingAsserions; this.operationAssertions = ((UnrecognizedPolicyAssertionElement)sourceElement).operationAssertions; this.messageAssertions = ((UnrecognizedPolicyAssertionElement)sourceElement).messageAssertions; } base.Unmerge(sourceElement, parentElement, saveMode); } string ToString(XmlElement e, XmlDocument document) { XmlElement top = document.CreateElement(e.Prefix, e.LocalName, e.NamespaceURI); top.InsertBefore(document.CreateTextNode(".."), null); return top.OuterXml; } void WriteComment(string text, int indent, XmlWriter writer, XmlWriterSettings settings) { if (settings.Indent) { // indent is always > 0 StringBuilder sb = new StringBuilder(); for (int i = 0; i < indent; i++) { sb.Append(settings.IndentChars); } sb.Append(text); sb.Append(settings.IndentChars); text = sb.ToString(); } writer.WriteComment(text); } XmlWriterSettings WriterSettings(XmlWriter writer) { if (writer.Settings == null) { // V1 writers XmlWriterSettings settings = new XmlWriterSettings(); XmlTextWriter xmlTextWriter = writer as XmlTextWriter; if (xmlTextWriter != null) { settings.Indent = xmlTextWriter.Formatting == Formatting.Indented; if (settings.Indent && xmlTextWriter.Indentation > 0) { StringBuilder sb = new StringBuilder(xmlTextWriter.Indentation); for (int i = 0; i < xmlTextWriter.Indentation; i++) sb.Append(xmlTextWriter.IndentChar); settings.IndentChars = sb.ToString(); } } return settings; } return writer.Settings; } } }