capisuite/src/modules/calloutgoing.cpp

109 lines
3.4 KiB
C++

/* @file calloutgoing.cpp
@brief Contains CallOutgoingModule - Call Module for establishment of an outgoing connection and wait for successful connect
@author Gernot Hillier <gernot@hillier.de>
$Revision: 1.4 $
*/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "calloutgoing.h"
CallOutgoing::CallOutgoing(Capi *capi, _cdword controller, string call_from, string call_to, Connection::service_t service, int timeout, string faxStationID, string faxHeadline, bool clir)
:CallModule(NULL,-1,false,false),capi(capi),controller(controller)
,call_from(call_from),call_to(call_to),service(service),
faxStationID(faxStationID),faxHeadline(faxHeadline),clir(clir)
,saved_timeout(timeout)
{}
void
CallOutgoing::mainLoop() throw (CapiExternalError, CapiMsgError)
{
conn=new Connection(capi,controller,call_from,clir,call_to,service,faxStationID,faxHeadline);
conn->registerCallInterface(this);
// first, we have no timeout, timeout is activated in alerting()!
CallModule::mainLoop();
if (conn->getState()==Connection::UP)
result=0;
else if (finish) { // error during connection setup
result=conn->getCause();
if (!result)
result=2; // no reason available
} else { // timeout exceeded
result=1;
conn->disconnectCall();
timespec delay_time;
delay_time.tv_sec=0; delay_time.tv_nsec=100000000; // 100 msec
while(conn->getState()!=Connection::DOWN)
nanosleep(&delay_time,NULL);
}
}
void
CallOutgoing::callConnected()
{
finish=true;
}
void
CallOutgoing::alerting()
{
// now activate the timeout!
resetTimer(saved_timeout);
}
Connection*
CallOutgoing::getConnection()
{
return conn;
}
int
CallOutgoing::getResult()
{
return result;
}
/* History
Old Log (for new changes see ChangeLog):
Revision 1.3 2003/10/03 14:56:40 gernot
- partly implementation of a bigger semantic change: don't throw
call finished exceptions in normal operation any longer; i.e. we only
test for the connection at the begin of a command. This allows return
values, e.g. for commands like capisuite.fax_receive() which were
interrupted by an exception always in former CapiSuite versions and thus
never returned. This is also a better and more logical use of exceptions
IMO. ATTN: this is *far from stable*
Revision 1.2 2003/04/17 10:52:12 gernot
- timeout value is now measured beginning at the moment the other party is
signalled
Revision 1.1.1.1 2003/02/19 08:19:53 gernot
initial checkin of 0.4
Revision 1.3 2002/12/06 13:10:34 ghillie
- corrected some wrong semantics, don't throw CapiWrongState any more
- added waiting for disconnection after timeout
- added result value for reason of abortion or success (getResult() added)
- always return Connection object, don't delete it in any case
Revision 1.2 2002/12/05 15:55:54 ghillie
- small typo fixed
Revision 1.1 2002/12/05 15:07:44 ghillie
- initial checking
*/