File: Recognition\RecognizerInfo.cs
Web Access
Project: src\src\runtime\src\libraries\System.Speech\src\System.Speech.csproj (System.Speech)
// 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.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Speech.AudioFormat;
using System.Speech.Internal;
using System.Speech.Internal.ObjectTokens;

namespace System.Speech.Recognition
{
    // This represents the attributes various speech recognizers may, or may not support.

    public class RecognizerInfo : IDisposable
    {
        #region Constructors

        private RecognizerInfo(ObjectToken token, CultureInfo culture)
        {
            // Retrieve the token name
            _id = token.Name;

            // Retrieve default display name
            _description = token.Description;

            // Store full object token id for internal use.
            // NOTE - SAPI returns the wrong hive for tokenenum tokens (always HKLM).
            // Do not rely on the path to be correct in all cases.
            _sapiObjectTokenId = token.Id;

            _name = token.TokenName();

            _culture = culture;

            // Enum all values and add to custom table
            Dictionary<string, string> attrs = new();
            foreach (string keyName in token.Attributes.GetValueNames())
            {
                string attributeValue;
                if (token.Attributes.TryGetString(keyName, out attributeValue))
                {
                    attrs[keyName] = attributeValue;
                }
            }
            _attributes = new ReadOnlyDictionary<string, string>(attrs);

            string audioFormats;
            if (token.Attributes.TryGetString("AudioFormats", out audioFormats))
            {
                _supportedAudioFormats = new ReadOnlyCollection<SpeechAudioFormatInfo>(SapiAttributeParser.GetAudioFormatsFromString(audioFormats));
            }
            else
            {
                _supportedAudioFormats = new ReadOnlyCollection<SpeechAudioFormatInfo>(new List<SpeechAudioFormatInfo>());
            }

            _objectToken = token;
        }

        internal static RecognizerInfo? Create(ObjectToken token)
        {
            // Token for recognizer should have Attributes.
            if (token.Attributes == null)
            {
                return null;
            }

            // Get other attributes
            string langId;

            // must have a language id
            if (!token.Attributes.TryGetString("Language", out langId))
            {
                return null;
            }
            CultureInfo? cultureInfo = SapiAttributeParser.GetCultureInfoFromLanguageString(langId);
            if (cultureInfo != null)
            {
                return new RecognizerInfo(token, cultureInfo);
            }
            else
            {
                return null;
            }
        }

        internal ObjectToken GetObjectToken()
        {
            return _objectToken;
        }

        /// <summary>
        /// For IDisposable.
        /// RecognizerInfo can be constructed through creating a new object token (usage of _recognizerInfo in RecognizerBase),
        /// so dispose needs to be called.
        /// </summary>
        public void Dispose()
        {
            _objectToken.Dispose();
            GC.SuppressFinalize(this);
        }

        #endregion

        #region public Properties
        public string Id
        {
            get { return _id; }
        }
        public string Name
        {
            get { return _name; }
        }
        public string Description
        {
            get { return _description; }
        }
        public CultureInfo Culture
        {
            get { return _culture; }
        }
        public ReadOnlyCollection<SpeechAudioFormatInfo> SupportedAudioFormats
        {
            get { return _supportedAudioFormats; }
        }
        public IDictionary<string, string> AdditionalInfo
        {
            get { return _attributes; }
        }

        #endregion

        #region Internal Properties

        #endregion

        #region Private Fields

        // This table stores each attribute
        private ReadOnlyDictionary<string, string> _attributes;

        // Named attributes - these get initialized in constructor
        private string _id;
        private string _name;
        private string _description;
        private string _sapiObjectTokenId;
        private CultureInfo _culture;

        private ReadOnlyCollection<SpeechAudioFormatInfo> _supportedAudioFormats;

        private ObjectToken _objectToken;

        #endregion
    }
}