Improve error handling
[mono.git] / mcs / class / System.Web / System.Web.UI / StateBag.cs
1 /**\r
2  * Namespace: System.Web.UI\r
3  * Class:     StateBag\r
4  * \r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Implementation: yes\r
8  * Contact: <gvaish@iitk.ac.in>\r
9  * Status:  100%\r
10  * \r
11  * (C) Gaurav Vaish (2001)\r
12  */\r
13 \r
14 using System;\r
15 using System.Web;\r
16 using System.Collections;\r
17 using System.Collections.Specialized;\r
18 \r
19 namespace System.Web.UI\r
20 {\r
21         public sealed class StateBag : IStateManager, IDictionary, ICollection, IEnumerable\r
22         {\r
23                 private bool ignoreCase;\r
24                 private bool marked;\r
25                 private HybridDictionary bag;\r
26                 \r
27                 public StateBag (bool ignoreCase)\r
28                 {\r
29                         Initialize (ignoreCase);\r
30                 }\r
31                 \r
32                 public StateBag ()\r
33                 {\r
34                         Initialize (false);\r
35                 }\r
36 \r
37                 private void Initialize (bool ignoreCase)\r
38                 {\r
39                         this.ignoreCase = ignoreCase;\r
40                         marked = false;\r
41                         bag = new HybridDictionary (ignoreCase);\r
42                 }\r
43                 \r
44                 public int Count {\r
45                         get { return bag.Count; }\r
46                 }\r
47 \r
48                 \r
49                 public object this [string key] {\r
50                         get {\r
51                                 if (key == null || key.Length == 0)\r
52                                         throw new ArgumentException (HttpRuntime.FormatResourceString ("Key_Cannot_Be_Null"));\r
53 \r
54                                 object val = bag [key];\r
55 \r
56                                 if (val is StateItem)\r
57                                         return ((StateItem) val).Value;\r
58 \r
59                                 return null; // \r
60                         }\r
61 \r
62                         set { Add (key, value); }\r
63                 }\r
64 \r
65                 object IDictionary.this [object key] {\r
66                         get { return this [(string) key] as object; }\r
67 \r
68                         set { Add ((string) key, value); }\r
69                 }\r
70                 \r
71                 public ICollection Keys {\r
72                         get { return bag.Keys; }\r
73                 }\r
74                 \r
75                 public ICollection Values {\r
76                         get { return bag.Values; }\r
77                 }\r
78                 \r
79                 public StateItem Add (string key, object value)\r
80                 {\r
81                         if (key == null || key.Length == 0)\r
82                                 throw new ArgumentException (HttpRuntime.FormatResourceString ("Key_Cannot_Be_Null"));\r
83 \r
84                         StateItem val = bag [key] as StateItem; //don't throw exception when null\r
85                         if(val == null) {\r
86                                 if(value != null || marked) {\r
87                                         val = new StateItem (value);\r
88                                         bag.Add (key, val);\r
89                                 }\r
90                         }\r
91                         else if (value == null && !marked)\r
92                                 bag.Remove (key);\r
93                         else\r
94                                 val.Value = value;\r
95 \r
96                         if (val != null && marked) {\r
97                                 val.IsDirty = true;\r
98                         }\r
99 \r
100                         return val;\r
101                 }\r
102                 \r
103                 public void Clear ()\r
104                 {\r
105                         bag.Clear ();\r
106                 }\r
107                 \r
108                 public IDictionaryEnumerator GetEnumerator ()\r
109                 {\r
110                         return bag.GetEnumerator ();\r
111                 }\r
112                 \r
113                 public bool IsItemDirty (string key)\r
114                 {\r
115                         object o = bag [key];\r
116 \r
117                         if (o is StateItem)\r
118                                 return ((StateItem) o).IsDirty;\r
119                         \r
120                         return false;\r
121                 }\r
122                 \r
123                 public void Remove (string key)\r
124                 {\r
125                         bag.Remove (key);\r
126                 }\r
127                 \r
128                 /// <summary>\r
129                 /// Undocumented\r
130                 /// </summary>\r
131                 public void SetItemDirty (string key, bool dirty)\r
132                 {\r
133                         if (bag [key] is StateItem)\r
134                                 ((StateItem) bag [key]).IsDirty = dirty;\r
135                 }\r
136                 \r
137                 internal bool IsTrackingViewState {\r
138                         get { return marked; }\r
139                 }\r
140                 \r
141                 internal void LoadViewState (object state)\r
142                 {\r
143                         if(state!=null) {\r
144                                 Pair pair = (Pair) state;\r
145                                 ArrayList keyList = (ArrayList) (pair.First);\r
146                                 ArrayList valList = (ArrayList) (pair.Second);\r
147 \r
148                                 int valCount = valList.Count;\r
149                                 for(int i = 0; i < keyList.Count; i++) {\r
150                                         if (i < valCount)\r
151                                                 Add ((string) keyList [i], valList [i]);\r
152                                         else\r
153                                                 Add ((string) keyList [i], null);\r
154                                 }\r
155                         }\r
156                 }\r
157                 \r
158                 internal object SaveViewState ()\r
159                 {\r
160                         if(bag.Count > 0) {\r
161                                 ArrayList keyList = null, valList = null;\r
162 \r
163                                 foreach (string key in bag.Keys) {\r
164                                         StateItem item = (StateItem) bag [key];\r
165 \r
166                                         if (item.IsDirty) {\r
167                                                 if (keyList == null) {\r
168                                                         keyList = new ArrayList ();\r
169                                                         valList = new ArrayList ();\r
170                                                 }\r
171                                                 \r
172                                                 keyList.Add (key);\r
173                                                 valList.Add (item.Value);\r
174                                         }\r
175                                 }\r
176 \r
177                                 if (keyList!=null)\r
178                                         return new Pair (keyList, valList);\r
179                         }\r
180                         return null;\r
181                 }\r
182                 \r
183                 internal void TrackViewState()\r
184                 {\r
185                         marked = true;\r
186                 }\r
187                 \r
188                 IEnumerator IEnumerable.GetEnumerator ()\r
189                 {\r
190                         return GetEnumerator ();\r
191                 }\r
192                 \r
193                 void IStateManager.LoadViewState (object savedState)\r
194                 {\r
195                         LoadViewState (savedState);\r
196                 }\r
197                 \r
198                 object IStateManager.SaveViewState ()\r
199                 {\r
200                         return SaveViewState ();\r
201                 }\r
202                 \r
203                 void IStateManager.TrackViewState ()\r
204                 {\r
205                         TrackViewState ();\r
206                 }\r
207                 \r
208                 bool IStateManager.IsTrackingViewState {\r
209                         get { return IsTrackingViewState; }\r
210                 }\r
211                 \r
212                 void ICollection.CopyTo (Array array, int index)\r
213                 {\r
214                         Values.CopyTo (array, index);\r
215                 }\r
216                 \r
217                 bool ICollection.IsSynchronized {\r
218                         get { return false; }\r
219                 }\r
220                 \r
221                 object ICollection.SyncRoot\r
222                 {\r
223                         get { return this; }\r
224                 }\r
225                 \r
226                 void IDictionary.Add (object key, object value)\r
227                 {\r
228                         Add ((string) key, value);\r
229                 }\r
230                 \r
231                 void IDictionary.Remove (object key)\r
232                 {\r
233                         Remove ((string) key);\r
234                 }\r
235                 \r
236                 bool IDictionary.Contains (object key)\r
237                 {\r
238                         return bag.Contains ((string) key);\r
239                 }\r
240                 \r
241                 bool IDictionary.IsFixedSize {\r
242                         get { return false; }\r
243                 }\r
244                 \r
245                 bool IDictionary.IsReadOnly {\r
246                         get { return false; }\r
247                 }\r
248         }\r
249 }\r