[System]: WebRequest.GetSystemProxy(): Return custom proxy for monodroid.
[mono.git] / mcs / class / System / System.Net / CookieCollection.cs
index 2303ac7891fd241baf5c2038a3e3a86adc909cfe..6881a880a050f186fd9837c40232dc3139867502 100644 (file)
@@ -4,8 +4,9 @@
 // Authors:
 //     Lawrence Pit (loz@cable.a2000.nl)
 //     Gonzalo Paniagua Javier (gonzalo@ximian.com)
+//     Sebastien Pouliot  <sebastien@ximian.com>
 //
-// (c) Copyright 2004 Novell, Inc. (http://www.novell.com)
+// Copyright (C) 2004,2009 Novell, Inc (http://www.novell.com)
 //
 
 //
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.Globalization;
 using System.Runtime.Serialization;
 
 namespace System.Net 
 {
        [Serializable]
-       public class CookieCollection : ICollection, IEnumerable
-       {
-               ArrayList list = new ArrayList (4);
+#if NET_2_1
+       public sealed class CookieCollection : ICollection, IEnumerable {
+#else
+       public class CookieCollection : ICollection, IEnumerable {
+#endif
+               // not 100% identical to MS implementation
+               sealed class CookieCollectionComparer : IComparer<Cookie> {
+                       public int Compare (Cookie x, Cookie y)
+                       {
+                               if (x == null || y == null)
+                                       return 0;
+
+                               var ydomain = y.Domain.Length - (y.Domain[0] == '.' ? 1 : 0);
+                               var xdomain = x.Domain.Length - (x.Domain[0] == '.' ? 1 : 0);
+
+                               int result = ydomain - xdomain;
+                               return result == 0 ? y.Path.Length - x.Path.Length : result;
+                       }
+               }
+
+               static CookieCollectionComparer Comparer = new CookieCollectionComparer ();
 
-               internal ArrayList List {
+               List<Cookie> list = new List<Cookie> ();
+
+               internal IList<Cookie> List {
                        get { return list; }
                }
                // ICollection
@@ -57,9 +78,14 @@ namespace System.Net
                        get { return this; }
                }
 
-               public void CopyTo (Array array, int arrayIndex)
+               public void CopyTo (Array array, int index)
                {
-                       list.CopyTo (array, arrayIndex);
+                       (list as IList).CopyTo (array, index);
+               }
+
+               public void CopyTo (Cookie [] array, int index)
+               {
+                       list.CopyTo (array, index);
                }
 
                // IEnumerable
@@ -89,6 +115,12 @@ namespace System.Net
                                list [pos] = cookie;
                }
 
+               internal void Sort ()
+               {
+                       if (list.Count > 0)
+                               list.Sort (Comparer);
+               }
+               
                int SearchCookie (Cookie cookie)
                {
                        string name = cookie.Name;
@@ -96,7 +128,7 @@ namespace System.Net
                        string path = cookie.Path;
 
                        for (int i = list.Count - 1; i >= 0; i--) {
-                               Cookie c = (Cookie) list [i];
+                               Cookie c = list [i];
                                if (c.Version != cookie.Version)
                                        continue;
 
@@ -129,7 +161,7 @@ namespace System.Net
                                if (index < 0 || index >= list.Count)
                                        throw new ArgumentOutOfRangeException ("index");
 
-                               return (Cookie) list [index];
+                               return list [index];
                        }
                }