2 * Namespace: System.Web.UI
\r
5 * Author: Gaurav Vaish
\r
6 * Maintainer: gvaish@iitk.ac.in
\r
7 * Implementation: yes
\r
8 * Contact: <gvaish@iitk.ac.in>
\r
11 * (C) Gaurav Vaish (2001)
\r
16 using System.Collections;
\r
17 using System.Collections.Specialized;
\r
19 namespace System.Web.UI
\r
21 public sealed class StateBag : IStateManager, IDictionary, ICollection, IEnumerable
\r
23 private bool ignoreCase;
\r
24 private bool marked;
\r
25 private HybridDictionary bag;
\r
27 public StateBag (bool ignoreCase)
\r
29 Initialize (ignoreCase);
\r
37 private void Initialize (bool ignoreCase)
\r
39 this.ignoreCase = ignoreCase;
\r
41 bag = new HybridDictionary (ignoreCase);
\r
45 get { return bag.Count; }
\r
49 public object this [string key] {
\r
51 if (key == null || key.Length == 0)
\r
52 throw new ArgumentException (HttpRuntime.FormatResourceString ("Key_Cannot_Be_Null"));
\r
54 object val = bag [key];
\r
56 if (val is StateItem)
\r
57 return ((StateItem) val).Value;
\r
62 set { Add (key, value); }
\r
65 object IDictionary.this [object key] {
\r
66 get { return this [(string) key] as object; }
\r
68 set { Add ((string) key, value); }
\r
71 public ICollection Keys {
\r
72 get { return bag.Keys; }
\r
75 public ICollection Values {
\r
76 get { return bag.Values; }
\r
79 public StateItem Add (string key, object value)
\r
81 if (key == null || key.Length == 0)
\r
82 throw new ArgumentException (HttpRuntime.FormatResourceString ("Key_Cannot_Be_Null"));
\r
84 StateItem val = bag [key] as StateItem; //don't throw exception when null
\r
86 if(value != null || marked) {
\r
87 val = new StateItem (value);
\r
91 else if (value == null && !marked)
\r
96 if (val != null && marked) {
\r
103 public void Clear ()
\r
108 public IDictionaryEnumerator GetEnumerator ()
\r
110 return bag.GetEnumerator ();
\r
113 public bool IsItemDirty (string key)
\r
115 object o = bag [key];
\r
117 if (o is StateItem)
\r
118 return ((StateItem) o).IsDirty;
\r
123 public void Remove (string key)
\r
131 public void SetItemDirty (string key, bool dirty)
\r
133 if (bag [key] is StateItem)
\r
134 ((StateItem) bag [key]).IsDirty = dirty;
\r
137 internal bool IsTrackingViewState {
\r
138 get { return marked; }
\r
141 internal void LoadViewState (object state)
\r
144 Pair pair = (Pair) state;
\r
145 ArrayList keyList = (ArrayList) (pair.First);
\r
146 ArrayList valList = (ArrayList) (pair.Second);
\r
148 int valCount = valList.Count;
\r
149 for(int i = 0; i < keyList.Count; i++) {
\r
151 Add ((string) keyList [i], valList [i]);
\r
153 Add ((string) keyList [i], null);
\r
158 internal object SaveViewState ()
\r
160 if(bag.Count > 0) {
\r
161 ArrayList keyList = null, valList = null;
\r
163 foreach (string key in bag.Keys) {
\r
164 StateItem item = (StateItem) bag [key];
\r
166 if (item.IsDirty) {
\r
167 if (keyList == null) {
\r
168 keyList = new ArrayList ();
\r
169 valList = new ArrayList ();
\r
173 valList.Add (item.Value);
\r
178 return new Pair (keyList, valList);
\r
183 internal void TrackViewState()
\r
188 IEnumerator IEnumerable.GetEnumerator ()
\r
190 return GetEnumerator ();
\r
193 void IStateManager.LoadViewState (object savedState)
\r
195 LoadViewState (savedState);
\r
198 object IStateManager.SaveViewState ()
\r
200 return SaveViewState ();
\r
203 void IStateManager.TrackViewState ()
\r
208 bool IStateManager.IsTrackingViewState {
\r
209 get { return IsTrackingViewState; }
\r
212 void ICollection.CopyTo (Array array, int index)
\r
214 Values.CopyTo (array, index);
\r
217 bool ICollection.IsSynchronized {
\r
218 get { return false; }
\r
221 object ICollection.SyncRoot
\r
223 get { return this; }
\r
226 void IDictionary.Add (object key, object value)
\r
228 Add ((string) key, value);
\r
231 void IDictionary.Remove (object key)
\r
233 Remove ((string) key);
\r
236 bool IDictionary.Contains (object key)
\r
238 return bag.Contains ((string) key);
\r
241 bool IDictionary.IsFixedSize {
\r
242 get { return false; }
\r
245 bool IDictionary.IsReadOnly {
\r
246 get { return false; }
\r