⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queuetracelistener.cs

📁 Aditional source code for sti5518 firmware uploader.
💻 CS
字号:
#region Copyright ArtfulBits Inc. 2005 - 2008
//
//  Copyright ArtfulBits Inc. 2005 - 2008. All rights reserved.
//
//  Use of this code is subject to the terms of our license.
//  A copy of the current license can be obtained at any time by e-mailing
//  info@artfulbits.com. Re-distribution in any form is strictly
//  prohibited. Any infringement will be prosecuted under applicable laws. 
//
#endregion

#region File usings
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
#endregion

namespace Artfulbits.Utilities.Diagnostics
{
  /// <summary>
  /// 
  /// </summary>
  public class QueueTraceListener : TraceListener
  {
    #region Class constants
    /// <summary></summary>
    public const int MaxMessages = 1000;
    /// <summary></summary>
    private static readonly string NewLine = Environment.NewLine;
    #endregion
    
    #region Members
    /// <summary></summary>
    private readonly LinkedList<string> m_messages = new LinkedList<string>();
    #endregion

    #region Class events
    /// <summary></summary>
    public event EventHandler<EventArgs<string>> OnWriteLine;
    #endregion

    #region Public properties
    /// <summary>
    /// 
    /// </summary>
    public LinkedList<string> Messages
    {
      get
      {
        return m_messages;
      }
    }
    #endregion

    #region Class construction
    /// <summary>
    /// 
    /// </summary>
    public QueueTraceListener()
    {
      // add first empty string into queue
      m_messages.AddLast( string.Empty );
    }
    #endregion

    #region Class overrides
    /// <summary>
    /// 
    /// </summary>
    /// <param name="message"></param>
    public override void Write( string message )
    {
      lock( m_messages )
      {
        string[] lines = message.Split( new string[]{ NewLine }, StringSplitOptions.RemoveEmptyEntries );
        
        LinkedListNode<string> node = m_messages.Last;
        node.Value = new StringBuilder( node.Value ).Append( lines[ 0 ] ).ToString();

        for( int i=1, len = lines.Length; i < len;  i++ )
        {
          WriteLine( lines[ i ] );
        }
      }
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="message"></param>
    public override void WriteLine( string message )
    {
      lock( m_messages )
      {
        if( m_messages.Count > MaxMessages + 1 )
          m_messages.RemoveFirst();

        LinkedListNode<string> node = m_messages.Last;
        node.Value = new StringBuilder( node.Value ).Append( message ).ToString();
        
        // add next line into queue - it's a start point for every next item in queue
        m_messages.AddLast( string.Empty );

        if( OnWriteLine != null )
        {
          OnWriteLine( this, new EventArgs<string>( node.Value ) );
        }
      }
    }
    /// <summary>
    /// 
    /// </summary>
    public override void Close()
    {
      base.Close();

      m_messages.Clear();
    }
    #endregion
  }


  /// <summary>
  /// Generic EventArgs. Useful in usage with generic EventHandler.
  /// </summary>
  /// <typeparam name="T"></typeparam>
  public class EventArgs<T> : EventArgs
    where T : class
  {
    #region Class members
    /// <summary></summary>
    private T m_data;
    #endregion

    #region Class properties
    /// <summary></summary>
    public T Data
    {
      get
      {
        return m_data;
      }
      set
      {
        m_data = value;
      }
    }
    #endregion

    #region Class constructor
    /// <summary></summary>
    public EventArgs()
      : this( null )
    {
    }
    /// <summary></summary>
    /// <param name="data"></param>
    public EventArgs( T data )
    {
      m_data = data;
    }
    #endregion
  }

  /// <summary></summary>
  /// <typeparam name="T"></typeparam>
  public class SimpleEventArgs<T> : EventArgs
    where T : struct
  {
    #region Class members
    /// <summary></summary>
    private T m_data;
    #endregion

    #region Class properties
    /// <summary></summary>
    public T Data
    {
      get
      {
        return m_data;
      }
      set
      {
        m_data = value;
      }
    }
    #endregion

    #region Class constructor
    /// <summary></summary>
    /// <param name="data"></param>
    public SimpleEventArgs( T data )
    {
      m_data = data;
    }
    #endregion
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -