we47126
asked on
Tapi
I'm building a Tapi application.
When a call comes in, tapi sends a message to the application (a line_callState message). How do i know when tapi sent such a message ? Is there a procedure started at that time ?
When a call comes in, tapi sends a message to the application (a line_callState message). How do i know when tapi sent such a message ? Is there a procedure started at that time ?
ASKER
First of all I should have mentioned that I'm using Borland c++ 5 and not visual C (the example was for visual c)
Second, is is an example to make a call. I still don't know haw to receive a call or recognise the button the caller pressed.
Second, is is an example to make a call. I still don't know haw to receive a call or recognise the button the caller pressed.
ASKER
Edited text of question
ASKER
Adjusted points to 80
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Why isn't mthis working :
...
lReturn = lineInitialize(&hLineApp, hInstance, lineCallbackFunc,
szAppName, &dwNumDevs)
...
lReturn = lineOpen(hLineApp, 0,&hLine, dwApiVersion, 0,0,LINECALLPRIVILEGE_MONI TOR,0,0);
...
void CALLBACK lineCallbackFunc(
DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance,
DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{
cout << "A message is received !";
... }
And how can I make my program wait for a call ? If it does nothing it just closes !
...
lReturn = lineInitialize(&hLineApp, hInstance, lineCallbackFunc,
szAppName, &dwNumDevs)
...
lReturn = lineOpen(hLineApp, 0,&hLine, dwApiVersion, 0,0,LINECALLPRIVILEGE_MONI
...
void CALLBACK lineCallbackFunc(
DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance,
DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{
cout << "A message is received !";
... }
And how can I make my program wait for a call ? If it does nothing it just closes !
This is how I do it.
Works with BC4.53 and BC5.01.
bool TTapi::Start( LPCSTR appName )
{
.
. Declare variables
.
if ( ( _lpfnLineCallback = (LINECALLBACK) MakeProcInstance( (FARPROC) lineCallbackFunc, hInst() ) ) == NULL )
{
return( false );
}
lRet = lineInitialize( &_hLineApp, hInst(), _lpfnLineCallback, appName, _dwNumDevs );
if ( lRet < 0 )
{
return( false );
}
lineRegisterRequestRecipie nt( hLineApp(), (DWORD)this, LINEREQUESTMODE_MAKECALL, true );
// fill lineCapsList with LineCaps object
for ( dwDeviceId = 0; dwDeviceId < _dwNumDevs; dwDeviceId++ )
{
TRACE("LineDevice = " << dwDeviceId );
LONG lRet;
HLINE hLine;
DWORD dwEXTVersion = 0;
LINEEXTENSIONID extensionID;
bool mdExt, claraExt, maryExt;
TRACE("lineNegotiateAPIVer sion");
lRet = lineNegotiateAPIVersion( _hLineApp, dwDeviceId, SupportAPILowVersion(), SupportAPIHighVersion(), _dwAPIVersion, &extensionID );
if ( lRet < 0 )
{
return( false );
}
mdExt = isMD110Ext( extensionID );
claraExt = isClaraExt( extensionID );
maryExt = isMaryExt( extensionID );
if ( mdExt || claraExt || maryExt )
{
lRet = lineNegotiateExtVersion( _hLineApp, dwDeviceId, _dwAPIVersion, SupportExtLowVersion(), SupportExtHighVersion(), &dwEXTVersion );
if ( lRet < 0 )
{
dwEXTVersion = 0;
return( false );
}
}
else
{
dwEXTVersion = 0;
}
if ( mdExt || claraExt )
{
lRet = lineOpen( _hLineApp, dwDeviceId, (LPHLINE) &hLine, _dwAPIVersion, dwEXTVersion, (DWORD) this, LINECALLPRIVILEGE_MONITOR | LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_INTERACTIVEV OICE, 0 );
}
else
{
lRet = lineOpen( _hLineApp, dwDeviceId, (LPHLINE) &hLine, _dwAPIVersion, 0, (DWORD) this, LINECALLPRIVILEGE_MONITOR | LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_INTERACTIVEV OICE, 0 );
if ( lRet < 0 )
{
TRACE("First lineOpen failed with error = " << lRet );
// Unimodem can not open line with owner priviliege
lRet = lineOpen( _hLineApp, dwDeviceId, (LPHLINE) &hLine, _dwAPIVersion, 0, (DWORD) this, LINECALLPRIVILEGE_MONITOR, LINEMEDIAMODE_INTERACTIVEV OICE, 0 );
}
if ( lRet < 0 )
{
TRACE( "Second lineOpen failed with error = " << lRet );
continue; // just skip this line device, it's not voice
}
}
if ( lRet < 0 )
{
return( false );
}
// fill lineList with LineDev object
LineDevice::LineTypeEnum lineType = mdExt ? LineDevice::ltMD110 : claraExt ? LineDevice::ltClaraBGS : maryExt ? LineDevice::ltMary :LineDevice::ltUnknown;
LineDevice * pLineDevice;
if ( lineType == LineDevice::ltMary )
{
pLineDevice = new LineDeviceMary( hLine, dwDeviceId, _dwAPIVersion, dwEXTVersion, extensionID, lineType );
}
pLineDevice = new LineDevice( hLine, dwDeviceId, _dwAPIVersion, dwEXTVersion, extensionID, lineType );
// get line device capabilities
LineCaps lineCaps( _hLineApp, pLineDevice );
lineCaps.capability();
if ( mdExt || claraExt )
{
SwitchInfo( lineCaps.switchInfo() );
getMsgDivTextStrings( lineCaps );
}
pLineDevice->SetLineName( lineCaps.lineName() );
pLineDevice->SetPPId( lineCaps.PPId() );
lineList().AddAtTail( pLineDevice );
if ( pLineDevice->GetLineType() == LineDevice::ltMD110 )
{
LineDevice::SetMD110Line( pLineDevice );
StrStream str;
IniFile ini( IniFileTelephone );
DWORD dw = lineCaps.PPId() >> 16;
str << "Provider" << dw << ends;
setDefaultTimeout( ini.read( str.str(), EntryTimeoutASYNC, (unsigned int) 5000 ) );
}
if ( pLineDevice->GetLineType() == LineDevice::ltClaraBGS )
{
LineDevice::SetClaraLine( pLineDevice );
}
TRACE("Before if ( !FillAddresses( pLineDevice, &lineCaps ) )");
if ( !FillAddresses( pLineDevice, &lineCaps ) )
{
return( false );
}
lineSetStatusMessages( hLine,
LINEDEVSTATE_OTHER |
LINEDEVSTATE_RINGING |
LINEDEVSTATE_CONNECTED |
LINEDEVSTATE_DISCONNECTED |
LINEDEVSTATE_MSGWAITON |
LINEDEVSTATE_MSGWAITOFF |
LINEDEVSTATE_INSERVICE |
LINEDEVSTATE_OUTOFSERVICE |
LINEDEVSTATE_MAINTENANCE |
LINEDEVSTATE_OPEN |
LINEDEVSTATE_CLOSE |
LINEDEVSTATE_NUMCALLS |
LINEDEVSTATE_NUMCOMPLETION S |
LINEDEVSTATE_TERMINALS |
LINEDEVSTATE_ROAMMODE |
LINEDEVSTATE_BATTERY |
LINEDEVSTATE_SIGNAL |
LINEDEVSTATE_DEVSPECIFIC |
LINEDEVSTATE_REINIT |
LINEDEVSTATE_LOCK,
LINEADDRESSSTATE_OTHER |
LINEADDRESSSTATE_DEVSPECIF IC |
LINEADDRESSSTATE_INUSEZERO |
LINEADDRESSSTATE_INUSEONE |
LINEADDRESSSTATE_INUSEMANY |
LINEADDRESSSTATE_NUMCALLS |
LINEADDRESSSTATE_FORWARD |
LINEADDRESSSTATE_TERMINALS );
checkLineStatus( pLineDevice );
}
_killTimer = new KillOCTimer( this, 500 );
return true;
}
Works with BC4.53 and BC5.01.
bool TTapi::Start( LPCSTR appName )
{
.
. Declare variables
.
if ( ( _lpfnLineCallback = (LINECALLBACK) MakeProcInstance( (FARPROC) lineCallbackFunc, hInst() ) ) == NULL )
{
return( false );
}
lRet = lineInitialize( &_hLineApp, hInst(), _lpfnLineCallback, appName, _dwNumDevs );
if ( lRet < 0 )
{
return( false );
}
lineRegisterRequestRecipie
// fill lineCapsList with LineCaps object
for ( dwDeviceId = 0; dwDeviceId < _dwNumDevs; dwDeviceId++ )
{
TRACE("LineDevice = " << dwDeviceId );
LONG lRet;
HLINE hLine;
DWORD dwEXTVersion = 0;
LINEEXTENSIONID extensionID;
bool mdExt, claraExt, maryExt;
TRACE("lineNegotiateAPIVer
lRet = lineNegotiateAPIVersion( _hLineApp, dwDeviceId, SupportAPILowVersion(), SupportAPIHighVersion(), _dwAPIVersion, &extensionID );
if ( lRet < 0 )
{
return( false );
}
mdExt = isMD110Ext( extensionID );
claraExt = isClaraExt( extensionID );
maryExt = isMaryExt( extensionID );
if ( mdExt || claraExt || maryExt )
{
lRet = lineNegotiateExtVersion( _hLineApp, dwDeviceId, _dwAPIVersion, SupportExtLowVersion(), SupportExtHighVersion(), &dwEXTVersion );
if ( lRet < 0 )
{
dwEXTVersion = 0;
return( false );
}
}
else
{
dwEXTVersion = 0;
}
if ( mdExt || claraExt )
{
lRet = lineOpen( _hLineApp, dwDeviceId, (LPHLINE) &hLine, _dwAPIVersion, dwEXTVersion, (DWORD) this, LINECALLPRIVILEGE_MONITOR | LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_INTERACTIVEV
}
else
{
lRet = lineOpen( _hLineApp, dwDeviceId, (LPHLINE) &hLine, _dwAPIVersion, 0, (DWORD) this, LINECALLPRIVILEGE_MONITOR | LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_INTERACTIVEV
if ( lRet < 0 )
{
TRACE("First lineOpen failed with error = " << lRet );
// Unimodem can not open line with owner priviliege
lRet = lineOpen( _hLineApp, dwDeviceId, (LPHLINE) &hLine, _dwAPIVersion, 0, (DWORD) this, LINECALLPRIVILEGE_MONITOR,
}
if ( lRet < 0 )
{
TRACE( "Second lineOpen failed with error = " << lRet );
continue; // just skip this line device, it's not voice
}
}
if ( lRet < 0 )
{
return( false );
}
// fill lineList with LineDev object
LineDevice::LineTypeEnum lineType = mdExt ? LineDevice::ltMD110 : claraExt ? LineDevice::ltClaraBGS : maryExt ? LineDevice::ltMary :LineDevice::ltUnknown;
LineDevice * pLineDevice;
if ( lineType == LineDevice::ltMary )
{
pLineDevice = new LineDeviceMary( hLine, dwDeviceId, _dwAPIVersion, dwEXTVersion, extensionID, lineType );
}
pLineDevice = new LineDevice( hLine, dwDeviceId, _dwAPIVersion, dwEXTVersion, extensionID, lineType );
// get line device capabilities
LineCaps lineCaps( _hLineApp, pLineDevice );
lineCaps.capability();
if ( mdExt || claraExt )
{
SwitchInfo( lineCaps.switchInfo() );
getMsgDivTextStrings( lineCaps );
}
pLineDevice->SetLineName( lineCaps.lineName() );
pLineDevice->SetPPId( lineCaps.PPId() );
lineList().AddAtTail( pLineDevice );
if ( pLineDevice->GetLineType()
{
LineDevice::SetMD110Line( pLineDevice );
StrStream str;
IniFile ini( IniFileTelephone );
DWORD dw = lineCaps.PPId() >> 16;
str << "Provider" << dw << ends;
setDefaultTimeout( ini.read( str.str(), EntryTimeoutASYNC, (unsigned int) 5000 ) );
}
if ( pLineDevice->GetLineType()
{
LineDevice::SetClaraLine( pLineDevice );
}
TRACE("Before if ( !FillAddresses( pLineDevice, &lineCaps ) )");
if ( !FillAddresses( pLineDevice, &lineCaps ) )
{
return( false );
}
lineSetStatusMessages( hLine,
LINEDEVSTATE_OTHER |
LINEDEVSTATE_RINGING |
LINEDEVSTATE_CONNECTED |
LINEDEVSTATE_DISCONNECTED |
LINEDEVSTATE_MSGWAITON |
LINEDEVSTATE_MSGWAITOFF |
LINEDEVSTATE_INSERVICE |
LINEDEVSTATE_OUTOFSERVICE |
LINEDEVSTATE_MAINTENANCE |
LINEDEVSTATE_OPEN |
LINEDEVSTATE_CLOSE |
LINEDEVSTATE_NUMCALLS |
LINEDEVSTATE_NUMCOMPLETION
LINEDEVSTATE_TERMINALS |
LINEDEVSTATE_ROAMMODE |
LINEDEVSTATE_BATTERY |
LINEDEVSTATE_SIGNAL |
LINEDEVSTATE_DEVSPECIFIC |
LINEDEVSTATE_REINIT |
LINEDEVSTATE_LOCK,
LINEADDRESSSTATE_OTHER |
LINEADDRESSSTATE_DEVSPECIF
LINEADDRESSSTATE_INUSEZERO
LINEADDRESSSTATE_INUSEONE |
LINEADDRESSSTATE_INUSEMANY
LINEADDRESSSTATE_NUMCALLS |
LINEADDRESSSTATE_FORWARD |
LINEADDRESSSTATE_TERMINALS
checkLineStatus( pLineDevice );
}
_killTimer = new KillOCTimer( this, 500 );
return true;
}
http://www.microsoft.com/WIN32DEV/NETWRK/CTA2669B.ZIP
The example creates the CTapiConnection class. It provides an easy way to initialize TAPI, connect, and make a voice-based telephone call.