}//HubEventHandler()

        //
        //
        //
        // *************************************************************************
        // ***                      Process Request                             ****
        // *************************************************************************
        /// <summary>
        /// These are request for fill hub resources.  Some can not be completed yet, and these
        /// will be stored in a Queue for retrying later.
        /// </summary>
        private void ProcessAuditTrailEvent(AuditTrailEventArgs eventArg)
        {
            if (eventArg == null)
            {
                return;
            }

            if (eventArg.auditTrailEventType == AuditTrailEventType.LoadAuditTrailFills)
            {
                if (m_Listener != null)
                {
                    // It does not need the TT to start fill listening.
                    m_IsInitializingBooks = false;
                    Log.NewEntry(LogLevel.Minor, "Connected to audit trail file.");
                    m_Listener.Filled += new EventHandler(HubEventEnqueue);
                    AuditTrailPlayer  auditTrailReader  = (AuditTrailPlayer)eventArg.Data[0];
                    AuditTrailFillHub auditTrailFillHub = (AuditTrailFillHub)eventArg.Data[1];
                    DateTime          auditTrailReadingStartDateTime = (DateTime)eventArg.Data[2];
                    DateTime          auditTrailPlayingEndDateTime   = (DateTime)eventArg.Data[3];
                    LogHub            log = (LogHub)eventArg.Data[4];
                    m_Listener.Log = log;

                    // Get the variables from GUI thread to load audit trail fills and update initial state of fill hub.
                    if (auditTrailReader.TryReadAuditTrailFills(auditTrailReadingStartDateTime, auditTrailPlayingEndDateTime, auditTrailFillHub))
                    {
                        m_NeededCheckKeys.Clear();
                        m_NeededCheckKeys.AddRange(auditTrailReader.m_NeededBookInstrumentList);
                        Log.NewEntry(LogLevel.Minor, "Successfully load fills from audit trail file.");
                    }
                    else
                    {
                        Log.NewEntry(LogLevel.Major, "Failed to load fills from audit trail file.");
                        return;
                    }
                }
            }
            else if (eventArg.auditTrailEventType == AuditTrailEventType.PlayAuditTrailFills)
            {
                AuditTrailPlayer  auditTrailReader  = (AuditTrailPlayer)eventArg.Data[0];
                AuditTrailFillHub auditTrailFillHub = (AuditTrailFillHub)eventArg.Data[1];
                DateTime          auditTrailReadingStartDateTime = (DateTime)eventArg.Data[2];
                DateTime          auditTrailPlayingEndDateTime   = (DateTime)eventArg.Data[3];
                LogHub            log = (LogHub)eventArg.Data[4];

                // Get the variables from GUI thread to play the audit trail fills.
                if (auditTrailReader.TryPlayAuditTrailFillsForFillHub(auditTrailFillHub, auditTrailReadingStartDateTime, auditTrailPlayingEndDateTime, out auditTrailFillHub))
                {
                    Log.NewEntry(LogLevel.Minor, "Successful in playing the audit trail file.");
                }
                else
                {
                    Log.NewEntry(LogLevel.Major, "Failed to play the audit trail file.");
                    return;
                }
            }
        }// ProcessRequest()
        }//buttonLoadAuditTrailFills_Click()

        /// <summary>
        /// When user clicks the recovery button, it loads drop file and play audit trail.
        /// And it display the final state of the fill hub.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonPlayAuditTrailFills_Click(object sender, EventArgs e)
        {
            if (sender == this.buttonPlayAuditTrail)
            {
                // Start recovery.
                Log.NewEntry(LogLevel.Minor, "The button of playing audit trail fills is clicked by user.");

                DateTime minDateTime = new DateTime(2000, 1, 1);
                if (m_UserSelectedRecoveryDropFileDateTime > minDateTime)
                {
                    // Check whether the end date time is larger than the start date time.
                    if (m_UserSelectedPlayerEndDateTime < m_UserSelectedRecoveryDropFileDateTime)
                    {
                        Log.NewEntry(LogLevel.Major, "The end player date time is smaller than the start recovery date time.");
                        return;
                    }

                    // Start to play the audit trail player.
                    if (m_AuditTrailPlayer != null)
                    {
                        AuditTrailEventArgs fillHubRequest = new AuditTrailEventArgs();
                        fillHubRequest.auditTrailEventType = AuditTrailEventType.PlayAuditTrailFills;
                        fillHubRequest.Data    = new object[5];
                        fillHubRequest.Data[0] = m_AuditTrailPlayer;
                        fillHubRequest.Data[1] = m_AuditTrailFillHub;
                        fillHubRequest.Data[2] = m_UserSelectedRecoveryDropFileDateTime;
                        fillHubRequest.Data[3] = m_UserSelectedPlayerEndDateTime;
                        fillHubRequest.Data[4] = Log;
                        m_AuditTrailFillHub.HubEventEnqueue(fillHubRequest);
                    }
                    else
                    {
                        Log.NewEntry(LogLevel.Major, "The user does not have a audit trail player.");
                        return;
                    }
                }
                else
                {
                    Log.NewEntry(LogLevel.Major, "The user does not give a start recovery date time. The date time in the code is now {0}.", m_UserSelectedRecoveryDropFileDateTime);
                    return;
                }
            }
        }//buttonRecoveryStart_Click()
        }//EndPlayingDateTime_ValueChanged()

        //
        //
        /// <summary>
        /// Wait the books created in the audit trail fill hub.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void WaitBooksCreated(object sender, EventArgs eventArgs)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new EventHandler(WaitBooksCreated), new object[] { sender, eventArgs });
            }
            else
            {
                //// Playing the fills from the audit trail file.
                // Check whether the end date time is larger than the start date time.
                if (m_UserSelectedPlayerEndDateTime < m_UserSelectedRecoveryDropFileDateTime)
                {
                    Log.NewEntry(LogLevel.Major, "The end player date time is smaller than the start recovery date time.");
                    return;
                }

                // Start to play the audit trail player.
                if (m_AuditTrailPlayer != null)
                {
                    m_AuditTrailFillHub.BooksCreated -= new EventHandler(WaitBooksCreated);
                    AuditTrailEventArgs fillHubRequestPlay = new AuditTrailEventArgs();
                    fillHubRequestPlay.auditTrailEventType = AuditTrailEventType.PlayAuditTrailFills;
                    fillHubRequestPlay.Data    = new object[5];
                    fillHubRequestPlay.Data[0] = m_AuditTrailPlayer;
                    fillHubRequestPlay.Data[1] = m_AuditTrailFillHub;
                    fillHubRequestPlay.Data[2] = m_UserSelectedRecoveryDropFileDateTime;
                    fillHubRequestPlay.Data[3] = m_UserSelectedPlayerEndDateTime;
                    fillHubRequestPlay.Data[4] = Log;
                    m_AuditTrailFillHub.HubEventEnqueue(fillHubRequestPlay);
                }
                else
                {
                    Log.NewEntry(LogLevel.Major, "The user does not have a audit trail player.");
                    return;
                }
            }
        }//WaitBooksCreated()
        }//buttonLoadDropFile_Click()

        /// <summary>
        /// This method will load all the fills from audit trail files and potentially create books that are not in the drop files.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonLoadAuditTrailFills_Click(object sender, EventArgs e)
        {
            if (sender == this.buttonLoadAuditTrailFills)
            {
                // Load fills from the audit trail and prepare books.
                Log.NewEntry(LogLevel.Minor, "The button of load audit trail fills is clicked by user.");

                DateTime minDateTime = new DateTime(2000, 1, 1);
                if (m_UserSelectedRecoveryDropFileDateTime > minDateTime)
                {
                    // Check whether the end date time is larger than the start date time.
                    if (m_UserSelectedPlayerEndDateTime < m_UserSelectedRecoveryDropFileDateTime)
                    {
                        Log.NewEntry(LogLevel.Major, "The end player date time is smaller than the start recovery date time.");
                        return;
                    }

                    // Start the listener in this fill hub.
                    m_AuditTrailPlayer = new AuditTrailPlayer(m_AuditTrailFilePath, m_UserName, m_FillHubOrFillManagerName, Log);
                    AuditTrailEventArgs fillHubRequest = new AuditTrailEventArgs();
                    fillHubRequest.auditTrailEventType = AuditTrailEventType.LoadAuditTrailFills;
                    fillHubRequest.Data    = new object[5];
                    fillHubRequest.Data[0] = m_AuditTrailPlayer;
                    fillHubRequest.Data[1] = m_AuditTrailFillHub;
                    fillHubRequest.Data[2] = m_UserSelectedRecoveryDropFileDateTime;
                    fillHubRequest.Data[3] = m_UserSelectedPlayerEndDateTime;
                    fillHubRequest.Data[4] = Log;
                    m_AuditTrailFillHub.HubEventEnqueue(fillHubRequest);
                }
                else
                {
                    Log.NewEntry(LogLevel.Major, "The user does not give a start recovery date time. The date time in the code is now {0}.", m_UserSelectedRecoveryDropFileDateTime);
                    return;
                }
            }
        }//buttonLoadAuditTrailFills_Click()
        }//TTAPIService_ServiceStateChanged()

        /// <summary>
        /// Start all the processes automatically to recover the positions for user.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonRecover_Click(object sender, EventArgs e)
        {
            if (sender == buttonRecover)
            {
                Log.NewEntry(LogLevel.Minor, "The button of recovering positions is clicked by user.");
                DateTime minDateTime = new DateTime(2000, 1, 1);
                if (m_UserSelectedRecoveryDropFileDateTime <= minDateTime)
                {
                    Log.NewEntry(LogLevel.Major, "The user does not give a start recovery date time. The date time in the code is now {0}.", m_UserSelectedRecoveryDropFileDateTime);
                    return;
                }
                else
                {
                    Log.NewEntry(LogLevel.Minor, "The user has chosen a drop file recovery date time of {0}.", m_UserSelectedRecoveryDropFileDateTime);

                    // Check if the user name or fill hub name is empty or null.
                    m_UserName = textBoxUserName.Text;
                    m_FillHubOrFillManagerName = textBoxFillHubName.Text;
                    if (string.IsNullOrEmpty(m_UserName) || string.IsNullOrEmpty(m_FillHubOrFillManagerName))
                    {
                        Log.NewEntry(LogLevel.Major, "There are no user name or fill hub name.");
                        return;
                    }

                    // Clear the previous audit trail fill hub.
                    if (m_AuditTrailFillHub != null)
                    {
                        m_AuditTrailFillHub.RequestStop();
                    }

                    if (m_DropFilePlayer.TryPlayDropFileForOneFillHub(m_UserName, m_FillHubOrFillManagerName, m_UserSelectedRecoveryDropFileDateTime, out m_AuditTrailFillHub))
                    {
                        // Create the books on the fill hub page and start.
                        m_UserSelectedRecoveryDropFileDateTime = m_DropFilePlayer.SelectedDropDateTime;
                        DropFileStartDateTime.Value            = m_UserSelectedRecoveryDropFileDateTime;
                        m_AuditTrailFillHub.Start();

                        // Try to get the final state of the fill hub.
                        if (m_FillHubPage != null)
                        {
                            m_FillHubPage.Shutdown();
                        }
                        m_FillHubPage = new FillHubPage();
                        m_FillHubPage.AddHub(m_AuditTrailFillHub);

                        // Display the fill hub page onto the GUI.
                        tabControlFillPageViewer.TabPages.Clear();
                        tabControlFillPageViewer.TabPages.Add(m_FillHubPage);
                        m_AuditTrailFillHub.CreateBooksStatic(m_MarketTTAPIService);
                        Log.NewEntry(LogLevel.Minor, "Successful in reading the drop file.");
                    }
                    else
                    {
                        Log.NewEntry(LogLevel.Major, "Failed to read the drop file.");
                        return;
                    }

                    //// Load fills from the audit trail and prepare books.
                    // Check whether the end date time is larger than the start date time.
                    if (m_UserSelectedPlayerEndDateTime < m_UserSelectedRecoveryDropFileDateTime)
                    {
                        Log.NewEntry(LogLevel.Major, "The end player date time is smaller than the start recovery date time.");
                        return;
                    }

                    // Start the listener in this fill hub.
                    m_AuditTrailPlayer = new AuditTrailPlayer(m_AuditTrailFilePath, m_UserName, m_FillHubOrFillManagerName, Log);
                    AuditTrailEventArgs fillHubRequestLoad = new AuditTrailEventArgs();
                    fillHubRequestLoad.auditTrailEventType = AuditTrailEventType.LoadAuditTrailFills;
                    fillHubRequestLoad.Data           = new object[5];
                    fillHubRequestLoad.Data[0]        = m_AuditTrailPlayer;
                    fillHubRequestLoad.Data[1]        = m_AuditTrailFillHub;
                    fillHubRequestLoad.Data[2]        = m_UserSelectedRecoveryDropFileDateTime;
                    fillHubRequestLoad.Data[3]        = m_UserSelectedPlayerEndDateTime;
                    fillHubRequestLoad.Data[4]        = Log;
                    m_AuditTrailFillHub.BooksCreated += new EventHandler(WaitBooksCreated);
                    m_AuditTrailFillHub.HubEventEnqueue(fillHubRequestLoad);
                } //DateTime_Check()
            }
        }         //buttonRecover_Click()