|
|
//Copyright (c) 1998 - 1999 Microsoft Corporation
/*******************************************************************************
* * ewsdlg.cpp * * implementation of CEditWinStationDlg dialog class * * copyright notice: Copyright 1995, Citrix Systems Inc. * * $Author: thanhl $ Butch Davis * * $Log: N:\NT\PRIVATE\UTILS\CITRIX\WINUTILS\TSCFG\VCS\EWSDLG.CPP $ * * Rev 1.51 04 May 1998 13:14:50 thanhl * MS bug#2090 fix * * Rev 1.50 18 Apr 1998 15:31:18 donm * Added capability bits * * Rev 1.49 Feb 21 1998 12:58:56 grega * * * Rev 1.47 28 Jan 1998 14:08:36 donm * sets default encryption and grays out control properly * * Rev 1.46 13 Jan 1998 14:08:26 donm * gets encryption levels from extension DLL * * Rev 1.45 10 Dec 1997 15:59:20 donm * added ability to have extension DLLs * * Rev 1.44 16 Sep 1997 09:16:30 butchd * delayed network transport error till OnOK * * Rev 1.43 29 Jul 1997 11:10:54 butchd * Don't allow editing of Max WinStation Count during rename * * Rev 1.42 15 Jul 1997 17:08:34 thanhl * Add support for Required PDs * * Rev 1.41 27 Jun 1997 15:58:26 butchd * Registry changes for Wds/Tds/Pds/Cds * * Rev 1.40 19 Jun 1997 19:22:14 kurtp * update * * Rev 1.39 18 Jun 1997 15:13:32 butchd * Hydrix split * * Rev 1.38 19 May 1997 14:34:42 butchd * ifdef out NASICALL dependancies * * Rev 1.37 03 May 1997 19:06:28 butchd * look out for RAS-configured modems * * Rev 1.36 25 Apr 1997 11:07:18 butchd * update * * Rev 1.35 25 Mar 1997 09:00:04 butchd * update * * Rev 1.34 21 Mar 1997 16:26:10 butchd * update * * Rev 1.33 11 Mar 1997 15:37:18 donm * update * * Rev 1.32 03 Mar 1997 17:14:24 butchd * update * * Rev 1.31 28 Feb 1997 17:59:32 butchd * update * * Rev 1.30 18 Dec 1996 16:02:04 butchd * update * * Rev 1.29 15 Oct 1996 09:11:12 butchd * update * *******************************************************************************/
/*
* include files */ #include "stdafx.h"
#include "wincfg.h"
//#include <citrix\nasicall.h>// for InitializeNASIPortNames() NASI enum call
#include <hydra\oemtdapi.h>// for OemTdxxx APIs
#include "appsvdoc.h"
#include "ewsdlg.h"
#include "atdlg.h"
#include "anasidlg.h"
#define INITGUID
#include "objbase.h"
#include "initguid.h"
#include <netcfgx.h>
#include "devguid.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__; #endif
extern CWincfgApp *pApp; extern "C" LPCTSTR WinUtilsAppName; extern "C" HWND WinUtilsAppWindow; extern "C" HINSTANCE WinUtilsAppInstance;
/*
* Global command line variables. */ extern USHORT g_Install; extern USHORT g_Add; extern WDNAME g_szType; extern PDNAME g_szTransport; extern ULONG g_ulCount;
#define RELEASEPTR(iPointer) if(iPointer) \
{ \ iPointer->Release(); \ iPointer = NULL; \ } ////////////////////////////////////////////////////////////////////////////////
// CEditWinStationDlg class construction / destruction, implementation
/*******************************************************************************
* * CEditWinStationDlg - CEditWinStationDlg constructor * * ENTRY: * pDoc (input) * Points to CAppServerDoc; current document. * EXIT: * (Refer to MFC CDialog::CDialog documentation) * ******************************************************************************/
CEditWinStationDlg::CEditWinStationDlg( CAppServerDoc *pDoc ) : CBaseDialog(CEditWinStationDlg::IDD), m_pDoc(pDoc), m_bAsyncListsInitialized(FALSE), m_nPreviousMaxTAPILineNumber(-1), m_nCurrentMaxTAPILineNumber(-1), m_nComboBoxIndexOfLatestTAPIDevice(-1), m_pCurrentTdList(NULL), m_pCurrentPdList(NULL) { //{{AFX_DATA_INIT(CEditWinStationDlg)
//}}AFX_DATA_INIT
/*
* Zero-initialize the NASICONFIG member structure. */ memset(&m_NASIConfig, 0, sizeof(m_NASIConfig));
} // end CEditWinStationDlg::CEditWinStationDlg
////////////////////////////////////////////////////////////////////////////////
// CEditWinStationDlg operations
/*******************************************************************************
* * RefrenceAssociatedLists - * CEditWinStationDlg member function: protected operation * * Set the m_pCurrentTdList and m_pCurrentPdList members to point to the * lists associated with the currently selected Wd (Type). * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::RefrenceAssociatedLists() { int index, count, currentcount; POSITION pos;
CComboBox *pWdNameBox = (CComboBox *)GetDlgItem(IDC_WDNAME);
if ( (index = pWdNameBox->GetCurSel()) != CB_ERR ) {
if ( (count = pWdNameBox->GetItemData( index )) != CB_ERR ) {
for ( currentcount = 0, pos = pApp->m_TdListList.GetHeadPosition(); pos != NULL; currentcount++ ) {
m_pCurrentTdList = (CObList *)pApp->m_TdListList.GetNext( pos ); if ( currentcount == count ) break; }
for ( currentcount = 0, pos = pApp->m_PdListList.GetHeadPosition(); pos != NULL; currentcount++ ) {
m_pCurrentPdList = (CObList *)pApp->m_PdListList.GetNext( pos ); if ( currentcount == count ) break; } } }
} // end RefrenceAssociatedLists
/*******************************************************************************
* * InitializeTransportComboBox - * CEditWinStationDlg member function: protected operation * * Initialize the Transport combo box with Tds available for the * currently selected Wd (Type). * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::InitializeTransportComboBox() { CComboBox *pTdNameBox = (CComboBox *)GetDlgItem(IDC_TDNAME); POSITION pos;
/*
* (re)initialize the Transport combo-box. */ pTdNameBox->ResetContent();
for ( pos = m_pCurrentTdList->GetHeadPosition(); pos != NULL; ) {
PPDLOBJECT pObject = (PPDLOBJECT)m_pCurrentTdList->GetNext( pos );
pTdNameBox->AddString( pObject->m_PdConfig.Data.PdName ); }
/*
* Select the currently specified PD in the combo-box. If that fails, * select the first in the list. */ if ( pTdNameBox->SelectString(-1, m_WSConfig.Pd[0].Create.PdName) == CB_ERR ) pTdNameBox->SetCurSel(0);
} // end InitializeTransportComboBox
/*******************************************************************************
* * InitializeLists - CEditWinStationDlg member function: protected operation * * Initialize the list box(es) to be used with the specified Pd. * * ENTRY: * pPdConfig (input) * Pointer to PDCONFIG3 structure specifying the Pd. * * EXIT: * (BOOL) TRUE if the Pd list box(es) were initialized. FALSE if error. * * FUTURE: For now, FALSE will indicate that there was an error * initializing the device list for the PD, the cause of which is * saved for GetLastError(). Additional status codes and/or * a queue of error conditions will need to be returned as the * additional FUTURE actions defined below are implemented. * ******************************************************************************/
BOOL CEditWinStationDlg::InitializeLists( PPDCONFIG3 pPdConfig ) { switch( pPdConfig->Data.SdClass ) {
case SdAsync:
/*
* Initialize the Device combo-box. */ if ( !InitializeAsyncLists(pPdConfig) ) return(FALSE);
break;
case SdNetwork: /*
* Initialize the LANADAPTER combo-box. */ if ( !InitializeNetworkLists(pPdConfig) ) return(FALSE);
break;
case SdNasi: /*
* NOTE: we don't initalize the NASI Port Name list at this * time, since it will be initialized at various times during * the dialog activity (like when SetDefaults() is processed). */ break;
case SdOemTransport: /*
* Initialize the DEVICE combo-box. */ if ( !InitializeOemTdLists(pPdConfig) ) return(FALSE);
break;
default: break; }
return(TRUE);
} // end CEditWinStationDlg::InitializeLists
/*******************************************************************************
* * HandleListInitError - * CEditWinStationDlg member function: protected operation * * Output a nice explaination as to why the list initialization failed. * * ENTRY: * pPdConfig (input) * Pointer to PDCONFIG3 structure specifying the current Pd. * ListInitError (input) * Error resource id from InitializeLists * * EXIT: * ******************************************************************************/
void CEditWinStationDlg::HandleListInitError( PPDCONFIG3 pPdConfig, DWORD ListInitError ) { /*
* Output a specific message for error conditions. */ switch( pPdConfig->Data.SdClass ) {
case SdAsync: case SdNetwork: case SdNasi: ERROR_MESSAGE((ListInitError)) break;
case SdOemTransport: switch ( ListInitError ) {
case IDP_ERROR_OEMTDINIT_NOCONFIGDLL: case IDP_ERROR_OEMTDINIT_CONFIGDLLENUMERATIONFAILURE: case IDP_ERROR_PDINIT: ERROR_MESSAGE((ListInitError)) break;
case IDP_ERROR_OEMTDINIT_MISSINGCONFIGDLLENTRYPOINT: case IDP_ERROR_OEMTDINIT_CANTOPENCONFIGDLL: ERROR_MESSAGE((ListInitError, pPdConfig->ConfigDLL)) break; } break; }
} // end CEditWinStationDlg::HandleListInitError
/*******************************************************************************
* * HandleSetFieldsError - * CEditWinStationDlg member function: protected operation * * Output a nice explaination as to why the setting the Pd fields failed. * * ENTRY: * pPdConfig (input) * Pointer to PDCONFIG3 structure specifying the current Pd. * nId (input) * Specifies control Id of field in error. * * EXIT: * ******************************************************************************/
void CEditWinStationDlg::HandleSetFieldsError( PPDCONFIG3 pPdConfig, int nId ) { /*
* Output protocol-specific error message. */ switch( pPdConfig->Data.SdClass ) {
case SdAsync: switch ( nId ) {
case IDC_ASYNC_DEVICENAME: { TCHAR szDecoratedName[DEVICENAME_LENGTH + MODEMNAME_LENGTH + 1];
FormDecoratedAsyncDeviceName( szDecoratedName, &(m_WSConfig.Pd[0].Params.Async) ); ERROR_MESSAGE(( IDP_ERROR_INVALIDDEVICE, szDecoratedName )) } break;
default: break; } break;
case SdNetwork: switch ( nId ) {
case IDC_NETWORK_LANADAPTER: ERROR_MESSAGE(( (pPdConfig->Data.PdFlag & PD_LANA) ? IDP_ERROR_INVALIDNETBIOSLANA : IDP_ERROR_INVALIDNETWORKADAPTER, m_WSConfig.Pd[0].Params.Network.LanAdapter )) break;
default: break; } break;
case SdOemTransport: switch ( nId ) {
case IDC_OEMTD_DEVICENAME: ERROR_MESSAGE(( IDP_ERROR_INVALIDDEVICE, m_WSConfig.Pd[0].Params.OemTd.DeviceName )) break;
default: break; } break; }
} // end CEditWinStationDlg::HandleSetFieldsError
/*******************************************************************************
* * InitializeAsyncLists - CEditWinStationDlg member function: protected operation * * Initialize the Async Device combo-box with the device strings * associated with the specified Async PD DLL. * * ENTRY: * pPdConfig (input) * Pointer to PDCONFIG3 structure specifying the Pd. * EXIT: * (BOOL) TRUE if the Device combo-box was initialized. * FALSE if error (code set for GetLastError). * * If the highest-numbered TAPI line device has been added to the combo * box, the m_nComboBoxIndexOfLatestTAPIDevice member will be set to the * combo-box index of that item. It will be -1 if the combo-box does * not contain the highest numbered TAPI line device. * * This routine also saves the current max TAPI line number * (m_nCurrentMaxTAPILineNumber) to the previous max TAPI line number * (m_nPreviousMaxTAPILineNumber) and will recalculate the current max * number so the caller can determine if the enumeration found a new TAPI * line device by checking for m_nCurrentMaxTAPILineNumber > * m_nPreviousMaxTAPILineNumber. * ******************************************************************************/
BOOL CEditWinStationDlg::InitializeAsyncLists( PPDCONFIG3 pPdConfig ) { PPDPARAMS pPdParams; char *pBuffer = NULL; ULONG i, Entries; CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_ASYNC_DEVICENAME); int index, nLoopIndexOfLatestTAPIDevice = -1; TCHAR szDecoratedName[DEVICENAME_LENGTH + MODEMNAME_LENGTH + 1];
/*
* If the Async lists have already been initialized, we don't need to * do it again, since there is only one Async Transport for WinStations. * This is not the case for Network WinStations, as there are different * network transport types. */ if ( m_bAsyncListsInitialized ) return(TRUE);
/*
* Clear the Device combo-box. */ pDevice->ResetContent();
/*
* Perform the device enumeration. */ if ( (pBuffer = (char *)WinEnumerateDevices( this->GetSafeHwnd(), pPdConfig, &Entries, g_Install ? TRUE : FALSE )) == NULL ) { SetLastError(IDP_ERROR_ASYNCDEVICEINIT); goto BadEnumerate; }
/*
* Set previous max TAPI line number to current max TAPI line number, * initialize current max TAPI line number and latest TAPI device combo-box * index, and loop to initialize the combo-box. */ m_nPreviousMaxTAPILineNumber = m_nCurrentMaxTAPILineNumber; m_nCurrentMaxTAPILineNumber = m_nComboBoxIndexOfLatestTAPIDevice = -1; for ( i = 0, pPdParams = (PPDPARAMS)pBuffer; i < Entries; i++, pPdParams++ ) {
/*
* Form decorated name. */ FormDecoratedAsyncDeviceName( szDecoratedName, &(pPdParams->Async) );
/*
* If this device is a TAPI modem and it's line number (in BaudRate field) * is greater than the current max line number, set it's line number as max and * save this loop index. */ if ( *(pPdParams->Async.ModemName) && (int(pPdParams->Async.BaudRate) > m_nCurrentMaxTAPILineNumber) ) {
m_nCurrentMaxTAPILineNumber = int(pPdParams->Async.BaudRate); nLoopIndexOfLatestTAPIDevice = i; }
/*
* Don't add this device to the list if it is already in use by a * WinStation other than the current one. */ if ( !((CAppServerDoc *)m_pDoc)-> IsAsyncDeviceAvailable( pPdParams->Async.DeviceName, (m_DlgMode == EWSDlgCopy) ? TEXT("") : m_pWSName) ) continue;
/*
* Insert the name into the combo-box if it's not a TAPI modem * or it is a TAPI modem that's not being used by RAS and it's * port is currently available. */ if ( !*(pPdParams->Async.ModemName) || (!pPdParams->Async.Parity && (pDevice->FindStringExact(-1, pPdParams->Async.DeviceName) != CB_ERR)) ) {
index = CBInsertInstancedName( szDecoratedName, pDevice ); if ( (index == CB_ERR) || (index == CB_ERRSPACE) ) goto BadAdd; }
/*
* If this device is a modem, make sure that the raw port this * device is configured on is not present in the list. This will * also take care of removing the raw port for TAPI modems that are * configured for use by RAS, in which case neither the configured. * TAPI modem(s) or raw port will be present in the list. */ if ( *(pPdParams->Async.ModemName) && ((index = pDevice->FindStringExact( -1, pPdParams->Async.DeviceName )) != CB_ERR) ) pDevice->DeleteString(index); }
/*
* Always make sure that the currently configured device is in * the list. */ if ( *(m_WSConfig.Pd[0].Params.Async.DeviceName) ) {
FormDecoratedAsyncDeviceName( szDecoratedName, &(m_WSConfig.Pd[0].Params.Async) );
if ( (index = pDevice->FindStringExact( -1, szDecoratedName )) == CB_ERR ) {
index = CBInsertInstancedName( szDecoratedName, pDevice ); if ( (index == CB_ERR) || (index == CB_ERRSPACE) ) goto BadAdd; } }
/*
* If the highest line-numbered TAPI device that was added to * the combo-box, find and save it's index in * m_nComboBoxIndexOfLatestTAPIDevice. */ if ( nLoopIndexOfLatestTAPIDevice > -1 ) {
pPdParams = &((PPDPARAMS)pBuffer)[nLoopIndexOfLatestTAPIDevice];
FormDecoratedAsyncDeviceName( szDecoratedName, &(pPdParams->Async) ); if ( (index = pDevice->FindStringExact(-1, szDecoratedName)) != CB_ERR ) m_nComboBoxIndexOfLatestTAPIDevice = index; }
/*
* Free the enumeration buffer and return success. */ VERIFY( LocalFree(pBuffer) == NULL ); m_bAsyncListsInitialized = TRUE; return(TRUE);
/*==============================================================================
* Error returns *============================================================================*/ BadAdd: LocalFree(pBuffer); SetLastError(IDP_ERROR_PDINIT); BadEnumerate: return(FALSE);
} // end CEditWinStationDlg::InitializeAsyncLists
/*******************************************************************************
* * InitializeNetworkLists - * CEditWinStationDlg member function: protected operation * * Initialize the Network Lan Adapter combo-box with the network adapter * strings and ordinal values associated with the specified Network PD DLL. * * ENTRY: * pPdConfig (input) * Pointer to PDCONFIG3 structure specifying the Pd. * * EXIT: * (BOOL) TRUE if the Lan Adapter combo-box was initialized. * FALSE if error (code set for GetLastError) * ******************************************************************************/
BOOL CEditWinStationDlg::InitializeNetworkLists( PPDCONFIG3 pPdConfig ) {
BOOL bResult = 0; CComboBox *pLanAdapter = (CComboBox *)GetDlgItem(IDC_NETWORK_LANADAPTER); /*
* Clear the Lan Adapter combo-box. */ pLanAdapter->ResetContent();
bResult = AddNetworkDeviceNameToList(pPdConfig,pLanAdapter);
return(TRUE); //We are returning TRUE always as we atleast return "All Lan Adapters"
} // end CEditWinStationDlg::InitializeNetworkLists
/*******************************************************************************
* * InitializeNASIPortNames - * CEditWinStationDlg member function: protected operation * * Initialize the NASI Port Name combo-box with the NASI Port strings, * based on the current NASICONFIG UserName, Password, FileServer, * and GlobalSession settings. * * NOTE: we only perform this initialization if any of the above settings * have changed since the last time this function was called. * * ENTRY: * pNASIConfig (input) * Pointer to NASICONFIG structure for the current NASI WinStation Set. * * EXIT: * (BOOL) TRUE if the Port Name combo-box was initialized (or not needed); * FALSE if error (code set for GetLastError) * ******************************************************************************/
// local helper function StripUndies(): strips trailing underscores from
// names returned by NCS enumeration calls.
void StripUndies( PBYTE String, ULONG Length ) { LONG i;
for ( i = Length-2; i > 0; i-- ) { if ( String[i] == '_' ) String[i] = '\0'; else break; } }
BOOL CEditWinStationDlg::InitializeNASIPortNames( PNASICONFIG pNASIConfig ) { #ifdef NASI
PORTQUERY PortQuery; NCS_ENUMERATE_HANDLE hEnum; int index; ULONG Status; #endif // NASI
BOOL bReturn = TRUE; CComboBox *pPortName = (CComboBox *)GetDlgItem(IDC_NASI_PORTNAME);
/*
* Only do this if any of the 'input' settings have changed. */
if ( !lstrcmp(m_NASIConfig.UserName, pNASIConfig->UserName) && !lstrcmp(m_NASIConfig.PassWord, pNASIConfig->PassWord) && !lstrcmp(m_NASIConfig.FileServer, pNASIConfig->FileServer) && m_NASIConfig.GlobalSession == pNASIConfig->GlobalSession ) {
return(TRUE); }
/*
* Update the saved input settings. */ lstrcpy(m_NASIConfig.UserName, pNASIConfig->UserName); lstrcpy(m_NASIConfig.PassWord, pNASIConfig->PassWord); lstrcpy(m_NASIConfig.FileServer, pNASIConfig->FileServer); m_NASIConfig.GlobalSession = pNASIConfig->GlobalSession;
/*
* Clear the Port Name combo-box. */ pPortName->ResetContent();
#ifdef NASI
/*
* Perform NASI port enumeration */ if ( !(Status = NCSOpenEnumerate( &hEnum, (PBYTE)pNASIConfig->UserName, (PBYTE)pNASIConfig->PassWord, (PBYTE)pNASIConfig->FileServer, pNASIConfig->GlobalSession ? TRUE : FALSE )) ) { while ( !Status ) { Status = NCSEnumerate(hEnum, &PortQuery);
if ( !Status ) { StripUndies(PortQuery.abSpecific, sizeof(PortQuery.abSpecific)); index = pPortName->AddString((LPTSTR)PortQuery.abSpecific);
if ( (index == CB_ERR) || (index == CB_ERRSPACE) ) { SetLastError(IDP_ERROR_PDINIT); bReturn = FALSE; break; } } }
NCSCloseEnumerate(hEnum); } #endif // NASI
/*
* Set the Port Name combo-box selection. Default to the * first item in the list (if any) if no SpecificName (Port Name) * is defined. */ if ( !*(pNASIConfig->SpecificName) ) { pPortName->SetCurSel(0); } else { pPortName->SetWindowText(pNASIConfig->SpecificName); }
return(bReturn);
} // end CEditWinStationDlg::InitializeNASIPortNames
/*******************************************************************************
* * InitializeOemTdLists - * CEditWinStationDlg member function: protected operation * * Initialize the Oem Transport Device combo-box with the device strings * returned by the Oem configuration helper DLL * * ENTRY: * pPdConfig (input) * Pointer to PDCONFIG3 structure specifying the Pd. * * EXIT: * (BOOL) TRUE if the device combo-box was initialized. * FALSE if error (code set for GetLastError) * ******************************************************************************/
BOOL CEditWinStationDlg::InitializeOemTdLists( PPDCONFIG3 pPdConfig ) { BOOL bStatus = FALSE; CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_OEMTD_DEVICENAME); HMODULE hMod; PFNOEMTDENUMERATEDEVICESW pfnOemTdEnumerateDevicesW; PFNOEMTDFREEBUFFERW pfnOemTdFreeBufferW;
/*
* Clear the Device combo-box. */ pDevice->ResetContent();
if ( *pPdConfig->ConfigDLL ) {
if ( hMod = ::LoadLibrary(pPdConfig->ConfigDLL) ) {
if ( (pfnOemTdEnumerateDevicesW = (PFNOEMTDENUMERATEDEVICESW)::GetProcAddress(hMod, OEMTDENUMERATEDEVICESW)) && (pfnOemTdFreeBufferW = (PFNOEMTDFREEBUFFERW)::GetProcAddress(hMod, OEMTDFREEBUFFERW)) ) {
LPWSTR pBuffer, pDeviceName; int index;
if ( (*pfnOemTdEnumerateDevicesW)( &pBuffer ) == ERROR_SUCCESS ) {
for ( pDeviceName = pBuffer; *pDeviceName; pDeviceName += (wcslen(pDeviceName) + 1) ) {
/*
* Don't add this device to the list if it is already in use by a * WinStation other than the current one. */ if ( !((CAppServerDoc *)m_pDoc)-> IsOemTdDeviceAvailable( pDeviceName, pPdConfig->Data.PdName, (m_DlgMode == EWSDlgCopy) ? TEXT("") : m_pWSName ) ) continue;
index = pDevice->AddString(pDeviceName); if ( (index == CB_ERR) || (index == CB_ERRSPACE) ) {
SetLastError(IDP_ERROR_PDINIT); break; } } (*pfnOemTdFreeBufferW)( pBuffer );
} else {
SetLastError(IDP_ERROR_OEMTDINIT_CONFIGDLLENUMERATIONFAILURE); }
} else {
SetLastError(IDP_ERROR_OEMTDINIT_MISSINGCONFIGDLLENTRYPOINT); } ::FreeLibrary(hMod);
} else {
SetLastError(IDP_ERROR_OEMTDINIT_CANTOPENCONFIGDLL); }
} else {
SetLastError(IDP_ERROR_OEMTDINIT_NOCONFIGDLL); } return(bStatus);
} // end CEditWinStationDlg::InitializeOemTdLists
/*******************************************************************************
* * GetSelectedPdConfig - CEditWinStationDlg member function: protected operation * * Read the PD config structure associated with the currently selected * TD in the Transport combo-box. * * ENTRY: * pPdConfig (output) * Pointer to PDCONFIG3 structure to fill. * EXIT: * nothing * ******************************************************************************/
void CEditWinStationDlg::GetSelectedPdConfig( PPDCONFIG3 pPdConfig ) { POSITION pos; CComboBox *pPd = (CComboBox *)GetDlgItem(IDC_TDNAME); PDNAME PdName; PPDLOBJECT pObject;
/*
* Fetch the currently selected TD string from the combo-box. */ pPd->GetLBText( pPd->GetCurSel(), PdName );
/*
* Traverse the PD list and obtain the PdConfig of matching PdName element. */ for ( pos = m_pCurrentTdList->GetHeadPosition(); pos != NULL; ) {
pObject = (PPDLOBJECT)m_pCurrentTdList->GetNext( pos );
if ( !lstrcmp( pObject->m_PdConfig.Data.PdName, PdName ) ) {
*pPdConfig = pObject->m_PdConfig; break; } }
} // end CEditWinStation::GetSelectedPdConfig
/*******************************************************************************
* * GetSelectedWdConfig - CEditWinStationDlg member function: protected operation * * Read the Wd config structure associated with the current * selection in the Wd combo-box. * * ENTRY: * pWdConfig (output) * Pointer to WDCONFIG2 structure to fill. * * EXIT: * nothing * ******************************************************************************/
void CEditWinStationDlg::GetSelectedWdConfig( PWDCONFIG2 pWdConfig ) { POSITION pos; CComboBox *pWd = (CComboBox *)GetDlgItem(IDC_WDNAME); WDNAME WdName; PTERMLOBJECT pObject;
/*
* Fetch the currently selected WD string from the combo-box. */ pWd->GetLBText( pWd->GetCurSel(), WdName );
/*
* Traverse the WD list and obtain the WdConfig of matching WdName element. */ for ( pos = pApp->m_WdList.GetHeadPosition(); pos != NULL; ) {
pObject = (PTERMLOBJECT)pApp->m_WdList.GetNext( pos );
if ( !lstrcmp( pObject->m_WdConfig.Wd.WdName, WdName ) ) {
*pWdConfig = pObject->m_WdConfig; break; } }
} // end CEditWinStation::GetSelectedWdConfig
PTERMLOBJECT CEditWinStationDlg::GetSelectedWdListObject() { POSITION pos; CComboBox *pWd = (CComboBox *)GetDlgItem(IDC_WDNAME); WDNAME WdName; PTERMLOBJECT pObject;
/*
* Fetch the currently selected WD string from the combo-box. */ pWd->GetLBText( pWd->GetCurSel(), WdName );
/*
* Traverse the WD list and obtain the WdConfig of matching WdName element. */ for ( pos = pApp->m_WdList.GetHeadPosition(); pos != NULL; ) {
pObject = (PTERMLOBJECT)pApp->m_WdList.GetNext( pos );
if ( !lstrcmp( pObject->m_WdConfig.Wd.WdName, WdName ) ) { return(pObject); } }
return(NULL);
} // end CEditWinStation::GetSelectedWdListObject
/*******************************************************************************
* * SetConfigurationFields - * CEditWinStationDlg member function: protected operation * * Main control function for the hiding / showing / setting of the proper * Pd-specific configuration fields. * * * ENTRY: * EXIT: * TRUE if the SetxxxFields was sucessful; FALSE otherwise. * ******************************************************************************/
BOOL CEditWinStationDlg::SetConfigurationFields() { BOOL bSetFields;
/*
* If the previous PdConfig is not the same as the current, disable and * hide all controls in the previous (currently displayed) Pd and * then enable (if not 'View' mode) and show the controls in the new * Pd. */ if ( memcmp(&m_PreviousPdConfig, &(m_WSConfig.Pd[0].Create), sizeof(m_PreviousPdConfig)) ) {
/*
* If this is not the first time that the function is called (at * dialog init time), disable/hide the current configuration fields. * These fields will already be disabled/hidden otherwise. */ if ( m_PreviousPdConfig.SdClass != SdNone ) {
/*
* Set the style of the parent dialog window to 'hidden' to suppress * the 'disable/hide' repainting of the child windows that is about * to take place. */ SetWindowLong( m_hWnd, GWL_STYLE, GetWindowLong( m_hWnd, GWL_STYLE ) & (~WS_VISIBLE) );
switch ( m_PreviousPdConfig.SdClass ) {
case SdAsync: EnableAsyncFields(FALSE); break;
case SdNetwork: EnableNetworkFields(FALSE); break;
case SdNasi: EnableNASIFields(FALSE); break;
case SdOemTransport: EnableOemTdFields(FALSE); break; }
/*
* Make the parent dialog window visible again to allow the child * window 'enable/show' painting to take place. */ SetWindowLong( m_hWnd, GWL_STYLE, GetWindowLong( m_hWnd, GWL_STYLE ) | WS_VISIBLE ); }
switch ( m_WSConfig.Pd[0].Create.SdClass ) {
case SdNone: break;
case SdAsync: EnableAsyncFields(TRUE); break;
case SdNetwork: EnableNetworkFields(TRUE); break;
case SdNasi: EnableNASIFields(TRUE); break;
case SdOemTransport: EnableOemTdFields(TRUE); break; }
}
/*
* Set the previous PdConfig to the current one. */ memcpy(&m_PreviousPdConfig, &(m_WSConfig.Pd[0].Create), sizeof(m_PreviousPdConfig));
// If the WD doesn't support any of the capabilities presented in the
// "Client Settings" dialogs, disable it's button
PTERMLOBJECT pTermObject = GetSelectedWdListObject(); if(pTermObject && !(pTermObject->m_Capabilities & WDC_CLIENT_DIALOG_MASK)) { GetDlgItem(IDC_CLIENT_SETTINGS)->EnableWindow(FALSE); }
/*
* Set the data in the configuration fields. */ switch ( m_WSConfig.Pd[0].Create.SdClass ) {
case SdNone: bSetFields = TRUE; break;
case SdAsync: bSetFields = SetAsyncFields(); break;
case SdNetwork: bSetFields = SetNetworkFields(); break;
case SdNasi: bSetFields = SetNASIFields(); break;
case SdOemTransport: bSetFields = SetOemTdFields(); break; }
/*
* Return the status of the SetxxxFields call. */ return(bSetFields);
} // end CEditWinStationDlg::SetConfigurationFields
/*******************************************************************************
* * EnableAsyncFields - CEditWinStationDlg member function: protected operation * * Enable and show or disable and hide the Async Pd configuration field's * control windows. * * ENTRY: * bEnableAndShow (input) * TRUE to enable and show the controls; FALSE to disable and hide. * EXIT: * ******************************************************************************/
void CEditWinStationDlg::EnableAsyncFields( BOOL bEnableAndShow ) { BOOL bEnableFlag = (bEnableAndShow && ((m_DlgMode != EWSDlgView) && (m_DlgMode != EWSDlgRename))) ? TRUE : FALSE; int nCmdShow = bEnableAndShow ? SW_SHOW : SW_HIDE; int id;
/*
* NOTE: must keep the Async label and control IDs consecutive for this * iteration to function properly. */ for ( id=IDL_ASYNC; id <= IDC_ASYNC_TEST; id++ ) { GetDlgItem(id)->EnableWindow(bEnableFlag); GetDlgItem(id)->ShowWindow(nCmdShow); }
/*
* The Advanced WinStation and Client Settings buttons are always * SHOWN and ENABLED for Async. */ if(bEnableAndShow) { GetDlgItem(IDC_ADVANCED_WINSTATION)->ShowWindow(SW_SHOW); GetDlgItem(IDC_ADVANCED_WINSTATION)->EnableWindow(TRUE); GetDlgItem(IDC_CLIENT_SETTINGS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_CLIENT_SETTINGS)->EnableWindow(TRUE); }
} // end CEditWinStationDlg::EnableAsyncFields
/*******************************************************************************
* * EnableNetworkFields - CEditWinStationDlg member function: protected operation * * Enable and show or disable and hide the Network Pd configuration * field's control windows. * * ENTRY: * bEnableAndShow (input) * TRUE to enable and show the controls; FALSE to disable and hide. * EXIT: * ******************************************************************************/
void CEditWinStationDlg::EnableNetworkFields( BOOL bEnableAndShow ) { BOOL bEnableFlag = (bEnableAndShow && ((m_DlgMode != EWSDlgView) && (m_DlgMode != EWSDlgRename))) ? TRUE : FALSE; int nCmdShow = bEnableAndShow ? SW_SHOW : SW_HIDE; int id;
/*
* NOTE: must keep the Network label and control IDs consecutive for this * iteration to function properly. */ for ( id=IDL_NETWORK; id <= IDC_NETWORK_INSTANCECOUNT_UNLIMITED; id++ ) { GetDlgItem(id)->EnableWindow(bEnableFlag); GetDlgItem(id)->ShowWindow(nCmdShow); }
/*
* The Advanced WinStation and Client Settings buttons are * always SHOWN and ENABLED for Network. */ if(bEnableAndShow) { GetDlgItem(IDC_ADVANCED_WINSTATION)->ShowWindow(SW_SHOW); GetDlgItem(IDC_ADVANCED_WINSTATION)->EnableWindow(TRUE); GetDlgItem(IDC_CLIENT_SETTINGS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_CLIENT_SETTINGS)->EnableWindow(TRUE); }
} // end CEditWinStationDlg::EnableNetworkFields
/*******************************************************************************
* * EnableNASIFields - CEditWinStationDlg member function: protected operation * * Enable and show or disable and hide the NASI Pd configuration * field's control windows. * * ENTRY: * bEnableAndShow (input) * TRUE to enable and show the controls; FALSE to disable and hide. * EXIT: * ******************************************************************************/
void CEditWinStationDlg::EnableNASIFields( BOOL bEnableAndShow ) { BOOL bEnableFlag = (bEnableAndShow && ((m_DlgMode != EWSDlgView) && (m_DlgMode != EWSDlgRename))) ? TRUE : FALSE; int nCmdShow = bEnableAndShow ? SW_SHOW : SW_HIDE; int id;
/*
* NOTE: must keep the NASI label and control IDs consecutive for this * iteration to function properly. */ for ( id=IDL_NASI; id <= IDC_NASI_ADVANCED; id++ ) { GetDlgItem(id)->EnableWindow(bEnableFlag); GetDlgItem(id)->ShowWindow(nCmdShow); }
/*
* The Advanced WinStation and Client Settings buttons are * always SHOWN and ENABLED for Nasi. */ if(bEnableAndShow) { GetDlgItem(IDC_ADVANCED_WINSTATION)->ShowWindow(SW_SHOW); GetDlgItem(IDC_ADVANCED_WINSTATION)->EnableWindow(TRUE); GetDlgItem(IDC_CLIENT_SETTINGS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_CLIENT_SETTINGS)->EnableWindow(TRUE); }
} // end CEditWinStationDlg::EnableNASIFields
/*******************************************************************************
* * EnableOemTdFields - CEditWinStationDlg member function: protected operation * * Enable and show or disable and hide the Oem Transport Pd configuration * field's control windows. * * ENTRY: * bEnableAndShow (input) * TRUE to enable and show the controls; FALSE to disable and hide. * EXIT: * ******************************************************************************/
void CEditWinStationDlg::EnableOemTdFields( BOOL bEnableAndShow ) { BOOL bEnableFlag = (bEnableAndShow && ((m_DlgMode != EWSDlgView) && (m_DlgMode != EWSDlgRename))) ? TRUE : FALSE; int nCmdShow = bEnableAndShow ? SW_SHOW : SW_HIDE; int id;
/*
* NOTE: must keep the Oem label and control IDs consecutive for this * iteration to function properly. */ for ( id=IDL_OEMTD; id <= IDC_OEMTD_INSTANCECOUNT_UNLIMITED; id++ ) { GetDlgItem(id)->EnableWindow(bEnableFlag); GetDlgItem(id)->ShowWindow(nCmdShow); }
/*
* If we're enabling and this is a single-instance Oem Transport, * hide the multi-instance fields. */ if ( bEnableAndShow && (m_WSConfig.Pd[0].Create.PdFlag & PD_SINGLE_INST) ) {
for ( id=IDL_OEMTD_INSTANCECOUNT; id <= IDC_OEMTD_INSTANCECOUNT_UNLIMITED; id++ ) { GetDlgItem(id)->EnableWindow(FALSE); GetDlgItem(id)->ShowWindow(SW_HIDE); } }
/*
* The Advanced WinStation and Client Settings buttons are * always SHOWN and ENABLED for Oem. */ if(bEnableAndShow) { GetDlgItem(IDC_ADVANCED_WINSTATION)->ShowWindow(SW_SHOW); GetDlgItem(IDC_ADVANCED_WINSTATION)->EnableWindow(TRUE); GetDlgItem(IDC_CLIENT_SETTINGS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_CLIENT_SETTINGS)->EnableWindow(TRUE); }
} // end CEditWinStationDlg::EnableOemTdFields
/*******************************************************************************
* * SetAsyncFields - CEditWinStationDlg member function: protected operation * * Set the contents of the Async Pd configuration fields. * * ENTRY: * EXIT: * TRUE if no errors on field setting; FALSE otherwise. * WM_EDITSETFIELDSERROR message(s) will have been posted on error. * ******************************************************************************/
BOOL CEditWinStationDlg::SetAsyncFields() { BOOL bStatus = TRUE; BOOL bSelectDefault = (m_DlgMode == EWSDlgAdd) || (m_DlgMode == EWSDlgCopy) || !(*m_WSConfig.Pd[0].Params.Async.DeviceName); CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_ASYNC_DEVICENAME); CComboBox *pCallback = (CComboBox *)GetDlgItem(IDC_ASYNC_MODEMCALLBACK); TCHAR szDeviceName[DEVICENAME_LENGTH+MODEMNAME_LENGTH+1];
/*
* Set the DEVICE combo-box selection from the current selection. */ FormDecoratedAsyncDeviceName( szDeviceName, &(m_WSConfig.Pd[0].Params.Async) ); if ( pDevice->SelectString(-1, szDeviceName) == CB_ERR ) {
/*
* Can't select current async DeviceName in combo-box. If this is * because we're supposed to select a default device name, select * the first device in the list. */ if ( bSelectDefault ) {
pDevice->SetCurSel(0);
} else {
PostMessage(WM_EDITSETFIELDSERROR, IDC_ASYNC_DEVICENAME, 0); bStatus = FALSE; } }
/*
* If the DEVICENAME list is empty, disable the Install Modems button, * since the user can't install a modem to a COM port that's unavailable * (maybe could, but would be very frustrating when it couldn't be used). */ if ( pDevice->GetCount() == 0 ) GetDlgItem(IDC_ASYNC_MODEMINSTALL)->EnableWindow(FALSE);
/*
* Set the MODEMCALLBACK combo-box selection, phone number, and 'inherit' * checkboxes, based on the current UserConfig settings. */ pCallback->SetCurSel(m_WSConfig.Config.User.Callback); SetDlgItemText( IDC_ASYNC_MODEMCALLBACK_PHONENUMBER, m_WSConfig.Config.User.CallbackNumber ); CheckDlgButton( IDC_ASYNC_MODEMCALLBACK_INHERIT, m_WSConfig.Config.User.fInheritCallback ); CheckDlgButton( IDC_ASYNC_MODEMCALLBACK_PHONENUMBER_INHERIT, m_WSConfig.Config.User.fInheritCallbackNumber );
/*
* Set the BAUDRATE combo-box selection (in it's edit field) and limit the * edit field text. */ { TCHAR string[ULONG_DIGIT_MAX];
wsprintf( string, TEXT("%lu"), m_WSConfig.Pd[0].Params.Async.BaudRate );
SetDlgItemText( IDC_ASYNC_BAUDRATE, string ); ((CEdit *)GetDlgItem(IDC_ASYNC_BAUDRATE)) ->LimitText( ULONG_DIGIT_MAX-1 ); }
/*
* Set the CONNECT combo-box selection. */ ((CComboBox *)GetDlgItem(IDC_ASYNC_CONNECT))->SetCurSel( m_WSConfig.Pd[0].Params.Async.Connect.Type);
/*
* Perform OnSelchangeAsyncDevicename() to properly * set up control states. */ OnSelchangeAsyncDevicename();
/*
* Return the set fields status. */ return(bStatus);
} // end CEditWinStationDlg::SetAsyncFields
/*******************************************************************************
* * SetNetworkFields - CEditWinStationDlg member function: protected operation * * Set the contents of the Network Pd configuration fields. * * ENTRY: * EXIT: * TRUE if no errors on field setting; FALSE otherwise. * WM_EDITSETFIELDSERROR message(s) will have been posted on error. * ******************************************************************************/
BOOL CEditWinStationDlg::SetNetworkFields() { int i; BOOL bSelectDefault = (m_DlgMode == EWSDlgAdd) || (m_DlgMode == EWSDlgCopy) || (m_WSConfig.Pd[0].Params.Network.LanAdapter == -1); CComboBox *pLanAdapter = (CComboBox *)GetDlgItem(IDC_NETWORK_LANADAPTER);
/*
* Set InstanceCount field and limit text. */ SetupInstanceCount(IDC_NETWORK_INSTANCECOUNT); ((CEdit *)GetDlgItem(IDC_NETWORK_INSTANCECOUNT)) ->LimitText( INSTANCE_COUNT_DIGIT_MAX );
/*
* Set the LANADAPTER combo-box selection. */ for ( i = pLanAdapter->GetCount(); i > 0; i-- ) {
/*
* If the current list item has the saved Lan Adapter's number, break * from loop to select this list item. */ if ( m_WSConfig.Pd[0].Params.Network.LanAdapter == (LONG)pLanAdapter->GetItemData(i-1) ) break; }
/*
* Select a list item only if we found a match or are to * set the 'default'. */ if ( (i > 0) || bSelectDefault ) {
pLanAdapter->SetCurSel(bSelectDefault ? 0 : i-1); if ( bSelectDefault ) m_WSConfig.Pd[0].Params.Network.LanAdapter = (LONG)pLanAdapter->GetItemData(0); return(TRUE);
} else {
PostMessage(WM_EDITSETFIELDSERROR, IDC_NETWORK_LANADAPTER, 0); return(FALSE); }
} // end CEditWinStationDlg::SetNetworkFields
/*******************************************************************************
* * SetNASIFields - CEditWinStationDlg member function: protected operation * * Set the contents of the NASI Pd configuration fields. * * ENTRY: * EXIT: * TRUE if no errors on field setting; FALSE otherwise. * WM_EDITSETFIELDSERROR message(s) will have been posted on error. * ******************************************************************************/
BOOL CEditWinStationDlg::SetNASIFields() { CComboBox *pPortName = (CComboBox *)GetDlgItem(IDC_NASI_PORTNAME);
/*
* Set edit fields. */ SetDlgItemText(IDC_NASI_USERNAME, m_WSConfig.Pd[0].Params.Nasi.UserName); SetDlgItemText(IDC_NASI_PASSWORD, m_WSConfig.Pd[0].Params.Nasi.PassWord); SetupInstanceCount(IDC_NASI_INSTANCECOUNT);
/*
* Limit edit field lengths. */ ((CEdit *)GetDlgItem(IDC_NASI_USERNAME))->LimitText(NASIUSERNAME_LENGTH); ((CEdit *)GetDlgItem(IDC_NASI_PASSWORD))->LimitText(NASIPASSWORD_LENGTH); pPortName->LimitText(NASISPECIFICNAME_LENGTH); ((CEdit *)GetDlgItem(IDC_NASI_INSTANCECOUNT))-> LimitText(INSTANCE_COUNT_DIGIT_MAX);
/*
* Set the Port Name combo-box selection. Default to the * first item in the list (if any) if no SpecificName (Port Name) * is defined. */ if ( !*(m_WSConfig.Pd[0].Params.Nasi.SpecificName) ) { pPortName->SetCurSel(0); } else { pPortName->SetWindowText(m_WSConfig.Pd[0].Params.Nasi.SpecificName); }
return(TRUE);
} // end CEditWinStationDlg::SetNASIFields
/*******************************************************************************
* * SetOemTdFields - CEditWinStationDlg member function: protected operation * * Set the contents of the Oem Transport Pd configuration fields. * * ENTRY: * EXIT: * TRUE if no errors on field setting; FALSE otherwise. * WM_EDITSETFIELDSERROR message(s) will have been posted on error. * ******************************************************************************/
BOOL CEditWinStationDlg::SetOemTdFields() { BOOL bStatus = TRUE; BOOL bSelectDefault = (m_DlgMode == EWSDlgAdd) || (m_DlgMode == EWSDlgCopy) || !(*m_WSConfig.Pd[0].Params.OemTd.DeviceName); CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_OEMTD_DEVICENAME);
/*
* Set InstanceCount field and limit text. */ SetupInstanceCount(IDC_OEMTD_INSTANCECOUNT); ((CEdit *)GetDlgItem(IDC_OEMTD_INSTANCECOUNT)) ->LimitText( INSTANCE_COUNT_DIGIT_MAX );
/*
* Set the DEVICE combo-box selection. */ if ( pDevice->SelectString(-1, m_WSConfig.Pd[0].Params.OemTd.DeviceName) == CB_ERR ) {
/*
* Can't select current DeviceName in combo-box. If this is * because we're supposed to select a default device name, select * the first device in the list. */ if ( bSelectDefault ) {
pDevice->SetCurSel(0);
} else {
PostMessage(WM_EDITSETFIELDSERROR, IDC_OEMTD_DEVICENAME, 0); bStatus = FALSE; } }
return(bStatus);
} // end CEditWinStationDlg::SetOemTdFields
/*******************************************************************************
* * SetDefaults - CEditWinStationDlg member function: protected operation * * Set defaults for current Protocol Configuration. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::SetDefaults() { int i; WDCONFIG2 WdConfig; CString szText;
/*
* Clear out all non-base WinStation Pd structures, and default * the instance count if we're not in an auto-add mode. */ for ( i=1; i < MAX_PDCONFIG; i++ ) memset(&m_WSConfig.Pd[i], 0, sizeof(PDCONFIG)); if ( !g_Add ) m_WSConfig.Create.MaxInstanceCount = (m_WSConfig.Pd[0].Create.PdFlag & PD_SINGLE_INST) ? 1 : INSTANCE_COUNT_UNLIMITED;
/*
* Fetch the currently selected Wd's config structure. */ GetSelectedWdConfig(&WdConfig);
/*
* Copy the Wd information into the WinStation config structure. */ m_WSConfig.Wd = WdConfig.Wd; m_WSConfig.Config.User = WdConfig.User; // m_WSConfig.Config.Hotkeys = WdConfig.Hotkeys;
/*
* Establish default settings for the Pd[0]'s PdParams structure. */ switch ( m_WSConfig.Pd[0].Create.SdClass ) {
case SdNetwork: /*
* Zeroing the Pd[0].Params.Network structure and setting the * LanAdapter field to -1 will set proper defaults. */ memset(&m_WSConfig.Pd[0].Params.Network, 0, sizeof(m_WSConfig.Pd[0].Params.Network)); m_WSConfig.Pd[0].Params.Network.LanAdapter = -1; break;
case SdNasi: /*
* Zero the Pd[0].Params.Nasi structure, set GlobalSession TRUE, * UserName to default, and SessionName to the AppServer name * (less the beginning slashes). */ memset(&m_WSConfig.Pd[0].Params.Nasi, 0, sizeof(m_WSConfig.Pd[0].Params.Nasi)); m_WSConfig.Pd[0].Params.Nasi.GlobalSession = TRUE; szText.LoadString(IDS_NASI_DEFAULT_USERNAME); lstrcpy(m_WSConfig.Pd[0].Params.Nasi.UserName, szText); lstrncpy( m_WSConfig.Pd[0].Params.Nasi.SessionName, &(pApp->m_szCurrentAppServer[2]), NASISESSIONNAME_LENGTH ); m_WSConfig.Pd[0].Params.Nasi.SessionName[NASISESSIONNAME_LENGTH] = TCHAR('\0');
/*
* We also establish the PortName list box at this time. */ InitializeNASIPortNames(&(m_WSConfig.Pd[0].Params.Nasi)); break;
case SdAsync: /*
* Copy the Async WD configuration information into * Pd[0]'s Async structure to establish defaults. */ m_WSConfig.Pd[0].Params.Async = WdConfig.Async; break;
case SdOemTransport: /*
* Zero the Pd[0].Params.OemTd structure to set proper defaults. */ memset(&m_WSConfig.Pd[0].Params.OemTd, 0, sizeof(m_WSConfig.Pd[0].Params.OemTd)); break; }
/*
* Set the encryption level to the default for the WD */ EncryptionLevel *pEncryptionLevels = NULL; LONG NumEncryptionLevels = 0L; BOOL bSet = FALSE;
// Get the array of encryption levels from the extension DLL
PTERMLOBJECT pTermObject = GetSelectedWdListObject(); if(pTermObject && pTermObject->m_hExtensionDLL && pTermObject->m_lpfnExtEncryptionLevels) NumEncryptionLevels = (*pTermObject->m_lpfnExtEncryptionLevels)(&WdConfig.Wd.WdName, &pEncryptionLevels);
if(pEncryptionLevels) { // Loop through the encryption levels and look for the default
for(int i = 0; i < NumEncryptionLevels; i++) {
// If this is the default encryption level, set the user's
// encryption level to this one
if(pEncryptionLevels[i].Flags & ELF_DEFAULT) { m_WSConfig.Config.User.MinEncryptionLevel = (UCHAR)pEncryptionLevels[i].RegistryValue; bSet = TRUE; } }
// If none of the encryption levels was flagged as the default,
// use the first encryption level as the default.
if(!bSet) { m_WSConfig.Config.User.MinEncryptionLevel = (UCHAR)pEncryptionLevels[0].RegistryValue; }
} else { // There aren't any encryption levels
m_WSConfig.Config.User.MinEncryptionLevel = 0; }
/*
* Update the Protocol Configuration fields. */ SetConfigurationFields();
} // end CEditWinStationDlg::SetDefaults
/*******************************************************************************
* * GetConfigurationFields - * CEditWinStationDlg member function: protected operation * * Fetch the configuration field contents and validate. * * ENTRY: * EXIT: * (BOOL) TRUE if the configuration fields were all OK; FALSE otherwise. * ******************************************************************************/
BOOL CEditWinStationDlg::GetConfigurationFields() { /*
* Fetch the data in the configuration fields. */ switch ( m_WSConfig.Pd[0].Create.SdClass ) {
case SdNone: break;
case SdAsync: return(GetAsyncFields());
case SdNetwork: return(GetNetworkFields());
case SdNasi: return(GetNASIFields());
case SdOemTransport: return(GetOemTdFields()); }
return(TRUE);
} // end CEditWinStationDlg::GetConfigurationFields
/*******************************************************************************
* * GetAsyncFields - CEditWinStationDlg member function: protected operation * * Fetch and validate the Async configuration field contents. * * ENTRY: * EXIT: * (BOOL) TRUE if all of the Async configuration fields were OK; * FALSE otherwise. * ******************************************************************************/
BOOL CEditWinStationDlg::GetAsyncFields() { /*
* Fetch the currently selected DEVICENAME string. */ { CComboBox *pDeviceName = (CComboBox *)GetDlgItem(IDC_ASYNC_DEVICENAME); int index;
if ( !pDeviceName->GetCount() || ((index = pDeviceName->GetCurSel()) == CB_ERR) ) {
/*
* No device is selected. */ ERROR_MESSAGE((IDP_INVALID_DEVICE)) GotoDlgCtrl(GetDlgItem(IDC_ASYNC_DEVICENAME)); return(FALSE);
} else
OnSelchangeAsyncDevicename(); }
/*
* Get the MODEMCALLBACK phone number (callback state and 'user specified' * flags are already gotten). */ GetDlgItemText( IDC_ASYNC_MODEMCALLBACK_PHONENUMBER, m_WSConfig.Config.User.CallbackNumber, lengthof(m_WSConfig.Config.User.CallbackNumber) );
/*
* Fetch and convert the BAUDRATE combo-box selection (in it's edit field). */ { TCHAR string[ULONG_DIGIT_MAX], *endptr; ULONG ul;
GetDlgItemText(IDC_ASYNC_BAUDRATE, string, lengthof(string)); ul = lstrtoul( string, &endptr, 10 );
if ( *endptr != TEXT('\0') ) {
/*
* Invalid character in Baud Rate field. */ ERROR_MESSAGE((IDP_INVALID_BAUDRATE)) GotoDlgCtrl(GetDlgItem(IDC_ASYNC_BAUDRATE)); return(FALSE);
} else m_WSConfig.Pd[0].Params.Async.BaudRate = ul; }
/*
* Fetch the CONNECT combo-box selection and set/reset the break * disconnect flag. */ if ( (m_WSConfig.Pd[0].Params.Async.Connect.Type = (ASYNCCONNECTCLASS) ((CComboBox *)GetDlgItem(IDC_ASYNC_CONNECT))->GetCurSel()) == Connect_FirstChar ) m_WSConfig.Pd[0].Params.Async.Connect.fEnableBreakDisconnect = 1; else m_WSConfig.Pd[0].Params.Async.Connect.fEnableBreakDisconnect = 0;
return(TRUE);
} // end CEditWinStationDlg::GetAsyncFields
/*******************************************************************************
* * GetNetworkFields - CEditWinStationDlg member function: protected operation * * Fetch and validate the Network configuration field contents. * * ENTRY: * * EXIT: * (BOOL) TRUE if all of the Network configuration fields were OK; * FALSE otherwise. * ******************************************************************************/
BOOL CEditWinStationDlg::GetNetworkFields() { CComboBox *pLanAdapter = (CComboBox *)GetDlgItem(IDC_NETWORK_LANADAPTER); int index;
/*
* Fetch & validate instance count field. */ if ( !ValidateInstanceCount(IDC_NETWORK_INSTANCECOUNT) ) return(FALSE);
/*
* Fetch the currently selected LANADAPTER string's associated value * (ordinal network card #) and save. */ if ( !pLanAdapter->GetCount() || ((index = pLanAdapter->GetCurSel()) == CB_ERR) ) {
/*
* No Lan Adapter is selected. */ if ( !pLanAdapter->GetCount() ) ERROR_MESSAGE((IDP_ERROR_NETWORKDEVICEINIT)) else ERROR_MESSAGE((IDP_INVALID_LANADAPTER)) GotoDlgCtrl(GetDlgItem(IDC_NETWORK_LANADAPTER)); return(FALSE); } else { m_WSConfig.Pd[0].Params.Network.LanAdapter = pLanAdapter->GetItemData(index); }
return(TRUE);
} // end CEditWinStationDlg::GetNetworkFields
/*******************************************************************************
* * GetNASIFields - CEditWinStationDlg member function: protected operation * * Fetch and validate the NASI configuration field contents. * * ENTRY: * * EXIT: * (BOOL) TRUE if all of the NASI configuration fields were OK; * FALSE otherwise. * ******************************************************************************/
BOOL CEditWinStationDlg::GetNASIFields() { /*
* Fetch & validate UserName field. */ GetDlgItemText( IDC_NASI_USERNAME, m_WSConfig.Pd[0].Params.Nasi.UserName, lengthof(m_WSConfig.Pd[0].Params.Nasi.UserName) ); if ( !*(m_WSConfig.Pd[0].Params.Nasi.UserName) ) { ERROR_MESSAGE((IDP_INVALID_NASI_USERNAME_EMPTY)) GotoDlgCtrl(GetDlgItem(IDC_NASI_USERNAME)); return(FALSE); }
/*
* Fetch & validate Port Name field. */ GetDlgItemText( IDC_NASI_PORTNAME, m_WSConfig.Pd[0].Params.Nasi.SpecificName, lengthof(m_WSConfig.Pd[0].Params.Nasi.SpecificName) ); if ( !*(m_WSConfig.Pd[0].Params.Nasi.SpecificName) ) { ERROR_MESSAGE((IDP_INVALID_NASI_PORTNAME_EMPTY)) GotoDlgCtrl(GetDlgItem(IDC_NASI_PORTNAME)); return(FALSE); }
/*
* Fetch & validate instance count field. */ if ( !ValidateInstanceCount(IDC_NASI_INSTANCECOUNT) ) return(FALSE);
/*
* Fetch Password field. */ GetDlgItemText( IDC_NASI_PASSWORD, m_WSConfig.Pd[0].Params.Nasi.PassWord, lengthof(m_WSConfig.Pd[0].Params.Nasi.PassWord) );
return(TRUE);
} // end CEditWinStationDlg::GetNASIFields
/*******************************************************************************
* * GetOemTdFields - CEditWinStationDlg member function: protected operation * * Fetch and validate the Oem Transport configuration field contents. * * ENTRY: * * EXIT: * (BOOL) TRUE if all of the Oem Transport configuration fields were OK; * FALSE otherwise. * ******************************************************************************/
BOOL CEditWinStationDlg::GetOemTdFields() { CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_OEMTD_DEVICENAME); int index;
/*
* Fetch & validate instance count field. */ if ( !ValidateInstanceCount(IDC_OEMTD_INSTANCECOUNT) ) return(FALSE);
/*
* Fetch the currently selected DEVICE string. */ if ( !pDevice->GetCount() || ((index = pDevice->GetCurSel()) == CB_ERR) ) {
/*
* No Device is selected. */ ERROR_MESSAGE((IDP_INVALID_DEVICE)) GotoDlgCtrl(GetDlgItem(IDC_OEMTD_DEVICENAME)); return(FALSE); } else { pDevice->GetLBText( index, m_WSConfig.Pd[0].Params.OemTd.DeviceName); }
return(TRUE);
} // end CEditWinStationDlg::GetOemTdFields
/*******************************************************************************
* * SetupInstanceCount - * CEditWinStationDlg member function: protected operation * * Setup the specified instance count controls based on the current * contents of m_WSConfig.Create.MaxInstanceCount. * * ENTRY: * nControlId (input) * Control ID of the instance count edit field. nControlId+1 must * be the control ID of the 'unlimited' checkbox. * EXIT: * ******************************************************************************/
void CEditWinStationDlg::SetupInstanceCount(int nControlId) { if ( m_WSConfig.Create.MaxInstanceCount == INSTANCE_COUNT_UNLIMITED ) {
CheckDlgButton( nControlId+1, TRUE ); SetDlgItemText( nControlId, TEXT("") ); GetDlgItem(nControlId)->EnableWindow(FALSE);
} else {
SetDlgItemInt( nControlId, m_WSConfig.Create.MaxInstanceCount ); GetDlgItem(nControlId)->EnableWindow( ((m_DlgMode == EWSDlgRename) || (m_DlgMode == EWSDlgView)) ? FALSE : TRUE ); }
} // end CEditWinStationDlg::SetupInstanceCount
/*******************************************************************************
* * ValidateInstanceCount - * CEditWinStationDlg member function: protected operation * * Fetch and validate the specified InstanceCount control contents * and save to m_WSConfig.Create.MaxInstanceCount member variable if valid. * * ENTRY: * nControlId (input) * Control ID of the instance count edit field. nControlId+1 must * be the control ID of the 'unlimited' checkbox. * EXIT: * (BOOL) TRUE if instance count is OK; FALSE otherwise (an error message * will have been output). * ******************************************************************************/
BOOL CEditWinStationDlg::ValidateInstanceCount(int nControlId) { BOOL bTrans, bStatus = TRUE; int i;
/*
* Fetch & validate instance count field if 'unlimited' checkbox * is not checked. */ if ( !((CButton *)GetDlgItem(nControlId+1))->GetCheck() ) {
i = GetDlgItemInt(nControlId, &bTrans); if ( !bTrans || (i < INSTANCE_COUNT_MIN) || (i > INSTANCE_COUNT_MAX) ) {
/*
* Invalid instance count. Display message and return to fix. */ ERROR_MESSAGE((IDP_INVALID_INSTANCECOUNT, INSTANCE_COUNT_MIN, INSTANCE_COUNT_MAX))
GotoDlgCtrl(GetDlgItem(nControlId)); bStatus = FALSE;
} else {
m_WSConfig.Create.MaxInstanceCount = i; } }
return(bStatus);
} // end CEditWinStationDlg::ValidateInstanceCount
////////////////////////////////////////////////////////////////////////////////
// CEditWinStationDlg message map
BEGIN_MESSAGE_MAP(CEditWinStationDlg, CBaseDialog) //{{AFX_MSG_MAP(CEditWinStationDlg)
ON_BN_CLICKED(IDC_ASYNC_MODEMINSTALL, OnClickedAsyncModeminstall) ON_BN_CLICKED(IDC_ASYNC_MODEMCONFIG, OnClickedAsyncModemconfig) ON_BN_CLICKED(IDC_ASYNC_MODEMCALLBACK_INHERIT, OnClickedAsyncModemcallbackInherit) ON_BN_CLICKED(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER_INHERIT, OnClickedAsyncModemcallbackPhonenumberInherit) ON_BN_CLICKED(IDC_ASYNC_DEFAULTS, OnClickedAsyncDefaults) ON_BN_CLICKED(IDC_ASYNC_ADVANCED, OnClickedAsyncAdvanced) ON_BN_CLICKED(IDC_ASYNC_TEST, OnClickedAsyncTest) ON_BN_CLICKED(IDC_NASI_INSTANCECOUNT_UNLIMITED, OnClickedNasiInstancecountUnlimited) ON_BN_CLICKED(IDC_NASI_ADVANCED, OnClickedNasiAdvanced) ON_BN_CLICKED(IDC_NETWORK_INSTANCECOUNT_UNLIMITED, OnClickedNetworkInstancecountUnlimited) ON_BN_CLICKED(IDC_OEMTD_INSTANCECOUNT_UNLIMITED, OnClickedOemInstancecountUnlimited) ON_BN_CLICKED(IDC_ADVANCED_WINSTATION, OnClickedAdvancedWinStation) ON_CBN_CLOSEUP(IDC_TDNAME, OnCloseupPdname) ON_CBN_SELCHANGE(IDC_TDNAME, OnSelchangePdname) ON_CBN_CLOSEUP(IDC_WDNAME, OnCloseupWdname) ON_CBN_SELCHANGE(IDC_WDNAME, OnSelchangeWdname) ON_CBN_CLOSEUP(IDC_ASYNC_DEVICENAME, OnCloseupAsyncDevicename) ON_CBN_SELCHANGE(IDC_ASYNC_DEVICENAME, OnSelchangeAsyncDevicename) ON_CBN_CLOSEUP(IDC_ASYNC_MODEMCALLBACK, OnCloseupAsyncModemcallback) ON_CBN_SELCHANGE(IDC_ASYNC_MODEMCALLBACK, OnSelchangeAsyncModemcallback) ON_CBN_CLOSEUP(IDC_ASYNC_BAUDRATE, OnCloseupAsyncBaudrate) ON_CBN_SELCHANGE(IDC_ASYNC_BAUDRATE, OnSelchangeAsyncBaudrate) ON_CBN_CLOSEUP(IDC_ASYNC_CONNECT, OnCloseupAsyncConnect) ON_CBN_SELCHANGE(IDC_ASYNC_CONNECT, OnSelchangeAsyncConnect) ON_CBN_DROPDOWN(IDC_NASI_PORTNAME, OnDropdownNasiPortname) ON_MESSAGE(WM_LISTINITERROR, OnListInitError) ON_MESSAGE(WM_EDITSETFIELDSERROR, OnSetFieldsError) ON_BN_CLICKED(IDC_CLIENT_SETTINGS, OnClickedClientSettings) ON_BN_CLICKED(IDC_EXTENSION_BUTTON, OnClickedExtensionButton) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////////////////////
// CEditWinStationDlg commands
/*******************************************************************************
* * OnInitDialog - CEditWinStationDlg member function: command (override) * * Performs the dialog intialization. * * ENTRY: * EXIT: * (Refer to CDialog::OnInitDialog documentation) * ******************************************************************************/
BOOL CEditWinStationDlg::OnInitDialog() { int index, count; CString string; CComboBox *pComboBox; POSITION pos;
/*
* Call the parent classes' OnInitDialog to perform default dialog * initialization. */ CBaseDialog::OnInitDialog();
/*
* Load up the fixed string combo boxes. */ pComboBox = (CComboBox *)GetDlgItem(IDC_ASYNC_CONNECT); string.LoadString(IDS_CONNECT_CTS); pComboBox->AddString(string); string.LoadString(IDS_CONNECT_DSR); pComboBox->AddString(string); string.LoadString(IDS_CONNECT_RI); pComboBox->AddString(string); string.LoadString(IDS_CONNECT_DCD); pComboBox->AddString(string); string.LoadString(IDS_CONNECT_FIRST_CHARACTER); pComboBox->AddString(string); string.LoadString(IDS_CONNECT_ALWAYS); pComboBox->AddString(string);
pComboBox = (CComboBox *)GetDlgItem(IDC_ASYNC_MODEMCALLBACK); string.LoadString(IDS_MODEM_CALLBACK_DISABLED); pComboBox->AddString(string); string.LoadString(IDS_MODEM_CALLBACK_ROVING); pComboBox->AddString(string); string.LoadString(IDS_MODEM_CALLBACK_FIXED); pComboBox->AddString(string);
/*
* Initialize the WinStation name field if we're not in 'rename' mode. */ if ( m_DlgMode != EWSDlgRename ) SetDlgItemText( IDC_WINSTATIONNAME, m_pWSName );
/*
* Initialize the Wd list box. */ pComboBox = ((CComboBox *)GetDlgItem(IDC_WDNAME)); pComboBox->ResetContent();
for ( count = 0, pos = pApp->m_WdList.GetHeadPosition(); pos != NULL; count++ ) {
PTERMLOBJECT pObject = (PTERMLOBJECT)pApp->m_WdList.GetNext( pos );
index = pComboBox->AddString( pObject->m_WdConfig.Wd.WdName ); pComboBox->SetItemData(index, count); }
/*
* Set the currently-selected WD. */ if ( pComboBox->SelectString( -1, m_WSConfig.Wd.WdName ) == CB_ERR ) pComboBox->SetCurSel(0);
/*
* Disable the Wd list box and label if only one element is in the list. */ pComboBox->EnableWindow(pComboBox->GetCount() > 1 ? TRUE : FALSE); GetDlgItem(IDL_WDNAME)->EnableWindow(pComboBox->GetCount() > 1 ? TRUE : FALSE);
/*
* Set all combo boxes to use the 'extended' UI. */ ((CComboBox *)GetDlgItem(IDC_TDNAME))->SetExtendedUI(TRUE); ((CComboBox *)GetDlgItem(IDC_WDNAME))->SetExtendedUI(TRUE); ((CComboBox *)GetDlgItem(IDC_ASYNC_DEVICENAME))->SetExtendedUI(TRUE); ((CComboBox *)GetDlgItem(IDC_ASYNC_BAUDRATE))->SetExtendedUI(TRUE); ((CComboBox *)GetDlgItem(IDC_ASYNC_CONNECT))->SetExtendedUI(TRUE); ((CComboBox *)GetDlgItem(IDC_NETWORK_LANADAPTER))->SetExtendedUI(TRUE); ((CComboBox *)GetDlgItem(IDC_NASI_PORTNAME))->SetExtendedUI(TRUE);
/*
* Initialize all other common control contents. */ SetDlgItemText( IDC_WSCOMMENT, m_WSConfig.Config.Comment );
/*
* Set the maximum length for the edit controls. */ ((CEdit *)GetDlgItem(IDC_WINSTATIONNAME)) ->LimitText(WINSTATIONNAME_LENGTH); ((CEdit *)GetDlgItem(IDC_WSCOMMENT)) ->LimitText(WINSTATIONCOMMENT_LENGTH);
/*
* Process for current dialog mode. */ if ( m_DlgMode == EWSDlgView ) {
/*
* View mode: set the dialog's title to "View WinStation Configuration". */ { CString szTitle;
szTitle.LoadString(IDS_VIEW_WINSTATION);
SetWindowText(szTitle); }
/*
* Disable all common dialog controls (and their labels), except for * navigation, CANCEL, & HELP buttons. */ GetDlgItem(IDC_WINSTATIONNAME)->EnableWindow(FALSE); GetDlgItem(IDL_WINSTATIONNAME)->EnableWindow(FALSE); GetDlgItem(IDC_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDC_WDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_WDNAME)->EnableWindow(FALSE); GetDlgItem(IDC_WSCOMMENT)->EnableWindow(FALSE); GetDlgItem(IDL_WSCOMMENT)->EnableWindow(FALSE); GetDlgItem(IDOK)->EnableWindow(FALSE);
} else if ( m_DlgMode == EWSDlgEdit ) {
/*
* Edit mode: set the dialog's title to "Edit WinStation Configuration". */ { CString szTitle;
szTitle.LoadString(IDS_EDIT_WINSTATION);
SetWindowText(szTitle); }
/*
* Disable the WinStationName box and PD & WD combo boxes. */ GetDlgItem(IDC_WINSTATIONNAME)->EnableWindow(FALSE); GetDlgItem(IDL_WINSTATIONNAME)->EnableWindow(FALSE); GetDlgItem(IDC_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDC_WDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_WDNAME)->EnableWindow(FALSE);
} else if ( m_DlgMode == EWSDlgAdd ) {
/*
* Add mode: set the dialog's title to "New WinStation". */ { CString szTitle;
szTitle.LoadString(IDS_NEW_WINSTATION);
SetWindowText(szTitle); }
} else if ( m_DlgMode == EWSDlgCopy ){
/*
* Copy mode: set the dialog's title to "Copy of " plus the * current WinStation name. */ { CString szTitle;
szTitle.LoadString(IDS_COPY_WINSTATION);
SetWindowText( szTitle + m_pWSName ); }
/*
* Disable the PD and WD combo boxes. */ GetDlgItem(IDC_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDC_WDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_WDNAME)->EnableWindow(FALSE);
} else {
/*
* Rename mode: set the dialog's title to "Rename " plus the * current WinStation name. */ { CString szTitle;
szTitle.LoadString(IDS_RENAME_WINSTATION);
SetWindowText( szTitle + m_pWSName ); }
/*
* Disable all common dialog controls (and their labels), except for * WinStationName field and navigation, OK, CANCEL, & HELP buttons. */ GetDlgItem(IDC_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_TDNAME)->EnableWindow(FALSE); GetDlgItem(IDC_WDNAME)->EnableWindow(FALSE); GetDlgItem(IDL_WDNAME)->EnableWindow(FALSE); GetDlgItem(IDC_WSCOMMENT)->EnableWindow(FALSE); GetDlgItem(IDL_WSCOMMENT)->EnableWindow(FALSE); }
/*
* Zero init previous PdConfig and initialize fields. */ memset(&m_PreviousPdConfig, 0, sizeof(m_PreviousPdConfig));
if ( m_DlgMode != EWSDlgAdd ) { PDCONFIG3 PdConfig;
/*
* We're not in Add mode, so initialize list boxes for this WinStation's * WD and TD and call SetConfigurationFields() to enable/show the proper * configuration field controls and initialize them. We don't call * OnSelchangeWdname() as for Add mode, because that will set Pd, Wd, * and field defaults, loosing the current settings. */ RefrenceAssociatedLists(); InitializeTransportComboBox(); GetSelectedPdConfig(&PdConfig);
if ( !InitializeLists(&PdConfig) ) PostMessage(WM_LISTINITERROR, 0, (LPARAM)GetLastError());
SetConfigurationFields();
/*
* Update the extension DLL button based on the selected Wd */
PTERMLOBJECT pObject = GetSelectedWdListObject(); BOOL bShowButton = FALSE; if(pObject && pObject->m_hExtensionDLL) { TCHAR string[128]; if(::LoadString(pObject->m_hExtensionDLL, 100, string, 127)) { /*
* The button is specified as hidden in the dialog template so * we need to set the text and then show the window. */ ((CButton*)GetDlgItem(IDC_EXTENSION_BUTTON))->SetWindowText(string); bShowButton = TRUE; } }
((CButton*)GetDlgItem(IDC_EXTENSION_BUTTON))->ShowWindow(bShowButton);
} else {
/*
* We're in auto-add mode. */ if ( g_Add ) {
/*
* Set instance count from command line. */ m_WSConfig.Create.MaxInstanceCount = (int)g_ulCount;
/*
* Initialize WdName and PdName to specified wd and transport. */ lstrcpy(m_WSConfig.Wd.WdName, g_szType); lstrcpy(m_WSConfig.Pd[0].Create.PdName, g_szTransport); OnSelchangeWdname();
/*
* Post an IDOK message to cause automatic addition. */ PostMessage(WM_COMMAND, IDOK);
} else { // normal add
/*
* NULL the PdName to establish the default WD / TD for * the new WinStation. */ memset( m_WSConfig.Pd[0].Create.PdName, 0, sizeof(m_WSConfig.Pd[0].Create.PdName) );
OnSelchangeWdname(); } }
/*
* If we're not in batch mode, make our window visible. */ if ( !g_Batch ) ShowWindow(SW_SHOW);
/*
* If we're in Edit mode, set focus to the comment field. * Otherwise, let dialog set focus/select first available control. */ if ( m_DlgMode == EWSDlgEdit ) { CEdit *pEdit = (CEdit *)GetDlgItem(IDC_WSCOMMENT);
GotoDlgCtrl(pEdit); return(FALSE);
} else return(TRUE);
} // end CEditWinStationDlg::OnInitDialog
/*******************************************************************************
* * OnClickedAsyncModeminstall - CEditWinStationDlg member function: command * * Invoke the UNIMODEM installation dialog. * * ENTRY: * EXIT: * ******************************************************************************/
#define MODEMINSTALL_ENUM_RETRY_COUNT 5
void CEditWinStationDlg::OnClickedAsyncModeminstall() { pApp->m_bAllowHelp = FALSE; CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_ASYNC_DEVICENAME);
if ( InstallModem( GetSafeHwnd() ) ) {
PDCONFIG3 PdConfig; int i; CWaitCursor wait;
if ( ((m_DlgMode == EWSDlgAdd) || (m_DlgMode == EWSDlgCopy)) && !*(m_WSConfig.Pd[0].Params.Async.ModemName) ) {
/*
* If we're in Add or Copy mode and the currently selected device * is not a modem device, zero out the device field before * re-initializing the device list so that if the user added a * modem to the device it will no longer show up in the list. */ *(m_WSConfig.Pd[0].Params.Async.DeviceName) = TEXT('\0'); }
/*
* Loop up to MODEMINSTALL_ENUM_RETRY_COUNT times till we notice * the new TAPI device. */ for ( i = 0; i < MODEMINSTALL_ENUM_RETRY_COUNT; i++ ) {
m_bAsyncListsInitialized = FALSE; GetSelectedPdConfig(&PdConfig); InitializeAsyncLists(&PdConfig);
if ( m_nCurrentMaxTAPILineNumber > m_nPreviousMaxTAPILineNumber ) {
pDevice->SetCurSel(m_nComboBoxIndexOfLatestTAPIDevice); break;
} else {
Sleep(1000L); } } pDevice->ShowDropDown(TRUE); }
pApp->m_bAllowHelp = TRUE;
} // end CEditWinStationDlg::OnClickedAsyncModeminstall
/*******************************************************************************
* * OnClickedAsyncModemconfig - CEditWinStationDlg member function: command * * Invoke the UNIMODEM Config dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAsyncModemconfig() { pApp->m_bAllowHelp = FALSE;
if ( !ConfigureModem( m_WSConfig.Pd[0].Params.Async.ModemName, GetSafeHwnd() ) ) {
ERROR_MESSAGE(( IDP_ERROR_MODEM_PROPERTIES_NOT_AVAILABLE, m_WSConfig.Pd[0].Params.Async.ModemName )); }
pApp->m_bAllowHelp = TRUE;
} // end CEditWinStationDlg::OnClickedAsyncModemconfig
/*******************************************************************************
* * OnClickedAsyncModemcallbackInherit - * CEditWinStationDlg member function: command * * Handle the 'inherit user config' for modem callback. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAsyncModemcallbackInherit() { BOOL bChecked = ((CButton *)GetDlgItem(IDC_ASYNC_MODEMCALLBACK_INHERIT))->GetCheck(); BOOL bEnable = !bChecked && (m_DlgMode != EWSDlgView) && (m_DlgMode != EWSDlgRename);
m_WSConfig.Config.User.fInheritCallback = bChecked; GetDlgItem(IDL_ASYNC_MODEMCALLBACK1)->EnableWindow(bEnable); GetDlgItem(IDC_ASYNC_MODEMCALLBACK)->EnableWindow(bEnable);
} // end CEditWinStationDlg::OnClickedAsyncModemcallbackInherit
/*******************************************************************************
* * OnClickedAsyncModemcallbackPhonenumberInherit - * CEditWinStationDlg member function: command * * Handle the 'inherit user config' for modem callback phone number. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAsyncModemcallbackPhonenumberInherit() { BOOL bChecked = ((CButton *)GetDlgItem(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER_INHERIT))->GetCheck(); BOOL bEnable = !bChecked && (m_DlgMode != EWSDlgView) && (m_DlgMode != EWSDlgRename);
m_WSConfig.Config.User.fInheritCallbackNumber = bChecked; GetDlgItem(IDL_ASYNC_MODEMCALLBACK_PHONENUMBER)->EnableWindow(bEnable); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER)->EnableWindow(bEnable);
} // end CEditWinStationDlg::OnClickedAsyncModemcallbackPhonenumberInherit
/*******************************************************************************
* * OnClickedAsyncDefaults - CEditWinStationDlg member function: command * * Invoke the SetDefaults() member in response to Defaults button click. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAsyncDefaults() { SetDefaults();
} // end CEditWinStationDlg::OnClickedAsyncDefaults
/*******************************************************************************
* * OnClickedAsyncAdvanced - CEditWinStationDlg member function: command * * Invoke the Advanced Async dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAsyncAdvanced() { CAdvancedAsyncDlg AADlg;
/*
* Initialize the dialog's member variables. */ AADlg.m_Async = m_WSConfig.Pd[0].Params.Async; AADlg.m_bReadOnly = (m_DlgMode == EWSDlgView) || (m_DlgMode == EWSDlgRename) ? TRUE : FALSE; AADlg.m_bModem = FALSE; AADlg.m_nHexBase = pApp->m_nHexBase; AADlg.m_nWdFlag = m_WSConfig.Wd.WdFlag;
/*
* Invoke the dialog. */ if ( (AADlg.DoModal() == IDOK) && !AADlg.m_bReadOnly ) {
/*
* Fetch the dialog's member variables. */ m_WSConfig.Pd[0].Params.Async = AADlg.m_Async; pApp->m_nHexBase = AADlg.m_nHexBase; }
} // end CEditWinStationDlg::OnClickedAsyncAdvanced
/*******************************************************************************
* * OnClickedAsyncTest - CEditWinStationDlg member function: command * * Invoke the Async Test dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAsyncTest() { CAsyncTestDlg ATDlg; WINSTATIONNAME WSName;
/*
* Get the current Configuration field data. Return if invalid data * entered (stay in edit dialog to fix the data). */ if ( !GetConfigurationFields() ) return;
ATDlg.m_PdConfig0 = m_WSConfig.Pd[0]; ATDlg.m_PdConfig1 = m_WSConfig.Pd[1];
if ( m_DlgMode == EWSDlgEdit ) { GetDlgItemText(IDC_WINSTATIONNAME, WSName, lengthof(WSName)); ATDlg.m_pWSName = WSName; } else { ATDlg.m_pWSName = NULL; }
/*
* Invoke the dialog. */ ATDlg.DoModal();
} // end CEditWinStationDlg::OnClickedAsyncTest
/*******************************************************************************
* * OnClickedNasiInstancecountUnlimited - * CEditWinStationDlg member function: command * * Process NASI 'unlimited' checkbox. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedNasiInstancecountUnlimited() { if ( ((CButton *)GetDlgItem(IDC_NASI_INSTANCECOUNT_UNLIMITED))->GetCheck() ) {
m_WSConfig.Create.MaxInstanceCount = INSTANCE_COUNT_UNLIMITED; SetupInstanceCount(IDC_NASI_INSTANCECOUNT);
} else {
m_WSConfig.Create.MaxInstanceCount = INSTANCE_COUNT_MIN; SetupInstanceCount(IDC_NASI_INSTANCECOUNT); GotoDlgCtrl( GetDlgItem(IDC_NASI_INSTANCECOUNT) ); }
} // end CEditWinStationDlg::OnClickedNasiInstancecountUnlimited
/*******************************************************************************
* * OnClickedNetworkInstancecountUnlimited - * CEditWinStationDlg member function: command * * Process Network 'unlimited' checkbox. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedNetworkInstancecountUnlimited() { if ( ((CButton *)GetDlgItem(IDC_NETWORK_INSTANCECOUNT_UNLIMITED))->GetCheck() ) {
m_WSConfig.Create.MaxInstanceCount = INSTANCE_COUNT_UNLIMITED; SetupInstanceCount(IDC_NETWORK_INSTANCECOUNT);
} else {
m_WSConfig.Create.MaxInstanceCount = INSTANCE_COUNT_MIN; SetupInstanceCount(IDC_NETWORK_INSTANCECOUNT); GotoDlgCtrl( GetDlgItem(IDC_NETWORK_INSTANCECOUNT) ); }
} // end CEditWinStationDlg::OnClickedNetworkInstancecountUnlimited
/*******************************************************************************
* * OnClickedOemInstancecountUnlimited - * CEditWinStationDlg member function: command * * Process Oem Transport 'unlimited' checkbox. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedOemInstancecountUnlimited() { if ( ((CButton *)GetDlgItem(IDC_OEMTD_INSTANCECOUNT_UNLIMITED))->GetCheck() ) {
m_WSConfig.Create.MaxInstanceCount = INSTANCE_COUNT_UNLIMITED; SetupInstanceCount(IDC_OEMTD_INSTANCECOUNT);
} else {
m_WSConfig.Create.MaxInstanceCount = INSTANCE_COUNT_MIN; SetupInstanceCount(IDC_OEMTD_INSTANCECOUNT); GotoDlgCtrl( GetDlgItem(IDC_OEMTD_INSTANCECOUNT) ); }
} // end CEditWinStationDlg::OnClickedOemInstancecountUnlimited
/*******************************************************************************
* * OnClickedNasiAdvanced - CEditWinStationDlg member function: command * * Invoke the Advanced NASI dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedNasiAdvanced() { CAdvancedNASIDlg ANDlg;
/*
* Initialize the dialog's member variables. */ ANDlg.m_NASIConfig = m_WSConfig.Pd[0].Params.Nasi; ANDlg.m_bReadOnly = (m_DlgMode == EWSDlgView) || (m_DlgMode == EWSDlgRename) ? TRUE : FALSE;
/*
* Invoke the dialog. */ if ( (ANDlg.DoModal() == IDOK) && !ANDlg.m_bReadOnly ) {
/*
* Fetch the dialog's member variables. */ m_WSConfig.Pd[0].Params.Nasi = ANDlg.m_NASIConfig; }
} // end CEditWinStationDlg::OnClickedNasiAdvanced
/*******************************************************************************
* * OnClickedAdvancedWinStation - CEditWinStationDlg member function: command * * Invoke the AdvancedWinStation dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedAdvancedWinStation() { CAdvancedWinStationDlg AWSDlg;
/*
* Initialize the dialog's member variables. */ AWSDlg.m_fEnableWinStation = m_WSConfig.Create.fEnableWinStation; AWSDlg.m_UserConfig = m_WSConfig.Config.User; // AWSDlg.m_Hotkeys = m_WSConfig.Config.Hotkeys;
AWSDlg.m_bReadOnly = (m_DlgMode == EWSDlgView) || (m_DlgMode == EWSDlgRename) ? TRUE : FALSE; AWSDlg.m_bSystemConsole = !lstrcmpi( m_pWSName, pApp->m_szSystemConsole ) ? TRUE : FALSE; AWSDlg.m_pTermObject = GetSelectedWdListObject();
/*
* Invoke the dialog. */ if ( (AWSDlg.DoModal() == IDOK) && !AWSDlg.m_bReadOnly ) {
/*
* Copy dialog's member variables back to our local member variables. */ m_WSConfig.Create.fEnableWinStation = AWSDlg.m_fEnableWinStation; m_WSConfig.Config.User = AWSDlg.m_UserConfig; // m_WSConfig.Config.Hotkeys = AWSDlg.m_Hotkeys;
}
} // end CEditWinStationDlg::OnClickedAdvancedWinStation
/*******************************************************************************
* * OnClickedClientSettings - CEditWinStationDlg member function: command * * Invoke the ClientSettings dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedClientSettings() { CClientSettingsDlg CSDlg;
/*
* Initialize the dialog's member variables. */ CSDlg.m_UserConfig = m_WSConfig.Config.User; CSDlg.m_bReadOnly = (m_DlgMode == EWSDlgView) || (m_DlgMode == EWSDlgRename) ? TRUE : FALSE;
PTERMLOBJECT pTermObject = GetSelectedWdListObject(); CSDlg.m_Capabilities = pTermObject ? pTermObject->m_Capabilities : 0;
/*
* Invoke the dialog. */ if ( (CSDlg.DoModal() == IDOK) && !CSDlg.m_bReadOnly ) {
/*
* Copy dialog's member variables back to our local member variables. */ m_WSConfig.Config.User = CSDlg.m_UserConfig; }
} // end CEditWinStationDlg::OnClickedClientSettings
/*******************************************************************************
* * OnClickedExtensionButton - CEditWinStationDlg member function: command * * Invoke the Extension dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnClickedExtensionButton() { PTERMLOBJECT pObject = GetSelectedWdListObject(); if(pObject && pObject->m_hExtensionDLL && pObject->m_lpfnExtDialog) { (*pObject->m_lpfnExtDialog)(m_hWnd, m_pExtObject); }
} // end CEditWinStationDlg::OnClickedExtensionButton
/*******************************************************************************
* * OnCloseupPdname - CEditWinStationDlg member function: command * * Invoke OnSelchangePdname() when Transport combo box closes up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnCloseupPdname() { OnSelchangePdname();
} // end CEditWinStationDlg::OnCloseupPdname
/*******************************************************************************
* * OnSelcahngePdname - CEditWinStationDlg member function: command * * Process new PD (Transport) selection. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnSelchangePdname() { int i; WINSTATIONNAME WSName; PDCONFIG3 PdConfig; PDNAME PdName; CComboBox *pTdNameBox = (CComboBox *)GetDlgItem(IDC_TDNAME); CWaitCursor Wait;
/*
* Ignore this notification if the combo box is in a dropped-down * state. */ if ( pTdNameBox->GetDroppedState() ) return;
if ( (i = pTdNameBox->GetCurSel()) != CB_ERR ) {
/*
* If the newly selected Pd is the same as the one that is currently * selected, ignore this notification. */ pTdNameBox->GetLBText( i, PdName ); if ( !lstrcmp(PdName, m_WSConfig.Pd[0].Create.PdName) ) return;
} else {
/*
* No current selection (we're called from OnSelchangeWdname). * Select the currently specified PD in the combo-box. If that fails, * select the first in the list. */ if ( pTdNameBox->SelectString(-1, m_WSConfig.Pd[0].Create.PdName) == CB_ERR ) pTdNameBox->SetCurSel(0); }
/*
* Fetch the currently selected Protocol's config structure. */ GetSelectedPdConfig(&PdConfig);
/*
* Clear out all WinStation Pd structures, then copy the selected PD * information into the WinStation config's Pd[0] structure and default * the instance count if we're not in auto-add mode. */ for ( i=0; i < MAX_PDCONFIG; i++ ) memset(&m_WSConfig.Pd[i], 0, sizeof(PDCONFIG)); m_WSConfig.Pd[0].Create = PdConfig.Data; m_WSConfig.Pd[0].Params.SdClass = PdConfig.Data.SdClass; if ( !g_Add ) m_WSConfig.Create.MaxInstanceCount = (m_WSConfig.Pd[0].Create.PdFlag & PD_SINGLE_INST) ? 1 : INSTANCE_COUNT_UNLIMITED;
/*
* Initialize the list box(es) that will be used with the selected PD. */ if ( !InitializeLists(&PdConfig) ) PostMessage(WM_LISTINITERROR, 0, (LPARAM)GetLastError());
/*
* Set the default Wd settings for this WinStation. */ SetDefaults();
/*
* Process if no name has been entered yet (edit control not 'modified'): * If we're a SdNetwork or PdNasi type, default the WinStation name to the * WdPrefix plus the PD name. Otherwise, clear the WinStation name field. * Set focus to the name and clear the 'modified' flag before leaving. */ if ( !((CEdit *)GetDlgItem(IDC_WINSTATIONNAME))->GetModify() ) {
if ( (m_WSConfig.Pd[0].Create.SdClass == SdNetwork) || (m_WSConfig.Pd[0].Create.SdClass == SdNasi) ) { PTERMLOBJECT pObject = GetSelectedWdListObject(); if(pObject) { lstrcpy(WSName, pObject->m_WdConfig.Wd.WdPrefix); if(WSName[0]) lstrcat(WSName, TEXT("-")); lstrcat(WSName, m_WSConfig.Pd[0].Create.PdName); } else lstrcpy(WSName, m_WSConfig.Pd[0].Create.PdName); } else WSName[0] = TCHAR('\0');
SetDlgItemText(IDC_WINSTATIONNAME, WSName); ((CEdit *)GetDlgItem(IDC_WINSTATIONNAME))->SetModify(FALSE); GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); }
} // end CEditWinStationDlg::OnSelchangePdname
/*******************************************************************************
* * OnCloseupWdname - CEditWinStationDlg member function: command * * Invoke OnSelchangeWdname() when Type combo box closes up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnCloseupWdname() { OnSelchangeWdname();
} // end CEditWinStationDlg::OnCloseupWdname
/*******************************************************************************
* * OnSelchangeWdname - CEditWinStationDlg member function: command * * Process new Wd selection. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnSelchangeWdname() { WDNAME WdName; CComboBox *pWdNameBox = (CComboBox *)GetDlgItem(IDC_WDNAME); CWaitCursor Wait;
/*
* Ignore this notification if the combo box is in a dropped-down * state. */ if ( pWdNameBox->GetDroppedState() ) return;
pWdNameBox->GetLBText( pWdNameBox->GetCurSel(), WdName );
/*
* Update the extension DLL button based on the selected Wd */ PTERMLOBJECT pObject = GetSelectedWdListObject(); BOOL bShowButton = FALSE; if(pObject && pObject->m_hExtensionDLL) { TCHAR string[128]; if(::LoadString(pObject->m_hExtensionDLL, 100, string, 127)) { ((CButton*)GetDlgItem(IDC_EXTENSION_BUTTON))->SetWindowText(string); bShowButton = TRUE; } }
((CButton*)GetDlgItem(IDC_EXTENSION_BUTTON))->ShowWindow(bShowButton);
/*
* If the newly selected Wd is the same as the one that is currently * selected, ignore this notification. */ if ( !lstrcmp(WdName, m_WSConfig.Wd.WdName) ) return; #if 0
/*
* We need to set the Wd that is associated with this WinStation * */ if(pObject && pObject->m_hExtensionDLL && pObject->m_lpfnExtRegQuery) { m_pExtObject = (*pObject->m_lpfnExtRegQuery)(m_pWSName); } else m_pExtObject = NULL; #endif
/*
* Point to the Td and Pd lists associated with this Wd and * (re)initialize the Transport combo-box. */ RefrenceAssociatedLists(); InitializeTransportComboBox();
/*
* Cause no current transport selection so that OnSelchangePdname will * not ignore the call (the user may want to configure same transport * but different type). */ ((CComboBox *)GetDlgItem(IDC_TDNAME))->SetCurSel(-1);
/*
* Set default field contents for the currently configured Pd. */ OnSelchangePdname();
/*
* We need to set the Wd that is associated with this WinStation * */ if(pObject && pObject->m_hExtensionDLL && pObject->m_lpfnExtRegQuery) { PDCONFIG3 PdConfig; GetSelectedPdConfig( &PdConfig ); m_pExtObject = (*pObject->m_lpfnExtRegQuery)(m_pWSName, &m_WSConfig.Pd[0]); } else m_pExtObject = NULL;
} // end CEditWinStationDlg::OnSelchangeWdname
/*******************************************************************************
* * OnCloseupAsyncDevicename - CEditWinStationDlg member function: command * * Invoke OnSelchangeAsyncDevicename() when Device combo box closes up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnCloseupAsyncDevicename() { OnSelchangeAsyncDevicename();
} // end CEditWinStationDlg::OnCloseupAsyncDevicename
/*******************************************************************************
* * OnSelchangeAsyncDevicename - CEditWinStationDlg member function: command * * Process new Async Device selection. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnSelchangeAsyncDevicename() { CComboBox *pDevice = (CComboBox *)GetDlgItem(IDC_ASYNC_DEVICENAME); BOOL bModemEnableFlag, bDirectEnableFlag; int index, nModemCmdShow, nDirectCmdShow;
/*
* Ignore this notification if the combo box is in a dropped-down * state. */ if ( pDevice->GetDroppedState() ) return;
if ( (index = pDevice->GetCurSel()) != CB_ERR ) {
TCHAR szDeviceName[DEVICENAME_LENGTH+MODEMNAME_LENGTH+1];
/*
* Fetch current selection and parse into device and modem names. */ pDevice->GetLBText(index, szDeviceName); ParseDecoratedAsyncDeviceName( szDeviceName, &(m_WSConfig.Pd[0].Params.Async) );
}
/*
* The SetDefaults, Advanced, and Test buttons and Device Connect * and Baud fields are enabled if the configuration is non-modem. * Otherwise, the Configure Modem button and modem callback fields * are enabled. (The Install Modems buttons is always enabled). */ if ( (*m_WSConfig.Pd[0].Params.Async.ModemName) ) {
bModemEnableFlag = ( (m_DlgMode != EWSDlgRename) && (m_DlgMode != EWSDlgView) ) ? TRUE : FALSE; nModemCmdShow = SW_SHOW; bDirectEnableFlag = FALSE; nDirectCmdShow = SW_HIDE;
} else {
bModemEnableFlag = FALSE; nModemCmdShow = SW_HIDE; bDirectEnableFlag = ( (m_DlgMode != EWSDlgRename) && (m_DlgMode != EWSDlgView) ) ? TRUE : FALSE; nDirectCmdShow = SW_SHOW;
}
GetDlgItem(IDC_ASYNC_MODEMCONFIG)->ShowWindow(nModemCmdShow); GetDlgItem(IDC_ASYNC_MODEMCONFIG)->EnableWindow(bModemEnableFlag); GetDlgItem(IDL_ASYNC_MODEMCALLBACK)->ShowWindow(nModemCmdShow); GetDlgItem(IDL_ASYNC_MODEMCALLBACK)->EnableWindow(bModemEnableFlag); GetDlgItem(IDL_ASYNC_MODEMCALLBACK1)->ShowWindow(nModemCmdShow); GetDlgItem(IDL_ASYNC_MODEMCALLBACK1)->EnableWindow(bModemEnableFlag); GetDlgItem(IDC_ASYNC_MODEMCALLBACK)->ShowWindow(nModemCmdShow); GetDlgItem(IDC_ASYNC_MODEMCALLBACK)->EnableWindow(bModemEnableFlag); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_INHERIT)->ShowWindow(nModemCmdShow); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_INHERIT)->EnableWindow(bModemEnableFlag); GetDlgItem(IDL_ASYNC_MODEMCALLBACK_PHONENUMBER)->ShowWindow(nModemCmdShow); GetDlgItem(IDL_ASYNC_MODEMCALLBACK_PHONENUMBER)->EnableWindow(bModemEnableFlag); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER)->ShowWindow(nModemCmdShow); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER)->EnableWindow(bModemEnableFlag); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER_INHERIT)->ShowWindow(nModemCmdShow); GetDlgItem(IDC_ASYNC_MODEMCALLBACK_PHONENUMBER_INHERIT)->EnableWindow(bModemEnableFlag); GetDlgItem(IDL_ASYNC_CONNECT)->ShowWindow(nDirectCmdShow); GetDlgItem(IDL_ASYNC_CONNECT)->EnableWindow(bDirectEnableFlag); GetDlgItem(IDC_ASYNC_CONNECT)->ShowWindow(nDirectCmdShow); GetDlgItem(IDC_ASYNC_CONNECT)->EnableWindow(bDirectEnableFlag); GetDlgItem(IDL_ASYNC_BAUDRATE)->ShowWindow(nDirectCmdShow); GetDlgItem(IDL_ASYNC_BAUDRATE)->EnableWindow(bDirectEnableFlag); GetDlgItem(IDC_ASYNC_BAUDRATE)->ShowWindow(nDirectCmdShow); GetDlgItem(IDC_ASYNC_BAUDRATE)->EnableWindow(bDirectEnableFlag); GetDlgItem(IDC_ASYNC_DEFAULTS)->ShowWindow(nDirectCmdShow); GetDlgItem(IDC_ASYNC_DEFAULTS)->EnableWindow(bDirectEnableFlag); GetDlgItem(IDC_ASYNC_ADVANCED)->ShowWindow(nDirectCmdShow); GetDlgItem(IDC_ASYNC_ADVANCED)->EnableWindow(bDirectEnableFlag); GetDlgItem(IDC_ASYNC_TEST)->ShowWindow(nDirectCmdShow); GetDlgItem(IDC_ASYNC_TEST)->EnableWindow(bDirectEnableFlag);
/*
* If this is a modem device, properly set the callback fields. */ if ( (*m_WSConfig.Pd[0].Params.Async.ModemName) ) {
OnClickedAsyncModemcallbackInherit(); OnClickedAsyncModemcallbackPhonenumberInherit(); }
} // end CEditWinStationDlg::OnSelchangeAsyncDevicename
/*******************************************************************************
* * OnCloseupAsyncModemcallback - CModemConfigDlg member function: command * * Invoke OnSelchangeAsyncModemcallback() when Modem Callback combo box * closes up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnCloseupAsyncModemcallback() { OnSelchangeAsyncModemcallback();
} // end CEditWinStationDlg::OnCloseupAsyncModemcallback
/*******************************************************************************
* * OnSelchangeAsyncModemcallback - CModemConfigDlg member function: command * * Process new Modem Callback selection. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnSelchangeAsyncModemcallback() { CComboBox *pCallback = (CComboBox *)GetDlgItem(IDC_ASYNC_MODEMCALLBACK);
/*
* Ignore this notification if the combo box is in a dropped-down * state. */ if ( pCallback->GetDroppedState() ) return;
/*
* Fetch current callback selection. */ m_WSConfig.Config.User.Callback = (CALLBACKCLASS)(pCallback->GetCurSel());
} // end CEditWinStationDlg::OnSelchangeAsyncModemcallback
/*******************************************************************************
* * OnCloseupAsyncBaudrate - CEditWinStationDlg member function: command * * Invoke OnSelchangeAsyncBaudrate() when Baud combo box closes up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnCloseupAsyncBaudrate() { OnSelchangeAsyncBaudrate();
} // end CEditWinStationDlg::OnCloseupAsyncBaudrate
/*******************************************************************************
* * OnSelchangeAsyncBaudrate - CEditWinStationDlg member function: command * * Process new Async Baud combo-box selection. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnSelchangeAsyncBaudrate() { CComboBox *pBaud = (CComboBox *)GetDlgItem(IDC_ASYNC_BAUDRATE); TCHAR string[ULONG_DIGIT_MAX], *endptr;
/*
* Ignore this notification if the combo box is in a dropped-down * state. */ if ( pBaud->GetDroppedState() ) return;
GetDlgItemText(IDC_ASYNC_BAUDRATE, string, lengthof(string)); m_WSConfig.Pd[0].Params.Async.BaudRate = lstrtoul(string, &endptr, 10);
} // end CEditWinStationDlg::OnSelchangeAsyncBaudrate
/*******************************************************************************
* * OnCloseupAsyncConnect - CEditWinStationDlg member function: command * * Invoke OnSelchangeAsyncConnect() when Connect combo box closes up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnCloseupAsyncConnect() { OnSelchangeAsyncConnect();
} // end CEditWinStationDlg::OnCloseupAsyncConnect
/*******************************************************************************
* * OnSelchangeAsyncConnect - CEditWinStationDlg member function: command * * Process new Async Connect combo-box selection. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnSelchangeAsyncConnect() { CComboBox *pConnect = (CComboBox *)GetDlgItem(IDC_ASYNC_CONNECT);
/*
* Ignore this notification if the combo box is in a dropped-down * state. */ if ( pConnect->GetDroppedState() ) return;
m_WSConfig.Pd[0].Params.Async.Connect.Type = (ASYNCCONNECTCLASS)pConnect->GetCurSel();
} // end CEditWinStationDlg::OnSelchangeAsyncConnect
/*******************************************************************************
* * OnDropdownNasiPortname - CEditWinStationDlg member function: command * * Update the Port Name combo box (if necessary) when it is opened up. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnDropdownNasiPortname() { CWaitCursor Wait;
/*
* We need to retrieve the current UserName, PassWord, and PortName contents * (with no validation) in order for InitializeNASIPortNames() to be able * to properly determine whether or not the 'input' fields have changed * since the last time the function was called. * * NOTE: be careful if you decide to validate at this point in time, because * any error message output to complain about invalid (like empty) fields may * mess up the behavior of the dialog (a strange side effect ButchD has * noticed in MFC). */ GetDlgItemText( IDC_NASI_USERNAME, m_WSConfig.Pd[0].Params.Nasi.UserName, lengthof(m_WSConfig.Pd[0].Params.Nasi.UserName) ); GetDlgItemText( IDC_NASI_PASSWORD, m_WSConfig.Pd[0].Params.Nasi.PassWord, lengthof(m_WSConfig.Pd[0].Params.Nasi.PassWord) ); GetDlgItemText( IDC_NASI_PORTNAME, m_WSConfig.Pd[0].Params.Nasi.SpecificName, lengthof(m_WSConfig.Pd[0].Params.Nasi.SpecificName) );
/*
* Now we get to initialize the Port Names (if needed). */ InitializeNASIPortNames(&(m_WSConfig.Pd[0].Params.Nasi));
} // end CEditWinStationDlg::OnDropdownNasiPortname
/*******************************************************************************
* * OnOK - CEditWinStationDlg member function: command (override) * * Read all control contents back into the WinStation config structure * before closing the dialog. * * ENTRY: * EXIT: * ******************************************************************************/
void CEditWinStationDlg::OnOK() { BOOL bOk = FALSE;
/*
* Get the current Configuration field data. Return if invalid data * entered (stay in dialog to fix the data). */ if ( !GetConfigurationFields() ) goto done;
/*
* Read common control contents back into the WinStation config structure. */ GetDlgItemText( IDC_WSCOMMENT, m_WSConfig.Config.Comment, lengthof(m_WSConfig.Config.Comment) );
/*
* If we're in Add, Copy, or Rename mode, fetch WinStation name from * control and validate. */ if ( (m_DlgMode == EWSDlgAdd) || (m_DlgMode == EWSDlgCopy) || (m_DlgMode == EWSDlgRename) ) {
GetDlgItemText(IDC_WINSTATIONNAME, m_pWSName, lengthof(WINSTATIONNAME));
/*
* If no WinStation name has been entered, output error message and * reset focus to WinStation name field for correction. */ if ( !*m_pWSName ) {
ERROR_MESSAGE((IDP_INVALID_WINSTATIONNAME_EMPTY))
GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); goto done; }
/*
* The WinStation name cannot begin with a digit. */ if ( _istdigit(*m_pWSName) ) {
ERROR_MESSAGE((IDP_INVALID_WINSTATIONNAME_DIGIT1)) GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); goto done; }
/*
* Validate the WinStation name for invalid characters. */ if ( lstrpbrk(m_pWSName, TEXT(":#.\\/ ")) ) {
ERROR_MESSAGE((IDP_INVALID_WINSTATIONNAME)) GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); goto done; }
/*
* The WinStation cannot be called 'console', which is a reserved name. */ if ( !lstrcmpi(m_pWSName, pApp->m_szSystemConsole) ) {
ERROR_MESSAGE((IDP_INVALID_WINSTATIONNAME_CONSOLE, pApp->m_szSystemConsole)) GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); goto done; }
/*
* Make sure that the specified WinStation name is unique. */ if ( !((CAppServerDoc *)m_pDoc)->IsWSNameUnique(m_pWSName) ) {
ERROR_MESSAGE((IDP_INVALID_WINSTATIONNAME_NOT_UNIQUE))
/*
* Set focus back to the WinStation name field and return * (don't allow exit). */ GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); goto done; }
} // end 'Add, Copy, or Rename name validation' if.
/*
* Perform special validation for SdNetwork and SdNasi types. */ if ( (m_WSConfig.Pd[0].Create.SdClass == SdNetwork) || (m_WSConfig.Pd[0].Create.SdClass == SdNasi) ) { PWSLOBJECT pWSLObject;
/*
* Special SdNetwork check: * If this is not a 'rename', make sure that no WinStation(s) * already exist with the selected PdName, WdName, and LanAdapter. * We don't need to make this check for rename, since the user * can't change anything but the name, which has already been * validated for uniqueness above. */ if ( (m_WSConfig.Pd[0].Create.SdClass == SdNetwork) && (m_DlgMode != EWSDlgRename) && (pWSLObject = ((CAppServerDoc *)m_pDoc)->GetWSLObjectNetworkMatch( m_WSConfig.Pd[0].Create.PdName, m_WSConfig.Wd.WdName, m_WSConfig.Pd[0].Params.Network.LanAdapter )) ) {
CString sz1;
/*
* A WinStation already exists with specified Pd, Wd, and LanAdapter. * If we're in Edit mode and the WinStation is actually 'us', then * this is no problem. Otherwise, tell the user of the problem. */ if ( (m_DlgMode != EWSDlgEdit) || lstrcmpi(m_pWSName, pWSLObject->m_WinStationName) ) {
/*
* Output a message indicating that existing WinStation(s) * are already defined with the current Protocol, Wd, * and LanAdapter; at least one of these must be changed for * new WinStation(s). */ ERROR_MESSAGE(( IDP_INVALID_NETWORK_WINSTATIONS_ALREADY_EXIST, pWSLObject->m_WinStationName ))
GotoDlgCtrl(GetDlgItem(IDC_WINSTATIONNAME)); goto done; } }
} // end 'special validation for SdNetwork and SdNasi types' if
/*
* If we're in Add, Copy, or Edit mode, make sure that the non-base PD * configuration fields are reset and then fill them with additional * PDs if necessary. */ if ( (m_DlgMode == EWSDlgAdd) || (m_DlgMode == EWSDlgCopy) || (m_DlgMode == EWSDlgEdit) ) {
int PdNext; UINT i; PDCONFIG3 PdConfig, SelectedPdConfig;
PdNext = 1;
for ( i=PdNext; i < MAX_PDCONFIG; i++ ) memset(&m_WSConfig.Pd[i], 0, sizeof(PDCONFIG));
/*
* If the selected Wd is an ICA type, process for additional Pds. */ if ( m_WSConfig.Wd.WdFlag & WDF_ICA ) { GetSelectedPdConfig(&SelectedPdConfig);
/*
* add additonal required PDs */ for ( i=PdNext; i < SelectedPdConfig.RequiredPdCount; i++ ) { GetPdConfig( m_pCurrentPdList, SelectedPdConfig.RequiredPds[i], &m_WSConfig, &PdConfig ); m_WSConfig.Pd[PdNext].Create = PdConfig.Data; m_WSConfig.Pd[PdNext].Params.SdClass = PdConfig.Data.SdClass; PdNext++; } }
/*
* Special Async handling. */ if ( m_WSConfig.Pd[0].Create.SdClass == SdAsync ) {
/*
* Properly set connection driver flag and Cd config * structure. */ m_WSConfig.Pd[0].Params.Async.fConnectionDriver = *(m_WSConfig.Pd[0].Params.Async.ModemName) ? TRUE : FALSE;
SetupAsyncCdConfig( &(m_WSConfig.Pd[0].Params.Async), &(m_WSConfig.Cd) );
}
} // end 'Add, Copy, or Edit' Pd configuration set' if
bOk = TRUE; // all's well
done: /*
* If we're in batch mode and not all's well, post * IDCANCEL to cancel this batch operation. */ if ( g_Batch && !bOk ) PostMessage(WM_COMMAND, IDCANCEL);
/*
* If all's well, Call the parent classes' OnOk to complete dialog closing * and destruction. */ if ( bOk ) CBaseDialog::OnOK();
} // end CEditWinStationDlg::OnOk
/*******************************************************************************
* * OnCancel - CEditWinStationDlg member function: command (override) * * Cancel the dialog. * * ENTRY: * EXIT: * (Refer to CDialog::OnCancel documentation) * ******************************************************************************/
void CEditWinStationDlg::OnCancel() { /*
* Call the parent classes' OnCancel to complete dialog closing * and destruction. */ CBaseDialog::OnCancel();
} // end CEditWinStationDlg::OnCancel
/*******************************************************************************
* * OnListInitError - CEditWinStationDlg member function: command * * Handle the list initialization error condition. * * ENTRY: * wParam (input) * (not used) * wLparam (input) * contains the DWORD error code from the list initialization attempt * EXIT: * (LRESULT) always returns 0 to indicate error handling complete. * ******************************************************************************/
LRESULT CEditWinStationDlg::OnListInitError( WPARAM wParam, LPARAM lParam ) { PDCONFIG3 PdConfig;
GetSelectedPdConfig(&PdConfig); HandleListInitError(&PdConfig, (DWORD)lParam); return(0);
} // end CEditWinStationDlg::OnListInitError
/*******************************************************************************
* * OnSetFieldsError - CEditWinStationDlg member function: command * * Handle the Protocol Configuration field set error condition. * * ENTRY: * wParam (input) * Contains the control ID that was in error during field setting. * wLparam (input) * (not used) * EXIT: * (LRESULT) always returns 0 to indicate error handling complete. * ******************************************************************************/
LRESULT CEditWinStationDlg::OnSetFieldsError( WPARAM wParam, LPARAM lParam ) { PDCONFIG3 PdConfig;
GetSelectedPdConfig(&PdConfig); HandleSetFieldsError(&PdConfig, wParam); return(0);
} // end CEditWinStationDlg::OnSetFieldsError
////////////////////////////////////////////////////////////////////////////////
#define ERROR_PDINIT \
{ \ bError = TRUE; \ goto cleanup; \ }
BOOL CEditWinStationDlg::AddNetworkDeviceNameToList(PPDCONFIG3 pPdConfig, CComboBox * pLanAdapter) {
TCHAR szDevice[DEVICENAME_LENGTH]; int length = 0, index = 0,Entry = 0; BOOL bError = FALSE;
//Interface pointer declarations
TCHAR szProtocol[256]; INetCfg * pnetCfg = NULL; INetCfgClass * pNetCfgClass = NULL; INetCfgClass * pNetCfgClassAdapter = NULL; INetCfgComponent * pNetCfgComponent = NULL; INetCfgComponent * pNetCfgComponentprot = NULL; INetCfgComponent * pOwner = NULL; IEnumNetCfgComponent * pEnumComponent = NULL; INetCfgComponentBindings * pBinding = NULL; LPWSTR pDisplayName = NULL; DWORD dwCharacteristics; ULONG count = 0; HRESULT hResult = S_OK;
/*
* Check for NetBIOS (PD_LANA) mapping or other mapping. */ if ( !(pPdConfig->Data.PdFlag & PD_LANA) ) {
//The First entry will be "All Lan Adapters"
length = LoadString( AfxGetInstanceHandle( ), IDS_ALL_LAN_ADAPTERS, szDevice, DEVICENAME_LENGTH ); ASSERT(length); index = pLanAdapter->AddString(szDevice); if ( (index != CB_ERR) && (index != CB_ERRSPACE) ) { pLanAdapter->SetItemData( index, Entry); Entry++; } else ERROR_PDINIT;
//include other possibilities
if(0 == lstrcmpi(pPdConfig->Data.PdName,L"tcp")) lstrcpy(szProtocol,NETCFG_TRANS_CID_MS_TCPIP);
else if(0 == lstrcmpi(pPdConfig->Data.PdName,L"netbios")) lstrcpy(szProtocol,NETCFG_SERVICE_CID_MS_NETBIOS);
else if(0 == lstrcmpi(pPdConfig->Data.PdName,L"ipx")) lstrcpy(szProtocol,NETCFG_TRANS_CID_MS_NWIPX); else if(0 == lstrcmpi(pPdConfig->Data.PdName,L"spx")) lstrcpy(szProtocol,NETCFG_TRANS_CID_MS_NWSPX); else return E_INVALIDARG;
if(S_OK != CoCreateInstance(CLSID_CNetCfg,NULL,CLSCTX_SERVER,IID_INetCfg,(LPVOID *)&pnetCfg)) ERROR_PDINIT;
if(pnetCfg) { hResult = pnetCfg->Initialize(NULL); if(FAILED(hResult)) ERROR_PDINIT; hResult = pnetCfg->QueryNetCfgClass(&GUID_DEVCLASS_NETTRANS ,IID_INetCfgClass,(void **)&pNetCfgClass); if(FAILED(hResult)) ERROR_PDINIT; hResult = pnetCfg->QueryNetCfgClass(&GUID_DEVCLASS_NET ,IID_INetCfgClass,(void **)&pNetCfgClassAdapter); if(FAILED(hResult)) ERROR_PDINIT; hResult = pNetCfgClass->FindComponent(szProtocol,&pNetCfgComponentprot); if(FAILED(hResult)) ERROR_PDINIT; hResult = pNetCfgComponentprot->QueryInterface(IID_INetCfgComponentBindings,(void **)&pBinding); if(FAILED(hResult)) ERROR_PDINIT; hResult = pNetCfgClassAdapter->EnumComponents(&pEnumComponent); RELEASEPTR(pNetCfgClassAdapter); if(FAILED(hResult)) ERROR_PDINIT; hResult = S_OK; while(TRUE) { hResult = pEnumComponent->Next(1,&pNetCfgComponent,&count); if(count == 0 || NULL == pNetCfgComponent) break;
hResult = pNetCfgComponent->GetCharacteristics(&dwCharacteristics); if(FAILED(hResult)) { RELEASEPTR(pNetCfgComponent); continue; } if(dwCharacteristics & NCF_PHYSICAL) {
if(S_OK == pBinding->IsBoundTo(pNetCfgComponent)) { hResult = pNetCfgComponent->GetDisplayName(&pDisplayName); if(FAILED(hResult)) ERROR_PDINIT;
index = pLanAdapter->AddString(pDisplayName); CoTaskMemFree(pDisplayName); if ( (index != CB_ERR) && (index != CB_ERRSPACE) ) { pLanAdapter->SetItemData( index, Entry); Entry++; } else ERROR_PDINIT;
} }
RELEASEPTR(pNetCfgComponent); } } cleanup: if(pnetCfg) pnetCfg->Uninitialize(); RELEASEPTR(pBinding); RELEASEPTR(pEnumComponent); RELEASEPTR(pNetCfgComponentprot); RELEASEPTR(pNetCfgComponent); RELEASEPTR(pNetCfgClass); RELEASEPTR(pnetCfg);
if(bError) { SetLastError(IDP_ERROR_PDINIT); return(FALSE);
} else return TRUE; } else {
/*
* NetBIOS LANA #: see which LanaMap entry corresponds to the specified * Lan Adapter. */
//Just use the functionality in Utildll. This seems to remain same on NT5.0 also
PPDPARAMS pPdParams, pBuffer; DEVICENAME szDevice; ULONG i, Entries; BOOL bResult = 0; int index;
/*
* Perform the device enumeration. */ if ( (pBuffer = WinEnumerateDevices( this->GetSafeHwnd(), pPdConfig, &Entries, g_Install ? TRUE : FALSE )) == NULL ) { // Don't report error here - let OnOK handle empty lan adapter selection
// SetLastError(IDP_ERROR_NETWORKDEVICEINIT);
// return(FALSE);
Entries = 0; }
/*
* Loop to initialize the combo-box. */ for ( i = 0, pPdParams = pBuffer; i < Entries; i++, pPdParams++ ) {
/*
* Fetch the Description for this device. */ if(!RegGetNetworkDeviceName(NULL, pPdConfig, pPdParams, szDevice, DEVICENAME_LENGTH))
{ SetLastError(IDP_ERROR_PDINIT); LocalFree(pBuffer); return(FALSE); } /*
* If the device description is not empty ('hidden' device), add the * device description and the ordinal value to the Lan Adapter * combo-box. */
if ( *szDevice ) { index = pLanAdapter->AddString(szDevice); if ( (index != CB_ERR) && (index != CB_ERRSPACE) )
pLanAdapter->SetItemData( index, pPdParams->Network.LanAdapter );
else { SetLastError(IDP_ERROR_PDINIT); LocalFree(pBuffer); return(FALSE); }
}
/*
* Free the enumeration buffer and return success. */ if ( pBuffer ) LocalFree(pBuffer); }
return TRUE;
} }
|