-// \r
-// System.Web.HttpApplicationState\r
-//\r
-// Author:\r
-// Patrik Torstensson (Patrik.Torstensson@labs2.com)\r
-//\r
-using System;\r
-using System.Threading;\r
-using System.Web;\r
-using System.Collections.Specialized;\r
-\r
-namespace System.Web {\r
-\r
- [MonoTODO("Performance - Use SWMR lock here")]\r
- public sealed class HttpApplicationState : NameObjectCollectionBase {\r
- private HttpStaticObjectsCollection _AppObjects;\r
- private HttpStaticObjectsCollection _SessionObjects;\r
-\r
- // TODO : Change to ReadWriteLock when ready\r
- private Mutex _Lock; \r
-\r
- private void LockRead() {\r
- Monitor.Enter(this);\r
- }\r
-\r
- private void LockWrite() {\r
- Monitor.Enter(this);\r
- }\r
-\r
- private void UnlockRead() {\r
- Monitor.Exit(this);\r
- }\r
-\r
- private void UnlockWrite() {\r
- Monitor.Exit(this);\r
- }\r
-\r
- internal HttpApplicationState() {\r
- _AppObjects = new HttpStaticObjectsCollection();\r
- _SessionObjects = new HttpStaticObjectsCollection();\r
- _Lock = new Mutex();\r
- }\r
-\r
- internal HttpApplicationState(HttpStaticObjectsCollection AppObj, HttpStaticObjectsCollection SessionObj) {\r
- if (null != AppObj) {\r
- _AppObjects = AppObj;\r
- } else {\r
- _AppObjects = new HttpStaticObjectsCollection();\r
- }\r
-\r
- if (null != SessionObj) {\r
- _SessionObjects = SessionObj;\r
- } else {\r
- _SessionObjects = new HttpStaticObjectsCollection();\r
- }\r
- _Lock = new Mutex();\r
- }\r
-\r
- public void Add(string name, object value) {\r
-\r
- LockWrite(); \r
- try {\r
- BaseAdd(name, value);\r
- }\r
- finally {\r
- UnlockWrite();\r
- }\r
- }\r
-\r
- public void Clear() {\r
-\r
- LockWrite(); \r
- try {\r
- BaseClear();\r
- }\r
- finally {\r
- UnlockWrite();\r
- }\r
- } \r
-\r
- public object Get(string name) {\r
- object ret = null;\r
-\r
- LockRead(); \r
- try {\r
- ret = BaseGet(name);\r
- }\r
- finally {\r
- UnlockRead();\r
- }\r
-\r
- return ret;\r
- }\r
-\r
- public object Get(int index) {\r
- object ret = null;\r
- \r
- LockRead(); \r
- try {\r
- ret = BaseGet(index);\r
- }\r
- finally {\r
- UnlockRead();\r
- }\r
-\r
- return ret;\r
- } \r
-\r
- public string GetKey(int index) {\r
- string ret = null;\r
-\r
- LockRead(); \r
- try {\r
- ret = BaseGetKey(index);\r
- }\r
- finally {\r
- UnlockRead();\r
- }\r
-\r
- return ret;\r
- } \r
-\r
- public void Lock() {\r
- LockWrite();\r
- }\r
-\r
- public void Remove(string name) {\r
- LockWrite(); \r
- try {\r
- BaseRemove(name);\r
- }\r
- finally {\r
- UnlockWrite();\r
- } \r
- }\r
-\r
- public void RemoveAll() {\r
- Clear();\r
- }\r
-\r
- public void RemoveAt(int index) {\r
- LockWrite(); \r
- try {\r
- BaseRemoveAt(index);\r
- }\r
- finally {\r
- UnlockWrite();\r
- } \r
- }\r
-\r
- public void Set(string name, object value) {\r
- LockWrite(); \r
- try {\r
- BaseSet(name, value);\r
- }\r
- finally {\r
- UnlockWrite();\r
- } \r
- } \r
- \r
- public void UnLock() {\r
- UnlockWrite();\r
- }\r
- \r
- public string [] AllKeys {\r
- get {\r
- string [] ret = null;\r
-\r
- LockRead(); \r
- try {\r
- ret = BaseGetAllKeys();\r
- }\r
- finally {\r
- UnlockRead();\r
- } \r
-\r
- return ret;\r
- }\r
- }\r
-\r
- public HttpApplicationState Contents {\r
- get {\r
- return this;\r
- }\r
- }\r
-\r
- override public int Count {\r
- get {\r
- int ret = 0;\r
-\r
- LockRead(); \r
- try {\r
- ret = base.Count;\r
- }\r
- finally {\r
- UnlockRead();\r
- } \r
-\r
- return ret;\r
- }\r
- } \r
-\r
- public object this[string name] {\r
- get {\r
- return Get(name);\r
- }\r
- set {\r
- Set(name, value);\r
- }\r
- }\r
-\r
- public object this[int index] {\r
- get {\r
- return Get(index);\r
- }\r
- }\r
-\r
- // ASP Session based objects\r
- internal HttpStaticObjectsCollection SessionObjects {\r
- get {\r
- return _SessionObjects;\r
- }\r
- }\r
-\r
- // ASP App based objects\r
- public HttpStaticObjectsCollection StaticObjects {\r
- get {\r
- return _AppObjects;\r
- }\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; }
+ }
+ }
+}
+