Listing 2

#include    "channel.hpp"

// initialize the channel
void CHANNEL::prep(int line)
{
   lineno = line;
   
   // enable events for this line: change in loop
   // current, ring detected, off-hook or on-hook
   // completed. Answer after 1 ring.
   setcst(lineno, C_LC | C_RING | C_OFFH | C_ONH, 1);
   
   // initial state is wait for ring
   begin_func = &CHANNEL::wait_for_ring;
   end_func   = &CHANNEL::wait_complete;
   
   begin_state();
}

// play the message back to the user
int CHANNEL::play()
{
   printf("Playing %s on %d\n", msgname, lineno);
   clrrwb(&rwb);   // clear the read/write block
   
   char fname[13];
   sprintf(fname, "%s%s", msgname, SPEECH_EXT);
   
   // open the handle to be played back, should
   // check against -1 return in production code
   rwb.filehndl = open(fname, 0_RDONLY | 0_BINARY);
   
   // instruct card to cause event if keypad is
   // pressed or loop signal detected
   rwb.maxdtmf = 1;
   rwb.loopsig = 1;
   
   return(xplayf(lineno, PM_NORM, &rwb));
}

// execute the state begin function
int CHANNEL::begin_state()
{
   INTPROC fp = this->begin_func;
   return (this->*fp)();
}

// execute the state end function
void CHANNEL::cmplt_state(int evtcode)
{
   VOIDPROC fp = this->end_func;
   (this->*fp)(evtcode);
}


// End of File