793 lines
24 KiB
C
793 lines
24 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
media.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
TAPI Service Provider functions related to media.
|
|||
|
|
|||
|
TSPI_lineConditionalMediaDetection
|
|||
|
TSPI_lineGetID
|
|||
|
TSPI_lineMSPIdentify
|
|||
|
TSPI_lineReceiveMSPData
|
|||
|
TSPI_lineSetDefaultMediaDetection
|
|||
|
TSPI_lineSetMediaMode
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode - Win32
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Include files //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include "globals.h"
|
|||
|
#include "provider.h"
|
|||
|
#include "termcaps.h"
|
|||
|
#include "callback.h"
|
|||
|
|
|||
|
#include <objbase.h>
|
|||
|
#include <initguid.h>
|
|||
|
#include "line.h"
|
|||
|
|
|||
|
// {0F1BE7F8-45CA-11d2-831F-00A0244D2298}
|
|||
|
DEFINE_GUID(CLSID_IPMSP,
|
|||
|
0x0F1BE7F8,0x45CA, 0x11d2, 0x83, 0x1F, 0x0, 0xA0, 0x24, 0x4D, 0x22, 0x98);
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Private definitions //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Private procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// TSPI procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
LONG
|
|||
|
TSPIAPI
|
|||
|
TSPI_lineConditionalMediaDetection(
|
|||
|
HDRVLINE hdLine,
|
|||
|
DWORD dwMediaModes,
|
|||
|
LPLINECALLPARAMS const pCallParams
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
If the Service Provider can monitor for the indicated set of media modes
|
|||
|
AND support the capabilities indicated in pCallParams, then it sets the
|
|||
|
indicated media moditoring modes for the line and replies with a "success"
|
|||
|
indication. Otherwise, it leaves the media monitoring modes for the line
|
|||
|
unchanged and replies with a "failure" indication.
|
|||
|
|
|||
|
A TAPI lineOpen that specifies the device ID LINE_MAPPER typically results
|
|||
|
in calling this procedure for multiple line devices to hunt for a suitable
|
|||
|
line, possibly also opening as-yet unopened lines. A "success" result
|
|||
|
indicates that the line is suitable for the calling application's
|
|||
|
requirements. Note that the media monitoring modes demanded at the TSPI
|
|||
|
level are the union of monitoring modes demanded by multiple applications
|
|||
|
at the TAPI level. As a consequence of this, it is most common for
|
|||
|
multiple media mode flags to be set simultaneously at this level. The
|
|||
|
Service Provider should test to determine if it can support at least the
|
|||
|
specified set regardless of what modes are currently in effect.
|
|||
|
|
|||
|
The Device ID LINE_MAPPER is never used at the TSPI level.
|
|||
|
|
|||
|
The service provider shall return an error (e.g., LINEERR_RESOURCEUNAVAIL)
|
|||
|
if, at the time this function is called, it is impossible to place a new
|
|||
|
call on the specified line device (in other words, if it would return
|
|||
|
LINEERR_CALLUNAVAIL or LINEERR_RESOURCEUNAVAIL should TSPI_lineMakeCall be
|
|||
|
invoked immediately after opening the line).
|
|||
|
|
|||
|
The function operates strictly synchronously.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hdLine - Specifies the Service Provider's opaque handle to the line to
|
|||
|
have media monitoring and parameter capabilities tested and set.
|
|||
|
|
|||
|
dwMediaModes - Specifies the media mode(s) of interest to the app, of
|
|||
|
type LINEMEDIAMODE. The dwMediaModes parameter is used to register
|
|||
|
the app as a potential target for inbound call and call hand off for
|
|||
|
the specified media mode. This parameter is ignored if the OWNER flag
|
|||
|
is not set in dwPrivileges.
|
|||
|
|
|||
|
pCallParams - Specifies a far pointer to a structure of type
|
|||
|
LINECALLPARAMS. It describes the call parameters that the line device
|
|||
|
should be able to provide.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns zero if the function is successful, or a negative error number if
|
|||
|
an error has occurred. Possible error returns are:
|
|||
|
|
|||
|
LINEERR_INVALADDRESSMODE - The address mode is invalid.
|
|||
|
|
|||
|
LINEERR_INVALBEARERMODE - The bearer mode is invalid.
|
|||
|
|
|||
|
LINEERR_INVALLINEHANDLE - The specified line handle is invalid.
|
|||
|
|
|||
|
LINEERR_INVALMEDIAMODE - One or more media modes specified as a
|
|||
|
parameter or in a list is invalid or not supported by the the
|
|||
|
service provider.
|
|||
|
|
|||
|
LINEERR_RESOURCEUNAVAIL - The specified operation cannot be completed
|
|||
|
because of resource overcommitment.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PH323_LINE pLine = NULL;
|
|||
|
|
|||
|
// see if we support media modes specified
|
|||
|
if (dwMediaModes & ~H323_LINE_MEDIAMODES) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"do not support media modes 0x%08lx.\n",
|
|||
|
dwMediaModes
|
|||
|
));
|
|||
|
|
|||
|
// do not support media mode
|
|||
|
return LINEERR_INVALMEDIAMODE;
|
|||
|
}
|
|||
|
|
|||
|
// validate pointer
|
|||
|
if (pCallParams != NULL) {
|
|||
|
|
|||
|
// see if we support media modes specified
|
|||
|
if (pCallParams->dwMediaMode & ~H323_LINE_MEDIAMODES) {
|
|||
|
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"do not support media modes 0x%08lx.\n",
|
|||
|
pCallParams->dwMediaMode
|
|||
|
));
|
|||
|
|
|||
|
// do not support media mode
|
|||
|
return LINEERR_INVALMEDIAMODE;
|
|||
|
}
|
|||
|
|
|||
|
// see if we support bearer modes
|
|||
|
if (pCallParams->dwBearerMode & ~H323_LINE_BEARERMODES) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"do not support bearer mode 0x%08lx.\n",
|
|||
|
pCallParams->dwBearerMode
|
|||
|
));
|
|||
|
|
|||
|
// do not support bearer mode
|
|||
|
return LINEERR_INVALBEARERMODE;
|
|||
|
}
|
|||
|
|
|||
|
// see if we support address modes
|
|||
|
if (pCallParams->dwAddressMode & ~H323_LINE_ADDRESSMODES) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"do not support address mode 0x%08lx.\n",
|
|||
|
pCallParams->dwAddressMode
|
|||
|
));
|
|||
|
|
|||
|
// do not support address mode
|
|||
|
return LINEERR_INVALADDRESSMODE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// retrieve line device pointer from handle
|
|||
|
if (!H323GetLineAndLock(&pLine, hdLine)) {
|
|||
|
|
|||
|
// invalid line device handle
|
|||
|
return LINEERR_INVALLINEHANDLE;
|
|||
|
}
|
|||
|
|
|||
|
// see if line is available
|
|||
|
if (!H323IsLineAvailable(pLine)) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"line %d is currently at maximum capacity.\n",
|
|||
|
pLine->dwDeviceID
|
|||
|
));
|
|||
|
|
|||
|
// release line device
|
|||
|
H323UnlockLine(pLine);
|
|||
|
|
|||
|
// no addresses available
|
|||
|
return LINEERR_RESOURCEUNAVAIL;
|
|||
|
}
|
|||
|
|
|||
|
// release line device
|
|||
|
H323UnlockLine(pLine);
|
|||
|
|
|||
|
// success
|
|||
|
return NOERROR;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LONG
|
|||
|
TSPIAPI
|
|||
|
TSPI_lineGetID(
|
|||
|
HDRVLINE hdLine,
|
|||
|
DWORD dwAddressID,
|
|||
|
HDRVCALL hdCall,
|
|||
|
DWORD dwSelect,
|
|||
|
LPVARSTRING pDeviceID,
|
|||
|
LPCWSTR pwszDeviceClass,
|
|||
|
HANDLE hTargetProcess
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function returns a device ID for the specified device class
|
|||
|
associated with the selected line, address or call.
|
|||
|
|
|||
|
This function can be used to retrieve a line device ID given a
|
|||
|
line handle. Although the TAPI DLL has sufficient information to
|
|||
|
determine the line device ID from a line handle, it may still call
|
|||
|
this operation in such a fashion on behalf of an application that
|
|||
|
has opened a line device using LINE_MAPPER. The Service Provider
|
|||
|
should support the "line" device class to allow applications to
|
|||
|
determine the real line device ID of an opened line.
|
|||
|
|
|||
|
This function can also be used to obtain the device ID of a phone
|
|||
|
device or media device (e.g., mci waveform, mci midi, wave, fax,
|
|||
|
etc.) associated with a call, address or line. This ID can then be
|
|||
|
used with the appropriate API (e.g., phone, mci, midi, wave, etc.)
|
|||
|
to select the corresponding media device associated with the specified
|
|||
|
call.
|
|||
|
|
|||
|
Note that the notion of Windows device class is different from that of
|
|||
|
media mode. For example, the interactive voice or stored voice media
|
|||
|
modes may be accessed using either the mci waveaudio or the low level
|
|||
|
wave device classes. A media modes describes a format of information
|
|||
|
on a call, a device class defines a Windows API used to manage that
|
|||
|
stream. Often, a single media stream may be accessed using multiple
|
|||
|
device classes, or a single device class (e.g., the Windows COMM API)
|
|||
|
may provide access to multiple media modes.
|
|||
|
|
|||
|
Note that a new device class value is defined in TAPI 2.0:
|
|||
|
|
|||
|
"comm/datamodem/portname"
|
|||
|
|
|||
|
When TSPI_lineGetID is called specifying this device class on a line
|
|||
|
device that supports the class, the VARSTRING structure returned will
|
|||
|
contain a null-terminated ANSI (not UNICODE) string specifying the name
|
|||
|
of the port to which the specified modem is attached, such as "COM1\0".
|
|||
|
This is intended primarily for identification purposes in user interface,
|
|||
|
but could be used under some circumstances to open the device directly,
|
|||
|
bypassing the service provider (if the service provider does not already
|
|||
|
have the device open itself). If there is no port associated with the
|
|||
|
device, a null string ("\0") is returned in the VARSTRING structure (with
|
|||
|
a string length of 1).
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hdLine - Specifies the Service Provider's opaque handle to the line
|
|||
|
to be queried.
|
|||
|
|
|||
|
dwAddressID - Specifies an address on the given open line device.
|
|||
|
|
|||
|
hdCall - Specifies the Service Provider's opaque handle to the call
|
|||
|
to be queried.
|
|||
|
|
|||
|
dwSelect - Specifies the whether the device ID requested is associated
|
|||
|
with the line, address or a single call, of type LINECALLSELECT.
|
|||
|
|
|||
|
pDeviceID - Specifies a far pointer to the memory location of type
|
|||
|
VARSTRING where the device ID is returned. Upon successful completion
|
|||
|
of the request, this location is filled with the device ID. The
|
|||
|
format of the returned information depends on the method used by the
|
|||
|
device class (API) for naming devices.
|
|||
|
|
|||
|
pwszDeviceClass - Specifies a far pointer to a NULL-terminated ASCII
|
|||
|
string that specifies the device class of the device whose ID is
|
|||
|
requested. Valid device class strings are those used in the SYSTEM.INI
|
|||
|
section to identify device classes.
|
|||
|
|
|||
|
hTargetProcess - The process handle of the application on behalf of which
|
|||
|
the TSPI_lineGetID function is being invoked. If the information being
|
|||
|
returned in the VARSTRING structure includes a handle for use by the
|
|||
|
application, the service provider should create or duplicate the handle
|
|||
|
for the process.
|
|||
|
|
|||
|
If hTargetProcess is set to INVALID_HANDLE_VALUE, then the application
|
|||
|
is executing on a remote client system and it is not possible to create
|
|||
|
a duplicate handle directly. Instead, the VARSTRING structure should
|
|||
|
contain a UNC name of a network device or other name that the remote
|
|||
|
client can use to access the device. If this is not possible, then the
|
|||
|
function should fail.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns zero if the function is successful or a negative error
|
|||
|
number if an error has occurred. Possible error returns are:
|
|||
|
|
|||
|
LINEERR_INVALCALLHANDLE - The hdCall parameter is an invalid handle.
|
|||
|
|
|||
|
LINEERR_INVALCALLSELECT - The specified dwCallSelect parameter is
|
|||
|
invalid.
|
|||
|
|
|||
|
LINEERR_INVALCALLSTATE - One or more of the specified calls are not in
|
|||
|
a valid state for the requested operation.
|
|||
|
|
|||
|
LINEERR_NODEVICE - The line device has no associated device for the
|
|||
|
given device class.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
// do not support device
|
|||
|
return LINEERR_NODEVICE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LONG
|
|||
|
TSPIAPI
|
|||
|
TSPI_lineMSPIdentify(
|
|||
|
DWORD dwDeviceID,
|
|||
|
GUID * pCLSID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This procedure is called after TAPI has initialized the line device in
|
|||
|
order to determine the assoicated Media Service Provider.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwDeviceID - Identifies the line device to be opened. The value
|
|||
|
LINE_MAPPER for a device ID is not permitted.
|
|||
|
|
|||
|
pCLSID - Points to a GUID-sized memory location which the service
|
|||
|
provider writes the class identifier of the associated media
|
|||
|
service provider.
|
|||
|
|
|||
|
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 range.
|
|||
|
|
|||
|
LINEERR_OPERATIONFAILED - The operation failed for an unspecified or
|
|||
|
unknown reason.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PH323_LINE pLine = NULL;
|
|||
|
|
|||
|
// retrieve pointer to line device from device id
|
|||
|
if (!H323GetLineFromIDAndLock(&pLine, dwDeviceID)) {
|
|||
|
|
|||
|
// do not recognize device
|
|||
|
return LINEERR_BADDEVICEID;
|
|||
|
}
|
|||
|
|
|||
|
// copy class id
|
|||
|
*pCLSID = CLSID_IPMSP;
|
|||
|
|
|||
|
// release line device
|
|||
|
H323UnlockLine(pLine);
|
|||
|
|
|||
|
// success
|
|||
|
return NOERROR;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LONG
|
|||
|
TSPIAPI
|
|||
|
TSPI_lineReceiveMSPData(
|
|||
|
HDRVLINE hdLine,
|
|||
|
HDRVCALL hdCall,
|
|||
|
HDRVMSPLINE hdMSPLine,
|
|||
|
LPVOID pBuffer,
|
|||
|
DWORD dwSize
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This procedure is called to deliver a payload from the MSP.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hdCall - Handle to line object.
|
|||
|
|
|||
|
hdCall - Handle to call object associated with MSP.
|
|||
|
|
|||
|
hdMSPLine - Handle to MSP.
|
|||
|
|
|||
|
pBuffer - Pointer to opaque buffer with MSP data.
|
|||
|
|
|||
|
dwSize - Size of buffer above.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns zero if the function is successful or a negative error
|
|||
|
number if an error has occurred. Possible error returns are:
|
|||
|
|
|||
|
LINEERR_INVALCALLHANDLE - The specified call handle is invalid.
|
|||
|
|
|||
|
LINEERR_OPERATIONFAILED - The operation failed for an unspecified or
|
|||
|
unknown reason.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PH323_CALL pCall = NULL;
|
|||
|
PH323MSP_MESSAGE pMessage = (PH323MSP_MESSAGE)pBuffer;
|
|||
|
|
|||
|
// validate pointer and message size
|
|||
|
if ((pMessage == NULL) || (dwSize != sizeof(H323MSP_MESSAGE))) {
|
|||
|
|
|||
|
// could not cancel listen
|
|||
|
return LINEERR_OPERATIONFAILED;
|
|||
|
}
|
|||
|
|
|||
|
// see if call handle is valid
|
|||
|
if (!H323GetCallAndLock(&pCall, hdCall)) {
|
|||
|
|
|||
|
// see if this is a line message.
|
|||
|
switch (pMessage->Type) {
|
|||
|
|
|||
|
case H323MSP_CONFIG_T120_COMMAND:
|
|||
|
|
|||
|
H323LockProvider();
|
|||
|
|
|||
|
H323ProcessConfigT120Command(
|
|||
|
&pMessage->ConfigT120Command
|
|||
|
);
|
|||
|
|
|||
|
H323UnlockProvider();
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_CONFIG_CAPABILITY_COMMAND:
|
|||
|
|
|||
|
H323LockProvider();
|
|||
|
|
|||
|
H323ProcessConfigCapabilityCommand(
|
|||
|
&pMessage->ConfigCapabilityCommand
|
|||
|
);
|
|||
|
|
|||
|
H323UnlockProvider();
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_SET_ALIAS_COMMAND:
|
|||
|
|
|||
|
H323LockProvider ();
|
|||
|
|
|||
|
if (pMessage->SetAliasCommand.dwLength > 0)
|
|||
|
{
|
|||
|
// check pointer
|
|||
|
if (IsBadReadPtr (
|
|||
|
pMessage->SetAliasCommand.strAlias,
|
|||
|
pMessage->SetAliasCommand.dwLength * sizeof (WCHAR)
|
|||
|
))
|
|||
|
{
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"H323MSP_SET_ALIAS_COMMAND receives bad pointer"
|
|||
|
));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// check wcs length
|
|||
|
g_dwAliasLength = pMessage->SetAliasCommand.dwLength < MAX_ALIAS_LENGTH
|
|||
|
?pMessage->SetAliasCommand.dwLength
|
|||
|
:MAX_ALIAS_LENGTH;
|
|||
|
|
|||
|
// copy
|
|||
|
CopyMemory (
|
|||
|
g_strAlias,
|
|||
|
pMessage->SetAliasCommand.strAlias,
|
|||
|
g_dwAliasLength * sizeof (WCHAR)
|
|||
|
);
|
|||
|
|
|||
|
// end char
|
|||
|
g_strAlias[g_dwAliasLength] = L'\0';
|
|||
|
}
|
|||
|
|
|||
|
H323UnlockProvider ();
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
// invalid call handle
|
|||
|
return LINEERR_INVALCALLHANDLE;
|
|||
|
}
|
|||
|
|
|||
|
// success
|
|||
|
return NOERROR;
|
|||
|
}
|
|||
|
|
|||
|
switch (pMessage->Type) {
|
|||
|
|
|||
|
case H323MSP_OPEN_CHANNEL_REQUEST:
|
|||
|
|
|||
|
H323ProcessOpenChannelRequest(
|
|||
|
pCall,
|
|||
|
&pMessage->OpenChannelRequest
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_ACCEPT_CHANNEL_RESPONSE:
|
|||
|
|
|||
|
H323ProcessAcceptChannelResponse(
|
|||
|
pCall,
|
|||
|
&pMessage->AcceptChannelResponse
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_CLOSE_CHANNEL_COMMAND:
|
|||
|
|
|||
|
H323ProcessCloseChannelCommand(
|
|||
|
pCall,
|
|||
|
&pMessage->CloseChannelCommand
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_VIDEO_FAST_UPDATE_PICTURE_COMMAND:
|
|||
|
|
|||
|
H323ProcessVideoFastUpdatePictureCommand(
|
|||
|
pCall,
|
|||
|
&pMessage->VideoFastUpdatePictureCommand
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_FLOW_CONTROL_COMMAND:
|
|||
|
|
|||
|
H323ProcessFlowControlCommand(
|
|||
|
pCall,
|
|||
|
&pMessage->FlowControlCommand
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case H323MSP_QOS_Evnet:
|
|||
|
|
|||
|
H323ProcessQoSEventIndication(
|
|||
|
pCall,
|
|||
|
&pMessage->QOSEvent
|
|||
|
);
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// unlock line device
|
|||
|
H323UnlockLine(pCall->pLine);
|
|||
|
|
|||
|
// success
|
|||
|
return NOERROR;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LONG
|
|||
|
TSPIAPI
|
|||
|
TSPI_lineSetDefaultMediaDetection(
|
|||
|
HDRVLINE hdLine,
|
|||
|
DWORD dwMediaModes
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This procedure tells the Service Provider the new set of Media Modes to
|
|||
|
detect for the indicated line (replacing any previous set). It also sets
|
|||
|
the initial set of Media Modes that should be monitored for on subsequent
|
|||
|
calls (inbound or outbound) on this line.
|
|||
|
|
|||
|
The TAPI DLL typically calls this function to update the set of detected
|
|||
|
media modes for the line to the union of all modes selected by all
|
|||
|
outstanding lineOpens whenever a line is Opened or Closed at the TAPI
|
|||
|
level. A lineOpen attempt is rejected if media detection is rejected.
|
|||
|
A single call to this procedure is typically the result of a lineOpen
|
|||
|
that does not specify the device ID LINE_MAPPER. The Device ID LINE_MAPPER
|
|||
|
is never used at the TSPI level.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hdLine - Specifies the Service Provider's opaque handle to the line to
|
|||
|
have media monitoring set.
|
|||
|
|
|||
|
dwMediaModes - Specifies the media mode(s) of interest to the TAPI DLL,
|
|||
|
of type LINEMEDIAMODE.
|
|||
|
|
|||
|
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 line handle is invalid.
|
|||
|
|
|||
|
LINEERR_INVALMEDIAMODE - One or more media modes specified as a
|
|||
|
parameter or in a list is invalid or not supported by the the
|
|||
|
service provider.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
HRESULT hr;
|
|||
|
PH323_LINE pLine = NULL;
|
|||
|
|
|||
|
// see if unknown bit is specified
|
|||
|
if (dwMediaModes & LINEMEDIAMODE_UNKNOWN) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_VERBOSE,
|
|||
|
"clearing unknown media mode.\n"
|
|||
|
));
|
|||
|
|
|||
|
// clear unknown bit from modes
|
|||
|
dwMediaModes &= ~LINEMEDIAMODE_UNKNOWN;
|
|||
|
}
|
|||
|
|
|||
|
// see if both audio bits are specified
|
|||
|
if ((dwMediaModes & LINEMEDIAMODE_AUTOMATEDVOICE) &&
|
|||
|
(dwMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE)) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_VERBOSE,
|
|||
|
"clearing automated voice media mode.\n"
|
|||
|
));
|
|||
|
|
|||
|
// clear extra audio bit from modes
|
|||
|
dwMediaModes &= ~LINEMEDIAMODE_INTERACTIVEVOICE;
|
|||
|
}
|
|||
|
|
|||
|
// see if we support media modes specified
|
|||
|
if (dwMediaModes & ~H323_LINE_MEDIAMODES) {
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_ERROR,
|
|||
|
"do not support media modes 0x%08lx.\n",
|
|||
|
dwMediaModes
|
|||
|
));
|
|||
|
|
|||
|
// do not support media mode
|
|||
|
return LINEERR_INVALMEDIAMODE;
|
|||
|
}
|
|||
|
|
|||
|
// retrieve line device pointer from handle
|
|||
|
if (!H323GetLineAndLock(&pLine, hdLine)) {
|
|||
|
|
|||
|
// invalid line device handle
|
|||
|
return LINEERR_INVALLINEHANDLE;
|
|||
|
}
|
|||
|
|
|||
|
H323DBG((
|
|||
|
DEBUG_LEVEL_TRACE,
|
|||
|
"line %d enabled to detect media modes 0x%08lx.\n",
|
|||
|
pLine->dwDeviceID,
|
|||
|
dwMediaModes
|
|||
|
));
|
|||
|
|
|||
|
// record media modes to detect
|
|||
|
pLine->dwMediaModes = dwMediaModes;
|
|||
|
|
|||
|
// see if we need to start listening
|
|||
|
if (H323IsMediaDetectionEnabled(pLine) &&
|
|||
|
!H323IsListening(pLine) &&
|
|||
|
!H323StartListening(pLine)) {
|
|||
|
|
|||
|
// release line device
|
|||
|
H323UnlockLine(pLine);
|
|||
|
|
|||
|
// could not cancel listen
|
|||
|
return LINEERR_OPERATIONFAILED;
|
|||
|
|
|||
|
// see if we need to stop listening
|
|||
|
} else if (H323IsListening(pLine) &&
|
|||
|
!H323IsMediaDetectionEnabled(pLine) &&
|
|||
|
!H323StopListening(pLine)) {
|
|||
|
|
|||
|
// release line device
|
|||
|
H323UnlockLine(pLine);
|
|||
|
|
|||
|
// could not cancel listen
|
|||
|
return LINEERR_OPERATIONFAILED;
|
|||
|
}
|
|||
|
|
|||
|
// release line device
|
|||
|
H323UnlockLine(pLine);
|
|||
|
|
|||
|
// success
|
|||
|
return NOERROR;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LONG
|
|||
|
TSPIAPI
|
|||
|
TSPI_lineSetMediaMode(
|
|||
|
HDRVCALL hdCall,
|
|||
|
DWORD dwMediaMode
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function changes the call's media as stored in the call's
|
|||
|
LINECALLINFO structure.
|
|||
|
|
|||
|
Other than changing the call's media as stored in the call's
|
|||
|
LINECALLINFO structure, this procedure is simply "advisory" in the sense
|
|||
|
that it indicates an expected media change that is about to occur, rather
|
|||
|
than forcing a specific change to the call. Typical usage is to set a
|
|||
|
calls media mode to a specific known media mode, or to exclude possible
|
|||
|
media modes as long as the call's media mode is not fully known; i.e.,
|
|||
|
the UNKNOWN media mode flag is set.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hdCall - Specifies the Service Provider's opaque handle to the call
|
|||
|
undergoing a change in media mode. Valid call states: any.
|
|||
|
|
|||
|
dwMediaMode - Specifies the new media mode(s) for the call, of type
|
|||
|
LINEMEDIAMODE. As long as the UNKNOWN media mode flag is set,
|
|||
|
multiple other media mode flags may be set as well. This is used
|
|||
|
to indentify a call's media mode as not fully determined, but
|
|||
|
narrowed down to one of just a small set of specified media modes.
|
|||
|
If the UNKNOWN flag is not set, then only a single media mode can
|
|||
|
be specified.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns zero if the function is successful or a negative error
|
|||
|
number if an error has occurred. Possible error returns are:
|
|||
|
|
|||
|
LINEERR_INVALCALLHANDLE - The specified call handle is invalid.
|
|||
|
|
|||
|
LINEERR_INVALMEDIAMODE - The specified media mode parameter is invalid.
|
|||
|
|
|||
|
LINEERR_OPERATIONUNAVAIL - The specified operation is not available.
|
|||
|
|
|||
|
LINEERR_OPERATIONFAILED - The specified operation failed for
|
|||
|
unspecified reasons.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return LINEERR_OPERATIONUNAVAIL; // CODEWORK...
|
|||
|
}
|