2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.Web / System.Web.SessionState / SessionDictionary.cs
index 8689d001da9860dc6bd6edf782b8c93b261b6943..d1b193d90d594d4e36e73351fb7c15ac6afa34aa 100644 (file)
 // 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;
+       }
 }
 
 }