/*++ 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 #include #include #include #include #include #include #include #include #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