File: System\Configuration\ConfigurationSchemaErrors.cs
Project: ndp\fx\src\Configuration\System.Configuration.csproj (System.Configuration)
//------------------------------------------------------------------------------
// <copyright file="ConfigurationSchemaErrors.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Configuration {
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Text;
 
    internal class ConfigurationSchemaErrors {
        // Errors with ExceptionAction.Local are logged to this list.
        // This list is reset when processing of a section is complete.
        // Errors on this list may be added to the _errorsAll list
        // when RetrieveAndResetLocalErrors is called.
        private List<ConfigurationException> _errorsLocal;
 
        // Errors with ExceptionAction.Global are logged to this list.
        private List<ConfigurationException> _errorsGlobal;
 
        // All errors related to a config file are logged to this list.
        // This includes all global errors, all non-specific errors,
        // and local errors for input that applies to this config file.
        private List<ConfigurationException> _errorsAll;
 
        internal ConfigurationSchemaErrors() {}
 
        internal bool HasLocalErrors {
            get {
                return ErrorsHelper.GetHasErrors(_errorsLocal);
            }
        }
 
        internal bool HasGlobalErrors {
            get {
                return ErrorsHelper.GetHasErrors(_errorsGlobal);
            }
        }
 
        private bool HasAllErrors {
            get {
                return ErrorsHelper.GetHasErrors(_errorsAll);
            }
        }
 
        internal int GlobalErrorCount {
            get {
                return ErrorsHelper.GetErrorCount(_errorsGlobal);
            }
        }
 
        //
        // Add a configuration Error.
        //
        internal void AddError(ConfigurationException ce, ExceptionAction action) {
            switch (action) {
                case ExceptionAction.Global:
                    ErrorsHelper.AddError(ref _errorsAll, ce);
                    ErrorsHelper.AddError(ref _errorsGlobal, ce);
                    break;
 
                case ExceptionAction.NonSpecific:
                    ErrorsHelper.AddError(ref _errorsAll, ce);
                    break;
 
                case ExceptionAction.Local:
                    ErrorsHelper.AddError(ref _errorsLocal, ce);
                    break;
            }
        }
 
        internal void SetSingleGlobalError(ConfigurationException ce) {
            _errorsAll = null;
            _errorsLocal = null;
            _errorsGlobal = null;
 
            AddError(ce, ExceptionAction.Global);
        }
 
        internal bool HasErrors(bool ignoreLocal) {
            if (ignoreLocal) {
                return HasGlobalErrors;
            }
            else {
                return HasAllErrors;
            }
        }
 
        // ThrowIfErrors
        //
        // Throw if Errors were detected and remembered.
        //
        // Parameters:
        //   IgnoreLocal - Should we be using the local errors also to
        //                  detemine if we should throw?
        //
        // Note: We will always return all the errors, no matter what
        //       IgnoreLocal is.
        //
        internal void ThrowIfErrors(bool ignoreLocal) {
            if (HasErrors(ignoreLocal)) {
                if (HasGlobalErrors) {
                    // Throw just the global errors, as they invalidate
                    // all other config file parsing.
                    throw new ConfigurationErrorsException(_errorsGlobal);
                }
                else {
                    // Throw all errors no matter what
                    throw new ConfigurationErrorsException(_errorsAll);
                }
            }
        }
 
        // RetrieveAndResetLocalErrors
        //
        // Retrieve the Local Errors, and Reset them to none.
        //
        internal List<ConfigurationException> RetrieveAndResetLocalErrors(bool keepLocalErrors) {
            List<ConfigurationException> list = _errorsLocal;
            _errorsLocal = null;
 
            if (keepLocalErrors) {
                ErrorsHelper.AddErrors(ref _errorsAll, list);
            }
 
            return list;
        }
 
        //
        // Add errors that have been saved for a specific section.
        //
        internal void AddSavedLocalErrors(ICollection<ConfigurationException> coll) {
            ErrorsHelper.AddErrors(ref _errorsAll, coll);
        }
 
        // ResetLocalErrors
        //
        // Remove all the Local Errors, so we can start from scratch
        //
        internal void ResetLocalErrors() {
            RetrieveAndResetLocalErrors(false);
        }
    }
}