text: /*
   * Legal Notice
   *
   * This document and associated source code (the "Work") is a preliminary
   * version of a benchmark specification being developed by the TPC. The
   * Work is being made available to the public for review and comment only.
   * The TPC reserves all right, title, and interest to the Work as provided
   * under U.S. and international laws, including without limitation all patent
   * and trademark rights therein.
   *
   * No Warranty
   *
   * 1.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE INFORMATION
   *     CONTAINED HEREIN IS PROVIDED "AS IS" AND WITH ALL FAULTS, AND THE
   *     AUTHORS AND DEVELOPERS OF THE WORK HEREBY DISCLAIM ALL OTHER
   *     WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
   *     INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) IMPLIED WARRANTIES,
   *     DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
   *     PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OF
   *     WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF NEGLIGENCE.
   *     ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT,
   *     QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT
   *     WITH REGARD TO THE WORK.
   * 1.2 IN NO EVENT WILL ANY AUTHOR OR DEVELOPER OF THE WORK BE LIABLE TO
   *     ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING BUT NOT LIMITED TO THE
   *     COST OF PROCURING SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS
   *     OF USE, LOSS OF DATA, OR ANY INCIDENTAL, CONSEQUENTIAL, DIRECT,
   *     INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER CONTRACT, TORT, WARRANTY,
   *     OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY OTHER AGREEMENT
   *     RELATING TO THE WORK, WHETHER OR NOT SUCH AUTHOR OR DEVELOPER HAD
   *     ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
   *
   * Contributors
   * - Doug Johnson
   */
  
  /******************************************************************************
  *   Description:        This class provides Market Exchange Emulator
  *                       functionality. It accepts trade requests for processing;
  *                       generates a negative exponential delay for each trade to
  *                       simulate the market processing time; manages the
  *                       timers for all trades being processed; generates
  *                       Trade-Result and Market-Feed input data to be used by a
  *                       sponsor provided callback interface to the SUT (see
  *                       MEESUTInterface.h).
  *
  *                       The constructor for this class requires two parameters.
  *                       - TradingTimeSoFar: the number of seconds for which
  *                       trades have been run against the database. This allows
  *                       the MEE to pick up on the price curves from where it
  *                       last left off. If doing this isn't important than 0 can
  *                       passed in.
  *                       - pSUT: a pointer to an instance of a sponsor provided
  *                       subclassing of the CMEESUTInterface class.
  *
  *                       - pLogger: a pointer to an instance of CEGenLogger or a
  *                       sponsor provided subclassing of the CBaseLogger class.
  *
  *                       The MEE provides the following entry points.
  *
  *                       - SetBaseTime: used to cordinate the price curves
  *                       across multiple instances of this class. This method
  *                       should be called "at the same time" for all instances.
  *                       This call should be made just prior to starting
  *                       transactions. There is no return value.
  *
  *                       - SubmitTradeRequest: used for submitting a trade
  *                       request into the market. The return value is the number
  *                       of milliseconds before the next timer is set to expire.
  *
  *                       - GenerateTradeResult: called whenever the current timer
  *                       has expired (i.e. whenever the number of milliseconds
  *                       returned by either SubmitTradeRequest or
  *                       GenerateTradeResult has elapsed). The return value is
  *                       the number of milliseconds before the next timer is set
  *                       to expire.
  *
  *                       - DisableTickerTape / EnableTickerTape: by default, the
  *                       ticker tape functionality of the MEE is enabled. It can
  *                       be disabled, or re-enabled by calls to these methods.
  *                       Disabling the ticker tape is useful at the end of a
  *                       test run to allow processing of submitted orders to
  *                       continue (Trade-Results) while not generating any
  *                       ticker tape activity (Market-Feeds).
  ******************************************************************************/
  
  #ifndef MEE_H
  #define MEE_H
  
  #include "EGenUtilities_stdafx.h"
  #include "MEETradeRequestActions.h"
  #include "TxnHarnessStructs.h"
  #include "MEEPriceBoard.h"
  #include "MEETickerTape.h"
  #include "MEETradingFloor.h"
  #include "MEESUTInterface.h"
  #include "BaseLogger.h"
  #include "DriverParamSettings.h"
  
  namespace TPCE
  {
  
  class CMEE
  {
  private:
  
      CDriverMEESettings  m_DriverMEESettings;
  
      CMEESUTInterface*   m_pSUT;
      CBaseLogger*        m_pLogger;
      CMEEPriceBoard      m_PriceBoard;
      CMEETickerTape      m_TickerTape;
      CMEETradingFloor    m_TradingFloor;
      CDateTime           m_BaseTime;
      CDateTime           m_CurrentTime;
  
      CSyncLock           m_MEELock;
  
      // Automatically generate unique RNG seeds
      void AutoSetRNGSeeds( UINT32 UniqueId );
  
  public:
      static const INT32  NO_OUTSTANDING_TRADES = CMEETradingFloor::NO_OUTSTANDING_TRADES;
  
      // Constructor - automatic RNG seed generation
      CMEE( INT32 TradingTimeSoFar, CMEESUTInterface *pSUT, CBaseLogger *pLogger, CSecurityFile *pSecurityFile, UINT32 UniqueId );
  
      // Constructor - RNG seed provided
      CMEE( INT32 TradingTimeSoFar, CMEESUTInterface *pSUT, CBaseLogger *pLogger, CSecurityFile *pSecurityFile, UINT32 UniqueId, RNGSEED TickerTapeRNGSeed, RNGSEED TradingFloorRNGSeed );
  
      ~CMEE(void);
  
      RNGSEED GetTickerTapeRNGSeed( void );
      RNGSEED GetTradingFloorRNGSeed( void );
  
      void    SetBaseTime( void );
  
      INT32   SubmitTradeRequest( PTradeRequest pTradeRequest );
      INT32   GenerateTradeResult( void );
  
      bool    EnableTickerTape( void );
      bool    DisableTickerTape( void );
  };
  
  }   // namespace TPCE
  
  #endif //MEE_H
  