|
|
// Copyright (c) 1995, Microsoft Corporation, all rights reserved
//
// nwc.c
// Remote Access Common Dialog APIs
// NetWare Compatible warning dialog
//
// 12/06/95 Steve Cobb
#include "rasdlgp.h"
//----------------------------------------------------------------------------
// Local datatypes
//----------------------------------------------------------------------------
// NetWare Compatible warning dialog argument block.
//
typedef struct _NWARGS { // Caller's arguments to the stub API.
//
BOOL fPosition; LONG xDlg; LONG yDlg; PBFILE* pFile; PBENTRY* pEntry; } NWARGS;
// NetWare Compatible warning dialog context block.
//
typedef struct _NWINFO { // Stub API arguments.
//
NWARGS* pArgs;
// Handle of this dialog and some of it's controls.
//
HWND hwndDlg; HWND hwndCb; } NWINFO;
//----------------------------------------------------------------------------
// Local prototypes (alphabetically)
//----------------------------------------------------------------------------
BOOL NwConnectionDlg( IN HWND hwndOwner, IN BOOL fPosition, IN LONG xDlg, IN LONG yDlg, IN PBFILE* pFile, IN PBENTRY* pEntry );
INT_PTR CALLBACK NwDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL NwCommand( IN NWINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
BOOL NwInit( IN HWND hwndDlg, IN NWARGS* pArgs );
VOID NwTerm( IN HWND hwndDlg );
TCHAR* GetNwProviderName( void );
BOOL IsActiveNwLanConnection( void );
//----------------------------------------------------------------------------
// Entry point
//----------------------------------------------------------------------------
BOOL NwConnectionCheck( IN HWND hwndOwner, IN BOOL fPosition, IN LONG xDlg, IN LONG yDlg, IN PBFILE* pFile, IN PBENTRY* pEntry )
// Warns about active NetWare LAN connections being blown away, if
// indicated. 'HwndOwner' is the owning window if a dialog is necessary.
// 'FPosition', 'xDlg', and 'yDlg' are the dialog positioning parameters
// as specified to the calling API. 'PFile' and 'pEntry' are the open
// phonebook file and entry to check.
//
// Note: This call will write the phonebook file if user checks the "not
// in the future" checkbox.
//
// Returns true if warning is not necessary or user pressed OK, false if
// user presses cancel.
//
{ TRACE("NwConnectionCheck");
// Warn about active NetWare LAN connections being blown away, if
// indicated.
//
if (!pEntry->fSkipNwcWarning && pEntry->dwBaseProtocol == BP_Ppp && (g_pGetInstalledProtocolsEx(NULL, FALSE, TRUE, FALSE) & NP_Ipx) && !(pEntry->dwfExcludedProtocols & NP_Ipx) && IsActiveNwLanConnection()) { if (!NwConnectionDlg( hwndOwner, fPosition, xDlg, yDlg, pFile, pEntry )) { return FALSE; } }
return TRUE; }
//----------------------------------------------------------------------------
// Netware dialog routines (alphabetically following stub and DlgProc)
//----------------------------------------------------------------------------
BOOL NwConnectionDlg( IN HWND hwndOwner, IN BOOL fPosition, IN LONG xDlg, IN LONG yDlg, IN PBFILE* pFile, IN PBENTRY* pEntry )
// Pops up a warning about active NWC LAN connections being blown away.
// 'HwndOwner' is the owning window if a dialog is necessary.
// 'FPosition', 'xDlg', and 'yDlg' are the dialog positioning parameters
// as specified to the calling API. 'PFile' and 'pEntry' are the open
// phonebook file and entry to check.
//
// Note: This call will write the phonebook file if user checks the "not
// in the future" checkbox.
//
// Returns true if user pressed OK, false if user presses cancel.
//
{ INT_PTR nStatus; NWARGS args;
TRACE( "NwConnectionDlg" );
// Initialize dialog argument block.
//
args.fPosition = fPosition; args.xDlg = xDlg; args.yDlg = yDlg; args.pFile = pFile; args.pEntry = pEntry;
// Run the dialog.
//
nStatus = DialogBoxParam( g_hinstDll, MAKEINTRESOURCE( DID_NW_NwcConnections ), hwndOwner, NwDlgProc, (LPARAM )&args );
if (nStatus == -1) { ErrorDlg( hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); nStatus = FALSE; }
return (nStatus) ? TRUE : FALSE; }
INT_PTR CALLBACK NwDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Netware warning dialog. Parameters and
// return value are as described for standard windows 'DialogProc's.
//
{ #if 0
TRACE4( "NwDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD )hwnd, (DWORD )unMsg, (DWORD )wparam, (DWORD )lparam ); #endif
switch (unMsg) { case WM_INITDIALOG: { return NwInit( hwnd, (NWARGS* )lparam ); }
case WM_COMMAND: { NWINFO* pInfo = (NWINFO* )GetWindowLongPtr( hwnd, DWLP_USER ); ASSERT(pInfo);
return NwCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); }
case WM_DESTROY: { NwTerm( hwnd ); break; } }
return FALSE; }
BOOL NwCommand( IN NWINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl )
// Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification'
// is the notification code of the command. 'wId' is the control/menu
// identifier of the command. 'HwndCtrl' is the control window handle of
// the command.
//
// Returns true if processed message, false otherwise.
//
{ TRACE3( "NwCommand(n=%d,i=%d,c=$%x)", (DWORD )wNotification, (DWORD )wId, (ULONG_PTR )hwndCtrl );
switch (wId) { case IDOK: { TRACE( "OK pressed" );
if (Button_GetCheck( pInfo->hwndCb )) { DWORD dwErr;
// Save user's preference to skip this warning popup in the
// phonebook.
//
pInfo->pArgs->pEntry->fSkipNwcWarning = TRUE; pInfo->pArgs->pEntry->fDirty = TRUE; dwErr = WritePhonebookFile( pInfo->pArgs->pFile, NULL ); if (dwErr != 0) { ErrorDlg( pInfo->hwndDlg, SID_OP_WritePhonebook, dwErr, NULL ); } }
EndDialog( pInfo->hwndDlg, TRUE ); return TRUE; }
case IDCANCEL: { TRACE( "Cancel pressed" ); EndDialog( pInfo->hwndDlg, FALSE ); return TRUE; } }
return FALSE; }
BOOL NwInit( IN HWND hwndDlg, IN NWARGS* pArgs )
// Called on WM_INITDIALOG. 'hwndDlg' is the handle of the owning window.
// 'PArgs' is caller's arguments as passed to the stub API.
//
// Return false if focus was set, true otherwise, i.e. as defined for
// WM_INITDIALOG.
//
{ DWORD dwErr; TCHAR* psz; NWINFO* pInfo;
TRACE( "NwInit" );
// Allocate the dialog context block. Initialize minimally for proper
// cleanup, then attach to the dialog window.
//
{ pInfo = Malloc( sizeof(*pInfo) ); if (!pInfo) { ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL ); EndDialog( hwndDlg, FALSE ); return TRUE; }
ZeroMemory( pInfo, sizeof(*pInfo) ); pInfo->pArgs = pArgs; pInfo->hwndDlg = hwndDlg;
SetWindowLongPtr( hwndDlg, DWLP_USER, (ULONG_PTR )pInfo ); TRACE( "Context set" ); }
pInfo->hwndCb = GetDlgItem( hwndDlg, CID_NW_CB_SkipPopup ); ASSERT( pInfo->hwndCb );
// Position the dialog per caller's instructions.
//
PositionDlg( hwndDlg, pArgs->fPosition, pArgs->xDlg, pArgs->yDlg ); SetForegroundWindow( hwndDlg );
// Add context help button to title bar.
//
AddContextHelpButton( hwndDlg );
return TRUE; }
VOID NwTerm( IN HWND hwndDlg )
// Called on WM_DESTROY. 'HwndDlg' is that handle of the dialog window.
//
{ NWINFO* pInfo = (NWINFO* )GetWindowLongPtr( hwndDlg, DWLP_USER );
TRACE( "NwTerm" );
if (pInfo) { Free( pInfo ); } }
//----------------------------------------------------------------------------
// Utility routines
//----------------------------------------------------------------------------
TCHAR* GetNwProviderName( void )
// Returns the NWC provider name from the registry or NULL if none. It's
// caller's responsibility to Free the returned string.
//
{ #define REGKEY_Nwc TEXT("SYSTEM\\CurrentControlSet\\Services\\NWCWorkstation\\networkprovider")
#define REGVAL_Name TEXT("Name")
HKEY hkey; DWORD dwErr; DWORD cb = 0; //Add this for prefix whislter bug 295921
TCHAR* psz = NULL; DWORD dwType = REG_SZ;
dwErr = RegOpenKey( HKEY_LOCAL_MACHINE, REGKEY_Nwc, &hkey );
if (dwErr == 0) { dwErr = RegQueryValueEx( hkey, REGVAL_Name, NULL, &dwType, NULL, &cb ); if (dwErr == 0) { psz = (TCHAR* )Malloc( cb ); if (psz) { dwErr = RegQueryValueEx( hkey, REGVAL_Name, NULL, &dwType, (LPBYTE )psz, &cb ); } }
RegCloseKey( hkey ); }
if (!psz || dwErr != 0 || dwType != REG_SZ) { if (psz) { Free( psz ); } return NULL; }
return psz; }
BOOL IsActiveNwLanConnection( void )
// Returns true if NWC is installed and there are redirected drive or UNC
// connections using NWC provider, false otherwise.
//
{ DWORD dwErr; DWORD cEntries; DWORD cb; TCHAR* pszProvider; BYTE ab[ 1024 ]; HANDLE hEnum = INVALID_HANDLE_VALUE; BOOL fStatus = FALSE;
do { pszProvider = GetNwProviderName(); if (!pszProvider) { break; }
dwErr = WNetOpenEnum( RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, NULL, &hEnum ); if (dwErr != NO_ERROR) { break; }
for (;;) { NETRESOURCE* pnr;
cEntries = 0xFFFFFFFF; cb = sizeof(ab); dwErr = WNetEnumResource( hEnum, &cEntries, ab, &cb ); if (!cEntries || dwErr != NO_ERROR) { break; }
for (pnr = (NETRESOURCE* )ab; cEntries--; ++pnr) { if (pnr->lpProvider && lstrcmp( pnr->lpProvider, pszProvider ) == 0) { fStatus = TRUE; break; } } } } while (FALSE);
if (hEnum != INVALID_HANDLE_VALUE) { WNetCloseEnum( hEnum ); }
if (pszProvider) { Free( pszProvider ); }
return fStatus; }
|