/// <summary>
 /// Releases the unmanaged resources used by this <see cref="RemoteInputAdapter"/> and optionally releases the managed resources.
 /// </summary>
 /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>
 protected override void Dispose(bool disposing)
 {
     if (!m_disposed)
     {
         try
         {
             // This will be done regardless of whether the object is finalized or disposed.
             if (disposing)
             {
                 // This will be done only when the object is disposed by calling Dispose().
                 if (m_historianDataListener != null)
                 {
                     m_historianDataListener.DataExtracted             -= HistorianDataListener_DataExtracted;
                     m_historianDataListener.SocketConnecting          -= HistorianDataListener_SocketConnecting;
                     m_historianDataListener.SocketConnected           -= HistorianDataListener_SocketConnected;
                     m_historianDataListener.SocketDisconnected        -= HistorianDataListener_SocketDisconnected;
                     m_historianDataListener.Parser.OutputTypeNotFound -= HistorianDataListener_OutputTypeNotFound;
                     m_historianDataListener.Parser.DataDiscarded      -= HistorianDataListener_DataDiscarded;
                     m_historianDataListener.Parser.ParsingException   -= HistorianDataListener_ParsingException;
                     m_historianDataListener.Dispose();
                 }
             }
         }
         finally
         {
             m_disposed = true;          // Prevent duplicate dispose.
             base.Dispose(disposing);    // Call base class Dispose().
         }
     }
 }