File: System\ServiceModel\EndpointAddressAugust2004.cs
Project: ndp\cdf\src\WCF\ServiceModel\System.ServiceModel.csproj (System.ServiceModel)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.ServiceModel
{
    using System;
    using System.ServiceModel.Channels;
    using System.Xml;
    using System.Xml.Schema;
    using System.Xml.Serialization;
    using System.Collections;
    using System.Text;
    using System.IO;
 
    [XmlSchemaProvider("GetSchema")]
    [XmlRoot(AddressingStrings.EndpointReference, Namespace = Addressing200408Strings.Namespace)]
    public class EndpointAddressAugust2004 : IXmlSerializable
    {
        static XmlQualifiedName eprType;
 
        EndpointAddress address;
 
        // for IXmlSerializable
        EndpointAddressAugust2004()
        {
            this.address = null;
        }
 
        EndpointAddressAugust2004(EndpointAddress address)
        {
            this.address = address;
        }
 
        public static EndpointAddressAugust2004 FromEndpointAddress(EndpointAddress address)
        {
            if (address == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
            }
            return new EndpointAddressAugust2004(address);
        }
 
        public EndpointAddress ToEndpointAddress()
        {
            return this.address;
        }
 
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            this.address = EndpointAddress.ReadFrom(AddressingVersion.WSAddressingAugust2004, XmlDictionaryReader.CreateDictionaryReader(reader));
        }
 
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            this.address.WriteContentsTo(AddressingVersion.WSAddressingAugust2004, XmlDictionaryWriter.CreateDictionaryWriter(writer));
        }
 
        static XmlQualifiedName EprType
        {
            get
            {
                if (eprType == null)
                    eprType = new XmlQualifiedName(AddressingStrings.EndpointReferenceType, Addressing200408Strings.Namespace);
                return eprType;
            }
        }
 
        static XmlSchema GetEprSchema()
        {
            using (XmlTextReader reader = new XmlTextReader(new StringReader(Schema)) { DtdProcessing = DtdProcessing.Prohibit })
            {
                return XmlSchema.Read(reader, null);
            }
        }
 
        public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
        {
            if (xmlSchemaSet == null)
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlSchemaSet");
            XmlQualifiedName eprType = EprType;
            XmlSchema eprSchema = GetEprSchema();
            ICollection schemas = xmlSchemaSet.Schemas(Addressing200408Strings.Namespace);
            if (schemas == null || schemas.Count == 0)
                xmlSchemaSet.Add(eprSchema);
            else
            {
                XmlSchema schemaToAdd = null;
                foreach (XmlSchema xmlSchema in schemas)
                {
                    if (xmlSchema.SchemaTypes.Contains(eprType))
                    {
                        schemaToAdd = null;
                        break;
                    }
                    else
                        schemaToAdd = xmlSchema;
                }
                if (schemaToAdd != null)
                {
                    foreach (XmlQualifiedName prefixNsPair in eprSchema.Namespaces.ToArray())
                        schemaToAdd.Namespaces.Add(prefixNsPair.Name, prefixNsPair.Namespace);
                    foreach (XmlSchemaObject schemaObject in eprSchema.Items)
                        schemaToAdd.Items.Add(schemaObject);
                    xmlSchemaSet.Reprocess(schemaToAdd);
                }
            }
            return eprType;
        }
 
        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }
 
        const string Schema =
@"<xs:schema targetNamespace=""http://schemas.xmlsoap.org/ws/2004/08/addressing"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:wsa=""http://schemas.xmlsoap.org/ws/2004/08/addressing"" elementFormDefault=""qualified"" blockDefault=""#all"">
  <!-- //////////////////// WS-Addressing //////////////////// -->
  <!-- Endpoint reference -->
  <xs:element name=""EndpointReference"" type=""wsa:EndpointReferenceType""/>
  <xs:complexType name=""EndpointReferenceType"">
    <xs:sequence>
      <xs:element name=""Address"" type=""wsa:AttributedURI""/>
      <xs:element name=""ReferenceProperties"" type=""wsa:ReferencePropertiesType"" minOccurs=""0""/>
      <xs:element name=""ReferenceParameters"" type=""wsa:ReferenceParametersType"" minOccurs=""0""/>
      <xs:element name=""PortType"" type=""wsa:AttributedQName"" minOccurs=""0""/>
      <xs:element name=""ServiceName"" type=""wsa:ServiceNameType"" minOccurs=""0""/>
      <xs:any namespace=""##other"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded"">
        <xs:annotation>
          <xs:documentation>
					 If ""Policy"" elements from namespace ""http://schemas.xmlsoap.org/ws/2002/12/policy#policy"" are used, they must appear first (before any extensibility elements).
					</xs:documentation>
        </xs:annotation>
      </xs:any>
    </xs:sequence>
    <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
  </xs:complexType>
  <xs:complexType name=""ReferencePropertiesType"">
    <xs:sequence>
      <xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name=""ReferenceParametersType"">
    <xs:sequence>
      <xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name=""ServiceNameType"">
    <xs:simpleContent>
      <xs:extension base=""xs:QName"">
        <xs:attribute name=""PortName"" type=""xs:NCName""/>
        <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <!-- Message information header blocks -->
  <xs:element name=""MessageID"" type=""wsa:AttributedURI""/>
  <xs:element name=""RelatesTo"" type=""wsa:Relationship""/>
  <xs:element name=""To"" type=""wsa:AttributedURI""/>
  <xs:element name=""Action"" type=""wsa:AttributedURI""/>
  <xs:element name=""From"" type=""wsa:EndpointReferenceType""/>
  <xs:element name=""ReplyTo"" type=""wsa:EndpointReferenceType""/>
  <xs:element name=""FaultTo"" type=""wsa:EndpointReferenceType""/>
  <xs:complexType name=""Relationship"">
    <xs:simpleContent>
      <xs:extension base=""xs:anyURI"">
        <xs:attribute name=""RelationshipType"" type=""xs:QName"" use=""optional""/>
        <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:simpleType name=""RelationshipTypeValues"">
    <xs:restriction base=""xs:QName"">
      <xs:enumeration value=""wsa:Reply""/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name=""ReplyAfter"" type=""wsa:ReplyAfterType""/>
  <xs:complexType name=""ReplyAfterType"">
    <xs:simpleContent>
      <xs:extension base=""xs:nonNegativeInteger"">
        <xs:anyAttribute namespace=""##other""/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:simpleType name=""FaultSubcodeValues"">
    <xs:restriction base=""xs:QName"">
      <xs:enumeration value=""wsa:InvalidMessageInformationHeader""/>
      <xs:enumeration value=""wsa:MessageInformationHeaderRequired""/>
      <xs:enumeration value=""wsa:DestinationUnreachable""/>
      <xs:enumeration value=""wsa:ActionNotSupported""/>
      <xs:enumeration value=""wsa:EndpointUnavailable""/>
    </xs:restriction>
  </xs:simpleType>
  <xs:attribute name=""Action"" type=""xs:anyURI""/>
  <!-- Common declarations and definitions -->
  <xs:complexType name=""AttributedQName"">
    <xs:simpleContent>
      <xs:extension base=""xs:QName"">
        <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name=""AttributedURI"">
    <xs:simpleContent>
      <xs:extension base=""xs:anyURI"">
        <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>";
    }
}