📄 simpletapi.cpp
字号:
//
// Note that when the call is dropped I call
// TAPI to free up the m_hCall handle that was
// associated with this call way back when it
// was first initiated.
//
if ( tapi->m_hCall ) {
HCALL temp_hcall = tapi->m_hCall;
tapi->m_hCall = 0;
tapi->DisconnectedEvent();
m_Trace << "Call was dropped\n";
lineDeallocateCall( temp_hcall );
tapi->m_bCallHandleValid = 0;
if ( tapi->m_ReplyAction == HANDLE_DROP_RESULT ) { //hack, I never see it o/w
tapi->HandleDropResult( 0 );
tapi->m_ReplyAction = NOTHING;
}
}
break;
//
// In SimpleTapi, we will always answer an
// incoming call that is being offered if the
// line is open. So if you don't want to answer
// an incoming call, don't open the line. Note
// that this creates the m_hCall handle, which
// will be used for the duration of the call.
// The call to lineAnswer() will almost always
// be given asynchronously, with a result code
// of > 0.
//
case LINECALLSTATE_OFFERING :
{
tapi->m_hCall = (HCALL) hDevice;
LONG result = lineAnswer( tapi->m_hCall, NULL, 0 );
if ( result < 0 ) {
tapi->Error( "Error returned from lineAnswer : ", result );
} else if ( result == 0 ) {
m_Trace << "lineAnswer returned : "
<< result
<< "\n";
tapi->HandleAnswerResult( 0 );
} else {
tapi->m_ReplyAction = HANDLE_ANSWER_RESULT;
tapi->m_dwPendingReplyCode = result;
}
}
break;
}
tapi->m_lCallState = dwParam1;
}
}
//
// This static member function simply transates one of the
// seemingly infinite TAPI error status codes to a string.
// This makes the trace information easier to read.
//
string SimpleTapi::TranslateTapiError( LONG code )
{
switch (code ) {
case LINEERR_ALLOCATED :
return "LINEERR_ALLOCATED";
case LINEERR_BADDEVICEID :
return "LINEERR_BADDEVICEID";
case LINEERR_BEARERMODEUNAVAIL:
return "LINEERR_BEARERMODEUNAVAIL";
case LINEERR_CALLUNAVAIL:
return "LINEERR_CALLUNAVAIL";
case LINEERR_COMPLETIONOVERRUN:
return "LINEERR_COMPLETIONOVERRUN";
case LINEERR_CONFERENCEFULL:
return "LINEERR_CONFERENCEFULL";
case LINEERR_DIALBILLING:
return "LINEERR_DIALBILLING";
case LINEERR_DIALDIALTONE:
return "LINEERR_DIALDIALTONE";
case LINEERR_DIALPROMPT:
return "LINEERR_DIALPROMPT";
case LINEERR_DIALQUIET:
return "LINEERR_DIALQUIET";
case LINEERR_INCOMPATIBLEAPIVERSION:
return "LINEERR_INCOMPATIBLEAPIVERSION";
case LINEERR_INCOMPATIBLEEXTVERSION:
return "LINEERR_INCOMPATIBLEEXTVERSION";
case LINEERR_INIFILECORRUPT:
return "LINEERR_INIFILECORRUPT";
case LINEERR_INUSE:
return "LINEERR_INUSE";
case LINEERR_INVALADDRESS:
return "LINEERR_INVALADDRESS";
case LINEERR_INVALADDRESSID:
return "LINEERR_INVALADDRESSID";
case LINEERR_INVALADDRESSMODE:
return "LINEERR_INVALADDRESSMODE";
case LINEERR_INVALADDRESSSTATE:
return "LINEERR_INVALADDRESSSTATE";
case LINEERR_INVALAPPHANDLE:
return "LINEERR_INVALAPPHANDLE";
case LINEERR_INVALAPPNAME:
return "LINEERR_INVALAPPNAME";
case LINEERR_INVALBEARERMODE:
return "LINEERR_INVALBEARERMODE";
case LINEERR_INVALCALLCOMPLMODE:
return "LINEERR_INVALCALLCOMPLMODE";
case LINEERR_INVALCALLHANDLE:
return "LINEERR_INVALCALLHANDLE";
case LINEERR_INVALCALLPARAMS:
return "LINEERR_INVALCALLPARAMS";
case LINEERR_INVALCALLPRIVILEGE:
return "LINEERR_INVALCALLPRIVILEGE";
case LINEERR_INVALCALLSELECT:
return "LINEERR_INVALCALLSELECT";
case LINEERR_INVALCALLSTATE:
return "LINEERR_INVALCALLSTATE";
case LINEERR_INVALCALLSTATELIST:
return "LINEERR_INVALCALLSTATELIST";
case LINEERR_INVALCARD:
return "LINEERR_INVALCARD";
case LINEERR_INVALCOMPLETIONID:
return "LINEERR_INVALCOMPLETIONID";
case LINEERR_INVALCONFCALLHANDLE:
return "LINEERR_INVALCONFCALLHANDLE";
case LINEERR_INVALCONSULTCALLHANDLE:
return "LINEERR_INVALCONSULTCALLHANDLE";
case LINEERR_INVALCOUNTRYCODE:
return "LINEERR_INVALCOUNTRYCODE";
case LINEERR_INVALDEVICECLASS:
return "LINEERR_INVALDEVICECLASS";
case LINEERR_INVALDEVICEHANDLE:
return "LINEERR_INVALDEVICEHANDLE";
case LINEERR_INVALDIALPARAMS:
return "LINEERR_INVALDIALPARAMS";
case LINEERR_INVALDIGITLIST:
return "LINEERR_INVALDIGITLIST";
case LINEERR_INVALDIGITMODE:
return "LINEERR_INVALDIGITMODE";
case LINEERR_INVALDIGITS:
return "LINEERR_INVALDIGITS";
case LINEERR_INVALEXTVERSION:
return "LINEERR_INVALEXTVERSION";
case LINEERR_INVALGROUPID:
return "LINEERR_INVALGROUPID";
case LINEERR_INVALLINEHANDLE:
return "LINEERR_INVALLINEHANDLE";
case LINEERR_INVALLINESTATE:
return "LINEERR_INVALLINESTATE";
case LINEERR_INVALLOCATION:
return "LINEERR_INVALLOCATION";
case LINEERR_INVALMEDIALIST:
return "LINEERR_INVALMEDIALIST";
case LINEERR_INVALMEDIAMODE:
return "LINEERR_INVALMEDIAMODE";
case LINEERR_INVALMESSAGEID:
return "LINEERR_INVALMESSAGEID";
case LINEERR_INVALPARAM:
return "LINEERR_INVALPARAM";
case LINEERR_INVALPARKID:
return "LINEERR_INVALPARKID";
case LINEERR_INVALPARKMODE:
return "LINEERR_INVALPARKMODE";
case LINEERR_INVALPOINTER:
return "LINEERR_INVALPOINTER";
case LINEERR_INVALPRIVSELECT:
return "LINEERR_INVALPRIVSELECT";
case LINEERR_INVALRATE:
return "LINEERR_INVALRATE";
case LINEERR_INVALREQUESTMODE:
return "LINEERR_INVALREQUESTMODE";
case LINEERR_INVALTERMINALID:
return "LINEERR_INVALTERMINALID";
case LINEERR_INVALTERMINALMODE:
return "LINEERR_INVALTERMINALMODE";
case LINEERR_INVALTIMEOUT:
return "LINEERR_INVALTIMEOUT";
case LINEERR_INVALTONE:
return "LINEERR_INVALTONE";
case LINEERR_INVALTONELIST:
return "LINEERR_INVALTONELIST";
case LINEERR_INVALTONEMODE:
return "LINEERR_INVALTONEMODE";
case LINEERR_INVALTRANSFERMODE:
return "LINEERR_INVALTRANSFERMODE";
case LINEERR_LINEMAPPERFAILED:
return "LINEERR_LINEMAPPERFAILED";
case LINEERR_NOCONFERENCE:
return "LINEERR_NOCONFERENCE";
case LINEERR_NODEVICE:
return "LINEERR_NODEVICE";
case LINEERR_NODRIVER:
return "LINEERR_NODRIVER";
case LINEERR_NOMEM:
return "LINEERR_NOMEM";
case LINEERR_NOREQUEST:
return "LINEERR_NOREQUEST";
case LINEERR_NOTOWNER:
return "LINEERR_NOTOWNER";
case LINEERR_NOTREGISTERED:
return "LINEERR_NOTREGISTERED";
case LINEERR_OPERATIONFAILED:
return "LINEERR_OPERATIONFAILED";
case LINEERR_OPERATIONUNAVAIL:
return "LINEERR_OPERATIONUNAVAIL";
case LINEERR_RATEUNAVAIL:
return "LINEERR_RATEUNAVAIL";
case LINEERR_RESOURCEUNAVAIL:
return "LINEERR_RESOURCEUNAVAIL";
case LINEERR_REQUESTOVERRUN:
return "LINEERR_REQUESTOVERRUN";
case LINEERR_STRUCTURETOOSMALL:
return "LINEERR_STRUCTURETOOSMALL";
case LINEERR_TARGETNOTFOUND:
return "LINEERR_TARGETNOTFOUND";
case LINEERR_TARGETSELF:
return "LINEERR_TARGETSELF";
case LINEERR_UNINITIALIZED:
return "LINEERR_UNINITIALIZED";
case LINEERR_USERUSERINFOTOOBIG:
return "LINEERR_USERUSERINFOTOOBIG";
case LINEERR_REINIT:
return "LINEERR_REINIT";
case LINEERR_ADDRESSBLOCKED:
return "LINEERR_ADDRESSBLOCKED";
case LINEERR_BILLINGREJECTED:
return "LINEERR_BILLINGREJECTED";
case LINEERR_INVALFEATURE:
return "LINEERR_INVALFEATURE";
case LINEERR_NOMULTIPLEINSTANCE:
return "LINEERR_NOMULTIPLEINSTANCE";
}
char buf[ 128 ];
wsprintf( buf, "Unknown error code: %08lx", code );
return buf;
}
//
// This static member function simply transates one of the
// TAPI call state codes to a string. This makes the trace
// information easier to read.
//
string SimpleTapi::TranslateCallState( LONG state )
{
switch ( state ) {
case LINECALLSTATE_IDLE:
return "LINECALLSTATE_IDLE";
case LINECALLSTATE_OFFERING:
return "LINECALLSTATE_OFFERING";
case LINECALLSTATE_ACCEPTED:
return "LINECALLSTATE_ACCEPTED";
case LINECALLSTATE_DIALTONE:
return "LINECALLSTATE_DIALTONE";
case LINECALLSTATE_DIALING:
return "LINECALLSTATE_DIALING";
case LINECALLSTATE_RINGBACK:
return "LINECALLSTATE_RINGBACK";
case LINECALLSTATE_BUSY:
return "LINECALLSTATE_BUSY";
case LINECALLSTATE_SPECIALINFO:
return "LINECALLSTATE_SPECIALINFO";
case LINECALLSTATE_CONNECTED:
return "LINECALLSTATE_CONNECTED";
case LINECALLSTATE_PROCEEDING:
return "LINECALLSTATE_PROCEEDING";
case LINECALLSTATE_ONHOLD:
return "LINECALLSTATE_ONHOLD";
case LINECALLSTATE_CONFERENCED:
return "LINECALLSTATE_CONFERENCED";
case LINECALLSTATE_ONHOLDPENDCONF:
return "LINECALLSTATE_ONHOLDPENDCONF";
case LINECALLSTATE_ONHOLDPENDTRANSFER:
return "LINECALLSTATE_ONHOLDPENDTRANSFER";
case LINECALLSTATE_DISCONNECTED:
return "LINECALLSTATE_DISCONNECTED";
case LINECALLSTATE_UNKNOWN:
return "LINECALLSTATE_UNKNOWN";
case -1:
return "";
}
char buf[ 128 ];
wsprintf( buf, "Unknown call state: %08lx", state );
return buf;
}
//
// TAPI is kind enough to provide a thorough configuration
// dialog for the devices it supports, relieving programmers
// of the horrible prospect of writing customized dialogs
// for any device a user might care to employ. All we have
// to do to invoke this ID is to come up with a device ID
// number and a parent window handle.
//
void SimpleTapi::ConfigureDevice( int index )
{
int dev_id = m_Devices[ index ].m_iDeviceNumber;
LONG result = lineConfigDialog( dev_id,
GetWindow(),
"comm/datamodem" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -