3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 * Namespace: System.Web.UI
\r
26 * Author: Gaurav Vaish
\r
27 * Maintainer: gvaish@iitk.ac.in
\r
28 * Implementation: yes
\r
29 * Contact: <gvaish@iitk.ac.in>
\r
32 * (C) Gaurav Vaish (2001)
\r
37 using System.Collections;
\r
38 using System.Collections.Specialized;
\r
40 namespace System.Web.UI
\r
42 public sealed class StateBag : IStateManager, IDictionary, ICollection, IEnumerable
\r
44 private bool ignoreCase;
\r
45 private bool marked;
\r
46 private HybridDictionary bag;
\r
48 public StateBag (bool ignoreCase)
\r
50 Initialize (ignoreCase);
\r
58 private void Initialize (bool ignoreCase)
\r
60 this.ignoreCase = ignoreCase;
\r
62 bag = new HybridDictionary (ignoreCase);
\r
66 get { return bag.Count; }
\r
70 public object this [string key] {
\r
72 if (key == null || key.Length == 0)
\r
73 throw new ArgumentException (HttpRuntime.FormatResourceString ("Key_Cannot_Be_Null"));
\r
75 object val = bag [key];
\r
77 if (val is StateItem)
\r
78 return ((StateItem) val).Value;
\r
83 set { Add (key, value); }
\r
86 object IDictionary.this [object key] {
\r
87 get { return this [(string) key] as object; }
\r
89 set { Add ((string) key, value); }
\r
92 public ICollection Keys {
\r
93 get { return bag.Keys; }
\r
96 public ICollection Values {
\r
97 get { return bag.Values; }
\r
100 public StateItem Add (string key, object value)
\r
102 if (key == null || key.Length == 0)
\r
103 throw new ArgumentException (HttpRuntime.FormatResourceString ("Key_Cannot_Be_Null"));
\r
105 StateItem val = bag [key] as StateItem; //don't throw exception when null
\r
107 if(value != null || marked) {
\r
108 val = new StateItem (value);
\r
109 bag.Add (key, val);
\r
112 else if (value == null && !marked)
\r
117 if (val != null && marked) {
\r
118 val.IsDirty = true;
\r
124 public void Clear ()
\r
129 public IDictionaryEnumerator GetEnumerator ()
\r
131 return bag.GetEnumerator ();
\r
134 public bool IsItemDirty (string key)
\r
136 object o = bag [key];
\r
138 if (o is StateItem)
\r
139 return ((StateItem) o).IsDirty;
\r
144 public void Remove (string key)
\r
152 public void SetItemDirty (string key, bool dirty)
\r
154 if (bag [key] is StateItem)
\r
155 ((StateItem) bag [key]).IsDirty = dirty;
\r
158 internal bool IsTrackingViewState {
\r
159 get { return marked; }
\r
162 internal void LoadViewState (object state)
\r
165 Pair pair = (Pair) state;
\r
166 ArrayList keyList = (ArrayList) (pair.First);
\r
167 ArrayList valList = (ArrayList) (pair.Second);
\r
169 int valCount = valList.Count;
\r
170 for(int i = 0; i < keyList.Count; i++) {
\r
172 Add ((string) keyList [i], valList [i]);
\r
174 Add ((string) keyList [i], null);
\r
179 internal object SaveViewState ()
\r
181 if(bag.Count > 0) {
\r
182 ArrayList keyList = null, valList = null;
\r
184 foreach (string key in bag.Keys) {
\r
185 StateItem item = (StateItem) bag [key];
\r
187 if (item.IsDirty) {
\r
188 if (keyList == null) {
\r
189 keyList = new ArrayList ();
\r
190 valList = new ArrayList ();
\r
194 valList.Add (item.Value);
\r
199 return new Pair (keyList, valList);
\r
204 internal void TrackViewState()
\r
209 IEnumerator IEnumerable.GetEnumerator ()
\r
211 return GetEnumerator ();
\r
214 void IStateManager.LoadViewState (object savedState)
\r
216 LoadViewState (savedState);
\r
219 object IStateManager.SaveViewState ()
\r
221 return SaveViewState ();
\r
224 void IStateManager.TrackViewState ()
\r
229 bool IStateManager.IsTrackingViewState {
\r
230 get { return IsTrackingViewState; }
\r
233 void ICollection.CopyTo (Array array, int index)
\r
235 Values.CopyTo (array, index);
\r
238 bool ICollection.IsSynchronized {
\r
239 get { return false; }
\r
242 object ICollection.SyncRoot
\r
244 get { return this; }
\r
247 void IDictionary.Add (object key, object value)
\r
249 Add ((string) key, value);
\r
252 void IDictionary.Remove (object key)
\r
254 Remove ((string) key);
\r
257 bool IDictionary.Contains (object key)
\r
259 return bag.Contains ((string) key);
\r
262 bool IDictionary.IsFixedSize {
\r
263 get { return false; }
\r
266 bool IDictionary.IsReadOnly {
\r
267 get { return false; }
\r