221 lines
4.7 KiB
C
221 lines
4.7 KiB
C
/*++
|
||
|
||
Copyright(c) 1995 Microsoft Corporation
|
||
|
||
MODULE NAME
|
||
tapiproc.c
|
||
|
||
ABSTRACT
|
||
TAPI utility routines
|
||
|
||
AUTHOR
|
||
Anthony Discolo (adiscolo) 12-Dec-1995
|
||
|
||
REVISION HISTORY
|
||
|
||
--*/
|
||
|
||
#define UNICODE
|
||
#define _UNICODE
|
||
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
|
||
#include <stdlib.h>
|
||
#include <windows.h>
|
||
#include <stdio.h>
|
||
#include <npapi.h>
|
||
#include <tapi.h>
|
||
#include <debug.h>
|
||
|
||
#include "imperson.h"
|
||
#include "radebug.h"
|
||
|
||
//
|
||
// TAPI version
|
||
//
|
||
#define TAPIVERSION 0x00020000
|
||
|
||
//
|
||
// Global variables
|
||
//
|
||
HLINEAPP hlineAppG;
|
||
DWORD dwDialingLocationErrorG;
|
||
DWORD dwDialingLocationIdG;
|
||
CRITICAL_SECTION csTapiG;
|
||
HANDLE hTapiChangeG;
|
||
|
||
//
|
||
// External variables
|
||
//
|
||
extern HINSTANCE hinstDllG;
|
||
extern IMPERSONATION_INFO ImpersonationInfoG;
|
||
|
||
|
||
DWORD
|
||
TapiGetDialingLocation(
|
||
OUT LPDWORD lpdwLocationID
|
||
)
|
||
{
|
||
DWORD dwErr, dwCurrentLocationID;
|
||
LINETRANSLATECAPS caps;
|
||
LINETRANSLATECAPS *pCaps;
|
||
|
||
//
|
||
// Get the dialing location from TAPI.
|
||
//
|
||
RtlZeroMemory(&caps, sizeof (LINETRANSLATECAPS));
|
||
caps.dwTotalSize = sizeof (LINETRANSLATECAPS);
|
||
dwErr = lineGetTranslateCaps(hlineAppG, TAPIVERSION, &caps);
|
||
if (dwErr) {
|
||
RASAUTO_TRACE1(
|
||
"TapiGetDialingLocation: lineGetTranslateCaps failed (dwErr=%d)",
|
||
dwErr);
|
||
return dwErr;
|
||
}
|
||
pCaps = (LINETRANSLATECAPS *)LocalAlloc(LPTR, caps.dwNeededSize);
|
||
if (pCaps == NULL) {
|
||
RASAUTO_TRACE("TapiGetDialingLocation: LocalAlloc failed");
|
||
return dwErr;
|
||
}
|
||
RtlZeroMemory(pCaps, sizeof (LINETRANSLATECAPS));
|
||
pCaps->dwTotalSize = caps.dwNeededSize;
|
||
dwErr = lineGetTranslateCaps(hlineAppG, TAPIVERSION, pCaps);
|
||
if (dwErr) {
|
||
RASAUTO_TRACE1(
|
||
"TapiGetDialingLocation: lineTranslateCaps failed (dwErr=%d)",
|
||
dwErr);
|
||
LocalFree(pCaps);
|
||
return dwErr;
|
||
}
|
||
dwCurrentLocationID = pCaps->dwCurrentLocationID;
|
||
LocalFree(pCaps);
|
||
|
||
RASAUTO_TRACE1(
|
||
"TapiGetDialingLocation: current dialing location is %d",
|
||
dwCurrentLocationID);
|
||
*lpdwLocationID = dwCurrentLocationID;
|
||
return dwErr;
|
||
} // TapiGetDialingLocation
|
||
|
||
|
||
|
||
DWORD
|
||
TapiCurrentDialingLocation(
|
||
OUT LPDWORD lpdwLocationID
|
||
)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
EnterCriticalSection(&csTapiG);
|
||
dwErr = dwDialingLocationErrorG;
|
||
if (!dwErr)
|
||
*lpdwLocationID = dwDialingLocationIdG;
|
||
LeaveCriticalSection(&csTapiG);
|
||
|
||
return dwErr;
|
||
} // TapiCurrentDialingLocation
|
||
|
||
|
||
|
||
VOID
|
||
ProcessTapiChangeEvent(VOID)
|
||
{
|
||
DWORD dwErr;
|
||
LINEMESSAGE msg;
|
||
|
||
dwErr = lineGetMessage(hlineAppG, &msg, 0);
|
||
if (dwErr) {
|
||
RASAUTO_TRACE1(
|
||
"ProcessTapiChangeEvent: lineGetMessage failed (dwErr=0x%x)",
|
||
dwErr);
|
||
return;
|
||
}
|
||
RASAUTO_TRACE2(
|
||
"ProcessTapiChangeEvent: dwMessageID=%d, dwParam1=%d",
|
||
msg.dwMessageID,
|
||
msg.dwParam1);
|
||
//
|
||
// Reset TAPI dialing location.
|
||
//
|
||
if (msg.dwMessageID == LINE_LINEDEVSTATE &&
|
||
msg.dwParam1 == LINEDEVSTATE_TRANSLATECHANGE)
|
||
{
|
||
EnterCriticalSection(&csTapiG);
|
||
dwDialingLocationErrorG =
|
||
TapiGetDialingLocation(&dwDialingLocationIdG);
|
||
LeaveCriticalSection(&csTapiG);
|
||
}
|
||
} // ProcessTapiChangeEvent
|
||
|
||
|
||
|
||
DWORD
|
||
TapiInitialize(VOID)
|
||
{
|
||
DWORD dwErr, dwcDevices, dwAPIVersion, dwDisp;
|
||
LINEINITIALIZEEXPARAMS lineParams;
|
||
|
||
//
|
||
// Create a mutex to serialize access
|
||
// to the dialing location variable.
|
||
//
|
||
InitializeCriticalSection(&csTapiG);
|
||
//
|
||
// Initialize TAPI.
|
||
//
|
||
dwAPIVersion = TAPIVERSION;
|
||
RtlZeroMemory(&lineParams, sizeof (lineParams));
|
||
lineParams.dwTotalSize = sizeof (lineParams);
|
||
lineParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
|
||
dwErr = lineInitializeEx(
|
||
&hlineAppG,
|
||
hinstDllG,
|
||
NULL,
|
||
TEXT("rasauto.dll"),
|
||
&dwcDevices,
|
||
&dwAPIVersion,
|
||
&lineParams);
|
||
if (dwErr) {
|
||
RASAUTO_TRACE1(
|
||
"TapiInitalize: lineInitializeEx failed (dwErr=0x%x)",
|
||
dwErr);
|
||
return dwErr;
|
||
}
|
||
//
|
||
// Save the event returned from TAPI that
|
||
// will get signaled on state changes.
|
||
//
|
||
hTapiChangeG = lineParams.Handles.hEvent;
|
||
//
|
||
// Get the current dialing location.
|
||
//
|
||
dwDialingLocationErrorG = TapiGetDialingLocation(&dwDialingLocationIdG);
|
||
RASAUTO_TRACE("TapiInitialize: initialization done");
|
||
|
||
return 0;
|
||
} // TapiInitialilze
|
||
|
||
|
||
|
||
VOID
|
||
TapiShutdown(VOID)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
//
|
||
// Shutdown TAPI.
|
||
//
|
||
dwErr = lineShutdown(hlineAppG);
|
||
if (dwErr) {
|
||
RASAUTO_TRACE1(
|
||
"TapiMessageLoopThread: lineShutdown failed (dwErr=%d)",
|
||
dwErr);
|
||
}
|
||
|
||
DeleteCriticalSection(&csTapiG);
|
||
RASAUTO_TRACE("TapiShutdown: shutting down");
|
||
} // TapiShutdown
|
||
|