You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
353 lines
8.4 KiB
353 lines
8.4 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
faxmodem.c
|
|
|
|
Abstract:
|
|
|
|
This module contains code to read the adaptive
|
|
answer modem list from the faxsetup.inf file.
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 22-Sep-1997
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <setupapi.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tchar.h>
|
|
#include <tapi.h>
|
|
|
|
#include "faxreg.h"
|
|
#include "faxutil.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
VOID
|
|
CALLBACK
|
|
lineCallbackFunc(
|
|
DWORD hDevice,
|
|
DWORD dwMsg,
|
|
DWORD_PTR dwCallbackInstance,
|
|
DWORD_PTR dwParam1,
|
|
DWORD_PTR dwParam2,
|
|
DWORD_PTR dwParam3
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER (hDevice);
|
|
UNREFERENCED_PARAMETER (dwMsg);
|
|
UNREFERENCED_PARAMETER (dwCallbackInstance);
|
|
UNREFERENCED_PARAMETER (dwParam1);
|
|
UNREFERENCED_PARAMETER (dwParam2);
|
|
UNREFERENCED_PARAMETER (dwParam3);
|
|
} // lineCallbackFunc
|
|
|
|
|
|
LPLINEDEVCAPS
|
|
SmartLineGetDevCaps(
|
|
HLINEAPP hLineApp,
|
|
DWORD dwDeviceId,
|
|
DWORD dwAPIVersion
|
|
)
|
|
/*++
|
|
|
|
Routine name : SmartLineGetDevCaps
|
|
|
|
Routine description:
|
|
|
|
Gets the line capabilities for a TAPI line
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Jul, 2000
|
|
|
|
Arguments:
|
|
|
|
hLineApp [in] - Handle to TAPI
|
|
dwDeviceId [in] - Line id
|
|
dwAPIVersion [in] - Negotiated TAPI API version
|
|
|
|
Return Value:
|
|
|
|
Pointer to allocated lide device capabilities data
|
|
|
|
--*/
|
|
{
|
|
DWORD dwLineDevCapsSize;
|
|
LPLINEDEVCAPS lpLineDevCaps = NULL;
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
DEBUG_FUNCTION_NAME(TEXT("SmartLineGetDevCaps"))
|
|
//
|
|
// Allocate the initial linedevcaps structure
|
|
//
|
|
dwLineDevCapsSize = sizeof(LINEDEVCAPS) + 4096;
|
|
lpLineDevCaps = (LPLINEDEVCAPS) MemAlloc( dwLineDevCapsSize );
|
|
if (!lpLineDevCaps)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Can't allocate %ld bytes for LINEDEVCAPS"),
|
|
dwLineDevCapsSize);
|
|
return NULL;
|
|
}
|
|
|
|
lpLineDevCaps->dwTotalSize = dwLineDevCapsSize;
|
|
|
|
dwRes = lineGetDevCaps(
|
|
hLineApp,
|
|
dwDeviceId,
|
|
dwAPIVersion,
|
|
0, // Always refer to address 0
|
|
lpLineDevCaps
|
|
);
|
|
|
|
if ((ERROR_SUCCESS != dwRes) && (LINEERR_STRUCTURETOOSMALL != dwRes))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("lineGetDevCaps failed with 0x%08x"),
|
|
dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
if (lpLineDevCaps->dwNeededSize > lpLineDevCaps->dwTotalSize)
|
|
{
|
|
//
|
|
// Re-allocate the linedevcaps structure
|
|
//
|
|
dwLineDevCapsSize = lpLineDevCaps->dwNeededSize;
|
|
MemFree( lpLineDevCaps );
|
|
lpLineDevCaps = (LPLINEDEVCAPS) MemAlloc( dwLineDevCapsSize );
|
|
if (!lpLineDevCaps)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Can't allocate %ld bytes for LINEDEVCAPS"),
|
|
dwLineDevCapsSize);
|
|
return NULL;
|
|
}
|
|
lpLineDevCaps->dwTotalSize = dwLineDevCapsSize;
|
|
dwRes = lineGetDevCaps(
|
|
hLineApp,
|
|
dwDeviceId,
|
|
dwAPIVersion,
|
|
0, // Always refer to address 0
|
|
lpLineDevCaps
|
|
);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
//
|
|
// lineGetDevCaps() can fail with error code 0x8000004b
|
|
// if a device has been deleted and tapi has not been
|
|
// cycled. this is caused by the fact that tapi leaves
|
|
// a phantom device in it's device list. the error is
|
|
// benign and the device can safely be ignored.
|
|
//
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("lineGetDevCaps failed with 0x%08x"),
|
|
dwRes);
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
exit:
|
|
if (dwRes != ERROR_SUCCESS)
|
|
{
|
|
MemFree( lpLineDevCaps );
|
|
lpLineDevCaps = NULL;
|
|
SetLastError(dwRes);
|
|
}
|
|
return lpLineDevCaps;
|
|
} // SmartLineGetDevCaps
|
|
|
|
BOOL
|
|
IsDeviceModem (
|
|
LPLINEDEVCAPS lpLineCaps,
|
|
LPCTSTR lpctstrUnimodemTspName
|
|
)
|
|
/*++
|
|
|
|
Routine name : IsDeviceModem
|
|
|
|
Routine description:
|
|
|
|
Is a TAPI line a modem?
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Jul, 2000
|
|
|
|
Arguments:
|
|
|
|
lpLineCaps [in] - Line capabilities buffer
|
|
lpctstrUnimodemTspName [in] - Full name of the Unimodem TSP
|
|
|
|
Return Value:
|
|
|
|
TRUE if a TAPI line is a modem, FALSE otherwise.
|
|
|
|
--*/
|
|
{
|
|
LPTSTR lptstrDeviceClassList;
|
|
BOOL bRes = FALSE;
|
|
DEBUG_FUNCTION_NAME(TEXT("IsDeviceModem"))
|
|
|
|
if (lpLineCaps->dwDeviceClassesSize && lpLineCaps->dwDeviceClassesOffset)
|
|
{
|
|
//
|
|
// Scan multi-string for modem class
|
|
//
|
|
lptstrDeviceClassList = (LPTSTR)((LPBYTE) lpLineCaps + lpLineCaps->dwDeviceClassesOffset);
|
|
while (*lptstrDeviceClassList)
|
|
{
|
|
if (_tcscmp(lptstrDeviceClassList,TEXT("comm/datamodem")) == 0)
|
|
{
|
|
bRes = TRUE;
|
|
break;
|
|
}
|
|
lptstrDeviceClassList += (_tcslen(lptstrDeviceClassList) + 1);
|
|
}
|
|
}
|
|
|
|
if ((!(lpLineCaps->dwBearerModes & LINEBEARERMODE_VOICE)) ||
|
|
(!(lpLineCaps->dwBearerModes & LINEBEARERMODE_PASSTHROUGH)))
|
|
{
|
|
//
|
|
// Unacceptable modem device type
|
|
//
|
|
bRes = FALSE;
|
|
}
|
|
if (lpLineCaps->dwProviderInfoSize && lpLineCaps->dwProviderInfoOffset)
|
|
{
|
|
//
|
|
// Provider (TSP) name is there
|
|
//
|
|
if (_tcscmp((LPTSTR)((LPBYTE) lpLineCaps + lpLineCaps->dwProviderInfoOffset),
|
|
lpctstrUnimodemTspName) != 0)
|
|
{
|
|
//
|
|
// Our T30 modem FSP only works with Unimodem TSP
|
|
//
|
|
bRes = FALSE;
|
|
}
|
|
}
|
|
return bRes;
|
|
} // IsDeviceModem
|
|
|
|
DWORD
|
|
GetFaxCapableTapiLinesCount (
|
|
LPDWORD lpdwCount,
|
|
LPCTSTR lpctstrUnimodemTspName
|
|
)
|
|
/*++
|
|
|
|
Routine name : GetFaxCapableTapiLinesCount
|
|
|
|
Routine description:
|
|
|
|
Counter the number of Fax-capable TAPI lines in the system
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Jul, 2000
|
|
|
|
Arguments:
|
|
|
|
lpdwCount [out] - Pointer to count of fax-capable Tapi lines
|
|
lpctstrUnimodemTspName [in] - Full name of the Unimodem TSP
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes;
|
|
LINEINITIALIZEEXPARAMS LineInitializeExParams = {sizeof (LINEINITIALIZEEXPARAMS), 0, 0, 0, 0, 0};
|
|
HLINEAPP hLineApp = NULL;
|
|
DWORD dwTapiDevices;
|
|
DWORD dwLocalTapiApiVersion = 0x00020000;
|
|
DWORD dwCount = 0;
|
|
DWORD dwIndex;
|
|
DEBUG_FUNCTION_NAME(TEXT("GetFaxCapableTapiLinesCount"))
|
|
|
|
dwRes = lineInitializeEx(
|
|
&hLineApp,
|
|
GetModuleHandle(NULL),
|
|
lineCallbackFunc,
|
|
FAX_SERVICE_DISPLAY_NAME,
|
|
&dwTapiDevices,
|
|
&dwLocalTapiApiVersion,
|
|
&LineInitializeExParams
|
|
);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("lineInitializeEx failed with %ld"),
|
|
dwRes);
|
|
goto exit;
|
|
}
|
|
for (dwIndex = 0; dwIndex < dwTapiDevices; dwIndex++)
|
|
{
|
|
//
|
|
// For each device, get it's caps
|
|
//
|
|
LPLINEDEVCAPS lpLineCaps = SmartLineGetDevCaps (hLineApp, dwIndex, dwLocalTapiApiVersion);
|
|
if (!lpLineCaps)
|
|
{
|
|
//
|
|
// Couldn't get the device capabilities
|
|
//
|
|
dwRes = GetLastError ();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("SmartLineGetDevCaps failed with %ld"),
|
|
dwRes);
|
|
continue;
|
|
}
|
|
if ((
|
|
(lpLineCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM) &&
|
|
IsDeviceModem(lpLineCaps, lpctstrUnimodemTspName)
|
|
)
|
|
||
|
|
(lpLineCaps->dwMediaModes & LINEMEDIAMODE_G3FAX)
|
|
)
|
|
{
|
|
//
|
|
// This is a fax-capable device
|
|
//
|
|
dwCount++;
|
|
}
|
|
MemFree (lpLineCaps);
|
|
}
|
|
dwRes = ERROR_SUCCESS;
|
|
|
|
exit:
|
|
if (hLineApp)
|
|
{
|
|
lineShutdown (hLineApp);
|
|
}
|
|
if (ERROR_SUCCESS == dwRes)
|
|
{
|
|
*lpdwCount = dwCount;
|
|
}
|
|
return dwRes;
|
|
} // GetFaxCapableTapiLinesCount
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|