//called to set the session for the current connection
 internal void SetSession(SessionState session)
 {
     _session = session;
 }
 public static void LoadStateForConnection(HttpRequest request,Site site)
 {
     switch (site.SessionStateType)
     {
         case SiteSessionTypes.ThreadState:
             if (request.Cookie.SessionID == null)
             {
                 Monitor.Enter(_lock);
                 if (_ipSessionIds == null)
                     _ipSessionIds = new Dictionary<string, CachedItemContainer>();
                 if (_ipSessionIds.ContainsKey(request.Connection.Client.ToString()))
                     request.Cookie.SessionID = _ipSessionIds[request.Connection.Client.ToString()].Value.ToString();
                 Monitor.Exit(_lock);
             }
             if (request.Cookie.SessionID != null)
             {
                 Monitor.Enter(_lock);
                 if (_sessions == null)
                     _sessions = new List<SessionState>();
                 for (int x = 0; x < _sessions.Count; x++)
                 {
                     SessionState session = _sessions[x];
                     if (session.ID == request.Cookie.SessionID)
                     {
                         session.Renew(site.SessionTimeoutMinutes);
                         request.SetSession(session);
                         _sessions.RemoveAt(x);
                         _sessions.Insert(x, session);
                         break;
                     }
                 }
                 Monitor.Exit(_lock);
             }
             if (request.Session==null)
             {
                 Monitor.Enter(_lock);
                 while (true)
                 {
                     bool okay = true;
                     string id = GenerateSessionID();
                     if (_sessions == null)
                         _sessions = new List<SessionState>();
                     foreach (SessionState session in _sessions)
                     {
                         if (session.ID == id)
                         {
                             okay = false;
                             break;
                         }
                     }
                     if (okay)
                     {
                         if (_ipSessionIds == null)
                             _ipSessionIds = new Dictionary<string, CachedItemContainer>();
                         _ipSessionIds.Add(request.Connection.Client.ToString(), new CachedItemContainer(id));
                         SessionState ss = new SessionState(id);
                         ss.Renew(site.SessionTimeoutMinutes);
                         _sessions.Add(ss);
                         request.SetSession(ss);
                         break;
                     }
                 }
                 Monitor.Exit(_lock);
                 request.ResponseCookie.SessionID = request.Session.ID;
             }
             break;
         case SiteSessionTypes.FileSystem:
             if (request.Cookie.SessionID == null)
             {
                 Monitor.Enter(_lock);
                 if (_ipSessionIds == null)
                     _ipSessionIds = new Dictionary<string, CachedItemContainer>();
                 if (_ipSessionIds.ContainsKey(request.Connection.Client.ToString()))
                     request.Cookie.SessionID = _ipSessionIds[request.Connection.Client.ToString()].Value.ToString();
                 Monitor.Exit(_lock);
             }
             if (request.Cookie.SessionID != null)
             {
                 Monitor.Enter(_lock);
                 DirectoryInfo di = new DirectoryInfo(site.TMPPath + Path.DirectorySeparatorChar + "Sessions");
                 if (!di.Exists)
                     di.Create();
                 if (di.GetFiles(request.Cookie.SessionID + ".xml").Length > 0)
                 {
                     SessionState ss = new SessionState(request.Cookie.SessionID);
                     ss.LoadFromFile(di.FullName + Path.DirectorySeparatorChar + request.Cookie.SessionID + ".xml");
                     ss.Renew(site.SessionTimeoutMinutes);
                     ss.StoreToFile(di.FullName + Path.DirectorySeparatorChar + request.Cookie.SessionID + ".xml");
                     request.SetSession(ss);
                 }
                 Monitor.Exit(_lock);
             }
             if (request.Session == null)
             {
                 Monitor.Enter(_lock);
                 DirectoryInfo di = new DirectoryInfo(site.TMPPath + Path.DirectorySeparatorChar + "Sessions");
                 if (!di.Exists)
                     di.Create();
                 while (true)
                 {
                     string id = GenerateSessionID();
                     if (_sessions == null)
                         _sessions = new List<SessionState>();
                     if (di.GetFiles(id + ".xml").Length == 0)
                     {
                         if (_ipSessionIds == null)
                             _ipSessionIds = new Dictionary<string, CachedItemContainer>();
                         _ipSessionIds.Add(request.Connection.Client.ToString(), new CachedItemContainer(id));
                         SessionState ss = new SessionState(id);
                         ss.StoreToFile(di.FullName + Path.DirectorySeparatorChar + id + ".xml");
                         request.SetSession(ss);
                         break;
                     }
                 }
                 Monitor.Exit(_lock);
                 request.ResponseCookie.SessionID = request.Session.ID;
             }
             break;
     }
 }