/*
 * Receives structured events containing stock quote information.
 */

#include "Analyst.h"
#include <orbsvcs/Shutdown_Utilities.h>

class Service_Shutdown_Functor : public Shutdown_Functor
{
public:
  Service_Shutdown_Functor (CORBA::ORB_ptr orb)
    : orb_ (CORBA::ORB::_duplicate (orb))
  {
  }

  void operator() (int which_signal)
  {
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("shutting down on signal %d\n"),
                which_signal));
    (void) this->orb_->shutdown ();
  }

private:
  CORBA::ORB_var orb_;
};

void
Analyst::select (const char *bureau)
{
  // Create the constraint expression.
  char constraint[60];
  ACE_OS::strcpy (constraint, ACE_TEXT ("$bureau == \'"));
  ACE_OS::strcat (constraint, bureau);
  ACE_OS::strcat (constraint, ACE_TEXT ("\' and $Priority >= 5"));
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("Constraint: %s\n"), constraint));

  setFilter (ACE_TEXT ("News"), ACE_TEXT ("StockQuote"), constraint);
}

int
main (int argc, char **argv)
{
  try
    {
      // Initialise the ORB instance.
      CORBA::ORB_var orbVar =
        CORBA::ORB_init (argc, argv, ACE_TEXT (""));

      // Cleaning guard.
      Service_Shutdown_Functor killer (orbVar.in ());
      Service_Shutdown kill_contractor (killer);

      // Create the analyst.
      Analyst *pAnalyst = 0;
      ACE_NEW_THROW_EX (pAnalyst,
                        Analyst (orbVar.in ()),
                        CORBA::NO_MEMORY ());
      PortableServer::ServantBase_var holder (pAnalyst);

      // Connect to the event channel and set up the appropriate filter.
      pAnalyst->connectToChannel ();
      pAnalyst->select (ACE_TEXT ("Wall Street"));

      // Wait to receive events.
      ACE_DEBUG ((LM_INFO, ACE_TEXT ("Waiting to receive events\n")));
      orbVar->run ();

      orbVar->destroy ();
    }
  catch (const CORBA::Exception &ex)
    {
      ex._tao_print_exception (ACE_TEXT ("ERROR: Exception in Analyst.cpp:"));
      return 1;
    }

  return 0;
}
