// Authors:
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
-// (C) 2002 Ximian, Inc (http://www.ximian.com)
+// (C) 2002,2003 Ximian, Inc (http://www.ximian.com)
//
+
+//
+// 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;
using System.IO;
+using System.Collections;
using System.Collections.Specialized;
namespace System.Web.SessionState {
internal class SessionDictionary : NameObjectCollectionBase
{
- private bool _dirty;
-
- static SessionDictionary ()
+ bool _dirty;
+
+ public SessionDictionary ()
{
}
- public SessionDictionary ()
+ internal SessionDictionary Clone ()
{
- }
+ SessionDictionary sess = new SessionDictionary ();
+ int last = sess.Count;
+ for (int i = 0; i < last; i++) {
+ string key = GetKey (i);
+ sess [key] = this [key];
+ }
- void Clear ()
+ return sess;
+ }
+
+ internal void Clear ()
{
_dirty = true;
- BaseClear ();
+ lock (this)
+ BaseClear ();
}
- [MonoTODO]
- static SessionDictionary Deserialize (BinaryReader r)
+ internal string GetKey (int index)
{
- throw new NotImplementedException ();
+ string value;
+ lock (this)
+ value = BaseGetKey (index);
+
+ return value;
}
- public string GetKey (int index)
+ internal static bool IsInmutable (object o)
{
- return BaseGetKey (index);
+ Type t = o.GetType ();
+ return (t == typeof (string) || t.IsPrimitive);
}
- [MonoTODO]
- static bool IsInmutable (object o)
+ internal void Remove (string s)
{
- throw new NotImplementedException ();
+ lock (this)
+ BaseRemove (s);
+ _dirty = true;
}
- void Remove (string s)
+ internal void RemoveAt (int index)
{
- BaseRemove (s);
+ lock (this)
+ BaseRemoveAt (index);
_dirty = true;
}
- void RemoveAt (int index)
+ internal void Serialize (BinaryWriter w)
{
- BaseRemoveAt (index);
- _dirty = true;
+ lock (this) {
+ w.Write (Count);
+ foreach (string key in Keys) {
+ w.Write (key);
+ object value = BaseGet (key);
+ if (value == null) {
+ w.Write (System.Web.Util.AltSerialization.NullIndex);
+ continue;
+ }
+
+ System.Web.Util.AltSerialization.SerializeByType (w, value);
+ }
+ }
}
- [MonoTODO]
- void Serialize(BinaryWriter w)
+ internal static SessionDictionary Deserialize (BinaryReader r)
{
- throw new NotImplementedException ();
+ SessionDictionary result = new SessionDictionary ();
+ for (int i = r.ReadInt32 (); i > 0; i--) {
+ string key = r.ReadString ();
+ int index = r.ReadInt32 ();
+ if (index == System.Web.Util.AltSerialization.NullIndex)
+ result [key] = null;
+ else
+ result [key] = System.Web.Util.AltSerialization.DeserializeFromIndex (index, r);
+ }
+
+ return result;
}
- bool Dirty
+ internal bool Dirty
{
get { return _dirty; }
set { _dirty = value; }
}
- object this [string s]
+ internal object this [string s]
{
- get { return BaseGet (s); }
+ get {
+ object o;
+ lock (this)
+ o = BaseGet (s);
+
+ return o;
+ }
+
set {
- BaseSet (s, value);
+ lock (this)\r
+ { \r
+ object obj = BaseGet(s);\r
+ if ((obj == null) && (value == null))\r
+ return; \r
+ BaseSet (s, value);
+ }
+
_dirty = true;
}
}
- object this [int index]
+ public object this [int index]
{
- get { return BaseGet (index); }
+ get {
+ object o;
+ lock (this)
+ o = BaseGet (index);
+
+ return o;
+ }
set {
- BaseSet (index, value);
+ lock (this)
+ { \r
+ object obj = BaseGet(index);\r
+ if ((obj == null) && (value == null))\r
+ return; \r
+ BaseSet (index, value);
+ }
+
_dirty = true;
}
}
+
+ internal byte [] ToByteArray ()
+ {
+ MemoryStream stream = null;
+ try {
+ stream = new MemoryStream ();
+ Serialize (new BinaryWriter (stream));
+ return stream.GetBuffer ();
+ } catch {
+ throw;
+ } finally {
+ if (stream != null)
+ stream.Close ();
+ }
+ }
+
+ internal static SessionDictionary FromByteArray (byte [] data)
+ {
+ SessionDictionary result = null;
+ MemoryStream stream = null;
+ try {
+ stream = new MemoryStream (data);
+ result = Deserialize (new BinaryReader (stream));
+ } catch {
+ throw;
+ } finally {
+ if (stream != null)
+ stream.Close ();
+ }
+ return result;
+ }
}
}