344 lines
9.8 KiB
C
344 lines
9.8 KiB
C
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
version.c
|
||
|
||
Abstract:
|
||
|
||
TAPI Service Provider functions related to negotiating version.
|
||
|
||
TSPI_lineNegotiateTSPIVersion
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
--*/
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// Include files //
|
||
// //
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
#include "globals.h"
|
||
#include "provider.h"
|
||
#include "version.h"
|
||
#include "line.h"
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// Private procedures //
|
||
// //
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
BOOL
|
||
H323NegotiateTSPIVersion(
|
||
DWORD dwLowVersion,
|
||
DWORD dwHighVersion,
|
||
PDWORD pdwTSPIVersion
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function determines whether or not specified TSPI version is
|
||
supported by the service provider.
|
||
|
||
Arguments:
|
||
|
||
dwLowVersion - Specifies the lowest TSPI version number under which the
|
||
TAPI DLL is willing to operate. The most-significant WORD is the
|
||
major version number and the least-significant WORD is the minor
|
||
version number.
|
||
|
||
dwHighVersion - Specifies the highest TSPI version number under which
|
||
the TAPI DLL is willing to operate. The most-significant WORD is the
|
||
major version number and the least-significant WORD is the minor
|
||
version number.
|
||
|
||
pdwTSPIVersion - Specifies a far pointer to a DWORD. The service
|
||
provider fills this location with the highest TSPI version number,
|
||
within the range requested by the caller, under which the service
|
||
provider is willing to operate. The most-significant WORD is the
|
||
major version number and the least-significant WORD is the minor
|
||
version number.
|
||
|
||
Return Values:
|
||
|
||
Returns true if successful.
|
||
|
||
--*/
|
||
|
||
{
|
||
// validate extension version range
|
||
if ((TSPI_VERSION_HI <= dwHighVersion) &&
|
||
(TSPI_VERSION_HI >= dwLowVersion)) {
|
||
|
||
// save negotiated version
|
||
*pdwTSPIVersion = TSPI_VERSION_HI;
|
||
|
||
// success
|
||
return TRUE;
|
||
|
||
} else if ((dwHighVersion <= TSPI_VERSION_HI) &&
|
||
(dwHighVersion >= TSPI_VERSION_LO)) {
|
||
|
||
// save negotiated version
|
||
*pdwTSPIVersion = dwHighVersion;
|
||
|
||
// success
|
||
return TRUE;
|
||
}
|
||
|
||
H323DBG((
|
||
DEBUG_LEVEL_ERROR,
|
||
"failed to negotiate version.\n"
|
||
));
|
||
|
||
// failure
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// Public procedures //
|
||
// //
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
BOOL
|
||
H323ValidateTSPIVersion(
|
||
DWORD dwTSPIVersion
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function determines whether or not specified TSPI version is
|
||
supported by the service provider.
|
||
|
||
Arguments:
|
||
|
||
dwTSPIVersion - Specifies the TSPI version to validate.
|
||
|
||
Return Values:
|
||
|
||
Returns true if successful.
|
||
|
||
--*/
|
||
|
||
{
|
||
// see if specified version is supported
|
||
if ((dwTSPIVersion >= TSPI_VERSION_LO) &&
|
||
(dwTSPIVersion <= TSPI_VERSION_HI)) {
|
||
|
||
// success
|
||
return TRUE;
|
||
}
|
||
|
||
H323DBG((
|
||
DEBUG_LEVEL_ERROR,
|
||
"do not support TSPI version %d.%d.\n",
|
||
HIWORD(dwTSPIVersion),
|
||
LOWORD(dwTSPIVersion)
|
||
));
|
||
|
||
// failure
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
BOOL
|
||
H323ValidateExtVersion(
|
||
DWORD dwExtVersion
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function determines whether or not specified extension version is
|
||
supported by the service provider.
|
||
|
||
Arguments:
|
||
|
||
dwExtVersion - Specifies the extension version to validate.
|
||
|
||
Return Values:
|
||
|
||
Returns true if successful.
|
||
|
||
--*/
|
||
|
||
{
|
||
// see if specified version is supported
|
||
if ((dwExtVersion >= H323_VERSION_LO) &&
|
||
(dwExtVersion <= H323_VERSION_HI)) {
|
||
|
||
// success
|
||
return TRUE;
|
||
}
|
||
|
||
H323DBG((
|
||
DEBUG_LEVEL_ERROR,
|
||
"do not support extension version %d.%d.\n",
|
||
HIWORD(dwExtVersion),
|
||
LOWORD(dwExtVersion)
|
||
));
|
||
|
||
// failure
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// TSPI procedures //
|
||
// //
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
LONG
|
||
TSPIAPI
|
||
TSPI_lineNegotiateTSPIVersion(
|
||
DWORD dwDeviceID,
|
||
DWORD dwLowVersion,
|
||
DWORD dwHighVersion,
|
||
PDWORD pdwTSPIVersion
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function returns the highest SPI version the Service Provider is
|
||
willing to operate under for this device given the range of possible
|
||
SPI versions.
|
||
|
||
The TAPI DLL typically calls this function early in the initialization
|
||
sequence for each line device. In addition, it calls this with the
|
||
value INITIALIZE_NEGOTIATION for dwDeviceID to negotiate an interface
|
||
version for calling early initialization functions.
|
||
|
||
Note that when dwDeviceID is INITIALIZE_NEGOTIATION, this function must
|
||
not return LINEERR_OPERATIONUNAVAIL, since this function (with that value)
|
||
is mandatory for negotiating the overall interface version even if the
|
||
service provider supports no line devices.
|
||
|
||
Negotiation of an Extension version is done through the separate
|
||
procedure TSPI_lineNegotiateExtVersion.
|
||
|
||
Arguments:
|
||
|
||
dwDeviceID - Identifies the line device for which interface version
|
||
negotiation is to be performed. In addition to device IDs within
|
||
the range the Service Provider supports, this may be the value:
|
||
|
||
INITIALIZE_NEGOTIATION - This value is used to signify that an overall
|
||
interface version is to be negotiated. Such an interface version
|
||
is required for functions that can be called early in the
|
||
initialization sequence, i.e., before the device ID range has
|
||
been set.
|
||
|
||
dwLowVersion - Specifies the lowest TSPI version number under which the
|
||
TAPI DLL is willing to operate. The most-significant WORD is the
|
||
major version number and the least-significant WORD is the minor
|
||
version number.
|
||
|
||
dwHighVersion - Specifies the highest TSPI version number under which
|
||
the TAPI DLL is willing to operate. The most-significant WORD is the
|
||
major version number and the least-significant WORD is the minor
|
||
version number.
|
||
|
||
pdwTSPIVersion - Specifies a far pointer to a DWORD. The service
|
||
provider fills this location with the highest TSPI version number,
|
||
within the range requested by the caller, under which the service
|
||
provider is willing to operate. The most-significant WORD is the
|
||
major version number and the least-significant WORD is the minor
|
||
version number. If the requested range does not overlap the range
|
||
supported by the service provider, the function returns
|
||
LINEERR_INCOMPATIBLEAPIVERSION.
|
||
|
||
Return Values:
|
||
|
||
Returns zero if the function is successful, or a negative error number
|
||
if an error has occurred. Possible return values are as follows:
|
||
|
||
LINEERR_BADDEVICEID - The specified device identifier or line device
|
||
identifier (such as in a dwDeviceID parameter) is invalid or
|
||
out of range.
|
||
|
||
LINEERR_INCOMPATIBLEAPIVERSION - The application requested an API
|
||
version or version range that is either incompatible or cannot
|
||
be supported by the Telephony API implementation and/or
|
||
corresponding service provider.
|
||
|
||
LINEERR_OPERATIONFAILED - The operation failed for an unspecified
|
||
or unknown reason.
|
||
|
||
--*/
|
||
|
||
{
|
||
DWORD dwTSPIVersion = UNINITIALIZED;
|
||
PH323_LINE pLine = NULL;
|
||
|
||
// see if this is a init line device
|
||
if ((DWORD_PTR)dwDeviceID == INITIALIZE_NEGOTIATION) {
|
||
|
||
H323DBG((
|
||
DEBUG_LEVEL_VERBOSE,
|
||
"tapisrv supports tspi version %d.%d through %d.%d.\n",
|
||
HIWORD(dwLowVersion),
|
||
LOWORD(dwLowVersion),
|
||
HIWORD(dwHighVersion),
|
||
LOWORD(dwHighVersion)
|
||
));
|
||
|
||
// perform version negotiation
|
||
if (!H323NegotiateTSPIVersion(
|
||
dwLowVersion,
|
||
dwHighVersion,
|
||
&dwTSPIVersion)) {
|
||
|
||
// negotiated version not agreed upon
|
||
return LINEERR_INCOMPATIBLEAPIVERSION;
|
||
}
|
||
|
||
// see if this is a valid line device
|
||
} else if (H323GetLineFromIDAndLock(&pLine, (DWORD)dwDeviceID)) {
|
||
|
||
// perform version negotiation
|
||
if (!H323NegotiateTSPIVersion(
|
||
dwLowVersion,
|
||
dwHighVersion,
|
||
&dwTSPIVersion)) {
|
||
|
||
// release line device
|
||
H323UnlockLine(pLine);
|
||
|
||
// negotiated version not agreed upon
|
||
return LINEERR_INCOMPATIBLEAPIVERSION;
|
||
}
|
||
|
||
// release line device
|
||
H323UnlockLine(pLine);
|
||
|
||
} else {
|
||
|
||
// do not recognize device
|
||
return LINEERR_BADDEVICEID;
|
||
}
|
||
|
||
// return negotiated version
|
||
*pdwTSPIVersion = dwTSPIVersion;
|
||
|
||
// success
|
||
return NOERROR;
|
||
}
|
||
|