Moving BSTR conv to native code in SecureStringToBSTR.
[mono.git] / mcs / class / referencesource / System.ServiceModel / System / ServiceModel / EndpointAddressAugust2004.cs
1 //-----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //-----------------------------------------------------------------------------
4 namespace System.ServiceModel
5 {
6     using System;
7     using System.ServiceModel.Channels;
8     using System.Xml;
9     using System.Xml.Schema;
10     using System.Xml.Serialization;
11     using System.Collections;
12     using System.Text;
13     using System.IO;
14
15     [XmlSchemaProvider("GetSchema")]
16     [XmlRoot(AddressingStrings.EndpointReference, Namespace = Addressing200408Strings.Namespace)]
17     public class EndpointAddressAugust2004 : IXmlSerializable
18     {
19         static XmlQualifiedName eprType;
20
21         EndpointAddress address;
22
23         // for IXmlSerializable
24         EndpointAddressAugust2004()
25         {
26             this.address = null;
27         }
28
29         EndpointAddressAugust2004(EndpointAddress address)
30         {
31             this.address = address;
32         }
33
34         public static EndpointAddressAugust2004 FromEndpointAddress(EndpointAddress address)
35         {
36             if (address == null)
37             {
38                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
39             }
40             return new EndpointAddressAugust2004(address);
41         }
42
43         public EndpointAddress ToEndpointAddress()
44         {
45             return this.address;
46         }
47
48         void IXmlSerializable.ReadXml(XmlReader reader)
49         {
50             this.address = EndpointAddress.ReadFrom(AddressingVersion.WSAddressingAugust2004, XmlDictionaryReader.CreateDictionaryReader(reader));
51         }
52
53         void IXmlSerializable.WriteXml(XmlWriter writer)
54         {
55             this.address.WriteContentsTo(AddressingVersion.WSAddressingAugust2004, XmlDictionaryWriter.CreateDictionaryWriter(writer));
56         }
57
58         static XmlQualifiedName EprType
59         {
60             get
61             {
62                 if (eprType == null)
63                     eprType = new XmlQualifiedName(AddressingStrings.EndpointReferenceType, Addressing200408Strings.Namespace);
64                 return eprType;
65             }
66         }
67
68         static XmlSchema GetEprSchema()
69         {
70             using (XmlTextReader reader = new XmlTextReader(new StringReader(Schema)))
71             {
72                 return XmlSchema.Read(reader, null);
73             }
74         }
75
76         public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
77         {
78             if (xmlSchemaSet == null)
79                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlSchemaSet");
80             XmlQualifiedName eprType = EprType;
81             XmlSchema eprSchema = GetEprSchema();
82             ICollection schemas = xmlSchemaSet.Schemas(Addressing200408Strings.Namespace);
83             if (schemas == null || schemas.Count == 0)
84                 xmlSchemaSet.Add(eprSchema);
85             else
86             {
87                 XmlSchema schemaToAdd = null;
88                 foreach (XmlSchema xmlSchema in schemas)
89                 {
90                     if (xmlSchema.SchemaTypes.Contains(eprType))
91                     {
92                         schemaToAdd = null;
93                         break;
94                     }
95                     else
96                         schemaToAdd = xmlSchema;
97                 }
98                 if (schemaToAdd != null)
99                 {
100                     foreach (XmlQualifiedName prefixNsPair in eprSchema.Namespaces.ToArray())
101                         schemaToAdd.Namespaces.Add(prefixNsPair.Name, prefixNsPair.Namespace);
102                     foreach (XmlSchemaObject schemaObject in eprSchema.Items)
103                         schemaToAdd.Items.Add(schemaObject);
104                     xmlSchemaSet.Reprocess(schemaToAdd);
105                 }
106             }
107             return eprType;
108         }
109
110         XmlSchema IXmlSerializable.GetSchema()
111         {
112             return null;
113         }
114
115         const string Schema =
116 @"<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"">
117   <!-- //////////////////// WS-Addressing //////////////////// -->
118   <!-- Endpoint reference -->
119   <xs:element name=""EndpointReference"" type=""wsa:EndpointReferenceType""/>
120   <xs:complexType name=""EndpointReferenceType"">
121     <xs:sequence>
122       <xs:element name=""Address"" type=""wsa:AttributedURI""/>
123       <xs:element name=""ReferenceProperties"" type=""wsa:ReferencePropertiesType"" minOccurs=""0""/>
124       <xs:element name=""ReferenceParameters"" type=""wsa:ReferenceParametersType"" minOccurs=""0""/>
125       <xs:element name=""PortType"" type=""wsa:AttributedQName"" minOccurs=""0""/>
126       <xs:element name=""ServiceName"" type=""wsa:ServiceNameType"" minOccurs=""0""/>
127       <xs:any namespace=""##other"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded"">
128         <xs:annotation>
129           <xs:documentation>
130                                          If ""Policy"" elements from namespace ""http://schemas.xmlsoap.org/ws/2002/12/policy#policy"" are used, they must appear first (before any extensibility elements).
131                                         </xs:documentation>
132         </xs:annotation>
133       </xs:any>
134     </xs:sequence>
135     <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
136   </xs:complexType>
137   <xs:complexType name=""ReferencePropertiesType"">
138     <xs:sequence>
139       <xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
140     </xs:sequence>
141   </xs:complexType>
142   <xs:complexType name=""ReferenceParametersType"">
143     <xs:sequence>
144       <xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
145     </xs:sequence>
146   </xs:complexType>
147   <xs:complexType name=""ServiceNameType"">
148     <xs:simpleContent>
149       <xs:extension base=""xs:QName"">
150         <xs:attribute name=""PortName"" type=""xs:NCName""/>
151         <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
152       </xs:extension>
153     </xs:simpleContent>
154   </xs:complexType>
155   <!-- Message information header blocks -->
156   <xs:element name=""MessageID"" type=""wsa:AttributedURI""/>
157   <xs:element name=""RelatesTo"" type=""wsa:Relationship""/>
158   <xs:element name=""To"" type=""wsa:AttributedURI""/>
159   <xs:element name=""Action"" type=""wsa:AttributedURI""/>
160   <xs:element name=""From"" type=""wsa:EndpointReferenceType""/>
161   <xs:element name=""ReplyTo"" type=""wsa:EndpointReferenceType""/>
162   <xs:element name=""FaultTo"" type=""wsa:EndpointReferenceType""/>
163   <xs:complexType name=""Relationship"">
164     <xs:simpleContent>
165       <xs:extension base=""xs:anyURI"">
166         <xs:attribute name=""RelationshipType"" type=""xs:QName"" use=""optional""/>
167         <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
168       </xs:extension>
169     </xs:simpleContent>
170   </xs:complexType>
171   <xs:simpleType name=""RelationshipTypeValues"">
172     <xs:restriction base=""xs:QName"">
173       <xs:enumeration value=""wsa:Reply""/>
174     </xs:restriction>
175   </xs:simpleType>
176   <xs:element name=""ReplyAfter"" type=""wsa:ReplyAfterType""/>
177   <xs:complexType name=""ReplyAfterType"">
178     <xs:simpleContent>
179       <xs:extension base=""xs:nonNegativeInteger"">
180         <xs:anyAttribute namespace=""##other""/>
181       </xs:extension>
182     </xs:simpleContent>
183   </xs:complexType>
184   <xs:simpleType name=""FaultSubcodeValues"">
185     <xs:restriction base=""xs:QName"">
186       <xs:enumeration value=""wsa:InvalidMessageInformationHeader""/>
187       <xs:enumeration value=""wsa:MessageInformationHeaderRequired""/>
188       <xs:enumeration value=""wsa:DestinationUnreachable""/>
189       <xs:enumeration value=""wsa:ActionNotSupported""/>
190       <xs:enumeration value=""wsa:EndpointUnavailable""/>
191     </xs:restriction>
192   </xs:simpleType>
193   <xs:attribute name=""Action"" type=""xs:anyURI""/>
194   <!-- Common declarations and definitions -->
195   <xs:complexType name=""AttributedQName"">
196     <xs:simpleContent>
197       <xs:extension base=""xs:QName"">
198         <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
199       </xs:extension>
200     </xs:simpleContent>
201   </xs:complexType>
202   <xs:complexType name=""AttributedURI"">
203     <xs:simpleContent>
204       <xs:extension base=""xs:anyURI"">
205         <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
206       </xs:extension>
207     </xs:simpleContent>
208   </xs:complexType>
209 </xs:schema>";
210     }
211 }