242 lines
7.1 KiB
C++
242 lines
7.1 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
address.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
TAPI Service Provider functions related to manipulating addresses.
|
||
|
|
||
|
TSPI_lineGetAddressCaps
|
||
|
TSPI_lineGetAddressStatus
|
||
|
|
||
|
Author:
|
||
|
Nikhil Bobde (NikhilB)
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
//
|
||
|
// Include files
|
||
|
//
|
||
|
|
||
|
#include "globals.h"
|
||
|
#include "line.h"
|
||
|
|
||
|
|
||
|
//
|
||
|
// TSPI procedures
|
||
|
//
|
||
|
|
||
|
LONG
|
||
|
TSPIAPI
|
||
|
TSPI_lineGetAddressCaps(
|
||
|
DWORD dwDeviceID,
|
||
|
DWORD dwAddressID,
|
||
|
DWORD dwTSPIVersion,
|
||
|
DWORD dwExtVersion,
|
||
|
LPLINEADDRESSCAPS pAddressCaps
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This function queries the specified address on the specified line device
|
||
|
to determine its telephony capabilities.
|
||
|
|
||
|
The line device IDs supported by a particular driver are numbered
|
||
|
sequentially starting at a value set by the TAPI DLL using the
|
||
|
TSPI_lineSetDeviceIDBase function.
|
||
|
|
||
|
The version number supplied has been negotiated by the TAPI DLL using
|
||
|
TSPI_lineNegotiateTSPIVersion.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
dwDeviceID - Specifies the line device containing the address to be
|
||
|
queried.
|
||
|
|
||
|
dwAddressID - Specifies the address on the given line device whose
|
||
|
capabilities are to be queried.
|
||
|
|
||
|
dwTSPIVersion - Specifies the version number of the Telephony SPI to be
|
||
|
used. The high order word contains the major version number; the low
|
||
|
order word contains the minor version number.
|
||
|
|
||
|
dwExtVersion - Specifies the version number of the service
|
||
|
provider-specific extensions to be used. This number can be left
|
||
|
zero if no device specific extensions are to be used. Otherwise,
|
||
|
the high order word contains the major version number; the low
|
||
|
order word contain the minor version number.
|
||
|
|
||
|
pAddressCaps - Specifies a far pointer to a variable sized structure
|
||
|
of type LINEADDRESSCAPS. Upon successful completion of the request,
|
||
|
this structure is filled with address capabilities information.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
Returns zero if the function is successful or a negative error
|
||
|
number if an error has occurred. Possible error returns are:
|
||
|
|
||
|
LINEERR_BADDEVICEID - The specified line device ID is out of the range
|
||
|
of line devices IDs supported by this driver.
|
||
|
|
||
|
LINEERR_INVALADDRESSID - The specified address ID is out of range.
|
||
|
|
||
|
LINEERR_INCOMPATIBLEVERSION - The specified TSPI and/or extension
|
||
|
version number is not supported by the Service Provider for the
|
||
|
specified line device.
|
||
|
|
||
|
LINEERR_INVALEXTVERSION - The app requested an invalid extension
|
||
|
version number.
|
||
|
|
||
|
LINEERR_STRUCTURETOOSMALL - The dwTotalSize member of a structure
|
||
|
does not specify enough memory to contain the fixed portion of
|
||
|
the structure. The dwNeededSize field has been set to the amount
|
||
|
required.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
LONG retVal;
|
||
|
|
||
|
H323DBG(( DEBUG_LEVEL_TRACE, "TSPI_lineGetAddressCaps - Entered." ));
|
||
|
|
||
|
if( g_pH323Line -> GetDeviceID() != dwDeviceID )
|
||
|
{
|
||
|
// do not recognize device
|
||
|
return LINEERR_BADDEVICEID;
|
||
|
}
|
||
|
|
||
|
// make sure this is a version we support
|
||
|
if (!H323ValidateTSPIVersion(dwTSPIVersion))
|
||
|
{
|
||
|
// do not support tspi version
|
||
|
return LINEERR_INCOMPATIBLEAPIVERSION;
|
||
|
}
|
||
|
|
||
|
// make sure this is a version we support
|
||
|
if (!H323ValidateExtVersion(dwExtVersion))
|
||
|
{
|
||
|
// do not support extensions
|
||
|
retVal = LINEERR_INVALEXTVERSION;
|
||
|
goto exit;
|
||
|
|
||
|
}
|
||
|
|
||
|
// make sure address id is supported
|
||
|
if( g_pH323Line -> IsValidAddressID(dwAddressID) == FALSE )
|
||
|
{
|
||
|
// invalid address id
|
||
|
retVal = LINEERR_INVALADDRESSID;
|
||
|
goto exit;
|
||
|
}
|
||
|
|
||
|
retVal = g_pH323Line -> CopyLineInfo( dwDeviceID, pAddressCaps );
|
||
|
exit:
|
||
|
return retVal;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This operation allows the TAPI DLL to query the specified address for its
|
||
|
current status.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hdLine - Specifies the Service Provider's opaque handle to the line
|
||
|
containing the address to be queried.
|
||
|
|
||
|
dwAddressID - Specifies an address on the given open line device.
|
||
|
This is the address to be queried.
|
||
|
|
||
|
pAddressStatus - Specifies a far pointer to a variable sized data
|
||
|
structure of type LINEADDRESSSTATUS.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
Returns zero if the function is successful or a negative error
|
||
|
number if an error has occurred. Possible error returns are:
|
||
|
|
||
|
LINEERR_INVALLINEHANDLE - The specified device handle is invalid.
|
||
|
|
||
|
LINEERR_INVALADDRESSID - The specified address ID is out of range.
|
||
|
|
||
|
LINEERR_STRUCTURETOOSMALL - The dwTotalSize member of a structure
|
||
|
does not specify enough memory to contain the fixed portion of
|
||
|
the structure. The dwNeededSize field has been set to the amount
|
||
|
required.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
LONG
|
||
|
TSPIAPI
|
||
|
TSPI_lineGetAddressStatus(
|
||
|
HDRVLINE hdLine,
|
||
|
DWORD dwAddressID,
|
||
|
LPLINEADDRESSSTATUS pAddressStatus
|
||
|
)
|
||
|
{
|
||
|
LONG retVal = NOERROR;
|
||
|
|
||
|
H323DBG(( DEBUG_LEVEL_TRACE, "TSPI_lineGetAddressStatus - Entered." ));
|
||
|
|
||
|
// make sure address id is supported
|
||
|
if( g_pH323Line -> IsValidAddressID(dwAddressID) == FALSE )
|
||
|
{
|
||
|
// invalid address id
|
||
|
return LINEERR_INVALADDRESSID;
|
||
|
}
|
||
|
|
||
|
//lock the line device
|
||
|
g_pH323Line -> Lock();
|
||
|
|
||
|
// calculate the number of bytes required
|
||
|
pAddressStatus->dwNeededSize = sizeof(LINEADDRESSSTATUS);
|
||
|
|
||
|
// see if lineaddressstatus structure is of correct size
|
||
|
if (pAddressStatus->dwTotalSize < pAddressStatus->dwNeededSize)
|
||
|
{
|
||
|
H323DBG(( DEBUG_LEVEL_ERROR,
|
||
|
"lineaddressstatus structure too small."
|
||
|
));
|
||
|
|
||
|
//unlock the line device
|
||
|
g_pH323Line -> Unlock();
|
||
|
|
||
|
// allocated structure too small
|
||
|
return LINEERR_STRUCTURETOOSMALL;
|
||
|
}
|
||
|
|
||
|
// record amount of memory used
|
||
|
pAddressStatus->dwUsedSize = pAddressStatus->dwNeededSize;
|
||
|
|
||
|
// transfer number of active calls from line device structure
|
||
|
pAddressStatus->dwNumActiveCalls = g_pH323Line -> GetNoOfCalls();
|
||
|
|
||
|
// specify that outbound call is possible on the address
|
||
|
pAddressStatus->dwAddressFeatures = H323_ADDR_ADDRFEATURES;
|
||
|
|
||
|
if( g_pH323Line->GetCallForwardParams() &&
|
||
|
(g_pH323Line->GetCallForwardParams()->fForwardingEnabled) )
|
||
|
{
|
||
|
pAddressStatus->dwNumRingsNoAnswer = g_pH323Line->m_dwNumRingsNoAnswer;
|
||
|
pAddressStatus->dwForwardOffset = pAddressStatus->dwUsedSize;
|
||
|
retVal = g_pH323Line->CopyAddressForwardInfo( pAddressStatus );
|
||
|
}
|
||
|
|
||
|
//unlock the line device
|
||
|
g_pH323Line -> Unlock();
|
||
|
|
||
|
H323DBG(( DEBUG_LEVEL_TRACE, "TSPI_lineGetAddressStatus - Exited." ));
|
||
|
|
||
|
// success
|
||
|
return retVal;
|
||
|
}
|