Merge pull request #3528 from BrzVlad/fix-sgen-check-before-collections
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / MessageHeaders.cs
index 6b56c88d59f2ffdc948fbdc284bb75f2505c5c9f..c08ef8697dd13e5cba749f5e94fc573d69450439 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 ()
@@ -74,9 +72,9 @@ namespace System.ServiceModel.Channels
                        l.Add (header);
                }
 
-               public void CopyHeaderFrom (Message m, int index)
+               public void CopyHeaderFrom (Message message, int headerIndex)
                {
-                       CopyHeaderFrom (m.Headers, index);
+                       CopyHeaderFrom (message.Headers, headerIndex);
                }
 
                public void Clear ()
@@ -84,25 +82,25 @@ namespace System.ServiceModel.Channels
                        l.Clear ();
                }
 
-               public void CopyHeaderFrom (MessageHeaders headers, int index)
+               public void CopyHeaderFrom (MessageHeaders collection, int headerIndex)
                {
-                       l.Add (headers [index]);
+                       l.Add (collection [headerIndex]);
                }
 
-               public void CopyHeadersFrom (Message m)
+               public void CopyHeadersFrom (Message message)
                {
-                       CopyHeadersFrom (m.Headers);
+                       CopyHeadersFrom (message.Headers);
                }
 
-               public void CopyHeadersFrom (MessageHeaders headers)
+               public void CopyHeadersFrom (MessageHeaders collection)
                {
-                       foreach (MessageHeaderInfo h in headers)
+                       foreach (MessageHeaderInfo h in collection)
                                l.Add (h);
                }
 
-               public void CopyTo (MessageHeaderInfo [] dst, int index)
+               public void CopyTo (MessageHeaderInfo [] array, int index)
                {
-                       l.CopyTo (dst, index);
+                       l.CopyTo (array, index);
                }
 
                public int FindHeader (string name, string ns)
@@ -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);
                }
@@ -205,15 +203,15 @@ namespace System.ServiceModel.Channels
                        return GetHeader<T> (idx, serializer);
                }
 
-               public XmlDictionaryReader GetReaderAtHeader (int index)
+               public XmlDictionaryReader GetReaderAtHeader (int headerIndex)
                {
-                       if (index >= l.Count)
-                               throw new ArgumentOutOfRangeException (String.Format ("Index is out of range. Current header count is {0}", index));
-                       MessageHeader item = (MessageHeader) l [index];
+                       if (headerIndex >= l.Count)
+                               throw new ArgumentOutOfRangeException (String.Format ("Index is out of range. Current header count is {0}", l.Count));
+                       MessageHeader item = (MessageHeader) l [headerIndex];
 
                        XmlReader reader =
-                               item is MessageHeader.RawMessageHeader ?
-                               ((MessageHeader.RawMessageHeader) item).CreateReader () :
+                               item is MessageHeader.XmlMessageHeader ?
+                               ((MessageHeader.XmlMessageHeader) item).CreateReader () :
                                XmlReader.Create (
                                        new StringReader (item.ToString ()),
                                        reader_settings);
@@ -233,9 +231,9 @@ namespace System.ServiceModel.Channels
                        throw new NotImplementedException ();
                }
 
-               public void Insert (int index, MessageHeader header)
+               public void Insert (int headerIndex, MessageHeader header)
                {
-                       l.Insert (index, header);
+                       l.Insert (headerIndex, header);
                }
 
                public void RemoveAll (string name, string ns)
@@ -253,9 +251,9 @@ namespace System.ServiceModel.Channels
                                l.RemoveAt (l.Count - 1);
                }
 
-               public void RemoveAt (int index)
+               public void RemoveAt (int headerIndex)
                {
-                       l.RemoveAt (index);
+                       l.RemoveAt (headerIndex);
                }
 
                IEnumerator IEnumerable.GetEnumerator ()
