UIAgentMonitor.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / infocard / Service / managed / Microsoft / InfoCards / UIAgentMonitor.cs / 1 / UIAgentMonitor.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
//
// Presharp uses the c# pragma mechanism to supress its warnings. 
// These are not recognised by the base compiler so we need to explictly
// disable the following warnings. See http://winweb/cse/Tools/PREsharp/userguide/default.asp 
// for details. 
//
#pragma warning disable 1634, 1691      // unknown message, unknown pragma 



namespace Microsoft.InfoCards 
{
    using System; 
    using System.Collections.Generic; 
    using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
 
    //
    // Summary
    // This class is used to make certain that only one user call and only one client per TS session can
    // use the infocard system. 
    //
    class UIAgentMonitor 
    { 

        static UIAgentMonitor s_singleton = null; 

        static object s_syncRoot = new object();

        // 
        // Dictionary of currently running users.
        // 
        Dictionary m_currentCallingUsers;  // user name to request dictionary. 
        Dictionary    m_currentTSSessions;    // tssession to request dictionary.
 
        private UIAgentMonitor()
        {
            m_currentCallingUsers = new Dictionary();
            m_currentTSSessions   = new Dictionary(); 
        }
 
        // 
        // Summary
        // Returns the singleton instance of the monitor, creating it if necessary. 
        //
        static public UIAgentMonitor Instance()
        {
            // 
            // Has it been created yet?
            // 
            if ( null == s_singleton ) 
            {
                // 
                // Doesn't look like it try for the lock.
                //
                lock ( s_syncRoot )
                { 
                    //
                    // Was this the first thread to get the lock? 
                    // 
                    if ( null == s_singleton )
                    { 
                        //
                        // Yes, this thread needs to create the monitor.
                        //
                        s_singleton = new UIAgentMonitor(); 
                    }
                } 
            } 

            return s_singleton; 
        }

        //
        // Summary 
        // Adds a new UIAgentMonitorHandle to the collection if the user and tssession associated with the request
        // are not already occupied.  If they are then this method throws the ServiceBusyException. 
        // 
        // Parameters
        // request   -  The request to add. 
        //
        public void AddNewClient( UIAgentMonitorHandle handle )
        {
            lock ( s_syncRoot ) 
            {
                string user      = handle.UserName; 
                int    tssession = handle.TsSessionId; 

                if ( m_currentCallingUsers.ContainsKey( user ) ) 
                {
                    throw IDT.ThrowHelperError( new ServiceBusyException(
                                            SR.GetString( SR.ServiceInUseOnAnotherSession ) ) );
                } 

                if ( m_currentTSSessions.ContainsKey( tssession ) ) 
                { 
                    throw IDT.ThrowHelperError( new ServiceBusyException(
                                            SR.GetString( SR.ServiceInUseOnAnotherSession ) ) ); 
                }

                m_currentCallingUsers.Add( user, handle );
 
                try
                { 
                    m_currentTSSessions.Add( tssession, handle ); 
                }
                catch( Exception ) 
                {
                    m_currentCallingUsers.Remove( user );
                    throw;
                } 
            }
        } 
 
        //
        // Summary 
        // Removes a UIAgentMonitorHandle from the collection if this specific request is in the collection.
        //
        // Parameters
        // request  - the request to remove. 
        //
        public void RemoveClient( UIAgentMonitorHandle handle ) 
        { 
            lock ( s_syncRoot )
            { 
                string user      = handle.UserName;
                int    tssession = handle.TsSessionId;

                if ( ( !string.IsNullOrEmpty( user ) ) && ( m_currentCallingUsers.ContainsKey( user ) ) && ( handle == m_currentCallingUsers[ user ] ) ) 
                {
                    m_currentCallingUsers.Remove( user ); 
                } 
                if ( ( m_currentTSSessions.ContainsKey( tssession ) ) && ( handle == m_currentTSSessions[ tssession ] ) )
                { 
                    m_currentTSSessions.Remove( tssession );
                }
            }
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK