Merge pull request #1275 from ranma42/fix-lib64
[mono.git] / mcs / class / System.Web / System.Web.UI / AttributeCollection.cs
old mode 100755 (executable)
new mode 100644 (file)
index be3ecde..4bcf883
@@ -6,8 +6,7 @@
 //     Gonzalo Paniagua (gonzalo@ximian.com)
 //
 // (C) 2002 Ximian, Inc. (http://www.ximian.com
-//
-
+// Copyright (C) 2005-2010 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
 using System.Collections;
+using System.Globalization;
+using System.Security.Permissions;
+using System.Web.Util;
 
 namespace System.Web.UI {
 
+       // CAS - no InheritanceDemand here as the class is sealed
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        public sealed class AttributeCollection
        {
-               private StateBag bag;
-               private CssStyleCollection styleCollection;
+               StateBag bag;
+               CssStyleCollection styleCollection;
+               internal const string StyleAttribute = "style";
                
                public AttributeCollection (StateBag bag)
                {
                        this.bag = bag;
                }
 
+               public override bool Equals (object obj) 
+               {
+                       AttributeCollection other = obj as AttributeCollection;
+                       if (other == null) {
+                               return false;
+                       }
+
+                       if (Count != other.Count) {
+                               return false;
+                       }
+
+                       foreach (string key in Keys) {
+                               if (0 == String.CompareOrdinal (key, StyleAttribute)) {
+                                       continue;
+                               }
+                               if (0 == String.CompareOrdinal (other [key], this [key])) {
+                                       return false;
+                               }
+                       }
+
+                       if ((styleCollection == null && other.styleCollection != null) ||
+                               (styleCollection != null && other.styleCollection == null)) {
+                               return false;
+                       }
+                       else if (styleCollection != null){
+                               // other.styleCollection != null too
+                               if (styleCollection.Count != other.styleCollection.Count){
+                                       return false;
+                               }
+                               foreach (string styleKey in styleCollection.Keys){
+                                       if (0 == String.CompareOrdinal(styleCollection [styleKey], other.styleCollection [styleKey])) {
+                                               return false;
+                                       }
+                               }
+                       }
+
+                       return true;
+               }
+
+               public override int GetHashCode () 
+               {
+                       int hashValue = 0;
+                       
+                       foreach (string key in Keys) {
+                               if (key == StyleAttribute) {
+                                       continue;
+                               }
+                               hashValue ^= key.GetHashCode ();
+                               string value = this [key];
+                               if (value != null) {
+                                       hashValue ^= value.GetHashCode ();
+                               }
+                       }
+
+                       if (styleCollection != null) {
+                               foreach (string styleKey in styleCollection.Keys) {
+                                       hashValue ^= styleCollection [styleKey].GetHashCode ();
+                                       string styleValue = styleCollection [styleKey];
+                                       if (styleValue != null) {
+                                               hashValue ^= styleValue.GetHashCode ();
+                                       }
+                               }
+                       }
+
+                       return hashValue;
+               }
+
                public int Count {
                        get { return bag.Count; }
                }
@@ -59,7 +130,9 @@ namespace System.Web.UI {
                public string this [string key] {
                        get { return bag [key] as string; }
 
-                       set { bag.Add (key, value); }
+                       set {
+                               Add (key, value);
+                       }
                }
 
                public ICollection Keys {
@@ -68,10 +141,11 @@ namespace System.Web.UI {
 
                public void Add (string key, string value)
                {
-                       if (styleCollection != null && 0 == String.Compare (key, "style", true))
-                               styleCollection.FillStyle (value);
-                       else
-                               bag.Add (key, value);
+                       if (0 == String.Compare (key, StyleAttribute, true, Helpers.InvariantCulture)) {
+                               CssStyle.Value = value;
+                               return;
+                       }
+                       bag.Add (key, value);
                }
 
                public void AddAttributes (HtmlTextWriter writer)
@@ -84,11 +158,16 @@ namespace System.Web.UI {
 
                public void Clear ()
                {
+                       CssStyle.Clear ();
                        bag.Clear ();
                }
 
                public void Remove (string key)
                {
+                       if (0 == String.Compare (key, StyleAttribute, true, Helpers.InvariantCulture)) {
+                               CssStyle.Clear ();
+                               return;
+                       }
                        bag.Remove (key);
                }
 
@@ -100,5 +179,14 @@ namespace System.Web.UI {
                                        writer.WriteAttribute (key, value, true);
                        }
                }
+
+               internal void CopyFrom (AttributeCollection attributeCollection)
+               {
+                       if (attributeCollection == null || attributeCollection.Count == 0)
+                               return;
+
+                       foreach (string key in attributeCollection.bag.Keys)
+                               this.Add (key, attributeCollection [key]);
+               }
        }
 }