2008-04-23 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web / HttpApplicationState.cs
index ce02569a2081371e8df5eefa796115c829f92fb3..de259d16d38dafa268a512c90bf653235043f8a3 100644 (file)
-// \r
-// System.Web.HttpApplicationState\r
-//\r
-// Author:\r
-//   Patrik Torstensson (Patrik.Torstensson@labs2.com)\r
-//\r
-using System;\r
-using System.Web;\r
-using System.Collections.Specialized;\r
-\r
-namespace System.Web {\r
-\r
-   public class HttpApplicationState : NameObjectCollectionBase {\r
-      [MonoTODO()]\r
-      internal HttpApplicationState() {\r
-      }\r
-   }\r
-}\r
+// 
+// System.Web.HttpApplicationState
+//
+// Author:
+//   Patrik Torstensson
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Threading;
+using System.Collections.Specialized;
+using System.Security.Permissions;
+
+namespace System.Web {
+
+       // CAS - no InheritanceDemand here as the class is sealed
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       public sealed class HttpApplicationState : NameObjectCollectionBase \r
+       {
+               private HttpStaticObjectsCollection _AppObjects;
+               private HttpStaticObjectsCollection _SessionObjects;
+
+               private ReaderWriterLock _Lock; 
+
+               internal HttpApplicationState ()
+               {
+                       // do not use the public (empty) ctor as it required UnmanagedCode permission
+                       _AppObjects = new HttpStaticObjectsCollection (this);
+                       _SessionObjects = new HttpStaticObjectsCollection (this);
+                       _Lock = new ReaderWriterLock ();
+               }
+
+               internal HttpApplicationState (HttpStaticObjectsCollection AppObj,
+                       HttpStaticObjectsCollection SessionObj)
+               {
+                       if (null != AppObj) \r
+                       {
+                               _AppObjects = AppObj;
+                       } \r
+                       else \r
+                       {
+                               // do not use the public (empty) ctor as it required UnmanagedCode permission
+                               _AppObjects = new HttpStaticObjectsCollection (this);
+                       }
+
+                       if (null != SessionObj) \r
+                       {
+                               _SessionObjects = SessionObj;
+                       } \r
+                       else \r
+                       {
+                               // do not use the public (empty) ctor as it required UnmanagedCode permission
+                               _SessionObjects = new HttpStaticObjectsCollection (this);
+                       }
+                       _Lock = new ReaderWriterLock ();
+               }
+
+               public void Add (string name, object value)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseAdd (name, value);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }
+               }
+
+               public void Clear ()
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseClear ();
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }
+               } 
+
+               public object Get (string name)
+               {
+                       object ret = null;
+
+                       _Lock.AcquireReaderLock (-1); 
+                       try \r
+                       {
+                               ret = BaseGet (name);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseReaderLock ();
+                       }
+
+                       return ret;
+               }
+
+               public object Get (int index)
+               {
+                       object ret = null;
+
+                       _Lock.AcquireReaderLock (-1); 
+                       try \r
+                       {
+                               ret = BaseGet (index);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseReaderLock ();
+                       }
+
+                       return ret;
+               }   
+
+               public string GetKey (int index)
+               {
+                       string ret = null;
+
+                       _Lock.AcquireReaderLock (-1); 
+                       try \r
+                       {
+                               ret = BaseGetKey (index);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseReaderLock ();
+                       }
+
+                       return ret;
+               }      
+
+               public void Lock ()
+               {
+                       _Lock.AcquireWriterLock (-1);
+               }
+
+               public void Remove (string name)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseRemove (name);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }      
+               }
+
+               public void RemoveAll ()
+               {
+                       Clear ();
+               }
+
+               public void RemoveAt (int index)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseRemoveAt (index);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }      
+               }
+
+               public void Set (string name, object value)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseSet (name, value);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }      
+               }   
+
+               public void UnLock ()
+               {
+                       _Lock.ReleaseWriterLock ();
+               }
+
+               public string [] AllKeys \r
+               {
+                       get \r
+                       {
+                               string [] ret = null;
+
+                               _Lock.AcquireReaderLock (-1); 
+                               try \r
+                               {
+                                       ret = BaseGetAllKeys ();
+                               } \r
+                               finally \r
+                               {
+                                       _Lock.ReleaseReaderLock ();
+                               }     
+
+                               return ret;
+                       }
+               }
+
+               public HttpApplicationState Contents \r
+               {
+                       get { return this; }
+               }
+
+               public override int Count \r
+               {
+                       get \r
+                       {
+                               int ret = 0;
+
+                               _Lock.AcquireReaderLock (-1); 
+                               try \r
+                               {
+                                       ret = base.Count;
+                               } \r
+                               finally \r
+                               {
+                                       _Lock.ReleaseReaderLock ();
+                               }     
+
+                               return ret;
+                       }
+               }   
+
+               public object this [string name] \r
+               {
+                       get { return Get (name); }
+                       set { Set (name, value); }
+               }
+
+               public object this [int index] \r
+               {
+                       get { return Get (index); }
+               }
+
+               //  ASP Session based objects
+               internal HttpStaticObjectsCollection SessionObjects \r
+               {
+                       get { return _SessionObjects; }
+               }
+
+               //  ASP App based objects
+               public HttpStaticObjectsCollection StaticObjects \r
+               {
+                       get { return _AppObjects; }
+               }
+       }
+}
+