|
|
//+----------------------------------------------------------------------------
//
// File: lanawait.cpp
//
// Module: CMDIAL32.DLL
//
// Synopsis: Implementation for the workaround to make CM wait for DUN to
// register its LANA for an internet connection before beginning
// the tunnel portion of a double dial connection.
//
// Copyright (c) 1996-1999 Microsoft Corporation
//
// Author: quintinb Created Header 08/17/99
//
//+----------------------------------------------------------------------------
#include "cmmaster.h"
const TCHAR* const c_pszCmEntryLanaTimeout = TEXT("LanaTimeout");
//+---------------------------------------------------------------------------
//
// Function: LanaWait
//
// Synopsis: Peform the LANA wait/timeout.
//
// Arguments: pArgs [the ptr to ArgsStruct]
// hwndMainDlg - hwnd of the main dlg
//
// Returns: BOOL TRUE=succes, FALSE=wait not performed.
//
//----------------------------------------------------------------------------
BOOL LanaWait( ArgsStruct *pArgs, HWND hwndMainDlg ) { BOOL fLanaDone = FALSE; BOOL fLanaAbort = FALSE;
if (IsLanaWaitEnabled()) { CMTRACE(TEXT("Performing Lana Wait!!"));
WNDCLASSEX WndClass; HWND hWnd; ZeroMemory(&WndClass, sizeof(WNDCLASSEX));
WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.lpfnWndProc = (WNDPROC)LanaWaitWndProc; WndClass.hInstance = g_hInst; WndClass.hIcon = LoadIconU(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursorU(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH); WndClass.lpszClassName = LANAWAIT_CLASSNAME;
MYVERIFY(RegisterClassExU(&WndClass));
if (!(hWnd = CreateWindowExU(0, LANAWAIT_CLASSNAME, LANAWAIT_WNDNAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)NULL, NULL, g_hInst, (LPVOID)pArgs))) { CMTRACE1(TEXT("CreateWindow LANA failed, LE=0x%x"), GetLastError()); } else { MSG msg; ZeroMemory(&msg, sizeof(MSG));
while (GetMessageU(&msg, NULL, 0, 0)) { //
// Since we have no accelerators, no need to call
// TranslateAccelerator here.
//
TranslateMessage(&msg); DispatchMessageU(&msg);
//
// If we received a msg from the top-level
// window, then the dial is being canceled
//
if (pArgs->uLanaMsgId == msg.message) { fLanaAbort = TRUE; DestroyWindow(hWnd); //break;
} } UnregisterClassU(LANAWAIT_CLASSNAME, g_hInst); SetActiveWindow(hwndMainDlg);
//
// once we've run it once, we don't need to run it again
// until after reboot or switch to a different domain.
// it's safe to just run it every time.
//
if (!fLanaAbort) { fLanaDone = TRUE; } } } else { CMTRACE(TEXT("Lana Wait is disabled")); fLanaDone = TRUE; }
return fLanaDone; }
//+----------------------------------------------------------------------------
// Function LanaWaitWndProc
//
// Synopsis Window function for the main app. Waits for device change
// message. This funcion will time out if device change is
// not recieived in LANA_TIMEOUT_DEFAULT secs.
//
//-----------------------------------------------------------------------------
LRESULT APIENTRY LanaWaitWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch (message) { case WM_CREATE: { UINT uiTimeout = ((ArgsStruct *)((CREATESTRUCT *)lParam)->lpCreateParams) ->piniService->GPPI(c_pszCmSection, c_pszCmEntryLanaTimeout, LANA_TIMEOUT_DEFAULT);
CMTRACE1(TEXT("Lana timeout time = %u ms"), uiTimeout*1000); //
// set up the timer
//
SetTimer(hWnd, LANA_TIME_ID, uiTimeout*1000, (TIMERPROC)NULL); } break;
//
// This is the message we are waiting for the LANA is registered
//
case WM_DEVICECHANGE: { PDEV_BROADCAST_HDR pDev; PDEV_BROADCAST_NET pNetDev; CMTRACE(TEXT("Lana - WM_DEVICECHANGE"));
if (wParam == DBT_DEVICEARRIVAL) { pDev = (PDEV_BROADCAST_HDR) lParam; if (pDev->dbch_devicetype != DBT_DEVTYP_NET) { break; }
pNetDev = (PDEV_BROADCAST_NET) pDev; if (!(pNetDev->dbcn_flags & DBTF_SLOWNET)) { break; }
CMTRACE(TEXT("Got Lana registration!!!")); //
// Must wait for Broadcast to propigate to all windows.
//
KillTimer(hWnd, LANA_TIME_ID);
CMTRACE1(TEXT("Lana propagate time = %u ms"), LANA_PROPAGATE_TIME_DEFAULT*1000);
SetTimer(hWnd, LANA_TIME_ID, LANA_PROPAGATE_TIME_DEFAULT*1000, (TIMERPROC)NULL); } } break;
// If we get this message we timed out on the device change
case WM_TIMER: if (wParam == LANA_TIME_ID) { CMTRACE(TEXT("Killing LANA window...")); DestroyWindow(hWnd); } break; case WM_DESTROY: KillTimer(hWnd, LANA_TIME_ID); PostQuitMessage(0); break; default: return DefWindowProcU(hWnd, message, wParam, lParam); }
return 0; }
//+----------------------------------------------------------------------------
// Function IsLanaWaitEnabled
//
// Synopsis Check to see if the lana wait is enabled. It's enabled if
// reg key value has a non-zero value.
//
// Arguments NONE
//
// Return TRUE - enabled
// FALSE - disabled
//
//-----------------------------------------------------------------------------
BOOL IsLanaWaitEnabled() { BOOL fLanaWaitEnabled = FALSE; HKEY hKeyCm; DWORD dwType; DWORD dwSize = sizeof(DWORD);
if (RegOpenKeyExU(HKEY_LOCAL_MACHINE, c_pszRegCmRoot, 0, KEY_QUERY_VALUE , &hKeyCm) == ERROR_SUCCESS) { LONG lResult = RegQueryValueExU(hKeyCm, ICM_REG_LANAWAIT, NULL, &dwType, (BYTE*)&fLanaWaitEnabled, &dwSize);
if ((lResult == ERROR_SUCCESS) && (dwType == REG_DWORD) && (dwSize == sizeof(DWORD)) && fLanaWaitEnabled) { fLanaWaitEnabled = TRUE; }
RegCloseKey(hKeyCm); }
return fLanaWaitEnabled; }
|