/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 -99 **/ /**********************************************************************/ /* repprtpp.cpp Comment goes here FILE HISTORY: */ #include "stdafx.h" #include "winssnap.h" #include "RepPrtpp.h" #include "nodes.h" #include "server.h" #include "tregkey.h" #include "reppart.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CRepPartnerPropGen property page IMPLEMENT_DYNCREATE(CRepPartnerPropGen, CPropertyPageBase) CRepPartnerPropGen::CRepPartnerPropGen() : CPropertyPageBase(CRepPartnerPropGen::IDD) { //{{AFX_DATA_INIT(CRepPartnerPropGen) //}}AFX_DATA_INIT m_pServer = NULL; } CRepPartnerPropGen::~CRepPartnerPropGen() { } void CRepPartnerPropGen::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRepPartnerPropGen) DDX_Control(pDX, IDC_EDIT_NAME, m_editName); DDX_Control(pDX, IDC_EDIT_IPADDRESS, m_editIpAdd); //}}AFX_DATA_MAP DDX_Control(pDX, IDC_IPADD, m_customIPAdd); } BEGIN_MESSAGE_MAP(CRepPartnerPropGen, CPropertyPageBase) //{{AFX_MSG_MAP(CRepPartnerPropGen) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRepPartnerPropGen message handlers BOOL CRepPartnerPropGen::OnInitDialog() { // get our server info from the holder m_pServer = ((CReplicationPartnerProperties *) GetHolder())->GetServer(); // Initialize the IP address controls m_ipControl.Create(m_hWnd, IDC_IPADD); m_ipControl.SetFieldRange(0, 0, 255); CPropertyPageBase::OnInitDialog(); CString strName, strIP; GetServerNameIP(strName, strIP); m_editName.SetWindowText(strName); m_editIpAdd.SetWindowText(strIP); m_ipControl.SetAddress(strIP); m_customIPAdd.SetWindowText(strIP); m_editName.SetReadOnly(TRUE); m_editIpAdd.SetReadOnly(TRUE); m_customIPAdd.SetReadOnly(); // 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; } } SetDirty(FALSE); return TRUE; } void CRepPartnerPropGen::GetServerNameIP(CString &strName, CString& strIP) { HRESULT hr = hrOK; AFX_MANAGE_STATE(AfxGetStaticModuleState()); strIP = m_pServer->GetstrIPAddress(); strName = m_pServer->GetNetBIOSName(); } ///////////////////////////////////////////////////////////////////////////// // CRepPartnerPropAdv property page IMPLEMENT_DYNCREATE(CRepPartnerPropAdv, CPropertyPageBase) CRepPartnerPropAdv::CRepPartnerPropAdv() : CPropertyPageBase(CRepPartnerPropAdv::IDD) { //{{AFX_DATA_INIT(CRepPartnerPropAdv) m_strType = _T(""); m_nUpdateCount = 0; m_nRepDay = 0; m_nRepHour = 0; m_nRepMinute = 0; m_nStartHour = 0; m_nStartMinute = 0; m_nStartSecond = 0; //}}AFX_DATA_INIT m_pServer = NULL; } CRepPartnerPropAdv::~CRepPartnerPropAdv() { } void CRepPartnerPropAdv::DoDataExchange(CDataExchange* pDX) { CPropertyPageBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRepPartnerPropAdv) DDX_Control(pDX, IDC_CHECK_PUSH_PERSISTENCE, m_buttonPushPersistence); DDX_Control(pDX, IDC_CHECK_PULL_PERSIST, m_buttonPullPersistence); DDX_Control(pDX, IDC_STATIC_PUSH_GROUP, m_GroupPush); DDX_Control(pDX, IDC_STATIC_PULL_GROUP, m_GroupPull); DDX_Control(pDX, IDC_STATIC_UPDATE, m_staticUpdate); DDX_Control(pDX, IDC_STATIC_START_TIME, m_staticStartTime); DDX_Control(pDX, IDC_STATIC_REP_TIME, m_staticRepTime); DDX_Control(pDX, IDC_SPIN_UPDATE_COUNT, m_spinUpdateCount); 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_REP_MINUTE, m_spinRepMinute); DDX_Control(pDX, IDC_SPIN_REP_HOUR, m_spinRepHour); DDX_Control(pDX, IDC_SPIN_REP_DAY, m_spinRepDay); DDX_Control(pDX, IDC_EDIT_UPDATE_COUNT, m_editUpdateCount); 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_REP_MINUTE, m_editRepMinute); DDX_Control(pDX, IDC_EDIT_REP_HOUR, m_editRepHour); DDX_Control(pDX, IDC_EDIT_REP_DAY, m_editRepDay); DDX_Control(pDX, IDC_COMBO_TYPE, m_comboType); DDX_Control(pDX, IDC_BUTTON_PUSH_SET_DEFAULT, m_buttonPush); DDX_Control(pDX, IDC_BUTTON_PULL_SET_DEFAULT, m_buttonPull); DDX_CBStringExact(pDX, IDC_COMBO_TYPE, m_strType); DDX_Text(pDX, IDC_EDIT_UPDATE_COUNT, m_nUpdateCount); DDX_Text(pDX, IDC_EDIT_REP_DAY, m_nRepDay); DDV_MinMaxInt(pDX, m_nRepDay, 0, 365); DDX_Text(pDX, IDC_EDIT_REP_HOUR, m_nRepHour); DDV_MinMaxInt(pDX, m_nRepHour, 0, 23); DDX_Text(pDX, IDC_EDIT_REP_MINUTE, m_nRepMinute); DDV_MinMaxInt(pDX, m_nRepMinute, 0, 59); DDX_Text(pDX, IDC_EDIT_START_HOUR, m_nStartHour); DDV_MinMaxInt(pDX, m_nStartHour, 0, 23); DDX_Text(pDX, IDC_EDIT_START_MINUTE, m_nStartMinute); DDV_MinMaxInt(pDX, m_nStartMinute, 0, 59); DDX_Text(pDX, IDC_EDIT_START_SECOND, m_nStartSecond); DDV_MinMaxInt(pDX, m_nStartSecond, 0, 59); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRepPartnerPropAdv, CPropertyPageBase) //{{AFX_MSG_MAP(CRepPartnerPropAdv) ON_BN_CLICKED(IDC_BUTTON_PULL_SET_DEFAULT, OnButtonPullSetDefault) ON_BN_CLICKED(IDC_BUTTON_PUSH_SET_DEFAULT, OnButtonPushSetDefault) ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnSelchangeComboType) ON_EN_CHANGE(IDC_EDIT_REP_DAY, OnChangeEditRepHour) ON_EN_CHANGE(IDC_EDIT_REP_HOUR, OnChangeEditRepHour) ON_EN_CHANGE(IDC_EDIT_REP_MINUTE, OnChangeEditRepHour) ON_EN_CHANGE(IDC_EDIT_START_HOUR, OnChangeEditRepHour) ON_EN_CHANGE(IDC_EDIT_START_MINUTE, OnChangeEditRepHour) ON_EN_CHANGE(IDC_EDIT_START_SECOND, OnChangeEditRepHour) ON_EN_CHANGE(IDC_EDIT_UPDATE_COUNT, OnChangeEditRepHour) ON_BN_CLICKED(IDC_CHECK_PULL_PERSIST, OnChangeEditRepHour) ON_BN_CLICKED(IDC_CHECK_PUSH_PERSISTENCE, OnChangeEditRepHour) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRepPartnerPropAdv message handlers BOOL CRepPartnerPropAdv::OnInitDialog() { int ids; BOOL bPush, bPull; CPropertyPageBase::OnInitDialog(); AFX_MANAGE_STATE(AfxGetStaticModuleState()); // get our server info from the holder m_pServer = ((CReplicationPartnerProperties *) GetHolder())->GetServer(); // init push spin controls m_spinUpdateCount.SetRange(0, UD_MAXVAL); // init pull spin controls m_spinRepMinute.SetRange(0, 59); m_spinRepHour.SetRange(0, 23); m_spinRepDay.SetRange(0, UD_MAXVAL); m_spinStartSecond.SetRange(0, 59); m_spinStartMinute.SetRange(0, 59); m_spinStartHour.SetRange(0, 23); // fill the combobox CString st; int nIndex = 0; st.LoadString(IDS_PUSHPULL); nIndex = m_comboType.AddString(st); m_comboType.SetItemData(nIndex, 0); st.LoadString(IDS_PUSH); nIndex = m_comboType.AddString(st); m_comboType.SetItemData(nIndex, 1); st.LoadString(IDS_PULL); nIndex = m_comboType.AddString(st); m_comboType.SetItemData(nIndex, 2); bPush = m_pServer->IsPush(); bPull = m_pServer->IsPull(); if (bPush && bPull) ids = IDS_PUSHPULL; else if (bPush) ids = IDS_PUSH; else if (bPull) ids = IDS_PULL; else ids = IDS_NONE; st.LoadString(ids); SetState(st, bPush, bPull); FillPushParameters(); FillPullParameters(); SetDirty(FALSE); return TRUE; } void CRepPartnerPropAdv::FillPushParameters() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); EnablePushControls(m_pServer->IsPush()); DWORD nUpdate = (LONG) m_pServer->GetPushUpdateCount(); m_spinUpdateCount.SetPos(nUpdate); // set the persistence parameter CConfiguration Config; GetConfig(Config); if (Config.m_dwMajorVersion < 5) { // no persistent connections for anything less that NT5 m_buttonPushPersistence.SetCheck(FALSE); } else { BOOL bCheck = m_pServer->GetPushPersistence() ? TRUE : FALSE; m_buttonPushPersistence.SetCheck(bCheck); } } void CRepPartnerPropAdv::FillPullParameters() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); EnablePullControls(m_pServer->IsPull()); DWORD nPullRep = (LONG) m_pServer->GetPullReplicationInterval(); DWORD dwPullTime, dwPullSpTime, dwUpdateCount; //if (nPullRep !=0 ) { int nDays =0, nHours = 0, nMinutes = 0; nDays = nPullRep/ SEC_PER_DAY; nPullRep -= nDays * SEC_PER_DAY; if (nPullRep) { nHours = nPullRep / SEC_PER_HOUR; nPullRep -= nHours * SEC_PER_HOUR; if (nPullRep) { nMinutes = nPullRep / SEC_PER_MINUTE; nPullRep -= nMinutes * SEC_PER_MINUTE; } } m_spinRepDay.SetPos(nDays); m_spinRepHour.SetPos(nHours); m_spinRepMinute.SetPos(nMinutes); } int nHours = 0, nMinutes = 0, nSeconds = 0; if (m_pServer->GetPullStartTime()) { nHours = m_pServer->GetPullStartTime().GetHour(); nMinutes = m_pServer->GetPullStartTime().GetMinute(); nSeconds = m_pServer->GetPullStartTime().GetSecond(); } m_spinStartHour.SetPos(nHours); m_spinStartMinute.SetPos(nMinutes); m_spinStartSecond.SetPos(nSeconds); // set the persistence parameter CConfiguration Config; GetConfig(Config); if (Config.m_dwMajorVersion < 5) { // no persistent connections for anything less that NT5 m_buttonPullPersistence.SetCheck(FALSE); } else { BOOL bCheck = m_pServer->GetPullPersistence() ? TRUE : FALSE; m_buttonPullPersistence.SetCheck(bCheck); } } CString CRepPartnerPropAdv::ToString(int nNumber) { TCHAR szStr[20]; _itot(nNumber, szStr, 10); CString str(szStr); return str; } DWORD CRepPartnerPropAdv::GetConfig(CConfiguration & config) { // leaf node SPITFSNode spNode ; spNode = GetHolder()->GetNode(); // scope pane rep node SPITFSNode spRepNode; spNode->GetParent(&spRepNode); // server node SPITFSNode spServerNode; spRepNode->GetParent(&spServerNode); CWinsServerHandler *pServer; pServer = GETHANDLER(CWinsServerHandler, spServerNode); config = pServer->GetConfig(); return NOERROR; } // read from the preferences void CRepPartnerPropAdv::ReadFromServerPref ( DWORD & dwPullTime, DWORD & dwPullSpTime, DWORD & dwUpdateCount, DWORD & dwPushPersistence, DWORD & dwPullPersistence ) { CConfiguration Config; GetConfig(Config); dwPullTime = Config.m_dwPullTimeInterval; dwPullSpTime = Config.m_dwPullSpTime; dwUpdateCount = Config.m_dwPushUpdateCount; dwPushPersistence = Config.m_dwPushPersistence; dwPullPersistence = Config.m_dwPullPersistence; } void CRepPartnerPropAdv::OnButtonPullSetDefault() { // read from the preferences of the server and display the values DWORD dwPullTime, dwPullSpTime, dwUpdate, dwPushPersistence, dwPullPersistence; ReadFromServerPref(dwPullTime, dwPullSpTime, dwUpdate, dwPushPersistence, dwPullPersistence); // fill the controls CTime PullSpTime(dwPullSpTime); int nHours = 0, nMinutes = 0, nSeconds = 0; if (dwPullSpTime) { nHours = PullSpTime.GetHour(); nMinutes = PullSpTime.GetMinute(); nSeconds = PullSpTime.GetSecond(); } m_spinStartHour.SetPos(nHours); m_spinStartMinute.SetPos(nMinutes); m_spinStartSecond.SetPos(nSeconds); int nDays = 0; nDays = dwPullTime / SEC_PER_DAY; dwPullTime -= nDays * SEC_PER_DAY; nHours = dwPullTime / SEC_PER_HOUR; dwPullTime -= nHours * SEC_PER_HOUR; nMinutes = dwPullTime / SEC_PER_MINUTE; dwPullTime -= nMinutes * SEC_PER_MINUTE; m_spinRepDay.SetPos(nDays); m_spinRepHour.SetPos(nHours); m_spinRepMinute.SetPos(nMinutes); // clear off the persistence check box m_buttonPullPersistence.SetCheck(dwPullPersistence); // mark the page dirty so changes get saved SetDirty(TRUE); } void CRepPartnerPropAdv::OnButtonPushSetDefault() { // read from the preferences of the server and display the values DWORD dwPullTime, dwPullSpTime, dwUpdate, dwPushPersistence, dwPullPersistence; ReadFromServerPref(dwPullTime, dwPullSpTime, dwUpdate, dwPushPersistence, dwPullPersistence); m_spinUpdateCount.SetPos(dwUpdate); m_buttonPushPersistence.SetCheck(dwPushPersistence); // mark the page dirty so changes get saved SetDirty(TRUE); } void CRepPartnerPropAdv::OnOK() { UpdateRep(); UpdateReg(); CPropertyPageBase::OnOK(); } void CRepPartnerPropAdv::UpdateRep() { // get the replication partner server item BOOL bPullPersist; BOOL bPushPersist; CThemeContextActivator themeActivator; UpdateData(); // get the persistence data for the server object bPullPersist = (m_buttonPullPersistence.GetCheck() == 0) ? FALSE : TRUE; bPushPersist = (m_buttonPushPersistence.GetCheck() == 0) ? FALSE : TRUE; if ( ( (m_nUpdateCount > 0) & (m_nUpdateCount < WINSCNF_MIN_VALID_UPDATE_CNT) ) & (!bPushPersist) ) { 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; } int nPullRep = m_pServer->GetPullReplicationInterval(); int nIndex = m_comboType.GetCurSel(); switch (m_comboType.GetItemData(nIndex)) { // pull/push partner case 0: m_pServer->SetPull(TRUE); m_pServer->SetPush(TRUE); break; // push partner case 1: m_pServer->SetPull(FALSE); m_pServer->SetPush(TRUE); break; // pull partner case 2: default: m_pServer->SetPull(TRUE); m_pServer->SetPush(FALSE); break; } // get the replication interval DWORD dwRepInt; CalculateRepInt(dwRepInt); m_pServer->GetPullReplicationInterval() = dwRepInt; // get the start time CTime timeStart; CalculateStartInt(timeStart); m_pServer->GetPullStartTime() = timeStart; m_pServer->GetPushUpdateCount() = m_nUpdateCount; //SetPersistence(bPersist); m_pServer->SetPullPersistence(bPullPersist); m_pServer->SetPushPersistence(bPushPersist); } int CRepPartnerPropAdv::ToInt(CString strNumber) { int nNumber = _ttoi(strNumber); return nNumber; } DWORD CRepPartnerPropAdv::UpdateReg() { UpdateData(); DWORD err; SPITFSNode spNode; CReplicationPartner * pRepParItem; // get the replication partner node & handler spNode = GetHolder()->GetNode(); pRepParItem = GETHANDLER(CReplicationPartner, spNode); // if none, delete the key from registry, no need to worry about the // persistence it gets deleted anyway if (!m_pServer->IsPush() && !m_pServer->IsPull()) { err = RemovePushPartner(); if (err) goto Error; err = RemovePullPartner(); } // if only push else if (m_pServer->IsPush() && !m_pServer->IsPull()) { // update the push stuff err = UpdatePushParameters(); if (err) goto Error; // remove if configured as a pull partner err = RemovePullPartner(); } //if only pull else if (!m_pServer->IsPush() && m_pServer->IsPull()) { // update the pull stuff err = UpdatePullParameters(); if (err) goto Error; // remove if configured as a push partner err = RemovePushPartner(); } // if both push and pull else if (m_pServer->IsPush() && m_pServer->IsPull()) { // update the push stuff err = UpdatePushParameters(); if (err) goto Error; err = UpdatePullParameters(); } Error: if (err == ERROR_SUCCESS) { // update our local cahced node with the changes from the property page pRepParItem->m_Server = *m_pServer; } return err; } DWORD CRepPartnerPropAdv::UpdatePullParameters() { SPITFSNode spNode, spRepNode; CReplicationPartnersHandler * pRep; // first get the replication partner node & handler spNode = GetHolder()->GetNode(); // Now get the replication partners node & handle spNode->GetParent(&spRepNode); pRep = GETHANDLER(CReplicationPartnersHandler, spRepNode); // build the server name CString strServerName; pRep->GetServerName(spRepNode, strServerName); strServerName = _T("\\\\") + strServerName; DWORD dwResult, dwRepInt, dwValue; DWORD err = ERROR_SUCCESS; // make sure it is setup as a pull partner RegKey rk; CString strKey = pRep->lpstrPullRoot + _T("\\") + (CString) m_pServer->GetstrIPAddress(); err = rk.Create(HKEY_LOCAL_MACHINE, strKey, 0, KEY_ALL_ACCESS, NULL, strServerName); if (err) goto Error; err = rk.SetValue(pRep->lpstrNetBIOSName, m_pServer->GetNetBIOSName()); if (err) { Trace1("CRepPartnerPropAdv::UpdatePullParameters - error writing netbios name! %d\n", err); goto Error; } err = rk.QueryValue(WINSCNF_SELF_FND_NM, (DWORD&) dwResult); if (err) { Trace0("CRepPartnerPropAdv::UpdatePullParameters - No selfFind value, setting to 0\n"); dwValue = 0; err = rk.SetValue(WINSCNF_SELF_FND_NM, dwValue); } dwRepInt = (LONG) m_pServer->GetPullReplicationInterval(); if ((LONG) m_pServer->GetPullReplicationInterval() > 0) { err = rk.SetValue(WINSCNF_RPL_INTERVAL_NM, (DWORD&) dwRepInt); if (err) { Trace1("CRepPartnerPropAdv::UpdatePullParameters - error writing Pull time interval! %d\n", err); goto Error; } } if (m_pServer->GetPullStartTime().GetTime() > (time_t) 0) { err = rk.SetValue(WINSCNF_SP_TIME_NM, m_pServer->GetPullStartTime().IntlFormat(CIntlTime::TFRQ_MILITARY_TIME)); if (err) { Trace1("CRepPartnerPropAdv::UpdatePullParameters - error writing Pull SpTime! %d\n", err); goto Error; } } else { err = rk.DeleteValue(WINSCNF_SP_TIME_NM); } // set the value to 0 or 1 depending on the PushPersistence dwValue = m_pServer->GetPullPersistence() ? 1 : 0; // Set the Persist key err = rk.SetValue(pRep->lpstrPersistence, (DWORD &)dwValue); if (err) { Trace1("CRepPartnerPropAdv::UpdatePullParameters - Error writing persistence! %d\n", err); } Error: return err; } DWORD CRepPartnerPropAdv::UpdatePushParameters() { SPITFSNode spNode, spRepNode; CReplicationPartnersHandler * pRep; // first get the replication partner node & handler spNode = GetHolder()->GetNode(); // Now get the replication partners node & handle spNode->GetParent(&spRepNode); pRep = GETHANDLER(CReplicationPartnersHandler, spRepNode); // build the server name CString strServerName; pRep->GetServerName(spRepNode, strServerName); strServerName = _T("\\\\") + strServerName; DWORD dwResult, dwValue; DWORD err = ERROR_SUCCESS; RegKey rk; // make sure it is setup as a push partner CString strKey = pRep->lpstrPushRoot + _T("\\") + (CString) m_pServer->GetstrIPAddress(); err = rk.Create(HKEY_LOCAL_MACHINE, strKey, 0, KEY_ALL_ACCESS, NULL, strServerName); if (err) goto Error; err = rk.SetValue(pRep->lpstrNetBIOSName, m_pServer->GetNetBIOSName()); if (err) { Trace1("CRepPartnerPropAdv::UpdatePushParameters - error writing netbios name! %d\n", err); goto Error; } err = rk.QueryValue(WINSCNF_SELF_FND_NM, (DWORD&) dwResult); if (err) { Trace0("CRepPartnerPropAdv::UpdatePushParameters - No selfFind value, setting to 0\n"); dwValue = 0; err = rk.SetValue(WINSCNF_SELF_FND_NM, dwValue); } // set the push update count if (m_nUpdateCount == 0) { err = rk.DeleteValue(WINSCNF_UPDATE_COUNT_NM); } else { err = rk.SetValue(WINSCNF_UPDATE_COUNT_NM, (DWORD&) m_nUpdateCount); if (err) { Trace1("CRepPartnerPropAdv::UpdatePushParameters - Error writing update count! %d\n", err); goto Error; } } // set the value to 0 or 1 depending on the PushPersistence dwValue = m_pServer->GetPushPersistence() ? 1 : 0; // Set the Persist key is present err = rk.SetValue(pRep->lpstrPersistence, (DWORD &) dwValue); if (err) { Trace1("CRepPartnerPropAdv::UpdatePushParameters - Error writing persistence! %d\n", err); } Error: return err; } DWORD CRepPartnerPropAdv::RemovePullPartner() { SPITFSNode spNode, spRepNode; CReplicationPartnersHandler * pRep; DWORD err, errDel = 0; CString csKeyName; // first get the replication partner node & handler spNode = GetHolder()->GetNode(); // Now get the replication partners node & handle spNode->GetParent(&spRepNode); pRep = GETHANDLER(CReplicationPartnersHandler, spRepNode); // build the server name CString strServerName; pRep->GetServerName(spRepNode, strServerName); strServerName = _T("\\\\") + strServerName; RegKey rkPull; // get the pull root key CString strKey = pRep->lpstrPullRoot + _T("\\") + (CString) m_pServer->GetstrIPAddress(); err = rkPull.Create(HKEY_LOCAL_MACHINE, (CString) pRep->lpstrPullRoot, 0, KEY_ALL_ACCESS, NULL, strServerName); if (err) return err; RegKeyIterator iterPullkey; err = iterPullkey.Init(&rkPull); err = iterPullkey.Next (&csKeyName, NULL); while (!err) { if (csKeyName == m_pServer->GetstrIPAddress()) { errDel = RegDeleteKey (HKEY(rkPull), csKeyName); iterPullkey.Reset(); } err = iterPullkey.Next (&csKeyName, NULL); } if (errDel) err = errDel; else err = ERROR_SUCCESS; return err; } DWORD CRepPartnerPropAdv::RemovePushPartner() { SPITFSNode spNode, spRepNode; CReplicationPartnersHandler * pRep; DWORD err, errDel = 0; CString csKeyName; // first get the replication partner node & handler spNode = GetHolder()->GetNode(); // Now get the replication partners node & handle spNode->GetParent(&spRepNode); pRep = GETHANDLER(CReplicationPartnersHandler, spRepNode); // build the server name CString strServerName; pRep->GetServerName(spRepNode, strServerName); strServerName = _T("\\\\") + strServerName; RegKey rkPush; CString strKey = pRep->lpstrPushRoot + _T("\\") + (CString) m_pServer->GetstrIPAddress(); err = rkPush.Create(HKEY_LOCAL_MACHINE, (CString) pRep->lpstrPushRoot, 0, KEY_ALL_ACCESS, NULL, strServerName); if (err) return err; RegKeyIterator iterPushkey; err = iterPushkey.Init(&rkPush); err = iterPushkey.Next (&csKeyName, NULL); while (!err) { if (csKeyName == m_pServer->GetstrIPAddress()) { errDel = RegDeleteKey (HKEY(rkPush), csKeyName); iterPushkey.Reset(); } err = iterPushkey.Next (&csKeyName, NULL); } if (errDel) err = errDel; else err = ERROR_SUCCESS; return err; } void CRepPartnerPropAdv::CalculateRepInt(DWORD& dwRepInt) { UpdateData(); int nDays = m_spinRepDay.GetPos(); int nHour = m_spinRepHour.GetPos(); int nMinute = m_spinRepMinute.GetPos(); DWORD nVerifyInt = nDays * SEC_PER_DAY + nHour * SEC_PER_HOUR + nMinute * SEC_PER_MINUTE; dwRepInt = nVerifyInt; } void CRepPartnerPropAdv::CalculateStartInt(CTime & time) { CTime tempTime; UpdateData(); int nHour = m_spinStartHour.GetPos(); int nMinute = m_spinStartMinute.GetPos(); int nSecond = m_spinStartSecond.GetPos(); if (nHour || nMinute || nSecond) { CTime curTime = CTime::GetCurrentTime(); int nYear = curTime.GetYear(); int nMonth = curTime.GetMonth(); int nDay = curTime.GetDay(); CTime tempTime(nYear, nMonth, nDay, nHour, nMinute, nSecond); time = tempTime; } else { CTime tempTime(0); time = tempTime; } } BOOL CRepPartnerPropAdv::OnApply() { // if not dirtied return if ( !IsDirty()) return TRUE; UpdateRep(); DWORD err = UpdateReg(); if (!err) { UpdateUI(); } else { WinsMessageBox(err); return FALSE; } return CPropertyPageBase::OnApply(); } void CRepPartnerPropAdv::UpdateUI() { SPITFSNode spNode; CReplicationPartner *pRepParItem; spNode = GetHolder()->GetNode(); pRepParItem = GETHANDLER(CReplicationPartner, spNode); //change the type depending on the type set pRepParItem->SetType(m_strType); VERIFY(SUCCEEDED(spNode->ChangeNode(RESULT_PANE_CHANGE_ITEM))); } void CRepPartnerPropAdv::OnChangeEditRepHour() { SetDirty(TRUE); } void CRepPartnerPropAdv::OnSelchangeComboType() { SetDirty(TRUE); UpdateData(); // depending on the type selected enable or disable // the set of controls int nIndex = m_comboType.GetCurSel(); switch (m_comboType.GetItemData(nIndex)) { // pull/push partner case 0: EnablePullControls(TRUE); EnablePushControls(TRUE); break; // push partner case 1: EnablePullControls(FALSE); EnablePushControls(TRUE); break; // pull partner case 2: default: EnablePullControls(TRUE); EnablePushControls(FALSE); break; } } void CRepPartnerPropAdv::EnablePushControls(BOOL bEnable ) { m_buttonPush.EnableWindow(bEnable); m_editUpdateCount.EnableWindow(bEnable); m_spinUpdateCount.EnableWindow(bEnable); m_staticUpdate.EnableWindow(bEnable); CConfiguration Config; GetConfig(Config); if (Config.m_dwMajorVersion < 5) { // no persistent connections for anything less that NT5 m_buttonPushPersistence.EnableWindow(FALSE); } else { m_buttonPushPersistence.EnableWindow(bEnable); } m_GroupPush.EnableWindow(bEnable); } void CRepPartnerPropAdv::EnablePullControls(BOOL bEnable) { m_spinRepDay.EnableWindow(bEnable); m_spinRepHour.EnableWindow(bEnable); m_spinRepMinute.EnableWindow(bEnable); m_spinStartHour.EnableWindow(bEnable); m_spinStartMinute.EnableWindow(bEnable); m_spinStartSecond.EnableWindow(bEnable); m_editRepDay.EnableWindow(bEnable); m_editRepHour.EnableWindow(bEnable); m_editRepMinute.EnableWindow(bEnable); m_editStartHour.EnableWindow(bEnable); m_editStartMinute.EnableWindow(bEnable); m_editStartSecond.EnableWindow(bEnable); m_buttonPull.EnableWindow(bEnable); m_GroupPull.EnableWindow(bEnable); m_staticRepTime.EnableWindow(bEnable); m_staticStartTime.EnableWindow(bEnable); CConfiguration Config; GetConfig(Config); if (Config.m_dwMajorVersion < 5) { // no persistent connections for anything less that NT5 m_buttonPullPersistence.EnableWindow(FALSE); } else { m_buttonPullPersistence.EnableWindow(bEnable); } } void CRepPartnerPropAdv::SetState(CString & strType, BOOL bPush, BOOL bPull) { int nIndex = m_comboType.FindStringExact(-1, strType); m_comboType.SetCurSel(nIndex); EnablePullControls(bPull); EnablePushControls(bPush); } ///////////////////////////////////////////////////////////////////////////// // // CReplicationPartnerProperties holder // ///////////////////////////////////////////////////////////////////////////// CReplicationPartnerProperties::CReplicationPartnerProperties ( ITFSNode * pNode, IComponentData * pComponentData, ITFSComponentData * pTFSCompData, LPCTSTR pszSheetName ) : CPropertyPageHolderBase(pNode, pComponentData, pszSheetName) { m_bAutoDeletePages = FALSE; // we have the pages as embedded members m_bTheme = TRUE; AddPageToList((CPropertyPageBase*) &m_pageGeneral); AddPageToList((CPropertyPageBase*) &m_pageAdvanced); Assert(pTFSCompData != NULL); m_spTFSCompData.Set(pTFSCompData); } CReplicationPartnerProperties::~CReplicationPartnerProperties() { RemovePageFromList((CPropertyPageBase*) &m_pageGeneral, FALSE); RemovePageFromList((CPropertyPageBase*) &m_pageAdvanced, FALSE); }