|
|
// configdlg.cpp : implements TSConfigDlg dialog.
//
#include "stdafx.h"
#include "resource.h"
#include "configdlg.h"
const CONNECTION_TIME_DIGIT_MAX = 5; // 5 digits max
const CONNECTION_TIME_DEFAULT = 120; // 120 minutes
const CONNECTION_TIME_MIN = 1; // 1 minute
const CONNECTION_TIME_MAX = 71582; // 71582 minutes (max msec for ULONG)
const DISCONNECTION_TIME_DIGIT_MAX = 5; // 5 digits max
const DISCONNECTION_TIME_DEFAULT = 10; // 10 minutes
const DISCONNECTION_TIME_MIN = 1; // 1 minute
const DISCONNECTION_TIME_MAX = 71582; // 71582 minutes (max msec for ULONG)
const IDLE_TIME_DIGIT_MAX = 5; // 5 digits max
const IDLE_TIME_DEFAULT = 10; // 10 minutes
const IDLE_TIME_MIN = 1; // 1 minute
const IDLE_TIME_MAX = 71582; // 71582 minutes (max msec for ULONG)
const TIME_RESOLUTION = 60000; // stored as msec-seen as minutes
// forword declard.
DWORD wchar2TCHAR(TCHAR *dest, const WCHAR *src); extern HINSTANCE GetInstance(); BOOL TSConfigDlg::m_sbWindowLogSet = FALSE;
// property page dialog procedure : handles dialog messages.
BOOL CALLBACK TSConfigDlg::PropertyPageDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_INITDIALOG) { // LPARAM points to the property sheet page.
// this will give us this pointer to access the class.
TSConfigDlg *pDlg = reinterpret_cast<TSConfigDlg*>(LPPROPSHEETPAGE(lParam)->lParam);
ASSERT(NULL != pDlg); ASSERT(pDlg->AssertClass()); SetWindowLong(hwndDlg, DWL_USER, long(pDlg));
// ok now hereafter we can access the class pointer.
// maks_done: check mfc implementation, how do they do it ?
// what mfc does is - its hooks into the wnd creation process
// and keeps a map of hwnd vs objects.
m_sbWindowLogSet = TRUE;
return pDlg->OnInitDialog(hwndDlg, wParam, lParam);
}
// now we have set DWL_USER as class pointer during INIT DIALOG.
if (m_sbWindowLogSet) { TSConfigDlg *pDlg = reinterpret_cast<TSConfigDlg*>(GetWindowLong(hwndDlg, DWL_USER)); ASSERT(NULL != pDlg); ASSERT(pDlg->AssertClass());
if (uMsg == WM_COMMAND) return pDlg->OnCommand(wParam, lParam);
if (uMsg == WM_NOTIFY) { LOGMESSAGE3(_T("Received WM_NOTIFY:hwnddlg =%ul,wParam=%u,lParam=%ul"), hwndDlg, wParam, lParam); return pDlg->OnNotify(wParam, lParam); }
}
return 0; }
// Property Sheet Procedure : gets notified about CREATE, RELEASE events
UINT CALLBACK TSConfigDlg::PropSheetPageProc ( HWND /* hWnd */, // [in] Window handle - always null
UINT uMsg, // [in,out] Either the create or delete message
LPPROPSHEETPAGE pPsp // [in,out] Pointer to the property sheet struct
) { ASSERT( NULL != pPsp );
// We need to recover a pointer to the current instance. We can't just use
// "this" because we are in a static function
TSConfigDlg* pMe = reinterpret_cast<TSConfigDlg*>(pPsp->lParam); ASSERT( NULL != pMe ); ASSERT(pMe->AssertClass());
switch( uMsg ) { case PSPCB_CREATE: break;
case PSPCB_RELEASE:
// this variable makes dialog proc setwindowlong on dialog handle.
m_sbWindowLogSet = FALSE; delete pMe; return 1; //(pfnOrig)(hWnd, uMsg, pPsp);
}
return 1;
} // end PropSheetPageProc()
TSConfigDlg::TSConfigDlg (LPWSTR wMachineName, LPWSTR wUserName) { ASSERT(wMachineName); ASSERT(wUserName);
ASSERT(wcslen(wMachineName) < SIZE_MAX_SERVERNAME); ASSERT(wcslen(wUserName) < SIZE_MAX_USERNAME); VERIFY( wchar2TCHAR(m_Username, wUserName) < SIZE_MAX_USERNAME); VERIFY( wchar2TCHAR(m_Servername, wMachineName) < SIZE_MAX_SERVERNAME);
LOGMESSAGE0(_T("TSConfigDlg::TSConfigDlg ()"));
m_tPropSheetPage.dwSize = sizeof (PROPSHEETPAGE); m_tPropSheetPage.hInstance = GetInstance (); m_tPropSheetPage.pszTemplate = MAKEINTRESOURCE(IDD); m_tPropSheetPage.dwFlags = PSP_USECALLBACK; m_tPropSheetPage.pfnDlgProc = PropertyPageDlgProc; m_tPropSheetPage.pfnCallback = PropSheetPageProc; m_tPropSheetPage.lParam = long(this); m_sbWindowLogSet = FALSE; m_id = IDD_TS_USER_CONFIG_EDIT; }
BOOL TSConfigDlg::AssertClass() const { return m_id == IDD_TS_USER_CONFIG_EDIT; }
TSConfigDlg::~TSConfigDlg () { LOGMESSAGE0(_T("TSConfigDlg::~TSConfigDlg ()")); }
BOOL TSConfigDlg::OnInitDialog( HWND hwndDlg, WPARAM /* wParam */, LPARAM /* lParam */ ) { m_hDlg = hwndDlg;
// get the user info and initialize dialog class members with it.
GetUserInfo();
// initializes the controls.
InitControls();
return 1; // non zero since we are not calling setfocus
}
APIERR TSConfigDlg::SetUserInfo () { APIERR err; USERCONFIG UserConfig;
/* If the object is not 'dirty', no need to save info.
*/ // if ( !_fDirty )
// return NERR_Success;
/* Zero-initialize USERCONFIG structure and copy member variable
* contents there. */ ZeroMemory( &UserConfig, sizeof(USERCONFIG) ); MembersToUCStruct( &UserConfig );
/*
* Save user's configuration. */ err = RegUserConfigSet( GetServername(), // servername
GetUsername(), // username
&UserConfig, sizeof(UserConfig) );
// Don't reset 'dirty' flag to behave properly with new RegUserConfig APIs
// (we might get called twice, just like the UsrMgr objects to, so we want
// to happily write our our data twice, just like they do)
// _fDirty = FALSE;
//
// By not setting _fDirty = FALSE here we try to check the validity of the RemoteWFHomeDir whenever OK is pressed
// This is because MS used 2 structures to hold its HomeDir, and could compare the two. We only have one and rely
// on this dirty flag. This flag is used in USERPROP_DLG::I_PerformOne_Write(...) and is set in the
// USER_CONFIG::GetInfo and USER_CONFIG::GetDefaults and USERPROF_DLG_NT::PerformOne()
//
tDialogData._fWFHomeDirDirty = FALSE;
return err;
}
APIERR TSConfigDlg::GetUserInfo () { APIERR err; ULONG Length; USERCONFIG UserConfig;
// calll regapi function for getting user configuration
err = RegUserConfigQuery ( GetServername(), // servername
GetUsername(), // username
&UserConfig, // address for userconfig buffer
sizeof(UserConfig), // size of buffer
&Length // returned size
);
if ( err == NERR_Success ) { ASSERT(Length == sizeof(UserConfig)); } else { LOGMESSAGE3(_T("RegUserConfigQuery failed for %s\\%s. Error = %ul"), GetServername(), GetUsername(), err); LOGMESSAGE0(_T("Getting Deafult user config")); err = RegDefaultUserConfigQuery( GetServername(), // servername
&UserConfig, // address for userconfig buffer
sizeof(UserConfig), // size of buffer
&Length // returned length
);
if (err != NERR_Success) { LOGMESSAGE3(_T("RegDefaultUserConfigQuery failed for %s\\%s. Error = %ul"), GetServername(), GetUsername(), err); // maks_todo: must initialize defaults known to us over here.
return err; } } UCStructToMembers( &UserConfig );
tDialogData._fWFHomeDirDirty = FALSE; tDialogData._fDirty = FALSE; return err; }
/*******************************************************************
NAME: USER_CONFIG::UCStructToMembers
SYNOPSIS: Copies a given USERCONFIG structure elements into corresponding member variables.
ENTRY: pUCStruct - pointer to USERCONFIG structure.
********************************************************************/ void TSConfigDlg::UCStructToMembers( PUSERCONFIG pUCStruct ) { ASSERT(pUCStruct);
tDialogData._fAllowLogon = (BOOL)!pUCStruct->fLogonDisabled; tDialogData._ulConnection = pUCStruct->MaxConnectionTime; tDialogData._ulDisconnection = pUCStruct->MaxDisconnectionTime; tDialogData._ulIdle = pUCStruct->MaxIdleTime; _tcscpy(tDialogData._nlsInitialProgram, pUCStruct->InitialProgram); _tcscpy(tDialogData._nlsWorkingDirectory, pUCStruct->WorkDirectory ); tDialogData._fClientSpecified = pUCStruct->fInheritInitialProgram; tDialogData._fAutoClientDrives = pUCStruct->fAutoClientDrives; tDialogData._fAutoClientLpts = pUCStruct->fAutoClientLpts; tDialogData._fForceClientLptDef = pUCStruct->fForceClientLptDef; tDialogData._iEncryption = (INT)pUCStruct->MinEncryptionLevel; tDialogData._fDisableEncryption = pUCStruct->fDisableEncryption; tDialogData._fHomeDirectoryMapRoot = pUCStruct->fHomeDirectoryMapRoot; tDialogData._iBroken = (INT)pUCStruct->fResetBroken; tDialogData._iReconnect = (INT)pUCStruct->fReconnectSame; tDialogData._iCallback = (INT)pUCStruct->Callback; _tcscpy(tDialogData._nlsPhoneNumber, pUCStruct->CallbackNumber ); tDialogData._iShadow = (INT)pUCStruct->Shadow; _tcscpy(tDialogData._nlsNWLogonServer, pUCStruct->NWLogonServer ); _tcscpy(tDialogData._nlsWFProfilePath, pUCStruct->WFProfilePath ); _tcscpy(tDialogData._nlsWFHomeDir, pUCStruct->WFHomeDir ); _tcscpy(tDialogData._nlsWFHomeDirDrive, pUCStruct->WFHomeDirDrive);
}
/*******************************************************************
NAME: USER_CONFIG::MembersToUCStruct
SYNOPSIS: Copies member variables into a given USERCONFIG structure elements.
ENTRY: pUCStruct - pointer to USERCONFIG structure.
********************************************************************/
void TSConfigDlg::MembersToUCStruct( PUSERCONFIG pUCStruct ) const { ASSERT(pUCStruct);
pUCStruct->fLogonDisabled = !tDialogData._fAllowLogon; pUCStruct->MaxConnectionTime = tDialogData._ulConnection; pUCStruct->MaxDisconnectionTime = tDialogData._ulDisconnection; pUCStruct->MaxIdleTime = tDialogData._ulIdle; _tcscpy( pUCStruct->InitialProgram, tDialogData._nlsInitialProgram); _tcscpy( pUCStruct->WorkDirectory, tDialogData._nlsWorkingDirectory); pUCStruct->fInheritInitialProgram = tDialogData._fClientSpecified; pUCStruct->fAutoClientDrives = tDialogData._fAutoClientDrives; pUCStruct->fAutoClientLpts = tDialogData._fAutoClientLpts; pUCStruct->fForceClientLptDef = tDialogData._fForceClientLptDef; pUCStruct->MinEncryptionLevel = (BYTE)tDialogData._iEncryption; pUCStruct->fDisableEncryption = tDialogData._fDisableEncryption; pUCStruct->fHomeDirectoryMapRoot = tDialogData._fHomeDirectoryMapRoot; pUCStruct->fResetBroken = tDialogData._iBroken; pUCStruct->fReconnectSame = tDialogData._iReconnect; pUCStruct->Callback = (CALLBACKCLASS)tDialogData._iCallback; _tcscpy( pUCStruct->CallbackNumber, tDialogData._nlsPhoneNumber); pUCStruct->Shadow = (SHADOWCLASS)tDialogData._iShadow; _tcscpy( pUCStruct->NWLogonServer, tDialogData._nlsNWLogonServer); _tcscpy( pUCStruct->WFProfilePath, tDialogData._nlsWFProfilePath); _tcscpy( pUCStruct->WFHomeDir, tDialogData._nlsWFHomeDir); _tcscpy( pUCStruct->WFHomeDirDrive, tDialogData._nlsWFHomeDirDrive); }
BOOL TSConfigDlg::OnNotify (WPARAM wParam, LPARAM lParam) { int idCtrl = (int) wParam; NMHDR *pnmh = (LPNMHDR) lParam;
// typedef struct tagNMHDR {
// HWND hwndFrom;
// UINT idFrom;
// UINT code;
// } NMHDR;
ASSERT(pnmh); switch(pnmh->code) { case PSN_KILLACTIVE: LOGMESSAGE0(_T("Its KillActive Notification")); if (VerifyChanges()) // verify passed, allow the page to lose the activation
SetWindowLong(GetDlgHandle(), DWL_MSGRESULT, FALSE); else // no verify failed, prevent the page from losing the activation
SetWindowLong(GetDlgHandle(), DWL_MSGRESULT, TRUE);;
break;
case PSN_APPLY: LOGMESSAGE0(_T("Its Apply Notification")); ApplyChanges(); break;
case PSN_RESET: // cancel changes.
LOGMESSAGE0(_T("Its Apply Reset")); break; default: break;
}
return 1;
}
BOOL TSConfigDlg::OnCommand(WPARAM wParam, LPARAM lParam) { WORD wNotifyCode = HIWORD(wParam); // notification code
WORD wID = LOWORD(wParam); // item, control, or accelerator identifier
HWND hwndCtl = (HWND) lParam; // handle of control
//if (wNotifyCode == 0 || wNotifyCode == 1)
// return 1;
// dispatch the command messages accordingly.
switch(wID) { case IDC_UCE_ALLOWLOGON: ALLOWLOGONEvent(wNotifyCode); break;
case IDC_UCE_CONNECTION_NONE: CONNECTION_NONEEvent(wNotifyCode); break;
case IDC_UCE_DISCONNECTION_NONE: DISCONNECTION_NONEEvent(wNotifyCode); break;
case IDC_UCE_IDLE_NONE: IDLE_NONEEvent(wNotifyCode); break;
case IDC_UCE_INITIALPROGRAM_INHERIT: INITIALPROGRAM_INHERITEvent(wNotifyCode); break;
case IDC_UCE_SECURITY_DISABLEAFTERLOGON: SECURITY_DISABLEAFTERLOGONEvent(wNotifyCode); break;
default: break;
} return 1; // since we do not process message.
}
BOOL TSConfigDlg::InitControls () { TCHAR str[SIZE_SMALL_STRING_BUFFER];
struct { UINT uiControlID; UINT uiNoOfStrings; UINT auiStringList[7];
} atListControls[] = { { IDC_UCE_SECURITY_ENCRYPT, 2, { IDS_UCE_ENCRYPT_NONE, IDS_UCE_ENCRYPT_LEVEL1, } }, { IDC_UCE_BROKEN, 2, { IDS_UCE_BROKEN_DISCONNECT, IDS_UCE_BROKEN_RESET, } }, { IDC_UCE_RECONNECT, 2, { IDS_UCE_RECONNECT_ANY, IDS_UCE_RECONNECT_PREVIOUS, } }, { IDC_UCE_CALLBACK, 3, { IDS_UCE_CALLBACK_DISABLE, IDS_UCE_CALLBACK_ROVING, IDS_UCE_CALLBACK_FIXED, } }, { IDC_UCE_SHADOW, 5, { IDS_UCE_SHADOW_DISABLE, IDS_UCE_SHADOW_INPUT_NOTIFY, IDS_UCE_SHADOW_INPUT_NONOTIFY, IDS_UCE_SHADOW_NOINPUT_NOTIFY, IDS_UCE_SHADOW_NOINPUT_NONOTIFY, } } };
// for each list/combo box control
for (int j = 0; j < sizeof(atListControls)/sizeof(atListControls[0]); j++) { // add all the strings specified for the control
for (UINT i = 0; i < atListControls[j].uiNoOfStrings; i++) { DWORD dwSize = LoadString( GetInstance (), atListControls[j].auiStringList[i], str, SIZE_SMALL_STRING_BUFFER); ASSERT(dwSize != 0 && dwSize <= SIZE_SMALL_STRING_BUFFER - 1);
SendDlgItemMessage( GetDlgHandle(), atListControls[j].uiControlID, CB_ADDSTRING, 0, LPARAM(str)); } }
// we dont want tristate buttons for now
// as we are not supporting multipal users
// lets make all the controls no tristate.
int aCheckBoxes[] = { IDC_UCE_ALLOWLOGON, IDC_UCE_CONNECTION_NONE, IDC_UCE_DISCONNECTION_NONE, IDC_UCE_IDLE_NONE, IDC_UCE_INITIALPROGRAM_INHERIT, IDC_UCE_SECURITY_DISABLEAFTERLOGON };
for (int i = 0; i < sizeof(aCheckBoxes)/sizeof(aCheckBoxes[0]); i++) { HWND hControlWnd = GetDlgItem(GetDlgHandle(), aCheckBoxes[i]); ASSERT(hControlWnd);
//DWORD dwStyle = GetWindowLong(hControlWnd, GWL_STYLE);
//dwStyle = dwStyle & ~BS_3STATE;
SendMessage (hControlWnd, BM_SETSTYLE, LOWORD(BS_AUTOCHECKBOX), MAKELPARAM(0, 0)); }
// set text limit for the edit boxes.
// EM_SETLIMITTEXT
// wParam = (WPARAM) cbMax; // new text limits, in bytes
// lParam = 0; // not used, must be zero
struct { UINT uiEditControlid; UINT uiLimitText; } atTextLimits[] = { {IDC_UCE_CONNECTION, CONNECTION_TIME_DIGIT_MAX}, {IDC_UCE_DISCONNECTION, DISCONNECTION_TIME_DIGIT_MAX}, {IDC_UCE_IDLE, IDLE_TIME_DIGIT_MAX}, {IDC_UCE_INITIALPROGRAM_COMMANDLINE, MAX_INIT_PROGRAM_SIZE}, {IDC_UCE_INITIALPROGRAM_WORKINGDIRECTORY, MAX_INIT_DIR_SIZE} };
for (i = 0; i < sizeof(atTextLimits)/sizeof(atTextLimits[0]); i++) { HWND hControlWnd = GetDlgItem(GetDlgHandle(), atTextLimits[i].uiEditControlid); ASSERT(hControlWnd);
//DWORD dwStyle = GetWindowLong(hControlWnd, GWL_STYLE);
//dwStyle = dwStyle & ~BS_3STATE;
SendMessage (hControlWnd, EM_SETLIMITTEXT, atTextLimits[i].uiLimitText, MAKELPARAM(0, 0)); }
return MembersToControls();
}
BOOL TSConfigDlg::VerifyChanges () { // do the necessary varification here.
// if data entered is good return TRUE
// otherwise display message and return FALSE
TDialogData tTemp; return ControlsToMembers(&tTemp); }
BOOL TSConfigDlg::ApplyChanges () { ASSERT(VerifyChanges());
// control to members fails if the data is controls is bad.
// but since we have varified the changes before getting call to apply changes
// it must pass.
VERIFY( ControlsToMembers(&tDialogData) ); SetUserInfo();
return TRUE; }
BOOL TSConfigDlg::MembersToControls () { VERIFY( SetAllowLogon ( tDialogData._fAllowLogon )); VERIFY( SetConnectionTimeOut( tDialogData._ulConnection )); VERIFY( SetDisConnectionTimeOut( tDialogData._ulDisconnection )); VERIFY( SetIdleTimeOut( tDialogData._ulIdle )); VERIFY( SetCommandLineAndWorkingDirectory(tDialogData._fClientSpecified, tDialogData._nlsWorkingDirectory, tDialogData._nlsInitialProgram)); VERIFY( SetSecurity(tDialogData._iEncryption, tDialogData._fDisableEncryption)); VERIFY( SetBrokenConnectionOption(tDialogData._iBroken)); VERIFY( SetReconnectDisconnection(tDialogData._iReconnect)); VERIFY( SetCallBackOptonAndPhoneNumber(tDialogData._iCallback, tDialogData._nlsPhoneNumber)); VERIFY( SetShadowing(tDialogData._iShadow));
return TRUE; }
BOOL TSConfigDlg::ControlsToMembers (TDialogData *pDlgData) { ASSERT(pDlgData); if ( !GetAllowLogon (&pDlgData->_fAllowLogon)) return FALSE; if ( !GetConnectionTimeOut(&pDlgData->_ulConnection)) return FALSE; if ( !GetDisConnectionTimeOut(&pDlgData->_ulDisconnection)) return FALSE; if ( !GetIdleTimeOut(&pDlgData->_ulIdle)) return FALSE; if ( !GetCommandLineAndWorkingDirectory(&pDlgData->_fClientSpecified, pDlgData->_nlsWorkingDirectory, pDlgData->_nlsInitialProgram)) return FALSE; if ( !GetSecurity(&pDlgData->_iEncryption, &pDlgData->_fDisableEncryption)) return FALSE; if ( !GetBrokenConnectionOption(&pDlgData->_iBroken)) return FALSE; if ( !GetReconnectDisconnection(&pDlgData->_iReconnect)) return FALSE; if ( !GetCallBackOptonAndPhoneNumber(&pDlgData->_iCallback, pDlgData->_nlsPhoneNumber)) return FALSE; if ( !GetShadowing(&pDlgData->_iShadow)) return FALSE;
return TRUE; }
BOOL TSConfigDlg::GetAllowLogon (BOOL *pbAllowLogon) { ASSERT(pbAllowLogon); *pbAllowLogon = IsChecked(IDC_UCE_ALLOWLOGON);
return TRUE; }
BOOL TSConfigDlg::SetAllowLogon (BOOL bAllowLogon) { SetCheck(IDC_UCE_ALLOWLOGON, bAllowLogon); return TRUE; }
BOOL TSConfigDlg::GetConnectionTimeOut(ULONG *pValue) {
ASSERT(pValue); BOOL bResult = FALSE;
if (IsChecked(IDC_UCE_CONNECTION_NONE)) { // maks_todo: assert that edit control is disabled.
// maks_todo : assert that edit control has value == 0
*pValue = 0; bResult = TRUE;
} else { // last parameter tells if the value is signed or unsigned.
// we ask it not to look for - sign.
// maks_todo:BUT WE MAY WANT TO CHNAGE THIS
*pValue = GetDlgItemInt(GetDlgHandle(), IDC_UCE_CONNECTION, &bResult, FALSE);
if (!bResult || *pValue == 0 || *pValue > 71582) { MessageBox(GetDlgHandle(), _T("The Connection Timeout value must 1 to 71582 minutes. Check the 'No Timeout' if you wish to specify no connection timeout"), _T("Termainl Server Properties"), MB_OK); bResult = FALSE; } }
// users talk in terms of mins.
// we talk about msecs.
*pValue = *pValue * TIME_RESOLUTION;
return bResult; }
BOOL TSConfigDlg::SetConnectionTimeOut(ULONG iValue) { // users talk in terms of mins.
// we talk about msecs.
iValue = iValue / TIME_RESOLUTION;
SetCheck(IDC_UCE_CONNECTION_NONE, iValue == 0); EnableControl(IDC_UCE_CONNECTION, iValue != 0); SetDlgItemInt(GetDlgHandle(), IDC_UCE_CONNECTION, iValue, TRUE); // maks_todo : look into last param.
return TRUE; }
BOOL TSConfigDlg::GetDisConnectionTimeOut(ULONG *pValue) { ASSERT(pValue); BOOL bResult = FALSE;
if (IsChecked(IDC_UCE_DISCONNECTION_NONE)) { // maks_todo: assert that edit control is disabled.
// maks_todo : assert that edit control has value == 0
*pValue = 0; bResult = TRUE;
} else { // last parameter tells if the value is signed or unsigned.
// we ask it not to look for - sign.
// maks_todo:BUT WE MAY WANT TO CHNAGE THIS
*pValue = GetDlgItemInt(GetDlgHandle(), IDC_UCE_DISCONNECTION, &bResult, FALSE); if (!bResult || *pValue == 0 || *pValue > 71582) { MessageBox(GetDlgHandle(), _T("The Disconnection Timeout value must 1 to 71582 minutes. Check the 'No Timeout' if you wish to specify no Disconnection timeout"), _T("Termainl Server Properties"), MB_OK); bResult = FALSE; }
}
*pValue = *pValue * TIME_RESOLUTION;
return bResult; }
BOOL TSConfigDlg::SetDisConnectionTimeOut(ULONG iValue) { // users talk in terms of mins.
// we talk about msecs.
iValue = iValue / TIME_RESOLUTION;
SetCheck(IDC_UCE_DISCONNECTION_NONE, iValue == 0);
EnableControl(IDC_UCE_DISCONNECTION, iValue != 0); SetDlgItemInt(GetDlgHandle(), IDC_UCE_DISCONNECTION, iValue, TRUE); // maks_todo : look into last param.
return TRUE;
}
BOOL TSConfigDlg::GetIdleTimeOut(ULONG *pValue) { ASSERT(pValue); BOOL bResult = FALSE;
if (IsChecked(IDC_UCE_IDLE_NONE)) { // maks_todo: assert that edit control is disabled.
// maks_todo : assert that edit control has value == 0
*pValue = 0; bResult = TRUE; } else { // last parameter tells if the value is signed or unsigned.
// we ask it not to look for - sign.
// maks_todo:BUT WE MAY WANT TO CHNAGE THIS
*pValue = GetDlgItemInt(GetDlgHandle(), IDC_UCE_IDLE, &bResult, FALSE);
if (!bResult || *pValue == 0 || *pValue > 71582) { MessageBox(GetDlgHandle(), _T("The Idle Timeout value must 1 to 71582 minutes. Check the 'No Timeout' if you wish to specify no Idle timeout"), _T("Termainl Server Properties"), MB_OK); bResult = FALSE; }
}
*pValue = *pValue * TIME_RESOLUTION;
return bResult; }
BOOL TSConfigDlg::SetIdleTimeOut(ULONG iValue) { // users talk in terms of mins.
// we talk about msecs.
iValue = iValue / TIME_RESOLUTION;
SetCheck(IDC_UCE_IDLE_NONE, iValue == 0); EnableControl(IDC_UCE_IDLE, iValue != 0); SetDlgItemInt(GetDlgHandle(), IDC_UCE_IDLE, iValue, TRUE); // maks_todo : look into last param.
return TRUE; }
BOOL TSConfigDlg::SetCommandLineAndWorkingDirectory(BOOL bUserInherited, LPCTSTR dir, LPCTSTR cmd) { ASSERT(dir); ASSERT(cmd);
if (bUserInherited) SetCheck(IDC_UCE_INITIALPROGRAM_INHERIT, bUserInherited); // enable/disable edits according to check box status.
EnableControl(IDL_UCE_INITIALPROGRAM_COMMANDLINE1, !bUserInherited); EnableControl(IDL_UCE_INITIALPROGRAM_WORKINGDIRECTORY1, !bUserInherited); EnableControl(IDC_UCE_INITIALPROGRAM_COMMANDLINE, !bUserInherited); EnableControl(IDC_UCE_INITIALPROGRAM_WORKINGDIRECTORY, !bUserInherited);
// set the text into edits.
SetDlgItemText(GetDlgHandle(), IDC_UCE_INITIALPROGRAM_COMMANDLINE, cmd); SetDlgItemText(GetDlgHandle(), IDC_UCE_INITIALPROGRAM_WORKINGDIRECTORY, dir);
return TRUE; }
BOOL TSConfigDlg::GetCommandLineAndWorkingDirectory(BOOL *pbUserInherited, LPTSTR dir, LPTSTR cmd) { ASSERT(dir); ASSERT(cmd);
*pbUserInherited = IsChecked(IDC_UCE_INITIALPROGRAM_INHERIT); // set the text into edits.
GetDlgItemText(GetDlgHandle(), IDC_UCE_INITIALPROGRAM_COMMANDLINE, cmd, MAX_INIT_PROGRAM_SIZE); GetDlgItemText(GetDlgHandle(), IDC_UCE_INITIALPROGRAM_WORKINGDIRECTORY, dir, MAX_INIT_DIR_SIZE);
return TRUE; }
BOOL TSConfigDlg::SetSecurity(int iLevel, BOOL bDisableAfterLogon) { SetComboCurrentSel(IDC_UCE_SECURITY_ENCRYPT, iLevel); SetCheck(IDC_UCE_SECURITY_DISABLEAFTERLOGON, bDisableAfterLogon); return TRUE; }
BOOL TSConfigDlg::GetSecurity(int *piLevel, BOOL *pbDisableAfterLogon) { ASSERT(piLevel); ASSERT(pbDisableAfterLogon);
*piLevel = GetComboCurrentSel(IDC_UCE_SECURITY_ENCRYPT); *pbDisableAfterLogon = IsChecked(IDC_UCE_SECURITY_DISABLEAFTERLOGON); return TRUE; }
BOOL TSConfigDlg::SetBrokenConnectionOption(int iLevel) { SetComboCurrentSel(IDC_UCE_BROKEN, iLevel); return TRUE; }
BOOL TSConfigDlg::GetBrokenConnectionOption(int *piLevel) { *piLevel = GetComboCurrentSel(IDC_UCE_BROKEN); return TRUE; }
BOOL TSConfigDlg::SetReconnectDisconnection(int iLevel) { SetComboCurrentSel(IDC_UCE_RECONNECT, iLevel); return TRUE; }
BOOL TSConfigDlg::GetReconnectDisconnection(int *piLevel) { *piLevel = GetComboCurrentSel(IDC_UCE_RECONNECT); return TRUE; }
BOOL TSConfigDlg::SetCallBackOptonAndPhoneNumber(int iCallBack, LPCTSTR PhoneNo) { SetComboCurrentSel(IDC_UCE_CALLBACK, iCallBack); SetDlgItemText(GetDlgHandle(), IDC_UCE_PHONENUMBER, PhoneNo);
// enable/disable phone # accordingly.
EnableControl(IDL_UCE_PHONENUMBER, iCallBack != 0); EnableControl(IDC_UCE_PHONENUMBER, iCallBack != 0);
return TRUE; }
BOOL TSConfigDlg::GetCallBackOptonAndPhoneNumber(int *piCallBack, LPTSTR PhoneNo) { *piCallBack = GetComboCurrentSel(IDC_UCE_CALLBACK); GetDlgItemText(GetDlgHandle(), IDC_UCE_PHONENUMBER, PhoneNo, MAX_PHONENO_SIZE);
return TRUE; }
BOOL TSConfigDlg::SetShadowing(int iLevel) { SetComboCurrentSel(IDC_UCE_SHADOW, iLevel); return TRUE; }
BOOL TSConfigDlg::GetShadowing(int *piLevel) { *piLevel = GetComboCurrentSel(IDC_UCE_SHADOW); return TRUE; }
// Utility function.
DWORD wchar2TCHAR(TCHAR *dest, const WCHAR *src) { ASSERT(dest && src);
#ifdef UNICODE
_tcscpy(dest, src); #else
DWORD count; count = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL); return WideCharToMultiByte(CP_ACP, 0, src, -1, dest, count, NULL, NULL);
#endif
return _tcslen(dest); }
BOOL TSConfigDlg::ALLOWLOGONEvent(WORD wNotifyCode) { switch(wNotifyCode) { case BN_CLICKED: break; default: break; }
return TRUE; }
BOOL TSConfigDlg::CONNECTION_NONEEvent(WORD wNotifyCode) { switch(wNotifyCode) { case BN_CLICKED: EnableControl(IDC_UCE_CONNECTION, !IsChecked(IDC_UCE_CONNECTION_NONE));
//EnableControl(IDC_UCE_CONNECTION, iValue != 0);
break; default: break; }
return TRUE; }
BOOL TSConfigDlg::DISCONNECTION_NONEEvent(WORD wNotifyCode) { switch(wNotifyCode) { case BN_CLICKED: EnableControl(IDC_UCE_DISCONNECTION, !IsChecked(IDC_UCE_DISCONNECTION_NONE)); break; default: break; }
return TRUE; }
BOOL TSConfigDlg::IDLE_NONEEvent(WORD wNotifyCode) { switch(wNotifyCode) { case BN_CLICKED: EnableControl(IDC_UCE_IDLE, !IsChecked(IDC_UCE_IDLE_NONE)); break; default: break; }
return TRUE; }
BOOL TSConfigDlg::INITIALPROGRAM_INHERITEvent(WORD wNotifyCode) { switch(wNotifyCode) { case BN_CLICKED: EnableControl(IDL_UCE_INITIALPROGRAM_COMMANDLINE1, !IsChecked(IDC_UCE_INITIALPROGRAM_INHERIT));
EnableControl(IDL_UCE_INITIALPROGRAM_WORKINGDIRECTORY1, !IsChecked(IDC_UCE_INITIALPROGRAM_INHERIT));
EnableControl(IDC_UCE_INITIALPROGRAM_COMMANDLINE, !IsChecked(IDC_UCE_INITIALPROGRAM_INHERIT));
EnableControl(IDC_UCE_INITIALPROGRAM_WORKINGDIRECTORY, !IsChecked(IDC_UCE_INITIALPROGRAM_INHERIT));
break; default: break; }
return TRUE; }
BOOL TSConfigDlg::SECURITY_DISABLEAFTERLOGONEvent(WORD /* wNotifyCode */ ) { return TRUE; }
BOOL TSConfigDlg::IsChecked(UINT controlId) { ASSERT(GetDlgItem(GetDlgHandle(), controlId)); return BST_CHECKED == SendDlgItemMessage(GetDlgHandle(), controlId, BM_GETCHECK, 0, 0); }
void TSConfigDlg::SetCheck(UINT controlId, BOOL bCheck) { ASSERT(GetDlgItem(GetDlgHandle(), controlId)); SendDlgItemMessage(GetDlgHandle(), controlId, BM_SETCHECK, bCheck ? BST_CHECKED : BST_UNCHECKED, 0); }
void TSConfigDlg::EnableControl(UINT controlId, BOOL bEnable) { ASSERT(GetDlgItem(GetDlgHandle(), controlId)); EnableWindow(GetDlgItem(GetDlgHandle(), controlId), bEnable); }
int TSConfigDlg::GetComboCurrentSel(UINT controlId) { ASSERT(GetDlgItem(GetDlgHandle(), controlId)); return SendDlgItemMessage(GetDlgHandle(), controlId, CB_GETCURSEL, 0, 0); }
void TSConfigDlg::SetComboCurrentSel(UINT controlId, int iSel) { ASSERT(GetDlgItem(GetDlgHandle(), controlId)); SendDlgItemMessage(GetDlgHandle(), controlId, CB_SETCURSEL, iSel, 0); }
|