From 9a72f4cdb69ceaaa4cbdda3873460e457d247d88 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 20 Jan 2010 14:05:06 +0000 Subject: [PATCH] 2010-01-20 Atsushi Enomoto * AddressHeader.cs : implement remaining bits. Eliminate dependency on NetDataContractSerializer. * AddressHeaderTest.cs : add reader and writer tests. svn path=/trunk/mcs/; revision=149907 --- .../AddressHeader.cs | 31 ++++++++++++------- .../System.ServiceModel.Channels/ChangeLog | 5 +++ .../AddressHeaderTest.cs | 21 +++++++++++++ .../System.ServiceModel.Channels/ChangeLog | 4 +++ 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/AddressHeader.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/AddressHeader.cs index ebaeaebc06f..06ad8d12c12 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/AddressHeader.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/AddressHeader.cs @@ -1,9 +1,11 @@ // // System.ServiceModel.AddressHeader.cs // -// Author: Duncan Mak (duncan@novell.com) +// Authors: +// Duncan Mak (duncan@novell.com) +// Atsushi Enomoto (atsushi@ximian.com) // -// Copyright (C) 2005 Novell, Inc (http://www.novell.com) +// Copyright (C) 2005,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 @@ -26,9 +28,11 @@ // using System; +using System.IO; using System.Runtime.Serialization; using System.ServiceModel; using System.Xml; +using System.Xml.Schema; namespace System.ServiceModel.Channels { @@ -69,10 +73,14 @@ namespace System.ServiceModel.Channels return o.Name == this.Name && o.Namespace == this.Namespace; } - [MonoTODO] public virtual XmlDictionaryReader GetAddressHeaderReader () { - throw new NotImplementedException (); + var sw = new StringWriter (); + var s = new XmlWriterSettings () { OmitXmlDeclaration = true }; + var xw = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw, s)); + WriteAddressHeader (xw); + xw.Close (); + return XmlDictionaryReader.CreateDictionaryReader (XmlReader.Create (new StringReader (sw.ToString ()))); } public override int GetHashCode () @@ -87,7 +95,7 @@ namespace System.ServiceModel.Channels public T GetValue (XmlObjectSerializer formatter) { - throw new NotImplementedException (); + return (T) formatter.ReadObject (GetAddressHeaderReader ()); } protected abstract void OnWriteAddressHeaderContents (XmlDictionaryWriter writer); @@ -151,12 +159,8 @@ namespace System.ServiceModel.Channels internal DefaultAddressHeader (string name, string ns, object value, XmlObjectSerializer formatter) { - if (formatter == null) { - if (value == null) - formatter = new NetDataContractSerializer (); - else - formatter = new DataContractSerializer (value.GetType ()); - } + if (formatter == null) + formatter = value != null ? new DataContractSerializer (value.GetType ()) : null; this.name = name; this.ns = ns; this.formatter = formatter; @@ -173,7 +177,10 @@ namespace System.ServiceModel.Channels protected override void OnWriteAddressHeaderContents (XmlDictionaryWriter writer) { - this.formatter.WriteObject (writer, value); + if (value == null) + writer.WriteAttributeString ("i", "nil", XmlSchema.InstanceNamespace, "true"); + else + this.formatter.WriteObject (writer, value); } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog index ad3ba79580c..70dbf110deb 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog @@ -1,3 +1,8 @@ +2010-01-20 Atsushi Enomoto + + * AddressHeader.cs : implement remaining bits. + Eliminate dependency on NetDataContractSerializer. + 2010-01-20 Atsushi Enomoto * CommunicationObject.cs : in Fault(), do similar work as previous diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/AddressHeaderTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/AddressHeaderTest.cs index fd6463c0552..6cf655e4dcf 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/AddressHeaderTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/AddressHeaderTest.cs @@ -51,5 +51,26 @@ namespace MonoTests.System.ServiceModel.Channels Assert.IsFalse (h.Equals (null), "#1"); // never throw nullref Assert.IsTrue (h.Equals (h2), "#2"); } + + [Test] + public void GetAddressHeaderReader () + { + var h = AddressHeader.CreateAddressHeader ("foo", String.Empty, null); + var r = h.GetAddressHeaderReader (); + r.MoveToContent (); + Assert.AreEqual ("foo", r.LocalName, "#1"); + Assert.AreEqual ("true", r.GetAttribute ("nil", XmlSchema.InstanceNamespace), "#2"); + } + + [Test] + public void WriteAddressHeader () + { + var h = AddressHeader.CreateAddressHeader ("foo", "urn:foo", null); + var sw = new StringWriter (); + var xw = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw)); + h.WriteAddressHeader (xw); + xw.Close (); + Assert.AreEqual ("", sw.ToString (), "#1"); + } } } diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/ChangeLog b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/ChangeLog index 9055cb41ef7..84aeb9937ea 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/ChangeLog +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/ChangeLog @@ -1,3 +1,7 @@ +2010-01-20 Atsushi Enomoto + + * AddressHeaderTest.cs : add reader and writer tests. + 2010-01-06 Atsushi Enomoto * BinaryMessageEncodingBindingElementTest.cs : added test for -- 2.25.1