File: State\ISessionStateStore.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="SessionStateStore.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
/*
 * SessionStateStoreProviderBase
 * 
 */
namespace System.Web.SessionState {
    using System.Xml;
    using System.Security.Permissions;
    using System.Configuration.Provider;
    using System.Collections.Specialized; 
 
    [FlagsAttribute()]
    internal enum SessionStateItemFlags : int {
        None =                          0x00000000,
        Uninitialized =                 0x00000001,
        IgnoreCacheItemRemoved =        0x00000002
    }
 
    [FlagsAttribute()]
    public enum SessionStateActions : int {
        None  =             0x00000000,
        InitializeItem =    0x00000001
    }
 
    // This interface is used by SessionStateModule to read/write the session state data
    public abstract class SessionStateStoreProviderBase : ProviderBase {
        public abstract void Dispose();
 
        // Called by SessionStateModule to notify the provider that Session_End is defined
        // in global.asax, and so when an item expires, it should call the expireCallback
        // If the provider does not support session expiry, it should return false.
        public abstract bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback);
        
        // Called at the beginning of the AcquireRequestState event
        public abstract void InitializeRequest(HttpContext context);
 
        // Get and return a SessionStateStoreData. 
        // Please note that we are implementing a reader/writer lock mechanism.
        //
        // If successful:
        //  - returns the item
        //
        // If not found:
        //  - set 'locked' to false
        //  - returns null
        //
        // If the item is already locked by another request:
        //  - set 'locked' to true
        //  - set 'lockAge' to how long has the item been locked
        //  - set 'lockId' to the context of the lock
        //  - returns null
        public abstract SessionStateStoreData GetItem(HttpContext context,
                                        String id, 
                                        out bool locked,
                                        out TimeSpan lockAge, 
                                        out object lockId,
                                        out SessionStateActions actions);
 
        // Get and lock a SessionStateStoreData. 
        // Please note that we are implementing a reader/writer lock mechanism.
        //
        // If successful:
        //  - set 'lockId' to the context of the lock
        //  - returns the item
        //
        // If not found:
        //  - set 'locked' to false
        //  - returns null
        //
        // If the item is already locked by another request:
        //  - set 'locked' to true
        //  - set 'lockAge' to how long has the item been locked
        //  - set 'lockId' to the context of the lock
        //  - returns null
        public abstract SessionStateStoreData GetItemExclusive(HttpContext context, 
                                                String id, 
                                                out bool locked,
                                                out TimeSpan lockAge, 
                                                out object lockId,
                                                out SessionStateActions actions);
 
        // Unlock an item locked by GetExclusive
        // 'lockId' is the lock context returned by previous call to GetExclusive
        public abstract void ReleaseItemExclusive(HttpContext context, 
                                                    String id, 
                                                    object lockId);
 
        // Write an item.  
        // Note: The item is originally obtained by GetExclusive
        // Because SessionStateModule will release (by ReleaseExclusive) am item if 
        // it has been locked for too long, so it is possible that the request calling
        // Set() may have lost the lock to someone else already.  This can be
        // discovered by comparing the supplied lockId with the lockId value 
        // stored with the state item.
        public abstract void SetAndReleaseItemExclusive(HttpContext context, 
                                    String id, 
                                    SessionStateStoreData item, 
                                    object lockId, 
                                    bool newItem);
        
        // Remove an item.  See the note in Set.
        public abstract void RemoveItem(HttpContext context, 
                                        String id, 
                                        object lockId, 
                                        SessionStateStoreData item);
 
        // Reset the expire time of an item based on its timeout value
        public abstract void ResetItemTimeout(HttpContext context, String id);
 
        // Create a brand new SessionStateStoreData. The created SessionStateStoreData must have
        // a non-null ISessionStateItemCollection.
        public abstract SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout);
 
        public abstract void CreateUninitializedItem(HttpContext context, String id, int timeout);
 
        // Called during EndRequest event
        public abstract void EndRequest(HttpContext context);
 
        internal virtual void Initialize(string name, NameValueCollection config, IPartitionResolver partitionResolver) {
        }
    }
 
    public class SessionStateStoreData {
        ISessionStateItemCollection      _sessionItems;
        HttpStaticObjectsCollection _staticObjects;
        int                         _timeout;
 
        public SessionStateStoreData(ISessionStateItemCollection sessionItems,
                                    HttpStaticObjectsCollection staticObjects,
                                    int timeout) {
            _sessionItems = sessionItems;
            _staticObjects = staticObjects;
            _timeout = timeout;
        }
 
        virtual public ISessionStateItemCollection Items { 
            get {
                return _sessionItems;
            }
        }
        
        virtual public HttpStaticObjectsCollection StaticObjects { 
            get {
                return _staticObjects;
            }
        }
        
        virtual public int Timeout { 
            get {
                return _timeout;
            }
            
            set {
                _timeout = value;
            }
        }
    }
}