/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/ /* repnodpp.cpp Replication Node Property page FILE HISTORY: */ // RepNodpp.cpp : implementation file // #include "stdafx.h" #include "winssnap.h" #include "server.h" #include "ipadddlg.h" #include "tregkey.h" #include "RepNodpp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define MAX_DAY UD_MAXVAL #define MAX_HOUR 23 #define MAX_MINUTE 59 const CRepNodePropAdvanced::REGKEYNAME CRepNodePropAdvanced::lpstrPartnersRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Partners"); const LPCTSTR lpstrPersonaMode = _T("PersonaMode"); const LPCTSTR lpstrPersonaNonGrata = _T("PersonaNonGrata"); const LPCTSTR lpstrPersonaGrata = _T("PersonaGrata"); ///////////////////////////////////////////////////////////////////////////// // CRepNodePropGen property page IMPLEMENT_DYNCREATE(CRepNodePropGen, CPropertyPageBase) CRepNodePropGen::CRepNodePropGen() : CPropertyPageBase(CRepNodePropGen::IDD) { //{{AFX_DATA_INIT(CRepNodePropGen) m_fMigrate = FALSE; m_fPushwithPartners = FALSE; //}}AFX_DATA_INIT } CRepNodePropGen::~CRepNodePropGen() { } void CRepNodePropGen::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRepNodePropGen) DDX_Control(pDX, IDC_CHECK_REP_WITH_PARTNERS, m_checkPushwithPartners); DDX_Control(pDX, IDC_CHECK_MIGRATE, m_checkMigrate); DDX_Check(pDX, IDC_CHECK_MIGRATE, m_fMigrate); DDX_Check(pDX, IDC_CHECK_REP_WITH_PARTNERS, m_fPushwithPartners); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRepNodePropGen, CPropertyPageBase) //{{AFX_MSG_MAP(CRepNodePropGen) ON_BN_CLICKED(IDC_CHECK_MIGRATE, OnCheckMigrate) ON_BN_CLICKED(IDC_CHECK_REP_WITH_PARTNERS, OnCheckRepWithPartners) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRepNodePropGen message handlers BOOL CRepNodePropGen::OnApply() { if (!IsDirty()) return TRUE; HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { return CPropertyPageBase::OnApply(); } } void CRepNodePropGen::OnOK() { CPropertyPageBase::OnOK(); } BOOL CRepNodePropGen::OnInitDialog() { CPropertyPageBase::OnInitDialog(); SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; GetConfig(); m_checkMigrate.SetCheck(m_pConfig->m_fMigrateOn); m_checkPushwithPartners.SetCheck(m_pConfig->m_fRplOnlyWithPartners); // load the correct icon for (int i = 0; i < ICON_IDX_MAX; i++) { if (g_uIconMap[i][1] == m_uImage) { HICON hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(g_uIconMap[i][0])); if (hIcon) ((CStatic *) GetDlgItem(IDC_STATIC_ICON))->SetIcon(hIcon); break; } } return TRUE; } void CRepNodePropGen::OnCheckMigrate() { SetDirty(TRUE); } void CRepNodePropGen::OnCheckRepWithPartners() { SetDirty(TRUE); } /*--------------------------------------------------------------------------- CRepNodePropGen::GetConfig() Gets the CConfiguration object from the server node ---------------------------------------------------------------------------*/ HRESULT CRepNodePropGen::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; m_pConfig = ((CRepNodeProperties *) GetHolder())->GetConfig(); return hr; } /*--------------------------------------------------------------------------- CRepNodePropGen::UpdateServerConfiguration() Updates the values for the CConfiguration object in the Server Node ---------------------------------------------------------------------------*/ HRESULT CRepNodePropGen::UpdateServerConfiguration() { // Reflect the changes in the server's CConfiguration object AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; UpdateData(); // get the server spNode = GetHolder()->GetNode(); // get it's parent spNode->GetParent(&spParentNode); pServer = GETHANDLER(CWinsServerHandler, spParentNode); UpdateConfig(); // now write to server DWORD err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened WinsMessageBox(err); } else { // success update our local copy pServer->SetConfig(*m_pConfig); } return HRESULT_FROM_WIN32(err); } /*--------------------------------------------------------------------------- CRepNodePropGen::UpdateConfig() Updates the values for the CConfiguration object in the Server Node ---------------------------------------------------------------------------*/ void CRepNodePropGen::UpdateConfig() { m_pConfig->m_fMigrateOn = m_fMigrate; m_pConfig->m_fRplOnlyWithPartners = m_fPushwithPartners; } ///////////////////////////////////////////////////////////////////////////// // CRepNodePropPush property page IMPLEMENT_DYNCREATE(CRepNodePropPush, CPropertyPageBase) CRepNodePropPush::CRepNodePropPush() : CPropertyPageBase(CRepNodePropPush::IDD) { //{{AFX_DATA_INIT(CRepNodePropPush) m_fRepOnAddrChange = FALSE; m_fPushStartup = FALSE; m_dwPushUpdateCount = 0; //}}AFX_DATA_INIT } CRepNodePropPush::~CRepNodePropPush() { } void CRepNodePropPush::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRepNodePropPush) DDX_Control(pDX, IDC_CHECK_PUSH_PERSIST, m_checkPushPersistence); DDX_Control(pDX, IDC_SPIN_UPDATE_COUNT, m_spinUpdateCount); DDX_Control(pDX, IDC_EDIT_UPDATE_COUNT, m_editUpdateCount); DDX_Control(pDX, IDC_CHECK_PUSH_ON_STARTUP, m_checkPushStartup); DDX_Control(pDX, IDC_CHECK_PUSH_ON_ADDRESS_CHANGE, m_checkRepOnAddrChange); DDX_Check(pDX, IDC_CHECK_PUSH_ON_ADDRESS_CHANGE, m_fRepOnAddrChange); DDX_Check(pDX, IDC_CHECK_PUSH_ON_STARTUP, m_fPushStartup); DDX_Text(pDX, IDC_EDIT_UPDATE_COUNT, m_dwPushUpdateCount); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRepNodePropPush, CPropertyPageBase) //{{AFX_MSG_MAP(CRepNodePropPush) ON_BN_CLICKED(IDC_CHECK_PUSH_ON_ADDRESS_CHANGE, OnCheckPushOnAddressChange) ON_BN_CLICKED(IDC_CHECK_PUSH_ON_STARTUP, OnCheckPushOnStartup) ON_BN_CLICKED(IDC_CHECK_PUSH_PERSIST, OnCheckPushPersist) ON_EN_CHANGE(IDC_EDIT_UPDATE_COUNT, OnChangeEditUpdateCount) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRepNodePropPush message handlers BOOL CRepNodePropPush::OnApply() { if (!IsDirty()) return TRUE; HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { return CPropertyPageBase::OnApply(); } } void CRepNodePropPush::OnOK() { CPropertyPageBase::OnOK(); } BOOL CRepNodePropPush::OnInitDialog() { CPropertyPageBase::OnInitDialog(); SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; GetConfig(); m_checkPushStartup.SetCheck(m_pConfig->m_fPushInitialReplication); m_checkRepOnAddrChange.SetCheck(m_pConfig->m_fPushReplOnAddrChange); m_spinUpdateCount.SetRange(0, UD_MAXVAL); m_editUpdateCount.SetWindowText(ToString(m_pConfig->m_dwPushUpdateCount)); // now for the persistence info if (m_pConfig->m_dwMajorVersion < 5) { // not supported, disable controls m_checkPushPersistence.SetCheck(FALSE); m_checkPushPersistence.EnableWindow(FALSE); } else { if (m_pConfig->m_dwPushPersistence) m_checkPushPersistence.SetCheck(TRUE); else m_checkPushPersistence.SetCheck(FALSE); } return TRUE; } void CRepNodePropPush::OnCheckPushOnAddressChange() { SetDirty(TRUE); } void CRepNodePropPush::OnCheckPushOnStartup() { SetDirty(TRUE); } void CRepNodePropPush::OnCheckPushPersist() { SetDirty(TRUE); } void CRepNodePropPush::OnChangeEditUpdateCount() { SetDirty(TRUE); } /*--------------------------------------------------------------------------- CRepNodePropPush::GetConfig() Gets the CConfiguration object from the server node ---------------------------------------------------------------------------*/ HRESULT CRepNodePropPush::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; m_pConfig = ((CRepNodeProperties *) GetHolder())->GetConfig(); return hr; } /*--------------------------------------------------------------------------- CRepNodePropPush::UpdateServerConfiguration() Updates the values for the CConfiguration object in the Server Node ---------------------------------------------------------------------------*/ HRESULT CRepNodePropPush::UpdateServerConfiguration() { // Reflect the changes in the server's CConfiguration object AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; UpdateData(); if ( ( (m_dwPushUpdateCount > 0) & (m_dwPushUpdateCount < WINSCNF_MIN_VALID_UPDATE_CNT) ) & (!m_pConfig->m_dwPushPersistence) ) { CString strMessage, strValue; strValue.Format(_T("%d"), WINSCNF_MIN_VALID_UPDATE_CNT); AfxFormatString1(strMessage, IDS_ERR_UPDATE_COUNT, strValue); AfxMessageBox(strMessage); m_editUpdateCount.SetFocus(); return E_FAIL; } // get the server spNode = GetHolder()->GetNode(); // get it's parent spNode->GetParent(&spParentNode); pServer = GETHANDLER(CWinsServerHandler, spParentNode); UpdateConfig(); // now write to server DWORD err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened WinsMessageBox(err); } else { // success update our local copy pServer->SetConfig(*m_pConfig); } return HRESULT_FROM_WIN32(err); } /*--------------------------------------------------------------------------- CRepNodePropPush::UpdateConfig() Updates the values for the CConfiguration object in the Server Node ---------------------------------------------------------------------------*/ void CRepNodePropPush::UpdateConfig() { m_pConfig->m_fPushInitialReplication = m_fPushStartup; m_pConfig->m_fPushReplOnAddrChange = m_fRepOnAddrChange; m_pConfig->m_dwPushUpdateCount = m_dwPushUpdateCount; // persistence stuff BOOL bPushPersist = m_checkPushPersistence.GetCheck() ? TRUE: FALSE; m_pConfig->m_dwPushPersistence = bPushPersist ? 1:0; } /*--------------------------------------------------------------------------- CRepNodePropPush::ToString(int nNumber) converts integet to string ---------------------------------------------------------------------------*/ CString CRepNodePropPush::ToString(int nNumber) { TCHAR szStr[20]; _itot(nNumber, szStr, 10); CString str(szStr); return str; } ///////////////////////////////////////////////////////////////////////////// // CRepNodePropPull property page IMPLEMENT_DYNCREATE(CRepNodePropPull, CPropertyPageBase) CRepNodePropPull::CRepNodePropPull() : CPropertyPageBase(CRepNodePropPull::IDD) { //{{AFX_DATA_INIT(CRepNodePropPull) m_fpullTrigOnStartup = FALSE; m_dwRetryCount = 0; m_nPullStartHour = 0; m_nPullStartMinute = 0; m_nPullStartSecond = 0; m_nRepliDay = 0; m_nRepliHour = 0; m_nRepliMinute= 0; //}}AFX_DATA_INIT } CRepNodePropPull::~CRepNodePropPull() { } void CRepNodePropPull::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRepNodePropPull) DDX_Control(pDX, IDC_CHECK_PULL_PERSIST, m_checkPullPersistence); DDX_Control(pDX, IDC_SPIN_START_SECOND, m_spinStartSecond); DDX_Control(pDX, IDC_SPIN_START_MINUTE, m_spinStartMinute); DDX_Control(pDX, IDC_SPIN_START_HOUR, m_spinStartHour); DDX_Control(pDX, IDC_SPIN_RETRY_COUNT, m_spinRetryCount); DDX_Control(pDX, IDC_SPIN_REP_INT_MINUTE, m_spinRepIntMinute); DDX_Control(pDX, IDC_SPIN_REP_INT_HOUR, m_spinRepIntHour); DDX_Control(pDX, IDC_SPIN_REP_INT_DAY, m_spinRepIntDay); DDX_Control(pDX, IDC_EDIT_START_SECOND, m_editStartSecond); DDX_Control(pDX, IDC_EDIT_START_MINUTE, m_editStartMinute); DDX_Control(pDX, IDC_EDIT_START_HOUR, m_editStartHour); DDX_Control(pDX, IDC_EDIT_RETRY_COUNT, m_editRetryCount); DDX_Control(pDX, IDC_EDIT_REP_INT_MINUTE, m_editRepIntMinute); DDX_Control(pDX, IDC_EDIT_REP_INT_HOUR, m_editRepIntHour); DDX_Control(pDX, IDC_EDIT_REP_INT_DAY, m_editRepIntDay); DDX_Control(pDX, IDC_CHECK_TRIGGER_PULL_STARTUP, m_checkpullTrigOnStartup); DDX_Check(pDX, IDC_CHECK_TRIGGER_PULL_STARTUP, m_fpullTrigOnStartup); DDX_Text(pDX, IDC_EDIT_RETRY_COUNT, m_dwRetryCount); DDX_Text(pDX, IDC_EDIT_START_HOUR, m_nPullStartHour); DDV_MinMaxInt(pDX, m_nPullStartHour, 0, 23); DDX_Text(pDX, IDC_EDIT_START_MINUTE, m_nPullStartMinute); DDV_MinMaxInt(pDX, m_nPullStartMinute, 0, 59); DDX_Text(pDX, IDC_EDIT_START_SECOND, m_nPullStartSecond); DDV_MinMaxInt(pDX, m_nPullStartSecond, 0, 59); DDX_Text(pDX, IDC_EDIT_REP_INT_DAY, m_nRepliDay); DDV_MinMaxInt(pDX, m_nRepliDay, 0, 365); DDX_Text(pDX, IDC_EDIT_REP_INT_HOUR, m_nRepliHour); DDV_MinMaxInt(pDX, m_nRepliHour, 0, 23); DDX_Text(pDX, IDC_EDIT_REP_INT_MINUTE, m_nRepliMinute); DDV_MinMaxInt(pDX, m_nRepliMinute, 0, 59); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRepNodePropPull, CPropertyPageBase) //{{AFX_MSG_MAP(CRepNodePropPull) ON_EN_CHANGE(IDC_EDIT_REP_INT_DAY, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_REP_INT_HOUR, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_REP_INT_MINUTE, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_RETRY_COUNT, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_START_HOUR, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_START_MINUTE, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_START_SECOND, OnChangeEditRepIntHour) ON_EN_CHANGE(IDC_EDIT_UPDATE_COUNT, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_MIGRATE, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_PUSH_ON_ADDRESS_CHANGE, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_REP_WITH_PARTNERS, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_TRIGGER_PULL_STARTUP, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_PUSH_PERSIST, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_PUSH_ON_STARTUP, OnChangeEditRepIntHour) ON_BN_CLICKED(IDC_CHECK_PULL_PERSIST, OnCheckPullPersist) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRepNodePropPull message handlers BOOL CRepNodePropPull::OnApply() { if (!IsDirty()) return TRUE; HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { return CPropertyPageBase::OnApply(); } } void CRepNodePropPull::OnOK() { CPropertyPageBase::OnOK(); } BOOL CRepNodePropPull::OnInitDialog() { CPropertyPageBase::OnInitDialog(); SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; GetConfig(); m_checkpullTrigOnStartup.SetCheck(m_pConfig->m_fPullInitialReplication); m_spinRetryCount.SetRange(0, UD_MAXVAL); m_editRetryCount.SetWindowText(ToString(m_pConfig->m_dwPullRetryCount)); SetPullStartTimeData(m_pConfig->m_dwPullSpTime); SetPullTimeIntData(m_pConfig->m_dwPullTimeInterval); // now for the persistence info if (m_pConfig->m_dwMajorVersion < 5) { // not supported, disable controls m_checkPullPersistence.SetCheck(FALSE); m_checkPullPersistence.EnableWindow(FALSE); } else { if (m_pConfig->m_dwPullPersistence) m_checkPullPersistence.SetCheck(TRUE); else m_checkPullPersistence.SetCheck(FALSE); } return TRUE; } void CRepNodePropPull::OnCheckPullPersist() { SetDirty(TRUE); } /*--------------------------------------------------------------------------- CRepNodePropPull::SetPullStartTimeData(DWORD dwPullStartTime) Sets the PullSpTime in the controls ---------------------------------------------------------------------------*/ void CRepNodePropPull::SetPullStartTimeData(DWORD dwPullStartTime) { int nHours = 0, nMinutes = 0, nSeconds = 0; CTime time(dwPullStartTime); m_spinStartSecond.SetRange(0, 59); m_spinStartMinute.SetRange(0, 59); m_spinStartHour.SetRange(0, 23); if (dwPullStartTime) { nHours = time.GetHour(); nMinutes = time.GetMinute(); nSeconds = time.GetSecond(); } m_spinStartHour.SetPos(nHours); m_spinStartMinute.SetPos(nMinutes); m_spinStartSecond.SetPos(nSeconds); } /*--------------------------------------------------------------------------- CRepNodePropPull::SetPullTimeIntData(DWORD dwPullInternal) Sets the Pull Replication Interval in the controls ---------------------------------------------------------------------------*/ void CRepNodePropPull::SetPullTimeIntData(DWORD dwPullInternal) { m_spinRepIntMinute.SetRange(0, 59); m_spinRepIntHour.SetRange(0, 23); m_spinRepIntDay.SetRange(0, UD_MAXVAL); int nDays = 0, nHours = 0, nMinutes = 0; if (dwPullInternal) { nDays = dwPullInternal / SEC_PER_DAY; dwPullInternal -= nDays * SEC_PER_DAY; if (dwPullInternal) { nHours = dwPullInternal / SEC_PER_HOUR; dwPullInternal -= nHours * SEC_PER_HOUR; if (dwPullInternal) { nMinutes = dwPullInternal / SEC_PER_MINUTE; dwPullInternal -= nMinutes * SEC_PER_MINUTE; } } } m_spinRepIntDay.SetPos(nDays); m_spinRepIntHour.SetPos(nHours); m_spinRepIntMinute.SetPos(nMinutes); } /*--------------------------------------------------------------------------- CRepNodePropPull::GetConfig() Gets the CConfiguration object from the server node ---------------------------------------------------------------------------*/ HRESULT CRepNodePropPull::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; m_pConfig = ((CRepNodeProperties *) GetHolder())->GetConfig(); return hr; } /*--------------------------------------------------------------------------- CRepNodePropGen::UpdateServerConfiguration() Updates the values for the CConfiguration object in the Server Node ---------------------------------------------------------------------------*/ HRESULT CRepNodePropPull::UpdateServerConfiguration() { // Reflect the changes in the server's CConfiguration object AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; UpdateData(); // get the server spNode = GetHolder()->GetNode(); // get it's parent spNode->GetParent(&spParentNode); pServer = GETHANDLER(CWinsServerHandler, spParentNode); UpdateConfig(); // now write to server DWORD err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened WinsMessageBox(err); } else { // success update our local copy pServer->SetConfig(*m_pConfig); } return HRESULT_FROM_WIN32(err); } /*--------------------------------------------------------------------------- CRepNodePropPull::UpdateConfig() Updates the values for the CConfiguration object in the Server Node ---------------------------------------------------------------------------*/ void CRepNodePropPull::UpdateConfig() { m_pConfig->m_fPullInitialReplication = m_fpullTrigOnStartup; m_pConfig->m_dwPullRetryCount = m_dwRetryCount; m_pConfig->m_dwPullTimeInterval = CalculateReplInt(); m_pConfig->m_dwPullSpTime = CalculatePullStartInt(); // persistence stuff BOOL bPullPersist = m_checkPullPersistence.GetCheck() ? TRUE: FALSE; m_pConfig->m_dwPullPersistence = bPullPersist ? 1:0; } /*--------------------------------------------------------------------------- CRepNodePropPull ::CalculatePullStartInt() Calculates the pullSPTime from the values in the controls ---------------------------------------------------------------------------*/ DWORD CRepNodePropPull ::CalculatePullStartInt() { CTime timePull; DWORD dwPullStartTime; if (m_nPullStartHour || m_nPullStartMinute || m_nPullStartSecond) { CTime time = CTime::GetCurrentTime(); CTime timeStart(time.GetYear(), time.GetMonth(), time.GetDay(), m_nPullStartHour, m_nPullStartMinute, m_nPullStartSecond); timePull = timeStart; } else { CTime time(0); timePull = time; } m_spinStartHour.SetPos(m_nPullStartHour); m_spinStartMinute.SetPos(m_nPullStartMinute); m_spinStartMinute.SetPos(m_nPullStartSecond); dwPullStartTime = (DWORD) timePull.GetTime(); return dwPullStartTime; } /*--------------------------------------------------------------------------- CRepNodePropPull ::CalculateReplInt() Calculates the pullReplInt from the values in the controls ---------------------------------------------------------------------------*/ DWORD CRepNodePropPull::CalculateReplInt() { DWORD dwReplInt = m_nRepliDay *SEC_PER_DAY + m_nRepliHour *SEC_PER_HOUR + m_nRepliMinute * SEC_PER_MINUTE; m_spinRepIntDay.SetPos(m_nRepliDay); m_spinRepIntHour.SetPos(m_nRepliHour); m_spinRepIntMinute.SetPos(m_nRepliMinute); return dwReplInt; } /*--------------------------------------------------------------------------- CRepNodePropPull::ToString(int nNumber) converts integet to string ---------------------------------------------------------------------------*/ CString CRepNodePropPull::ToString(int nNumber) { TCHAR szStr[20]; _itot(nNumber, szStr, 10); CString str(szStr); return str; } void CRepNodePropPull::OnChangeEditRepIntHour() { SetDirty(TRUE); } int CALLBACK RepNodeAdvancedPageCompareFunc ( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) { return ((CRepNodePropAdvanced *) lParamSort)->HandleSort(lParam1, lParam2); } ///////////////////////////////////////////////////////////////////////////// // CRepNodePropAdvanced property page IMPLEMENT_DYNCREATE(CRepNodePropAdvanced, CPropertyPage) CRepNodePropAdvanced::CRepNodePropAdvanced() : CPropertyPageBase(CRepNodePropAdvanced::IDD) { //{{AFX_DATA_INIT(cRepNodePropAdvanced) m_fEnableAuto = FALSE; m_dwHours = 0; m_dwMinutes = 0; m_dwSeconds = 0; m_dwMulticastTTL = 0; m_dwPersonaMode = PERSMODE_NON_GRATA; //}}AFX_DATA_INIT m_nSortColumn = -1; for (int i = 0; i < COLUMN_MAX; i++) { m_aSortOrder[i] = TRUE; // ascending } } CRepNodePropAdvanced::~CRepNodePropAdvanced() { } void CRepNodePropAdvanced::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(cRepNodePropAdvanced) DDX_Control(pDX, IDC_BUTTON_ADD, m_buttonAdd); DDX_Control(pDX, IDC_BUTTON_REMOVE, m_buttonRemove); DDX_Control(pDX, IDC_LIST_OWNERS, m_listOwners); DDX_Control(pDX, IDC_STATIC_DESP, m_staticDesp); DDX_Control(pDX, IDC_STATIC_MUTICASTINT, m_staticMulticastTTL); DDX_Control(pDX, IDC_STATIC_MULTICAST_TTL, m_staticMulticastInt); DDX_Control(pDX, IDC_SPIN_MULTICAST_TTL, m_spinMulticastTTL); DDX_Control(pDX, IDC_SPIN_MULTICAST_SECOND, m_spinMulticastSecond); DDX_Control(pDX, IDC_SPIN_MULTICAST_MINUTE, m_spinMulticastMinute); DDX_Control(pDX, IDC_SPIN_MULTICAST_HOUR, m_spinMulticastHour); DDX_Control(pDX, IDC_EDIT_MULTICAST_SECOND, m_editMulticastSecond); DDX_Control(pDX, IDC_EDIT_MULTICAST_TTL, m_editMulticastTTL); DDX_Control(pDX, IDC_EDIT_MULTICAST_MINUTE, m_editMulticastMinute); DDX_Control(pDX, IDC_EDIT_MULTICAST_HOUR, m_editMulticastHour); DDX_Control(pDX, IDC_CHECK_ENABLE_AUTO_PARTNER_CONFIG, m_checkenableAutoConfig); DDX_Check(pDX, IDC_CHECK_ENABLE_AUTO_PARTNER_CONFIG, m_fEnableAuto); DDX_Text(pDX, IDC_EDIT_MULTICAST_HOUR, m_dwHours); DDV_MinMaxDWord(pDX, m_dwHours, 0, 23); DDX_Text(pDX, IDC_EDIT_MULTICAST_MINUTE, m_dwMinutes); DDV_MinMaxDWord(pDX, m_dwMinutes, 0, 59); DDX_Text(pDX, IDC_EDIT_MULTICAST_SECOND, m_dwSeconds); DDV_MinMaxDWord(pDX, m_dwSeconds, 0, 59); DDX_Text(pDX, IDC_EDIT_MULTICAST_TTL, m_dwMulticastTTL); DDV_MinMaxDWord(pDX, m_dwMulticastTTL, WINSCNF_MIN_MCAST_TTL, WINSCNF_MAX_MCAST_TTL); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRepNodePropAdvanced, CPropertyPageBase) //{{AFX_MSG_MAP(cRepNodePropAdvanced) ON_BN_CLICKED(IDC_CHECK_ENABLE_AUTO_PARTNER_CONFIG, OnCheckEnableAutoPartnerConfig) ON_EN_CHANGE(IDC_EDIT_MULTICAST_HOUR, OnChangeEditMulticastHour) ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd) ON_BN_CLICKED(IDC_BUTTON_REMOVE, OnButtonRemove) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_OWNERS, OnItemchangedListOwners) ON_EN_CHANGE(IDC_EDIT_MULTICAST_MINUTE, OnChangeEditMulticastHour) ON_EN_CHANGE(IDC_EDIT_MULTICAST_SECOND, OnChangeEditMulticastHour) ON_EN_CHANGE(IDC_EDIT_MULTICAST_TTL, OnChangeEditMulticastHour) ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_OWNERS, OnColumnclickListOwners) ON_BN_CLICKED(IDC_RADIO_GRATA, OnRadioGrata) ON_BN_CLICKED(IDC_RADIO_NON_GRATA, OnRadioNonGrata) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // cRepNodePropAdvanced message handlers BOOL CRepNodePropAdvanced::OnApply() { if (!IsDirty()) return TRUE; HRESULT hr = UpdateServerConfiguration(); if (FAILED(hr)) { return FALSE; } else { return CPropertyPageBase::OnApply(); } } void CRepNodePropAdvanced::OnOK() { // TODO: Add your specialized code here and/or call the base class CPropertyPageBase::OnOK(); } BOOL CRepNodePropAdvanced::OnInitDialog() { CPropertyPageBase::OnInitDialog(); GetConfig(); InitializeControls(); if (m_pConfig->m_fUseSelfFndPnrs) { m_checkenableAutoConfig.SetCheck(TRUE); EnableControls(); FillControls(); } else { m_checkenableAutoConfig.SetCheck(FALSE); // disable the controls FillControls(); EnableControls(FALSE); } // now for the owner list box // fill the header informnation for the list control //CString strOwner; //strOwner.LoadString(IDS_WINSSERVER); //m_listOwners.InsertColumn(0,strOwner, LVCFMT_LEFT, 150,1); CString strID; strID.LoadString(IDS_IPADDRESS); m_listOwners.InsertColumn(0, strID, LVCFMT_LEFT, 150, -1); FillServerInfo(); SetRemoveButtonState(); SetDirty(FALSE); return TRUE; } void CRepNodePropAdvanced::InitializeControls() { m_spinMulticastHour.SetRange(0, UD_MAXVAL); m_spinMulticastMinute.SetRange(0, 59); m_spinMulticastSecond.SetRange(0, 59); m_spinMulticastTTL.SetRange(WINSCNF_MIN_MCAST_TTL, WINSCNF_MAX_MCAST_TTL); } void CRepNodePropAdvanced::EnableControls(BOOL bEnable ) { m_staticMulticastInt.EnableWindow(bEnable); m_staticMulticastTTL.EnableWindow(bEnable); m_staticDesp.EnableWindow(bEnable); m_editMulticastHour.EnableWindow(bEnable); m_editMulticastMinute.EnableWindow(bEnable); m_editMulticastSecond.EnableWindow(bEnable); m_spinMulticastHour.EnableWindow(bEnable); m_spinMulticastMinute.EnableWindow(bEnable); m_spinMulticastSecond.EnableWindow(bEnable); m_spinMulticastTTL.EnableWindow(bEnable); m_editMulticastTTL.EnableWindow(bEnable); } void CRepNodePropAdvanced::FillControls() { DWORD dwMulticastInt = m_pConfig->m_dwMulticastInt; int nHours = dwMulticastInt / SEC_PER_HOUR; dwMulticastInt -= nHours * SEC_PER_HOUR; int nMinutes = dwMulticastInt / SEC_PER_MINUTE; dwMulticastInt -= nMinutes * SEC_PER_MINUTE; int nSeconds = dwMulticastInt; m_spinMulticastHour.SetPos(nHours); m_spinMulticastMinute.SetPos(nMinutes); m_spinMulticastSecond.SetPos(nSeconds); m_editMulticastTTL.SetWindowText(ToString(m_pConfig->m_dwMcastTtl)); } CString CRepNodePropAdvanced::ToString(int nNumber) { TCHAR szStr[20]; _itot(nNumber, szStr, 10); CString str(szStr); return str; } void CRepNodePropAdvanced::UpdateConfig() { if (m_fEnableAuto) { DWORD dwInt = m_dwHours*SEC_PER_HOUR + m_dwMinutes *SEC_PER_MINUTE + m_dwSeconds; m_pConfig->m_dwMulticastInt = dwInt; m_pConfig->m_dwMcastTtl = m_dwMulticastTTL; m_pConfig->m_fUseSelfFndPnrs = m_fEnableAuto; } else { m_pConfig->m_fUseSelfFndPnrs = m_fEnableAuto; } } HRESULT CRepNodePropAdvanced::UpdateServerConfiguration() { // Reflect the changes in the server's CConfiguration object AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; DWORD err = ERROR_SUCCESS; // get the server spNode = GetHolder()->GetNode(); // get it's parent spNode->GetParent(&spParentNode); pServer = GETHANDLER(CWinsServerHandler, spParentNode); UpdateData(); UpdateConfig(); // update persona non grata err = WriteToRegistry(); if (err != ERROR_SUCCESS) { // something bad happened WinsMessageBox(err); goto Error; } // now write to server err = m_pConfig->Store(); if (err != ERROR_SUCCESS) { // something bad happened WinsMessageBox(err); } else { // success update our local copy pServer->SetConfig(*m_pConfig); } Error: return HRESULT_FROM_WIN32(err); } HRESULT CRepNodePropAdvanced::GetConfig() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; m_pConfig = ((CRepNodeProperties *) GetHolder())->GetConfig(); return hr; } void CRepNodePropAdvanced::OnCheckEnableAutoPartnerConfig() { SetDirty(TRUE); if (m_checkenableAutoConfig.GetCheck()) { EnableControls(); FillControls(); } else { FillControls(); EnableControls(FALSE); } SetRemoveButtonState(); } void CRepNodePropAdvanced::OnChangeEditMulticastHour() { SetDirty(TRUE); } void CRepNodePropAdvanced::OnButtonAdd() { BOOL fDuplicate = FALSE; CNewPersonaNonGrata dlg; CStringArray *pPersonaList; // empty the strings m_strServerName.Empty(); m_strIPAddress.Empty(); dlg.m_pRepPropDlg = this; // show the dialog if (IDOK != dlg.DoModal()) return; m_strServerName = dlg.m_strServerName; m_strIPAddress = dlg.m_strServerIp; pPersonaList = (m_dwPersonaMode == PERSMODE_NON_GRATA) ? &m_strPersonaNonGrata : &m_strPersonaGrata; // check to make sure it already isn't in the list for (int i = 0; i < pPersonaList->GetSize(); i++) { if ((*pPersonaList)[i] == m_strIPAddress) { // oh no, duplicate AfxMessageBox(IDS_ERR_WINS_EXISTS); fDuplicate = TRUE; } } if (!fDuplicate) { int nCount = m_listOwners.GetItemCount(); // add to the list control int ntest = m_listOwners.InsertItem(nCount, m_strIPAddress, 0); CIpAddress ipaddr1(m_strIPAddress); m_listOwners.SetItemData(ntest, (LONG) ipaddr1); // add to the list of the IP address array too. pPersonaList->Add(m_strIPAddress); // set focus to the Add button m_buttonAdd.SetFocus(); SetRemoveButtonState(); // mark the page as dirty SetDirty(TRUE); } } void CRepNodePropAdvanced::OnButtonRemove() { int nSel; CString strSel; nSel = m_listOwners.GetNextItem(-1, LVNI_SELECTED); if (nSel == -1) return; strSel = m_listOwners.GetItemText(nSel, 0); // remove from the list of IP addresses RemoveFromArray(strSel); m_listOwners.DeleteItem(nSel); if (m_listOwners.GetItemCount() > 0) m_listOwners.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED); // set focus to the owners list box m_listOwners.SetFocus(); m_buttonAdd.SetFocus(); SetRemoveButtonState(); // mark the page dirty SetDirty(TRUE); } void CRepNodePropAdvanced::RemoveFromArray(CString &strSel) { int nCount; int i; CStringArray *pPersonaList; pPersonaList = (m_dwPersonaMode == PERSMODE_NON_GRATA) ? &m_strPersonaNonGrata : &m_strPersonaGrata; nCount = (int)pPersonaList->GetSize(); for(i = 0 ; i < nCount; i++) { // get the string that matches with the one selected if (pPersonaList->GetAt(i).CompareNoCase(strSel) == 0) { pPersonaList->RemoveAt(i); break; } } } BOOL CRepNodePropAdvanced::IsDuplicate(CString &strServerName) { BOOL bFound = FALSE; LV_FINDINFO lvFindInfo; int nFound ; lvFindInfo.flags = LVFI_STRING; lvFindInfo.psz = strServerName; lvFindInfo.lParam = NULL; nFound = m_listOwners.FindItem(&lvFindInfo); bFound = (nFound != -1) ? TRUE : FALSE; return bFound; } BOOL CRepNodePropAdvanced::IsCurrentServer(CString &strServerName) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); BOOL bCurrent = FALSE; SPITFSNode spNode; CWinsServerHandler *pServer; SPITFSNode spParentNode; // get the server spNode = GetHolder()->GetNode(); // get it's parent spNode->GetParent(&spParentNode); pServer = GETHANDLER(CWinsServerHandler, spParentNode); // check if the same server is being added if (pServer->m_strServerAddress.CompareNoCase(m_strServerName) == 0) { return TRUE; } return FALSE; } DWORD CRepNodePropAdvanced::ReadFromRegistry() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); DWORD err = ERROR_SUCCESS; CString strServerName; CString strTemp =_T("\\\\"); CString strName; CStringList strList; RegKey rk; GetServerName(strServerName); strServerName = strTemp + strServerName; // clear the IP array first m_strPersonaNonGrata.RemoveAll(); m_strPersonaGrata.RemoveAll(); err = rk.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPartnersRoot, KEY_READ, strServerName); if (err) { err = rk.Create(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPartnersRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, strServerName); } if (err == ERROR_SUCCESS) { err = rk.QueryValue(lpstrPersonaNonGrata, strList); if (err == ERROR_SUCCESS) { POSITION pos = strList.GetHeadPosition(); while (pos) { strName = strList.GetNext(pos); if (!strName.IsEmpty()) m_strPersonaNonGrata.Add(strName); } } err = rk.QueryValue(lpstrPersonaGrata, strList); if (err == ERROR_SUCCESS) { POSITION pos = strList.GetHeadPosition(); while (pos) { strName = strList.GetNext(pos); if (!strName.IsEmpty()) m_strPersonaGrata.Add(strName); } } // don't worry here about the return code. In case of failure (entry doesn't exist) // rely on default which is 'NON_GRATA' rk.QueryValue(lpstrPersonaMode, m_dwPersonaMode); // normalize the value - if > 0 it is set to 1 if (m_dwPersonaMode > 0) m_dwPersonaMode = PERSMODE_GRATA; } return ERROR_SUCCESS; } DWORD CRepNodePropAdvanced::WriteToRegistry() { DWORD err = ERROR_SUCCESS; RegKey rk; CString strServerName; CString strTemp =_T("\\\\"); int i = 0; CStringList strList; // get the servername GetServerName(strServerName); strServerName = strTemp + strServerName; err = rk.Create(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPartnersRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, strServerName); if (err == ERROR_SUCCESS) { for (i = 0; i < m_strPersonaNonGrata.GetSize(); i++) { if (!m_strPersonaNonGrata[i].IsEmpty()) strList.AddTail(m_strPersonaNonGrata.GetAt(i)); } err = rk.SetValue(lpstrPersonaNonGrata, strList); strList.RemoveAll(); } if (err == ERROR_SUCCESS) { for (i = 0; i < m_strPersonaGrata.GetSize(); i++) { if (!m_strPersonaGrata[i].IsEmpty()) strList.AddTail(m_strPersonaGrata.GetAt(i)); } err = rk.SetValue(lpstrPersonaGrata, strList); } if (err == ERROR_SUCCESS) { err = rk.SetValue(lpstrPersonaMode, m_dwPersonaMode); } return err; } DWORD CRepNodePropAdvanced::ResolveIPAddress(CString &strIP, CString &strServerName) { DWORD err = ERROR_SUCCESS; DWORD dwIPDummy; // check by resolving the name thro' WINS api BEGIN_WAIT_CURSOR err = ::VerifyWinsServer(strIP, strServerName, dwIPDummy); END_WAIT_CURSOR return err; } void CRepNodePropAdvanced::FillServerInfo() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); int nSize; int i; DWORD err; CStringArray *pPersonaList; // read from the registry ReadFromRegistry(); if (m_dwPersonaMode == PERSMODE_NON_GRATA) { pPersonaList = &m_strPersonaNonGrata; CheckRadioButton(IDC_RADIO_NON_GRATA,IDC_RADIO_GRATA, IDC_RADIO_NON_GRATA); } else { pPersonaList = &m_strPersonaGrata; CheckRadioButton(IDC_RADIO_NON_GRATA,IDC_RADIO_GRATA, IDC_RADIO_GRATA); } // now for each of the IP addresses, get the server name nSize = (int)pPersonaList->GetSize(); for (i = 0; i < nSize; i++) { int nPos = m_listOwners.InsertItem(i, pPersonaList->GetAt(i)); CIpAddress ipaddr1(pPersonaList->GetAt(i)); m_listOwners.SetItemData(nPos, (LONG) ipaddr1); } Sort(COLUMN_IP); } void CRepNodePropAdvanced::GetServerName(CString &ServerName) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); DWORD err = ERROR_SUCCESS; HKEY hkeyMachine = HKEY_LOCAL_MACHINE; SPITFSNode spNode; CWinsServerHandler *pServer; HRESULT hr = hrOK; SPITFSNode spParentNode; // get the server spNode = GetHolder()->GetNode(); // get it's parent spNode->GetParent(&spParentNode); pServer = GETHANDLER(CWinsServerHandler, spParentNode); ServerName = pServer->GetServerAddress(); } void CRepNodePropAdvanced::SetRemoveButtonState() { int nSel; // check if any item is seleted in the list ctrl. nSel = m_listOwners.GetNextItem(-1, LVNI_SELECTED); if (nSel == -1) m_buttonRemove.EnableWindow(FALSE); else m_buttonRemove.EnableWindow(TRUE); } void CRepNodePropAdvanced::OnItemchangedListOwners(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; SetRemoveButtonState(); *pResult = 0; } void CRepNodePropAdvanced::OnColumnclickListOwners(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // sort depending on what column was clicked; Sort(pNMListView->iSubItem); *pResult = 0; } void CRepNodePropAdvanced::Sort(int nCol) { if (m_nSortColumn == nCol) { // if the user is clicking the same column again, reverse the sort order m_aSortOrder[nCol] = m_aSortOrder[nCol] ? FALSE : TRUE; } else { m_nSortColumn = nCol; } m_listOwners.SortItems(RepNodeAdvancedPageCompareFunc, (LPARAM) this); } int CRepNodePropAdvanced::HandleSort(LPARAM lParam1, LPARAM lParam2) { int nCompare = 0; switch (m_nSortColumn) { case COLUMN_IP: { CIpAddress ipaddr1((LONG) lParam1); CIpAddress ipaddr2((LONG) lParam2); UINT uIpAddr1 = (UINT) ((LONG) ipaddr1); UINT uIpAddr2 = (UINT) ((LONG) ipaddr2); if (uIpAddr1 > uIpAddr2) nCompare = 1; else if (uIpAddr1 < uIpAddr2) nCompare = -1; } break; } if (m_aSortOrder[m_nSortColumn] == FALSE) { // descending return -nCompare; } else { // ascending return nCompare; } } void CRepNodePropAdvanced::OnRadioGrata() { if (m_dwPersonaMode != PERSMODE_GRATA) { INT i, nSize; m_listOwners.DeleteAllItems(); nSize = (int)m_strPersonaGrata.GetSize(); for (i = 0; i < nSize; i++) { int nPos = m_listOwners.InsertItem(i, m_strPersonaGrata[i]); } m_dwPersonaMode = PERSMODE_GRATA; SetDirty(TRUE); } } void CRepNodePropAdvanced::OnRadioNonGrata() { if (m_dwPersonaMode != PERSMODE_NON_GRATA) { INT i, nSize; m_listOwners.DeleteAllItems(); nSize = (int)m_strPersonaNonGrata.GetSize(); for (i = 0; i < nSize; i++) { int nPos = m_listOwners.InsertItem(i, m_strPersonaNonGrata[i]); } m_dwPersonaMode = PERSMODE_NON_GRATA; SetDirty(TRUE); } } ///////////////////////////////////////////////////////////////////////////// // CRepNodeProperties Handlers ///////////////////////////////////////////////////////////////////////////// CRepNodeProperties::CRepNodeProperties ( ITFSNode * pNode, IComponentData * pComponentData, ITFSComponentData * pTFSCompData, LPCTSTR pszSheetName ) : CPropertyPageHolderBase(pNode, pComponentData, pszSheetName) { m_bAutoDeletePages = FALSE; // we have the pages as embedded members AddPageToList((CPropertyPageBase*) &m_pageGeneral); AddPageToList((CPropertyPageBase*) &m_pagePush); AddPageToList((CPropertyPageBase*) &m_pagePull); AddPageToList((CPropertyPageBase*) &m_pageAdvanced); Assert(pTFSCompData != NULL); m_spTFSCompData.Set(pTFSCompData); } CRepNodeProperties::~CRepNodeProperties() { RemovePageFromList((CPropertyPageBase*) &m_pageGeneral, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pagePush, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pagePull, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageAdvanced, FALSE); }