Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4059 lines
124 KiB

//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;
}
}