Bug 15572. Lookup KnownTypeCollection element types in MSSimpleNamespace
[mono.git] / mcs / class / System.ServiceModel.Discovery / System.ServiceModel.Discovery / ResolveCriteria.cs
index 11731efb31cdbb24aaeb31bc2c305aa641c927c8..e37de28bc6a94da48278be9c5414640a4e6378ad 100755 (executable)
@@ -1,7 +1,7 @@
 //
 // Author: Atsushi Enomoto <atsushi@ximian.com>
 //
-// Copyright (C) 2009 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2009,2010 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -29,15 +29,22 @@ using System.ServiceModel;
 using System.ServiceModel.Channels;
 using System.ServiceModel.Description;
 using System.ServiceModel.Dispatcher;
+using System.Xml;
+using System.Xml.Schema;
 using System.Xml.Linq;
 
 namespace System.ServiceModel.Discovery
 {
        public class ResolveCriteria
        {
+               const string SerializationNS = "http://schemas.microsoft.com/ws/2008/06/discovery";
+               static readonly EndpointAddress anonymous_address = new EndpointAddress (EndpointAddress.AnonymousUri);
+
                public ResolveCriteria ()
                {
                        Extensions = new Collection<XElement> ();
+                       Duration = TimeSpan.FromSeconds (20);
+                       Address = anonymous_address;
                }
 
                public ResolveCriteria (EndpointAddress address)
@@ -47,8 +54,76 @@ namespace System.ServiceModel.Discovery
                }
 
                public EndpointAddress Address { get; set; }
-               [MonoTODO]
                public TimeSpan Duration { get; set; }
                public Collection<XElement> Extensions { get; private set; }
+
+               internal static ResolveCriteria ReadXml (XmlReader reader, DiscoveryVersion version)
+               {
+                       if (reader == null)
+                               throw new ArgumentNullException ("reader");
+
+                       var ret = new ResolveCriteria ();
+
+                       reader.MoveToContent ();
+                       if (!reader.IsStartElement ("ResolveType", version.Namespace) || reader.IsEmptyElement)
+                               throw new XmlException ("Non-empty ResolveType element is expected");
+                       reader.ReadStartElement ("ResolveType", version.Namespace);
+
+                       // standard members
+                       reader.MoveToContent ();
+                       ret.Address = EndpointAddress.ReadFrom (version.MessageVersion.Addressing, reader);
+
+                       // non-standard members
+                       for (reader.MoveToContent (); !reader.EOF && reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
+                               if (reader.NamespaceURI == SerializationNS) {
+                                       switch (reader.LocalName) {
+                                       case "Duration":
+                                               ret.Duration = (TimeSpan) reader.ReadElementContentAs (typeof (TimeSpan), null);
+                                               break;
+                                       }
+                               }
+                               else
+                                       ret.Extensions.Add (XElement.Load (reader));
+                       }
+
+                       reader.ReadEndElement ();
+
+                       return ret;
+               }
+
+               internal void WriteXml (XmlWriter writer, DiscoveryVersion version)
+               {
+                       if (writer == null)
+                               throw new ArgumentNullException ("writer");
+
+                       // standard members
+                       Address.WriteTo (version.MessageVersion.Addressing, writer);
+
+                       // non-standard members
+                       writer.WriteStartElement ("Duration", SerializationNS);
+                       writer.WriteValue (Duration);
+                       writer.WriteEndElement ();
+                       
+                       foreach (var ext in Extensions)
+                               ext.WriteTo (writer);
+               }
+
+               internal static XmlSchema BuildSchema (DiscoveryVersion version)
+               {
+                       var schema = new XmlSchema () { TargetNamespace = version.Namespace };
+                       string addrNS = "http://www.w3.org/2005/08/addressing";
+
+                       var anyAttr = new XmlSchemaAnyAttribute () { Namespace = "##other", ProcessContents = XmlSchemaContentProcessing.Lax };
+
+                       var resolvePart = new XmlSchemaSequence ();
+                       resolvePart.Items.Add (new XmlSchemaElement () { RefName = new XmlQualifiedName ("EndpointReference", addrNS), MinOccurs = 0 });
+                       resolvePart.Items.Add (new XmlSchemaAny () { MinOccurs = 0, MaxOccursString = "unbounded", Namespace = "##other", ProcessContents = XmlSchemaContentProcessing.Lax });
+                       var ct = new XmlSchemaComplexType () { Name = "ResolveType", Particle = resolvePart, AnyAttribute = anyAttr };
+
+                       schema.Includes.Add (new XmlSchemaImport () { Namespace = addrNS });
+                       schema.Items.Add (ct);
+
+                       return schema;
+               }
        }
 }