EventNotify.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Speech / Src / Internal / SapiInterop / EventNotify.cs / 1 / EventNotify.cs

                            //------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------- 

using System; 
using System.Diagnostics; 
using System.Speech.Internal.SapiInterop;
using System.Threading; 
using System.Speech.AudioFormat;
using System.Collections.Generic;

namespace System.Speech.Internal.SapiInterop 
{
 
    internal class SpNotifySink : ISpNotifySink 
    {
        public SpNotifySink (EventNotify eventNotify) 
        {
            _eventNotifyReference = new WeakReference (eventNotify);
        }
 
        void ISpNotifySink.Notify ()
        { 
            EventNotify eventNotify = (EventNotify) _eventNotifyReference.Target; 
            if (eventNotify != null)
            { 
                ThreadPool.QueueUserWorkItem (new WaitCallback (eventNotify.SendNotification));
            }
        }
 
        private WeakReference _eventNotifyReference;
    } 
    /// Dispatches events from ISpEventSource to DispatchEventDelegate on a thread 
    /// compatible with the application model of the thread that created this object.
    internal class EventNotify 
    {
        //*******************************************************************
        //
        // Constructors 
        //
        //******************************************************************* 
 
        #region Constructors
 
        internal EventNotify (ISpEventSource sapiEventSource, IAsyncDispatch dispatcher, bool additionalSapiFeatures)
        {
            // Remember event source
            _sapiEventSourceReference = new WeakReference (sapiEventSource); 

            _dispatcher = dispatcher; 
            _additionalSapiFeatures = additionalSapiFeatures; 

            // Start listening to events from sapiEventSource. 
            _notifySink = new SpNotifySink (this);
            sapiEventSource.SetNotifySink (_notifySink);
        }
 
        #endregion Constructors
 
        //******************************************************************** 
        //
        // Internal Methods 
        //
        //*******************************************************************

        #region Internal Methods 

        // Finalizer is not required since ISpEventSource and AsyncOperation both implement appropriate finalizers. 
        internal void Dispose () 
        {
            lock (this) 
            {
                // Since we are explicitly calling Dispose(), sapiEventSource (RCW) will normally be alive.
                // If Dispose() is called from a finalizer this may not be the case so check for null.
                if (_sapiEventSourceReference != null) 
                {
                    ISpEventSource sapiEventSource = (ISpEventSource) _sapiEventSourceReference.Target; 
                    if (sapiEventSource != null) 
                    {
                        // Stop listening to events from sapiEventSource. 
                        sapiEventSource.SetNotifySink (null);
                        _notifySink = null;
                    }
                } 
                _sapiEventSourceReference = null;
            } 
        } 

        internal void SendNotification (object ignored) 
        {
            lock (this)
            {
                // Call dispatchEventDelegate for each SAPI event currently queued. 
                if (_sapiEventSourceReference != null)
                { 
                    ISpEventSource sapiEventSource = (ISpEventSource) _sapiEventSourceReference.Target; 
                    if (sapiEventSource != null)
                    { 
                        List speechEvents = new List ();
                        SpeechEvent speechEvent;
                        while (null != (speechEvent = SpeechEvent.TryCreateSpeechEvent (sapiEventSource, _additionalSapiFeatures, _audioFormat)))
                        { 
                            speechEvents.Add (speechEvent);
                        } 
                        _dispatcher.Post (speechEvents.ToArray ()); 
                    }
                } 
            }
        }

        #endregion Methods 

        //******************************************************************** 
        // 
        // Internal Properties
        // 
        //********************************************************************

        #region Internal Properties
 
        internal SpeechAudioFormatInfo AudioFormat
        { 
            set 
            {
                _audioFormat = value; 
            }
        }

        #endregion Methods 

        //******************************************************************* 
        // 
        // Private Methods
        // 
        //********************************************************************

        #region Private Methods
 
        #endregion
 
        //******************************************************************* 
        //
        // Private Fields 
        //
        //*******************************************************************

        #region Private Fields 

        private IAsyncDispatch _dispatcher; 
        private WeakReference _sapiEventSourceReference; 
        private bool _additionalSapiFeatures;
        private SpeechAudioFormatInfo _audioFormat; 
        private ISpNotifySink _notifySink;
        #endregion Private Fields
    }
} 

// 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