windows-nt/Source/XPSP1/NT/admin/netui/llsmgr/srvppgr.cpp
2020-09-26 16:20:57 +08:00

1642 lines
36 KiB
C++

/*++
Copyright (c) 1994-95 Microsoft Corporation
Module Name:
srvppgr.cpp
Abstract:
Server property page (repl) implementation.
Author:
Don Ryan (donryan) 02-Feb-1995
Environment:
User Mode - Win32
Revision History:
Chandana Surlu 05-Apr-1995 Redid the replication dialog (mostly modeled after liccpa.cpl)
JeffParh (jeffparh) 16-Dec-1996
o Disallowed server as own enterprise server.
o Changed "Start At" to use locale info for time format rather than
private registry settings. Merged OnClose() functionality into
OnKillActive().
o Added warning of possible license loss when changing replication
target server.
o No longer automatically saves when page is flipped.
--*/
#include "stdafx.h"
#include "llsmgr.h"
#include "srvppgr.h"
extern "C"
{
#include <lmcons.h>
#include <icanon.h>
}
#ifndef WS_EX_CLIENTEDGE
#define WS_EX_CLIENTEDGE 0x00000200L
#endif // WS_EX_CLIENTEDGE
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CServerPropertyPageReplication, CPropertyPage)
BEGIN_MESSAGE_MAP(CServerPropertyPageReplication, CPropertyPage)
//{{AFX_MSG_MAP(CServerPropertyPageReplication)
ON_BN_CLICKED(IDC_PP_SERVER_REPLICATION_AT, OnAt)
ON_BN_CLICKED(IDC_PP_SERVER_REPLICATION_DC, OnDc)
ON_BN_CLICKED(IDC_PP_SERVER_REPLICATION_ESRV, OnEsrv)
ON_BN_CLICKED(IDC_PP_SERVER_REPLICATION_EVERY, OnEvery)
ON_WM_CTLCOLOR()
ON_LBN_SETFOCUS(IDC_PP_SERVER_REPLICATION_AT_AMPM, OnSetfocusAmpm)
ON_LBN_KILLFOCUS(IDC_PP_SERVER_REPLICATION_AT_AMPM, OnKillfocusAmpm)
ON_EN_KILLFOCUS(IDC_PP_SERVER_REPLICATION_AT_HOUR, OnKillFocusHour)
ON_EN_SETFOCUS(IDC_PP_SERVER_REPLICATION_AT_HOUR, OnSetFocusHour)
ON_EN_KILLFOCUS(IDC_PP_SERVER_REPLICATION_AT_MINUTE, OnKillFocusMinute)
ON_EN_SETFOCUS(IDC_PP_SERVER_REPLICATION_AT_MINUTE, OnSetFocusMinute)
ON_EN_SETFOCUS(IDC_PP_SERVER_REPLICATION_AT_SECOND, OnSetFocusSecond)
ON_EN_KILLFOCUS(IDC_PP_SERVER_REPLICATION_AT_SECOND, OnKillFocusSecond)
ON_EN_SETFOCUS(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, OnSetfocusEvery)
ON_EN_KILLFOCUS(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, OnKillfocusEvery)
ON_EN_UPDATE(IDC_PP_SERVER_REPLICATION_ESRV_NAME, OnUpdateEsrvName)
ON_EN_UPDATE(IDC_PP_SERVER_REPLICATION_AT_HOUR, OnUpdateAtHour)
ON_EN_UPDATE(IDC_PP_SERVER_REPLICATION_AT_MINUTE, OnUpdateAtMinute)
ON_EN_UPDATE(IDC_PP_SERVER_REPLICATION_AT_SECOND, OnUpdateAtSecond)
ON_EN_UPDATE(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, OnUpdateEveryValue)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CServerPropertyPageReplication::CServerPropertyPageReplication()
: CPropertyPage(CServerPropertyPageReplication::IDD)
/*++
Routine Description:
Constructor for server properties (replication).
Arguments:
None.
Return Values:
None.
--*/
{
//{{AFX_DATA_INIT(CServerPropertyPageReplication)
//}}AFX_DATA_INIT
m_pServer = NULL;
m_bReplAt = FALSE;
m_bUseEsrv = FALSE;
m_bOnInit = TRUE;
m_nHourMax = HOUR_MAX_24;
m_nHourMin = HOUR_MIN_24;
}
CServerPropertyPageReplication::~CServerPropertyPageReplication()
/*++
Routine Description:
Destructor for server properties (replication).
Arguments:
None.
Return Values:
None.
--*/
{
//
// Nothing to do here.
//
}
void CServerPropertyPageReplication::DoDataExchange(CDataExchange* pDX)
/*++
Routine Description:
Called by framework to exchange dialog data.
Arguments:
pDX - data exchange object.
Return Values:
None.
--*/
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServerPropertyPageReplication)
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_EVERY_VALUE, m_everyEdit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_ESRV_NAME, m_esrvEdit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT, m_atBtn);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_EVERY, m_everyBtn);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_DC, m_dcBtn);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_ESRV, m_esrvBtn);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_SPIN_AT, m_spinAt);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_SPIN_EVERY, m_spinEvery);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_BORDER, m_atBorderEdit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_SEP1, m_atSep1Edit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_SEP2, m_atSep2Edit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_HOUR, m_atHourEdit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_MINUTE, m_atMinEdit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_SECOND, m_atSecEdit);
DDX_Control(pDX, IDC_PP_SERVER_REPLICATION_AT_AMPM, m_atAmPmEdit);
//}}AFX_DATA_MAP
}
void CServerPropertyPageReplication::InitPage(CServer* pServer)
/*++
Routine Description:
Initializes server property page (replication).
Arguments:
pServer - server object.
Return Values:
None.
--*/
{
ASSERT_VALID(pServer);
m_pServer = pServer;
}
BOOL CServerPropertyPageReplication::OnInitDialog()
/*++
Routine Description:
Message handler for WM_INITDIALOG.
Arguments:
None.
Return Values:
VT_BOOL.
--*/
{
BeginWaitCursor();
GetProfile();
CPropertyPage::OnInitDialog();
if (!m_bIsMode24)
{
m_atAmPmEdit.InsertString(0, m_str1159);
m_atAmPmEdit.InsertString(1, m_str2359);
m_atAmPmEdit.InsertString(2, TEXT("")); // fake it for the 24 hour mode
}
// Do the edit text limits
m_everyEdit.LimitText(2);
m_esrvEdit.LimitText(MAX_PATH); // we'll eat up the \\ chars
m_atHourEdit.LimitText(2);
m_atMinEdit.LimitText(2);
m_atSecEdit.LimitText(2);
m_spinEvery.SetRange(INTERVAL_MIN, INTERVAL_MAX);
if (Refresh())
{
// UpdateData(FALSE);
}
else
{
theApp.DisplayLastStatus();
}
m_atBorderEdit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
if (m_bReplAt)
m_atHourEdit.SetFocus();
else
m_everyEdit.SetFocus();
if ( m_pServer->IsWin2000() )
{
m_esrvEdit.EnableWindow(FALSE);
m_dcBtn.EnableWindow(FALSE);
m_esrvBtn.EnableWindow(FALSE);
CWnd * pWndMasterGB = GetDlgItem( IDC_PP_SERVER_REPLICATION_MASTER_GB );
ASSERT( pWndMasterGB != NULL );
if (pWndMasterGB != NULL)
{
pWndMasterGB->EnableWindow(FALSE);
}
}
else
{
if (m_bUseEsrv)
m_esrvEdit.SetFocus();
}
m_bOnInit = FALSE;
EndWaitCursor();
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CServerPropertyPageReplication::Refresh()
/*++
Routine Description:
Refreshs property page.
Arguments:
None.
Return Values:
VT_BOOL.
--*/
{
if (m_bReplAt = m_pServer->IsReplicatingDaily())
{
DWORD dwTemp = m_pServer->GetReplicationTime();
m_nHour = dwTemp / (60 * 60);
m_nMinute = (dwTemp - (m_nHour * 60 * 60)) / 60;
m_nSecond = dwTemp - (m_nHour * 60 * 60) - (m_nMinute * 60);
m_nStartingHour = DEFAULT_EVERY; // When the every button is selected, we always show the default.
if (!m_bIsMode24)
{ // it's in 12 hour format
if (m_nHour > 12)
{
m_bPM = TRUE;
m_nHour -= 12;
}
else if (m_nHour == 12)
{
m_bPM = TRUE;
}
else
{
if (m_nHour == 0)
m_nHour = m_nHourMax;
m_bPM = FALSE;
}
}
}
else
{
m_nStartingHour = m_pServer->GetReplicationTime() / 3600;
if (!m_bIsMode24)
// it's in 12 hour format
m_nHour = m_nHourMax;
else
m_nHour = m_nHourMin;
m_nMinute = MINUTE_MIN;
m_nSecond = SECOND_MIN;
m_bPM = FALSE;
}
m_bUseEsrv = !m_pServer->IsReplicatingToDC();
if (m_bReplAt)
{
OnAt();
}
else
{
OnEvery();
}
if (m_bUseEsrv)
{
BSTR bstrEnterpriseServer = m_pServer->GetController();
m_strEnterpriseServer = bstrEnterpriseServer;
SysFreeString(bstrEnterpriseServer);
OnEsrv();
}
else
{
OnDc();
}
return TRUE;
}
void CServerPropertyPageReplication::OnAt()
/*++
Routine Description:
Enables LLS_REPLICATION_TYPE_TIME controls.
Arguments:
None.
Return Values:
None.
--*/
{
// change time edit control bg color
m_atBorderEdit.Invalidate();
m_atBorderEdit.UpdateWindow();
m_atSep1Edit.Invalidate();
m_atSep1Edit.UpdateWindow();
m_atSep2Edit.Invalidate();
m_atSep2Edit.UpdateWindow();
if (!m_bOnInit) SetModified(TRUE);
m_bReplAt = TRUE;
m_atBtn.SetCheck(TRUE);
m_everyBtn.SetCheck(FALSE);
TCHAR szTemp[3];
if (m_bIsHourLZ)
{
wsprintf(szTemp, TEXT("%02u"), m_nHour);
szTemp[2] = NULL;
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_HOUR, szTemp);
}
else
SetDlgItemInt(IDC_PP_SERVER_REPLICATION_AT_HOUR, m_nHour);
wsprintf(szTemp, TEXT("%02u"), m_nMinute);
szTemp[2] = NULL;
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_MINUTE, szTemp);
wsprintf(szTemp, TEXT("%02u"), m_nSecond);
szTemp[2] = NULL;
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SECOND, szTemp);
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SEP1, m_strSep1);
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SEP2, m_strSep1);
if (m_bPM)
m_atAmPmEdit.SetTopIndex(1);
else
m_atAmPmEdit.SetTopIndex(0);
SetDlgItemText(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, TEXT(""));
m_everyEdit.EnableWindow(FALSE);
m_spinEvery.EnableWindow(FALSE);
m_atHourEdit.EnableWindow(TRUE);
m_atMinEdit.EnableWindow(TRUE);
m_atSecEdit.EnableWindow(TRUE);
m_spinAt.EnableWindow(TRUE);
if ( m_bIsMode24 )
{
m_atAmPmEdit.ShowWindow( SW_HIDE );
}
else
{
m_atAmPmEdit.ShowWindow( SW_SHOWNOACTIVATE );
m_atAmPmEdit.EnableWindow( TRUE );
}
m_atBtn.SetFocus();
}
void CServerPropertyPageReplication::OnEvery()
/*++
Routine Description:
Enables LLS_REPLICATION_TYPE_DELTA controls.
Arguments:
None.
Return Values:
None.
--*/
{
// change time edit control bg color
m_atBorderEdit.Invalidate();
m_atBorderEdit.UpdateWindow();
m_atSep1Edit.Invalidate();
m_atSep1Edit.UpdateWindow();
m_atSep2Edit.Invalidate();
m_atSep2Edit.UpdateWindow();
if (!m_bOnInit) SetModified(TRUE);
m_bReplAt = FALSE;
m_atBtn.SetCheck(FALSE);
m_everyBtn.SetCheck(TRUE);
SetDlgItemInt(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, m_nStartingHour);
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_HOUR, TEXT(""));
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_MINUTE, TEXT(""));
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SECOND, TEXT(""));
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SEP1, TEXT(""));
SetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SEP2, TEXT(""));
m_atAmPmEdit.SetTopIndex(2); // Have to fake this
m_atHourEdit.EnableWindow(FALSE);
m_atMinEdit.EnableWindow(FALSE);
m_atSecEdit.EnableWindow(FALSE);
m_spinAt.EnableWindow(FALSE);
m_atAmPmEdit.EnableWindow(FALSE);
m_atAmPmEdit.ShowWindow( SW_HIDE );
m_everyEdit.EnableWindow(TRUE);
m_spinEvery.EnableWindow(TRUE);
m_everyBtn.SetFocus();
}
void CServerPropertyPageReplication::OnDc()
/*++
Routine Description:
Enables LLS_REPLICATION_TYPE_DELTA controls.
Arguments:
None.
Return Values:
None.
--*/
{
if (!m_bOnInit) SetModified(TRUE);
m_bUseEsrv = FALSE;
m_dcBtn.SetCheck(TRUE);
m_esrvBtn.SetCheck(FALSE);
SetDlgItemText(IDC_PP_SERVER_REPLICATION_ESRV_NAME, TEXT(""));
m_esrvEdit.EnableWindow(FALSE);
m_dcBtn.SetFocus();
}
void CServerPropertyPageReplication::OnEsrv()
/*++
Routine Description:
Enables LLS_REPLICATION_TYPE_DELTA controls.
Arguments:
None.
Return Values:
None.
--*/
{
if (!m_bOnInit) SetModified(TRUE);
m_bUseEsrv = TRUE;
m_dcBtn.SetCheck(FALSE);
m_esrvBtn.SetCheck(TRUE);
m_esrvEdit.EnableWindow(TRUE);
SetDlgItemText(IDC_PP_SERVER_REPLICATION_ESRV_NAME, m_strEnterpriseServer);
m_esrvBtn.SetFocus();
}
BOOL CServerPropertyPageReplication::OnKillActive()
/*++
Routine Description:
Process property page (replication).
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
short nID;
BOOL fBeep = TRUE;
if ( EditValidate(&nID, &fBeep))
{
return TRUE;
}
else
{
EditInvalidDlg(fBeep);
return FALSE;
}
}
HBRUSH CServerPropertyPageReplication::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
/*++
Routine Description:
Message handler for WM_CTLCOLOR.
Arguments:
pDC - device context.
pWnd - control window.
nCtlColor - color selected.
Return Values:
Brush of background color.
--*/
{
if ( ( m_atBtn.GetCheck() )
&& ( ( pWnd == &m_atSep1Edit )
|| ( pWnd == &m_atSep2Edit )
|| ( pWnd == &m_atBorderEdit ) ) )
{
return (HBRUSH)DefWindowProc(WM_CTLCOLOREDIT, (WPARAM)pDC->GetSafeHdc(), (LPARAM)pWnd->GetSafeHwnd());
}
else
{
return CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
}
}
void CServerPropertyPageReplication::GetProfile()
/*++
Routine Description:
Loads international config info.
Arguments:
None.
Return Values:
None..
--*/
{
int cch;
int cchBuffer;
LPTSTR pszBuffer;
TCHAR szValue[ 2 ];
// defaults in case of memory allocation failure
m_strSep1 = TEXT( ":" );
m_strSep2 = TEXT( ":" );
m_str1159 = TEXT( "AM" );
m_str2359 = TEXT( "PM" );
m_bIsMode24 = FALSE;
m_bIsHourLZ = FALSE;
// time seperator
cchBuffer = 16;
pszBuffer = m_strSep1.GetBuffer( cchBuffer );
ASSERT( NULL != pszBuffer );
if ( NULL != pszBuffer )
{
cch = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_STIME, pszBuffer, cchBuffer );
m_strSep1.ReleaseBuffer();
ASSERT( cch > 0 );
m_strSep2 = m_strSep1;
}
// AM string
cchBuffer = 16;
pszBuffer = m_str1159.GetBuffer( cchBuffer );
ASSERT( NULL != pszBuffer );
if ( NULL != pszBuffer )
{
cch = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_S1159, pszBuffer, cchBuffer );
m_str1159.ReleaseBuffer();
ASSERT( cch > 0 );
}
// PM string
cchBuffer = 16;
pszBuffer = m_str2359.GetBuffer( cchBuffer );
ASSERT( NULL != pszBuffer );
if ( NULL != pszBuffer )
{
cch = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_S2359, pszBuffer, cchBuffer );
m_str2359.ReleaseBuffer();
ASSERT( cch > 0 );
}
// Leading zero for hours?
cch = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szValue, sizeof( szValue ) / sizeof( TCHAR ) );
ASSERT( cch > 0 );
if ( cch > 0 )
{
m_bIsHourLZ = _wtoi( szValue );
}
// time format; 0 = AM/PM, 1 = 24hr
cch = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_ITIME, szValue, sizeof( szValue ) / sizeof( TCHAR ) );
ASSERT( cch > 0 );
if ( cch > 0 )
{
m_bIsMode24 = _wtoi( szValue );
}
if (!m_bIsMode24)
{
m_nHourMax = HOUR_MAX_12;
m_nHourMin = HOUR_MIN_12;
}
if ( NULL == pszBuffer )
{
theApp.DisplayStatus( STATUS_NO_MEMORY );
}
}
void CServerPropertyPageReplication::OnSetfocusAmpm()
/*++
Routine Description:
Message handler for Listbox control IDC_PP_SERVER_REPLICATION_AT_AMPM on message LBN_SETFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
if (!m_bOnInit) SetModified(TRUE);
m_spinAt.SetRange(0, 1);
m_spinAt.SetBuddy(&m_atAmPmEdit);
}
void CServerPropertyPageReplication::OnKillfocusAmpm()
/*++
Routine Description:
Message handler for Listbox control IDC_PP_SERVER_REPLICATION_AT_AMPM on message LBN_KILLFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
m_atAmPmEdit.SetCurSel(-1);
//if (m_spinAt.GetBuddy() == &m_atAmPmEdit)
// m_spinAt.SendMessage(UDM_SETBUDDY, 0, 0);
}
void CServerPropertyPageReplication::OnSetFocusHour()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_HOUR on message EN_SETFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
if (!m_bOnInit) SetModified(TRUE);
m_spinAt.SetRange(m_bIsMode24 ? 0 :1, m_bIsMode24 ? 23 : 12);
m_spinAt.SetBuddy(&m_atHourEdit);
}
void CServerPropertyPageReplication::OnKillFocusHour()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_HOUR on message EN_KILLFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
// if (m_spinAt.GetBuddy() == &m_atHourEdit)
// m_spinAt.SendMessage(UDM_SETBUDDY, 0, 0);
}
void CServerPropertyPageReplication::OnSetFocusMinute()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_MINUTE on message EN_SETFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
if (!m_bOnInit) SetModified(TRUE);
m_spinAt.SetRange(0, 59);
m_spinAt.SetBuddy(&m_atMinEdit);
}
void CServerPropertyPageReplication::OnKillFocusMinute()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_MINUTE on message EN_KILLFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
// if (m_spinAt.GetBuddy() == &m_atMinEdit)
// m_spinAt.SendMessage(UDM_SETBUDDY, 0, 0);
}
void CServerPropertyPageReplication::OnSetFocusSecond()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_SECOND on message EN_SETFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
if (!m_bOnInit) SetModified(TRUE);
m_spinAt.SetRange(0, 59);
m_spinAt.SetBuddy(&m_atSecEdit);
}
void CServerPropertyPageReplication::OnKillFocusSecond()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_SECOND on message EN_KILLFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
// if (m_spinAt.GetBuddy() == &m_atSecEdit)
// m_spinAt.SendMessage(UDM_SETBUDDY, 0, 0);
}
void CServerPropertyPageReplication::OnSetfocusEvery()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_EVERY_VALUE on message EN_SETFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
if (!m_bOnInit) SetModified(TRUE);
}
void CServerPropertyPageReplication::OnKillfocusEvery()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_EVERY_VALUE on message EN_KILLFOCUS.
Arguments:
None.
Return Values:
None..
--*/
{
// if (m_spinEvery.GetBuddy() == &m_everyEdit)
// m_spinEvery.SendMessage(UDM_SETBUDDY, 0, 0);
}
void CServerPropertyPageReplication::OnUpdateEsrvName()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_ESRV_NAME on message EN_UPDATE
Arguments:
None.
Return Values:
None..
--*/
{
TCHAR szName[MAX_PATH + 3]; // MAX_PATH + 2 \ char's + null
UINT nValue;
if (!m_bOnInit) SetModified(TRUE);
nValue = GetDlgItemText(IDC_PP_SERVER_REPLICATION_ESRV_NAME, szName, MAX_PATH +3);
szName[nValue] = NULL;
if (!(wcsncmp(szName, TEXT("\\\\"), 2)))
SetDlgItemText(IDC_PP_SERVER_REPLICATION_ESRV_NAME, szName + 2);
}
void CServerPropertyPageReplication::OnUpdateAtHour()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_HOUR on message EN_UPDATE
Arguments:
None.
Return Values:
None..
--*/
{
TCHAR szNum[3];
UINT nValue;
short i;
int iVal;
BOOL fOk = TRUE;
if (!m_bOnInit) SetModified(TRUE);
nValue = GetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_HOUR, szNum, sizeof(szNum) / sizeof( TCHAR ));
for (i=0;szNum[i];i++)
if(!_istdigit(szNum[i]))
fOk = FALSE;
if (fOk)
{
iVal = _wtoi(szNum);
if (!nValue)
{
if (m_bIsMode24)
{
m_nHour = 0;
m_bPM = FALSE;
}
else
{
m_nHour = m_nHourMax;
m_bPM = FALSE;
}
}
else if ((iVal < (int)m_nHourMin) || (iVal > (int)m_nHourMax))
fOk = FALSE;
}
if (!fOk)
m_atHourEdit.Undo();
}
void CServerPropertyPageReplication::OnUpdateAtMinute()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_MINUTE on message EN_UPDATE
Arguments:
None.
Return Values:
None..
--*/
{
TCHAR szNum[3];
UINT nValue;
short i;
int iVal;
BOOL fOk = TRUE;
if (!m_bOnInit) SetModified(TRUE);
nValue = GetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_MINUTE, szNum, sizeof(szNum) / sizeof( TCHAR ));
for (i=0;szNum[i];i++)
if(!_istdigit(szNum[i]))
fOk = FALSE;
if (fOk)
{
iVal = _wtoi(szNum);
if (!nValue)
{
m_nSecond = MINUTE_MIN;
}
else if ((iVal < MINUTE_MIN) || (iVal > MINUTE_MAX))
fOk = FALSE;
}
if (!fOk)
m_atMinEdit.Undo();
}
void CServerPropertyPageReplication::OnUpdateAtSecond()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_AT_SECOND on message EN_UPDATE
Arguments:
None.
Return Values:
None..
--*/
{
TCHAR szNum[3];
UINT nValue;
short i;
int iVal;
BOOL fOk = TRUE;
if (!m_bOnInit) SetModified(TRUE);
nValue = GetDlgItemText(IDC_PP_SERVER_REPLICATION_AT_SECOND, szNum, sizeof(szNum) / sizeof( TCHAR ));
for (i=0;szNum[i];i++)
if(!_istdigit(szNum[i]))
fOk = FALSE;
if (fOk)
{
iVal = _wtoi(szNum);
if (!nValue)
{
m_nSecond = SECOND_MIN;
}
else if ((iVal < SECOND_MIN) || (iVal > SECOND_MAX))
fOk = FALSE;
}
if (!fOk)
m_atSecEdit.Undo();
}
void CServerPropertyPageReplication::OnUpdateEveryValue()
/*++
Routine Description:
Message handler for Edit control IDC_PP_SERVER_REPLICATION_EVERY_VALUE on message EN_UPDATE
Arguments:
None.
Return Values:
None..
--*/
{
TCHAR szNum[3];
UINT nValue;
short i;
int iVal;
BOOL fOk = TRUE;
if (!m_bOnInit) SetModified(TRUE);
nValue = GetDlgItemText(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, szNum, sizeof(szNum) / sizeof( TCHAR ));
for (i=0;szNum[i];i++)
if(!_istdigit(szNum[i]))
fOk = FALSE;
if (fOk)
{
iVal = _wtoi(szNum);
if (!nValue)
{
m_nStartingHour = DEFAULT_EVERY;
}
else if (iVal < 9)
{
m_nStartingHour = (DWORD) iVal;
}
else if ((iVal < INTERVAL_MIN) || (iVal > INTERVAL_MAX))
fOk = FALSE;
else
m_nStartingHour = (DWORD) iVal;
}
if (!fOk)
m_everyEdit.Undo();
}
BOOL CServerPropertyPageReplication::EditValidate(short *pnID, BOOL *pfBeep)
/*++
Routine Description:
Validate all edit & other fields.
Arguments:
None.
Return Values:
short *pnID Pass back the bad ID
BOOL *pfBeep Whether to Beep
--*/
{
UINT nValue;
BOOL fValid = FALSE;
TCHAR szTemp[MAX_PATH + 1];
DWORD NumberOfHours, SecondsinHours;
*pfBeep = TRUE;
// only do this if license info is replicated to an ES
do {
if (m_esrvBtn.GetCheck())
{
if ( m_pServer->IsReplicatingToDC() )
{
// the user has changed the "UseEnterprise" value from "no" to "yes";
// warn of possible license loss
int nButton;
CString strMessage;
AfxFormatString1( strMessage, IDP_CONFIRM_USE_ENTERPRISE, m_pServer->m_strName );
nButton = AfxMessageBox( strMessage, MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2, IDP_CONFIRM_USE_ENTERPRISE );
if ( IDYES != nButton )
{
*pnID = IDC_PP_SERVER_REPLICATION_ESRV;
*pfBeep = FALSE;
fValid = FALSE;
m_esrvBtn.SetFocus();
break;
}
}
nValue = GetDlgItemText( IDC_PP_SERVER_REPLICATION_ESRV_NAME, szTemp, MAX_PATH + 1);
if (nValue == 0)
{
if ( m_pServer->IsWin2000() )
{
// It is ok for Enterprise Server to be blank
fValid = TRUE;
szTemp[nValue] = UNICODE_NULL;
// 375761 JonN 8/9/99 do not break here, this is not an error
}
else
{
*pnID = IDC_PP_SERVER_REPLICATION_ESRV_NAME;
m_esrvEdit.SetFocus();
m_esrvEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
}
else
{
fValid = TRUE; // we got a name, assume valid
// 375761 JonN 8/9/99 moved this stuff into this "else"
if (nValue > MAX_PATH)
nValue = MAX_PATH;
// Validate server name
if (I_NetNameValidate(NULL, szTemp, NAMETYPE_COMPUTER, LM2X_COMPATIBLE) != ERROR_SUCCESS)
{
AfxMessageBox(IDP_ERROR_INVALID_COMPUTERNAME, MB_OK|MB_ICONSTOP);
*pnID = IDC_PP_SERVER_REPLICATION_ESRV_NAME;
*pfBeep = FALSE;
fValid = FALSE;
m_esrvEdit.SetFocus();
m_esrvEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
ASSERT_VALID( m_pServer );
if ( !m_pServer->m_strName.CompareNoCase( szTemp ) )
{
// can't replicate to yourself
AfxMessageBox(IDP_ERROR_NO_SELF_REPLICATION, MB_OK|MB_ICONSTOP);
*pnID = IDC_PP_SERVER_REPLICATION_ESRV_NAME;
*pfBeep = FALSE;
fValid = FALSE;
m_esrvEdit.SetFocus();
m_esrvEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
if ( m_strEnterpriseServer.CompareNoCase( szTemp ) && !m_pServer->IsReplicatingToDC() )
{
// this server was already set to replicate to an enterprise server,
// but the user has changed the name of the enterprise server;
// warn of possible license loss
int nButton;
CString strMessage;
AfxFormatString1( strMessage, IDP_CONFIRM_ENTERPRISE_CHANGE, m_pServer->m_strName );
nButton = AfxMessageBox( strMessage, MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2, IDP_CONFIRM_ENTERPRISE_CHANGE );
if ( IDYES != nButton )
{
*pnID = IDC_PP_SERVER_REPLICATION_ESRV_NAME;
*pfBeep = FALSE;
fValid = FALSE;
m_esrvEdit.SetFocus();
m_esrvEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
}
}
m_strEnterpriseServer = szTemp;
m_bUseEsrv = TRUE;
}
else
{
if ( !m_pServer->IsReplicatingToDC() )
{
// the user has changed the "UseEnterprise" value from "yes" to "no";
// warn of possible license loss
int nButton;
CString strMessage;
AfxFormatString1( strMessage, IDP_CONFIRM_NOT_USE_ENTERPRISE, m_pServer->m_strName );
nButton = AfxMessageBox( strMessage, MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2, IDP_CONFIRM_NOT_USE_ENTERPRISE );
if ( IDYES != nButton )
{
*pnID = IDC_PP_SERVER_REPLICATION_ESRV;
*pfBeep = FALSE;
fValid = FALSE;
m_esrvBtn.SetFocus();
break;
}
}
// Get rid of the Server Name.
m_strEnterpriseServer = TEXT("");
m_bUseEsrv = FALSE;
}
if (m_everyBtn.GetCheck())
{
nValue = GetDlgItemInt(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, &fValid, FALSE);
*pnID = IDC_PP_SERVER_REPLICATION_EVERY_VALUE;
if (fValid)
{
if (nValue < INTERVAL_MIN)
{
fValid = FALSE;
m_nStartingHour = INTERVAL_MIN;
SetDlgItemInt(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, INTERVAL_MIN, FALSE);
m_everyEdit.SetFocus();
m_everyEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
else if (nValue > INTERVAL_MAX)
{
fValid = FALSE;
m_nStartingHour = INTERVAL_MAX;
SetDlgItemInt(IDC_PP_SERVER_REPLICATION_EVERY_VALUE, INTERVAL_MAX, FALSE);
m_everyEdit.SetFocus();
m_everyEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
else
m_nStartingHour = nValue;
m_nReplicationTime = m_nStartingHour;
}
else
{
fValid = FALSE;
m_everyEdit.SetFocus();
m_everyEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
m_bReplAt = FALSE;
}
else
{
nValue = GetDlgItemInt(IDC_PP_SERVER_REPLICATION_AT_HOUR, &fValid, FALSE);
if (fValid)
m_nHour = nValue;
else
{
*pnID = IDC_PP_SERVER_REPLICATION_AT_HOUR;
m_atHourEdit.SetFocus();
m_atHourEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
nValue = GetDlgItemInt(IDC_PP_SERVER_REPLICATION_AT_MINUTE, &fValid, FALSE);
if (fValid)
m_nMinute = nValue;
else
{
*pnID = IDC_PP_SERVER_REPLICATION_AT_MINUTE;
m_atMinEdit.SetFocus();
m_atMinEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
nValue = GetDlgItemInt(IDC_PP_SERVER_REPLICATION_AT_SECOND, &fValid, FALSE);
if (fValid)
m_nSecond = nValue;
else
{
*pnID = IDC_PP_SERVER_REPLICATION_AT_SECOND;
m_atSecEdit.SetFocus();
m_atSecEdit.SetSel(MAKELONG(0, -1), FALSE);
break;
}
if (!m_bIsMode24)
{
*pnID = IDC_PP_SERVER_REPLICATION_AT_AMPM;
nValue = m_atAmPmEdit.GetTopIndex();
if (nValue == 0)
{
m_bPM = FALSE;
}
else if (nValue == 1)
{
m_bPM = TRUE;
}
else
{
fValid = FALSE;
m_atAmPmEdit.SetFocus();
break;
}
}
if (!m_bIsMode24)
{ // It's in 12 hour format
if (m_bPM)
{
NumberOfHours = 12 + m_nHour - ((m_nHour / 12) * 12);
}
else
{
NumberOfHours = m_nHour - ((m_nHour / 12) * 12);
}
}
else
{ // It's in 24 hour format
NumberOfHours = m_nHour;
}
SecondsinHours = NumberOfHours * 60 * 60;
m_nReplicationTime = SecondsinHours + (m_nMinute * 60) + m_nSecond; // Cheating. Use the same member
m_bReplAt = TRUE;
}
} while(FALSE);
return( fValid );
}
void CServerPropertyPageReplication::EditInvalidDlg(BOOL fBeep)
/*++
Routine Description:
If any edit/listbox field has an invalid data item.
Arguments:
BOOL fBeep Beep only if we haven't yet put up a MessageBox.
Return Values:
None..
--*/
{
if (fBeep)
::MessageBeep(MB_OK);
}
void CServerPropertyPageReplication::SaveReplicationParams()
/*++
Routine Description:
Write to the remote registry.
REG_VALUE_ENTERPRISE_SERVER m_strEnterpriseServer
REG_VALUE_USE_ENTERPRISE m_bUseEsrv
REG_VALUE_REPLICATION_TYPE m_bReplAt
REG_VALUE_REPLICATION_TIME m_nReplicationTime
Arguments:
None.
Return Values:
None..
--*/
{
long Status;
DWORD dwValue;
ASSERT(m_bUseEsrv == m_esrvBtn.GetCheck());
ASSERT(m_bReplAt == m_atBtn.GetCheck());
#ifdef CONFIG_THROUGH_REGISTRY
do {
dwValue = m_esrvBtn.GetCheck();
Status = RegSetValueEx(m_pServer->GetReplRegHandle(),REG_VALUE_USE_ENTERPRISE,0,REG_DWORD,
(PBYTE)&dwValue, sizeof(DWORD));
ASSERT(Status == ERROR_SUCCESS);
if (Status != ERROR_SUCCESS) break;
Status = RegSetValueEx(m_pServer->GetReplRegHandle(), REG_VALUE_ENTERPRISE_SERVER, 0, REG_SZ,
(LPBYTE)MKSTR(m_strEnterpriseServer), (lstrlen(m_strEnterpriseServer) + 1) * sizeof(TCHAR));
ASSERT(Status == ERROR_SUCCESS);
if (Status != ERROR_SUCCESS) break;
dwValue = m_atBtn.GetCheck();
Status = RegSetValueEx(m_pServer->GetReplRegHandle(), REG_VALUE_REPLICATION_TYPE,0,REG_DWORD,
(PBYTE)&dwValue, sizeof(DWORD));
ASSERT(Status == ERROR_SUCCESS);
if (Status != ERROR_SUCCESS) break;
dwValue = (m_bReplAt? m_nReplicationTime : (m_nStartingHour * 3600));
Status = RegSetValueEx(m_pServer->GetReplRegHandle(), REG_VALUE_REPLICATION_TIME,0,REG_DWORD,
(PBYTE)&dwValue, sizeof(DWORD));
ASSERT(Status == ERROR_SUCCESS);
if (Status != ERROR_SUCCESS) break;
} while (FALSE);
#else
if ( m_pServer->ConnectLls() )
{
LLS_SERVICE_INFO_0 ServiceInfo;
ZeroMemory( &ServiceInfo, sizeof( ServiceInfo ) );
ServiceInfo.UseEnterprise = m_esrvBtn.GetCheck();
ServiceInfo.EnterpriseServer = MKSTR(m_strEnterpriseServer);
ServiceInfo.ReplicationType = m_atBtn.GetCheck();
ServiceInfo.ReplicationTime = ( LLS_REPLICATION_TYPE_TIME == ServiceInfo.ReplicationType )
? m_nReplicationTime
: (m_nStartingHour * 3600);
Status = ::LlsServiceInfoSet( m_pServer->GetLlsHandle(), 0, (LPBYTE) &ServiceInfo );
LlsSetLastStatus( Status );
if ( IsConnectionDropped( Status ) )
{
m_pServer->DisconnectLls();
}
}
else
{
Status = LlsGetLastStatus();
}
#endif
if (Status != ERROR_SUCCESS)
{
theApp.DisplayStatus(Status);
}
else
{
SetModified(FALSE);
}
}
void CServerPropertyPageReplication::OnOK()
/*++
Routine Description:
Handler for Apply button.
Arguments:
None.
Return Values:
None.
--*/
{
SaveReplicationParams();
}