/*
* oper.cpp
* (C) gsd 2001
*/
#include <algorithm>
// #include <sstream> // for standard
#include <strstream> // for g++
#include "oper.h"
using namespace std;
COperMaint::COperMaint( std::istream& is, std::ostream& os)
: m_input_source( is ), m_output_source( os )
{
init();
m_scid = 0;
m_dbid = 0;
m_is_exit = false;
m_sid = getsid();
}
void COperMaint::init()
{
m_commands["REG"] = 1; // Register new user
m_commands["UNREG"] = 2; // Unregister user
m_commands["CALL"] = 3; // Initiate a call
m_commands["DISC"] = 4; // Clear a call
m_commands["LACT"] = 5; // List active calls
m_commands["LREG"] = 6; // List registered users
m_commands["EXIT"] = 7; // Exit
}
void COperMaint::doit()
{
string current_line;
while ( ! m_is_exit && getline( m_input_source, current_line) )
{
if ( parse( current_line) )
execute();
}
}
bool COperMaint::parse( string line)
{
// istringstream is( line);
istrstream is( line.c_str());
string command;
if ( is >> command )
{
// line.erase(0, command.size());
m_arguments = line;
if ( (m_it_current = m_commands.find(command)) == m_commands.end() )
{
cerr << command << ": command not found" << endl;
return false;
}
// return m_it_current != m_commands.end();
return true;
}
else
return false;
}
void COperMaint::execute()
{
switch( m_it_current->second )
{
default: cerr<<"execute error"<< endl; uexit(); break;
case 1: send( m_dbid, m_arguments); break;
case 2: send( m_dbid, m_arguments); break;
case 3: send( m_scid, m_arguments); break;
case 4: send( m_scid, m_arguments); break;
case 5: send( m_scid, m_arguments); break;
case 6: send( m_dbid, m_arguments); break;
case 7: uexit(); break;
}
}
void COperMaint::assign( long scid, long dbid)
{
m_scid = scid;
m_dbid = dbid;
}
void COperMaint::receive( long sender, string message)
{
m_output_source << "OperMaint output from "
<< sender << ", message: "
<< message << endl;
}
void COperMaint::uexit()
{
m_is_exit = true;
cout << "Exiting on user request" << endl;
}