// 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
- {
- class CookieCollectionPathComparer : IComparer
- {
- int IComparer.Compare (object p1, object p2)
+#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)
{
- Cookie c1 = p1 as Cookie;
- Cookie c2 = p2 as Cookie;
-
- if (c1 == null || c2 == null)
+ if (x == null || y == null)
return 0;
-
- return (c2.Path.Length - c1.Path.Length);
+
+ 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;
}
}
-
- ArrayList list = new ArrayList (4);
- internal ArrayList List {
+ static CookieCollectionComparer Comparer = new CookieCollectionComparer ();
+
+ List<Cookie> list = new List<Cookie> ();
+
+ internal IList<Cookie> List {
get { return list; }
}
// ICollection
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
list [pos] = cookie;
}
- internal void SortByPath ()
+ internal void Sort ()
{
- if (list == null || list.Count == 0)
- return;
-
- list.Sort (new CookieCollectionPathComparer ());
+ if (list.Count > 0)
+ list.Sort (Comparer);
}
int SearchCookie (Cookie cookie)
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;
if (index < 0 || index >= list.Count)
throw new ArgumentOutOfRangeException ("index");
- return (Cookie) list [index];
+ return list [index];
}
}