@@ -263,48 +261,48 @@ namespace System.ServiceModel.Channels
                        return ((IEnumerable) l).GetEnumerator ();
                }
 
-               public void WriteHeader (int index, XmlDictionaryWriter writer)
+               public void WriteHeader (int headerIndex, XmlDictionaryWriter writer)
                {
                        if (version.Envelope == EnvelopeVersion.None)
                                return;
-                       WriteStartHeader (index, writer);
-                       WriteHeaderContents (index, writer);
+                       WriteStartHeader (headerIndex, writer);
+                       WriteHeaderContents (headerIndex, writer);
                        writer.WriteEndElement ();
                }
 
-               public void WriteHeader (int index, XmlWriter writer)
+               public void WriteHeader (int headerIndex, XmlWriter writer)
                {
-                       WriteHeader (index, XmlDictionaryWriter.CreateDictionaryWriter (writer));
+                       WriteHeader (headerIndex, XmlDictionaryWriter.CreateDictionaryWriter (writer));
                }
 
-               public void WriteHeaderContents (int index, XmlDictionaryWriter writer)
+               public void WriteHeaderContents (int headerIndex, XmlDictionaryWriter writer)
                {
-                       if (index > l.Count)
-                               throw new ArgumentOutOfRangeException ("There is no header at position " + index + ".");
+                       if (headerIndex > l.Count)
+                               throw new ArgumentOutOfRangeException ("There is no header at position " + headerIndex + ".");
                        
-                       MessageHeader h = l [index] as MessageHeader;
+                       MessageHeader h = l [headerIndex] as MessageHeader;
 
                        h.WriteHeaderContents (writer, version);
                }
 
-               public void WriteHeaderContents (int index, XmlWriter writer)
+               public void WriteHeaderContents (int headerIndex, XmlWriter writer)
                {
-                       WriteHeaderContents (index, XmlDictionaryWriter.CreateDictionaryWriter (writer));
+                       WriteHeaderContents (headerIndex, XmlDictionaryWriter.CreateDictionaryWriter (writer));
                }
 
-               public void WriteStartHeader (int index, XmlDictionaryWriter writer)
+               public void WriteStartHeader (int headerIndex, XmlDictionaryWriter writer)
                {
-                       if (index > l.Count)
-                               throw new ArgumentOutOfRangeException ("There is no header at position " + index + ".");
+                       if (headerIndex > l.Count)
+                               throw new ArgumentOutOfRangeException ("There is no header at position " + headerIndex + ".");
 
-                       MessageHeader h = l [index] as MessageHeader;
+                       MessageHeader h = l [headerIndex] as MessageHeader;
                        
                        h.WriteStartHeader (writer, version);
                }
 
-               public void WriteStartHeader (int index, XmlWriter writer)
+               public void WriteStartHeader (int headerIndex, XmlWriter writer)
                {
-                       WriteStartHeader (index, XmlDictionaryWriter.CreateDictionaryWriter (writer));
+                       WriteStartHeader (headerIndex, XmlDictionaryWriter.CreateDictionaryWriter (writer));
                }
 
                public string Action {
@@ -325,12 +323,11 @@ namespace System.ServiceModel.Channels
 
                void AddEndpointAddressHeader (string name, string ns, EndpointAddress address)
                {
-                       RemoveAll ("FaultTo", Constants.WsaNamespace);
                        if (address == null)
                                return;
                        if (MessageVersion.Addressing.Equals (AddressingVersion.WSAddressing10))
                                Add (MessageHeader.CreateHeader (name, ns, EndpointAddress10.FromEndpointAddress (address)));
-#if !NET_2_1
+#if !MOBILE
                        else if (MessageVersion.Addressing.Equals (AddressingVersion.WSAddressingAugust2004))
                                Add (MessageHeader.CreateHeader (name, ns, EndpointAddressAugust2004.FromEndpointAddress (address)));
 #endif
@@ -340,10 +337,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 +352,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 +365,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 +382,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 {