File: System\Xml\Xslt\XsltArgumentList.cs
Web Access
Project: src\runtime\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections;
using System.Diagnostics.CodeAnalysis;

namespace System.Xml.Xsl
{
    public abstract class XsltMessageEncounteredEventArgs : EventArgs
    {
        public abstract string Message { get; }
    }

    public delegate void XsltMessageEncounteredEventHandler(object sender, XsltMessageEncounteredEventArgs e);

    public class XsltArgumentList
    {
        private readonly Hashtable _parameters = new Hashtable();
        private readonly Hashtable _extensions = new Hashtable();
        private const string ExtensionObjectWarning = @"The stylesheet may have calls to methods of the extension object passed in which cannot be statically analyzed " +
            "by the trimmer. Ensure all methods that may be called are preserved.";
        internal const string ExtensionObjectSuppresion = @"In order for this code path to be hit, a previous call to XsltArgumentList.AddExtensionObject is " +
            "required. That method is already annotated as unsafe and throwing a warning, so we can suppress here.";

        // Used for reporting xsl:message's during execution
        internal XsltMessageEncounteredEventHandler? xsltMessageEncountered;

        public XsltArgumentList() { }

        public object? GetParam(string name, string namespaceUri)
        {
            return _parameters[new XmlQualifiedName(name, namespaceUri)];
        }

        [RequiresUnreferencedCode(ExtensionObjectWarning)]
        public object? GetExtensionObject(string namespaceUri)
        {
            return _extensions[namespaceUri];
        }

        public void AddParam(string name, string namespaceUri, object parameter)
        {
            ArgumentNullException.ThrowIfNull(name);
            ArgumentNullException.ThrowIfNull(namespaceUri);
            ArgumentNullException.ThrowIfNull(parameter);

            XmlQualifiedName qname = new XmlQualifiedName(name, namespaceUri);
            qname.Verify();
            _parameters.Add(qname, parameter);
        }

        [RequiresUnreferencedCode(ExtensionObjectWarning)]
        public void AddExtensionObject(string namespaceUri, object extension)
        {
            ArgumentNullException.ThrowIfNull(namespaceUri);
            ArgumentNullException.ThrowIfNull(extension);

            _extensions.Add(namespaceUri, extension);
        }

        public object? RemoveParam(string name, string namespaceUri)
        {
            XmlQualifiedName qname = new XmlQualifiedName(name, namespaceUri);
            object? parameter = _parameters[qname];
            _parameters.Remove(qname);
            return parameter;
        }

        public object? RemoveExtensionObject(string namespaceUri)
        {
            object? extension = _extensions[namespaceUri];
            _extensions.Remove(namespaceUri);
            return extension;
        }

        public event XsltMessageEncounteredEventHandler XsltMessageEncountered
        {
            add
            {
                xsltMessageEncountered += value;
            }
            remove
            {
                xsltMessageEncountered -= value;
            }
        }

        public void Clear()
        {
            _parameters.Clear();
            _extensions.Clear();
            xsltMessageEncountered = null;
        }
    }
}