// 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
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 Sort ()
+ {
+ if (list.Count > 0)
+ list.Sort (Comparer);
+ }
+
int SearchCookie (Cookie cookie)
{
string name = cookie.Name;
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];
}
}