2010-07-14 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / MessageHeaders.cs
index 6b56c88d59f2ffdc948fbdc284bb75f2505c5c9f..a883150770976b8102c5dea4d8439c0b11fe32de 100644 (file)
@@ -37,8 +37,6 @@ namespace System.ServiceModel.Channels
 {
        public sealed class MessageHeaders : IEnumerable<MessageHeaderInfo>, IEnumerable
        {
-               static string [] empty_strings = new string [0];
-
                static readonly XmlReaderSettings reader_settings;
 
                static MessageHeaders ()
@@ -180,7 +178,7 @@ namespace System.ServiceModel.Channels
 
                public T GetHeader<T> (string name, string ns)
                {
-                       return GetHeader<T> (name, ns, empty_strings);
+                       return GetHeader<T> (name, ns, (string []) null);
                }
 
                public T GetHeader<T> (string name, string ns, params string [] actors)
@@ -188,7 +186,7 @@ namespace System.ServiceModel.Channels
                        int idx = FindHeader (name, ns, actors);
 
                        if (idx == -1)
-                               throw new MessageHeaderException (String.Format ("Header '{0}:{1}' was not found for the argument actors: {2}", ns, name, String.Join (",", actors)));
+                               throw new MessageHeaderException (String.Format ("Header '{0}:{1}' was not found for the argument actors: {2}", ns, name, actors == null ? "(null)" : String.Join (",", actors)));
 
                        return GetHeader<T> (idx);
                }
@@ -340,10 +338,14 @@ namespace System.ServiceModel.Channels
 
                public EndpointAddress FaultTo {
                        get {
-                               int idx = FindHeader ("FaultTo", Constants.WsaNamespace);
+                               int idx = FindHeader ("FaultTo", version.Addressing.Namespace);
                                return idx < 0 ? null : GetHeader<EndpointAddress> (idx);
                        }
-                       set { AddEndpointAddressHeader ("FaultTo", Constants.WsaNamespace, value); }
+                       set {
+                               RemoveAll ("FaultTo", version.Addressing.Namespace);
+                               if (value != null)
+                                       AddEndpointAddressHeader ("FaultTo", version.Addressing.Namespace, value);
+                       }
                }
 
                public EndpointAddress From {
@@ -351,7 +353,11 @@ namespace System.ServiceModel.Channels
                                int idx = FindHeader ("From", version.Addressing.Namespace);
                                return idx < 0 ? null : GetHeader<EndpointAddress> (idx);
                        }
-                       set { AddEndpointAddressHeader ("From", Constants.WsaNamespace, value); }
+                       set {
+                               RemoveAll ("From", version.Addressing.Namespace);
+                               if (value != null)
+                                       AddEndpointAddressHeader ("From", version.Addressing.Namespace, value);
+                       }
                }
 
                public MessageHeaderInfo this [int index] {
@@ -360,16 +366,16 @@ namespace System.ServiceModel.Channels
 
                public UniqueId MessageId {
                        get { 
-                               int idx = FindHeader ("MessageID", Constants.WsaNamespace);
+                               int idx = FindHeader ("MessageID", version.Addressing.Namespace);
                                return idx < 0 ? null : new UniqueId (GetHeader<string> (idx));
                        }
                        set {
                                if (version.Addressing == AddressingVersion.None && value != null)
                                        throw new InvalidOperationException ("WS-Addressing header is not allowed for AddressingVersion.None");
 
-                               RemoveAll ("MessageID", Constants.WsaNamespace);
+                               RemoveAll ("MessageID", version.Addressing.Namespace);
                                if (value != null)
-                                       Add (MessageHeader.CreateHeader ("MessageID", Constants.WsaNamespace, value));
+                                       Add (MessageHeader.CreateHeader ("MessageID", version.Addressing.Namespace, value));
                        }
                }
 
@@ -377,26 +383,30 @@ namespace System.ServiceModel.Channels
 
                public UniqueId RelatesTo {
                        get { 
-                               int idx = FindHeader ("RelatesTo", Constants.WsaNamespace);
+                               int idx = FindHeader ("RelatesTo", version.Addressing.Namespace);
                                return idx < 0 ? null : new UniqueId (GetHeader<string> (idx));
                        }
                        set {
                                if (version.Addressing == AddressingVersion.None && value != null)
                                        throw new InvalidOperationException ("WS-Addressing header is not allowed for AddressingVersion.None");
 
-                               RemoveAll ("MessageID", Constants.WsaNamespace);
+                               RemoveAll ("MessageID", version.Addressing.Namespace);
                                if (value != null)
-                                       Add (MessageHeader.CreateHeader ("RelatesTo", Constants.WsaNamespace, value));
+                                       Add (MessageHeader.CreateHeader ("RelatesTo", version.Addressing.Namespace, value));
                        }
 
                }
 
                public EndpointAddress ReplyTo {
                        get {
-                               int idx = FindHeader ("ReplyTo", Constants.WsaNamespace);
+                               int idx = FindHeader ("ReplyTo", version.Addressing.Namespace);
                                return idx < 0 ? null : GetHeader<EndpointAddress> (idx);
                        }
-                       set { AddEndpointAddressHeader ("ReplyTo", Constants.WsaNamespace, value); }
+                       set {
+                               RemoveAll ("ReplyTo", version.Addressing.Namespace);
+                               if (value != null)
+                                       AddEndpointAddressHeader ("ReplyTo", version.Addressing.Namespace, value);
+                       }
                }
 
                public Uri To {