File: System\ServiceModel\Activities\AppSettings.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Activities\System.ServiceModel.Activities.csproj (System.ServiceModel.Activities)
// <copyright>
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
 
namespace System.ServiceModel.Activities
{
    using System;
    using System.Collections.Specialized;
    using System.Configuration;
 
    internal static class AppSettings
    {
        private static volatile bool settingsInitialized = false;
        private static object appSettingsLock = new object();
 
        // false [default] to NOT have InstanceKeys automatically disassociated by default, so that they stay around until the completion of the workflow.
        // true to have InstanceKeys automatically dissociated by default. Doing this affects the extensibility point WorkflowInstance.OnDisassociateKeys.
        // <add key="microsoft:WorkflowServices:DefaultAutomaticInstanceKeyDisassociation" value="true"/>
        //
        // NOTE - There is a similar setting in System.Activities because the changes affected by this are in both assemblies.
        private static bool defaultAutomaticInstanceKeyDisassociation;
 
        // The number of seconds to wait for non-protocol bookmarks if we receive a request, but the protocol bookmark for that Receive activity is not ready.
        // Default = 60 (1 minute).
        // A value of 0 implies that we should not wait at all and the "out of order" exception should be thrown, rather than the timeout exception.
        // <add key="microsoft:WorkflowServices:FilterResumeTimeoutInSeconds" value="60"/>
        private static int filterResumeTimeoutInSeconds;
 
        // false [default] uses the transaction that is provided by an IWorkflowInstanceMangement.TransactedCancel and TransactedTerminate invocation.
        // true - we ignore the transaction provided.
        //
        // Specify true to avoid a possible stack overflow performing WaitForCanPersist without actually waiting when the instance is in a
        // no-persist zone at transaction commit time. DevDiv 258978
        private static bool ignoreTransactionsForTransactedCancelAndTransactedTerminate;
 
        internal static bool DefaultAutomaticInstanceKeyDisassociation
        {
            get
            {
                EnsureSettingsLoaded();
                return defaultAutomaticInstanceKeyDisassociation;
            }
        }
 
        internal static int FilterResumeTimeoutInSeconds
        {
            get
            {
                EnsureSettingsLoaded();
                return filterResumeTimeoutInSeconds;
            }
        }
 
        internal static bool IgnoreTransactionsForTransactedCancelAndTransactedTerminate
        {
            get
            {
                EnsureSettingsLoaded();
                return ignoreTransactionsForTransactedCancelAndTransactedTerminate;
            }
        }
 
        private static void EnsureSettingsLoaded()
        {
            if (!settingsInitialized)
            {
                lock (appSettingsLock)
                {
                    if (!settingsInitialized)
                    {
                        NameValueCollection settings = null;
 
                        try
                        {
                            settings = ConfigurationManager.AppSettings;
                        }
                        finally
                        {
                            if (settings == null || !bool.TryParse(settings["microsoft:WorkflowServices:DefaultAutomaticInstanceKeyDisassociation"], out defaultAutomaticInstanceKeyDisassociation))
                            {
                                defaultAutomaticInstanceKeyDisassociation = false;
                            }
 
                            if (settings == null || !int.TryParse(settings["microsoft:WorkflowServices:FilterResumeTimeoutInSeconds"], out filterResumeTimeoutInSeconds) ||
                                (filterResumeTimeoutInSeconds < 0))
                            {
                                filterResumeTimeoutInSeconds = 60;
                            }
 
                            if (settings == null || !bool.TryParse(settings["microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate"], out ignoreTransactionsForTransactedCancelAndTransactedTerminate))
                            {
                                ignoreTransactionsForTransactedCancelAndTransactedTerminate = false;
                            }
 
                            settingsInitialized = true;
                        }
                    }
                }
            }
        }
    }
}