/*++ Module Name: NewFrs.cpp Abstract: This module contains the implementation for CNewReplicaSetPage pages. These classes implement pages in the Create Replica Set wizard. --*/ #include "stdafx.h" #include "resource.h" // To be able to use the resource symbols #include "DfsEnums.h" // for common enums, typedefs, etc #include "Utils.h" // For the LoadStringFromResource method #include "mmcrep.h" #include "newfrs.h" #include "custop.h" // RSTOPOLOGYPREF_STRING g_TopologyPref[]; //////////////////////////////////////////////// // // CNewReplicaSetPage0: welcome page // CNewReplicaSetPage0::CNewReplicaSetPage0() : CQWizardPageImpl(false), m_hBigBoldFont(NULL) { } CNewReplicaSetPage0::~CNewReplicaSetPage0() { DestroyFonts(m_hBigBoldFont, NULL); } BOOL CNewReplicaSetPage0::OnSetActive() { ::PropSheet_SetWizButtons(GetParent(), PSWIZB_NEXT); return TRUE; } LRESULT CNewReplicaSetPage0::OnInitDialog( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { SetupFonts( _Module.GetResourceInstance(), NULL, &m_hBigBoldFont, NULL); SetControlFont(m_hBigBoldFont, m_hWnd, IDC_NEWFRS_WELCOME); return TRUE; } //////////////////////////////////////////////// // // CNewReplicaSetPage1: pick initial master page // CNewReplicaSetPage1::CNewReplicaSetPage1(CNewReplicaSet* i_pRepSet) : CQWizardPageImpl(false), m_pRepSet(i_pRepSet), m_nCount(0) { } BOOL CNewReplicaSetPage1::OnSetActive() { ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK | PSWIZB_NEXT); HWND hwnd = GetDlgItem(IDC_NEWFRSWIZ_MASTER); int nIndex = -1; if ((BSTR)(m_pRepSet->m_bstrPrimaryServer)) { while (-1 != (nIndex = ListView_GetNextItem(hwnd, nIndex, LVNI_ALL))) { CAlternateReplicaInfo *pInfo = (CAlternateReplicaInfo *)GetListViewItemData(hwnd, nIndex); if (!lstrcmpi(m_pRepSet->m_bstrPrimaryServer, pInfo->m_bstrDnsHostName)) break; } } if (-1 == nIndex) nIndex = 0; ListView_SetItemState(hwnd, nIndex, LVIS_SELECTED | LVIS_FOCUSED, 0xffffffff); return TRUE; } LRESULT CNewReplicaSetPage1::OnInitDialog( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { HWND hwnd = GetDlgItem(IDC_NEWFRSWIZ_MASTER); HIMAGELIST hImageList = NULL; int nIconIDs[] = {IDI_16x16_SHARE, IDI_16x16_SHARENA}; HRESULT hr = CreateSmallImageList( _Module.GetResourceInstance(), nIconIDs, sizeof(nIconIDs) / sizeof(nIconIDs[0]), &hImageList); if (SUCCEEDED(hr)) { ListView_SetImageList(hwnd, hImageList, LVSIL_SMALL); AddLVColumns(hwnd, IDS_REPLICATION_COLUMN_1, 2); CComBSTR bstrYes, bstrNo; LoadStringFromResource(IDS_REPLICATION_YES, &bstrYes); LoadStringFromResource(IDS_REPLICATION_NO, &bstrNo); AltRepList* pList = &(m_pRepSet->m_AltRepList); AltRepList::iterator i; int nIndex = 0; BOOL bEligible = FALSE; for (i = pList->begin(); i != pList->end(); i++) { bEligible = (FRSSHARE_TYPE_OK == (*i)->m_nFRSShareType); LVITEM lvItem; lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; lvItem.lParam = (LPARAM)(*i); lvItem.pszText = (*i)->m_bstrDisplayName; lvItem.iSubItem = 0; lvItem.iImage = (bEligible ? 0 : 1); nIndex = ListView_InsertItem(hwnd, &lvItem); lvItem.mask = LVIF_TEXT; lvItem.pszText = (bEligible ? bstrYes : bstrNo); lvItem.iItem = nIndex; lvItem.iSubItem = 1; ListView_SetItem(hwnd, &lvItem); // // count number of eligible members // if (bEligible) m_nCount++; } } return TRUE; } LRESULT CNewReplicaSetPage1::OnNotify( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { io_bHandled = FALSE; // So that the base class gets this notify too NMHDR* pNMHDR = (NMHDR*)i_lParam; if (NULL == pNMHDR) return TRUE; if (IDC_NEWFRSWIZ_MASTER != pNMHDR->idFrom) return TRUE; NM_LISTVIEW *pnmv = (NM_LISTVIEW *)i_lParam; switch(pNMHDR->code) { case LVN_ITEMCHANGED: case NM_CLICK: if (OnItemChanged(((NM_LISTVIEW *)i_lParam)->iItem)) ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK | PSWIZB_NEXT); else ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK); return 0; // Should be returning 0 case NM_DBLCLK: // Double click event if (OnItemChanged(((NM_LISTVIEW *)i_lParam)->iItem)) { ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK | PSWIZB_NEXT); ::PropSheet_PressButton(GetParent(), PSBTN_NEXT); } break; default: break; } return TRUE; } BOOL CNewReplicaSetPage1::OnItemChanged(int i_iItem) { HWND hwnd = GetDlgItem(IDC_NEWFRSWIZ_MASTER); CAlternateReplicaInfo *pInfo = (CAlternateReplicaInfo *)GetListViewItemData(hwnd, i_iItem); if (!pInfo) return FALSE; CComBSTR bstrText; if (FRSSHARE_TYPE_UNKNOWN == pInfo->m_nFRSShareType) FormatMessageString(&bstrText, pInfo->m_hrFRS, IDS_REPLICATION_UNKNOWN); int nID = 0; switch (pInfo->m_nFRSShareType) { case FRSSHARE_TYPE_NONTFRS: nID = IDS_REPLICATION_NONTFRS; break; case FRSSHARE_TYPE_NOTDISKTREE: nID = IDS_REPLICATION_NOTDISKTREE; break; case FRSSHARE_TYPE_NOTNTFS: nID = IDS_REPLICATION_NOTNTFS; break; case FRSSHARE_TYPE_CONFLICTSTAGING: nID = IDS_REPLICATION_CONFLICTSTAGING; break; case FRSSHARE_TYPE_NODOMAIN: nID = IDS_REPLICATION_NODOMAIN; break; case FRSSHARE_TYPE_NOTSMBDISK: nID = IDS_REPLICATION_NOTSMBDISK; break; case FRSSHARE_TYPE_OVERLAPPING: nID = IDS_REPLICATION_OVERLAPPING; break; default: break; } if (nID) LoadStringFromResource(nID, &bstrText); if (!bstrText) { SetDlgItemText(IDC_NEWFRSWIZ_MASTER_DESC, _T("")); return TRUE; // okay to enable Next button } else { SetDlgItemText(IDC_NEWFRSWIZ_MASTER_DESC, bstrText); return FALSE; } } BOOL CNewReplicaSetPage1::OnWizardBack() { _Reset(); return TRUE; } BOOL CNewReplicaSetPage1::OnWizardNext() { _Reset(); if (m_nCount < 2) { DisplayMessageBoxWithOK(IDS_REPLICA_SET_TOPOLOGY_MINIMUM); return FALSE; } HWND hwnd = GetDlgItem(IDC_NEWFRSWIZ_MASTER); int nIndex = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED); if (-1 == nIndex) { DisplayMessageBoxWithOK(IDS_NEWFRSWIZ_NOSELECTION); return FALSE; } CAlternateReplicaInfo *pInfo = (CAlternateReplicaInfo *)GetListViewItemData(hwnd, nIndex); m_pRepSet->m_bstrPrimaryServer = pInfo->m_bstrDnsHostName; if (!(m_pRepSet->m_bstrPrimaryServer)) { DisplayMessageBoxForHR(E_OUTOFMEMORY); return FALSE; } return TRUE; } void CNewReplicaSetPage1::_Reset() { m_pRepSet->m_bstrPrimaryServer.Empty(); } //////////////////////////////////////////////// // // CNewReplicaSetPage2: TopologyPref page // CNewReplicaSetPage2::CNewReplicaSetPage2(CNewReplicaSet* i_pRepSet, BOOL i_bNewSchema) : CQWizardPageImpl(false), m_pRepSet(i_pRepSet), m_bNewSchema(i_bNewSchema) { } BOOL CNewReplicaSetPage2::OnSetActive() { ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK | PSWIZB_FINISH); SendDlgItemMessage(IDC_NEWFRSWIZ_TOPOLOGYPREF, CB_SETCURSEL, 0, 0); SendDlgItemMessage(IDC_NEWFRSWIZ_HUBSERVER, CB_SETCURSEL, 0, 0); MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER_LABEL), FALSE); MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER), FALSE); return TRUE; } LRESULT CNewReplicaSetPage2::OnInitDialog( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { // // add strings to Topology combo box // CComBSTR bstrTopologyPref; int j = 0; for (j = 0; j < 3; j++) { bstrTopologyPref.Empty(); LoadStringFromResource(g_TopologyPref[j].nStringID, &bstrTopologyPref); SendDlgItemMessage(IDC_NEWFRSWIZ_TOPOLOGYPREF, CB_INSERTSTRING, j, (LPARAM)(BSTR)bstrTopologyPref); } bstrTopologyPref.Empty(); LoadStringFromResource(IDS_NEWFRSWIZ_CUSTOM, &bstrTopologyPref); SendDlgItemMessage(IDC_NEWFRSWIZ_TOPOLOGYPREF, CB_INSERTSTRING, j, (LPARAM)(BSTR)bstrTopologyPref); // // add strings to Hub combo box // AltRepList* pList = &(m_pRepSet->m_AltRepList); AltRepList::iterator i; for (i = pList->begin(); i != pList->end(); i++) { if (FRSSHARE_TYPE_OK == (*i)->m_nFRSShareType) { SendDlgItemMessage( IDC_NEWFRSWIZ_HUBSERVER, CB_ADDSTRING, 0, // not used (LPARAM)((BSTR)(*i)->m_bstrDnsHostName) ); } } MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_OLDSCHEMA), !m_bNewSchema); return TRUE; } BOOL CNewReplicaSetPage2::OnTopologyPref( IN WORD wNotifyCode, IN WORD wID, IN HWND hWndCtl, IN BOOL& bHandled ) { int index = SendDlgItemMessage(IDC_NEWFRSWIZ_TOPOLOGYPREF, CB_GETCURSEL, 0, 0); if (!lstrcmpi(FRS_RSTOPOLOGYPREF_HUBSPOKE, g_TopologyPref[index].pszTopologyPref)) { MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER_LABEL), TRUE); MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER), TRUE); } else { MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER_LABEL), FALSE); MyShowWindow(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER), FALSE); } return TRUE; } BOOL CNewReplicaSetPage2::OnWizardBack() { _Reset(); return TRUE; } BOOL CNewReplicaSetPage2::OnWizardFinish() { CWaitCursor wait; _Reset(); HRESULT hr = S_OK; int index = SendDlgItemMessage(IDC_NEWFRSWIZ_TOPOLOGYPREF, CB_GETCURSEL, 0, 0); m_pRepSet->m_bstrTopologyPref = g_TopologyPref[index].pszTopologyPref; if (!(m_pRepSet->m_bstrTopologyPref)) { DisplayMessageBoxForHR(E_OUTOFMEMORY); return FALSE; } if (!lstrcmpi(FRS_RSTOPOLOGYPREF_HUBSPOKE, m_pRepSet->m_bstrTopologyPref)) { hr = GetComboBoxText(GetDlgItem(IDC_NEWFRSWIZ_HUBSERVER), &(m_pRepSet->m_bstrHubServer)); if (FAILED(hr)) { DisplayMessageBoxForHR(hr); return FALSE; } } if (!lstrcmpi(FRS_RSTOPOLOGYPREF_CUSTOM, m_pRepSet->m_bstrTopologyPref)) { DisplayMessageBox(::GetActiveWindow(), MB_OK | MB_ICONINFORMATION, 0, IDS_NEWFRSWIZ_CUSTOM_MSG); } m_pRepSet->m_bstrDirFilter.Empty(); m_pRepSet->m_bstrFileFilter = DEFAULT_FILEFILTER; if (!(m_pRepSet->m_bstrFileFilter)) { DisplayMessageBoxForHR(E_OUTOFMEMORY); return FALSE; } hr = _CreateReplicaSet(); if (FAILED(hr)) return FALSE; // error reported already m_pRepSet->m_hr = S_OK; // the only way out successfully return TRUE; } void CNewReplicaSetPage2::_Reset() { m_pRepSet->m_hr = S_FALSE; m_pRepSet->m_bstrTopologyPref.Empty(); m_pRepSet->m_bstrHubServer.Empty(); } HRESULT CNewReplicaSetPage2::_CreateReplicaSet() { HRESULT hr = S_OK; CComPtr piReplicaSet; BOOL bUndo = FALSE; AltRepList* pList = &(m_pRepSet->m_AltRepList); AltRepList::iterator i; do { for (i = pList->begin(); i != pList->end(); i++) { if (FRSSHARE_TYPE_OK == (*i)->m_nFRSShareType) { (void) CreateAndHideStagingPath( (*i)->m_bstrDnsHostName, (*i)->m_bstrStagingPath ); hr = ConfigAndStartNtfrs((*i)->m_bstrDnsHostName); if (FAILED(hr)) { if (IDYES != DisplayMessageBox( m_hWnd, MB_YESNO, hr, IDS_MSG_FRS_BADSERVICE, (*i)->m_bstrDisplayName, (*i)->m_bstrDnsHostName)) { bUndo = TRUE; break; } hr = S_OK; } } } // for BREAK_IF_FAILED(hr); // // Create replica set object with attribute: // TopologyPref/HubMember/PrimaryMember/FileFilter/DirFilter // hr = CoCreateInstance(CLSID_ReplicaSet, NULL, CLSCTX_INPROC_SERVER, IID_IReplicaSet, (void**)&piReplicaSet); BREAK_IF_FAILED(hr); hr = piReplicaSet->Create( m_pRepSet->m_bstrDomain, m_pRepSet->m_bstrReplicaSetDN, FRS_RSTYPE_DFS, m_pRepSet->m_bstrTopologyPref, NULL, // HubMemberDN, will set later after we know member DN NULL, // PrimaryMemberDN, will set later after we know member DN m_pRepSet->m_bstrFileFilter, m_pRepSet->m_bstrDirFilter ); if (FAILED(hr)) { piReplicaSet.Release(); // no need to call DeleteReplicaSet method when Undo break; } // // create each member // BOOL bPrimaryServerFound = FALSE; CComBSTR bstrPrimaryMemberDN; BOOL bHubSpoke = !lstrcmpi(FRS_RSTOPOLOGYPREF_HUBSPOKE, m_pRepSet->m_bstrTopologyPref); BOOL bHubServerFound = FALSE; CComBSTR bstrHubMemberDN; for (i = pList->begin(); i != pList->end(); i++) { if (FRSSHARE_TYPE_OK == (*i)->m_nFRSShareType) { CComBSTR bstrMemberDN; hr = piReplicaSet->AddMember( (*i)->m_bstrDnsHostName, (*i)->m_bstrRootPath, (*i)->m_bstrStagingPath, FALSE, // add connection later &bstrMemberDN); BREAK_IF_FAILED(hr); if (!bPrimaryServerFound && !lstrcmpi((*i)->m_bstrDnsHostName, m_pRepSet->m_bstrPrimaryServer)) { bPrimaryServerFound = TRUE; bstrPrimaryMemberDN = bstrMemberDN; BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrPrimaryMemberDN, &hr); } if (bHubSpoke && !bHubServerFound && !lstrcmpi((*i)->m_bstrDnsHostName, m_pRepSet->m_bstrHubServer)) { bHubServerFound = TRUE; bstrHubMemberDN = bstrMemberDN; BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrHubMemberDN, &hr); } } } BREAK_IF_FAILED(hr); // // set PrimaryMember and HubMember // hr = piReplicaSet->put_PrimaryMemberDN(bstrPrimaryMemberDN); BREAK_IF_FAILED(hr); if (bHubSpoke) { hr = piReplicaSet->put_HubMemberDN(bstrHubMemberDN); BREAK_IF_FAILED(hr); } // // build connection based on specified TopologyPref // hr = piReplicaSet->CreateConnections(); BREAK_IF_FAILED(hr); } while (0); if (!bUndo && FAILED(hr)) { DisplayMessageBox(m_hWnd, MB_OK, hr, IDS_NEWFRSWIZ_FAILURE); bUndo = TRUE; } if (bUndo) { // // Delete replica set // if ((IReplicaSet *)(piReplicaSet)) { piReplicaSet->Delete(); piReplicaSet.Release(); } } else { m_pRepSet->m_piReplicaSet = piReplicaSet; } return hr; } /* //////////////////////////////////////////////// // // CNewReplicaSetPage3: file/dir filter page // CNewReplicaSetPage3::CNewReplicaSetPage3(CNewReplicaSet* i_pRepSet) : CQWizardPageImpl(false), m_pRepSet(i_pRepSet) { } BOOL CNewReplicaSetPage3::OnSetActive() { ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK | PSWIZB_FINISH); SetDlgItemText(IDC_NEWFRSWIZ_FILEFILTER, DEFAULT_FILEFILTER); SetDlgItemText(IDC_NEWFRSWIZ_DIRFILTER, _T("")); return TRUE; } LRESULT CNewReplicaSetPage3::OnInitDialog( IN UINT i_uMsg, IN WPARAM i_wParam, IN LPARAM i_lParam, IN OUT BOOL& io_bHandled ) { return TRUE; } BOOL CNewReplicaSetPage3::OnWizardBack() { _Reset(); return TRUE; } BOOL CNewReplicaSetPage3::OnWizardFinish() { CWaitCursor wait; _Reset(); ULONG ulTextLen = 0; HRESULT hr = GetInputText( GetDlgItem(IDC_NEWFRSWIZ_FILEFILTER), &(m_pRepSet->m_bstrFileFilter), &ulTextLen ); if (SUCCEEDED(hr)) hr = GetInputText( GetDlgItem(IDC_NEWFRSWIZ_DIRFILTER), &(m_pRepSet->m_bstrDirFilter), &ulTextLen ); if (FAILED(hr)) { DisplayMessageBoxForHR(hr); return FALSE; } hr = _CreateReplicaSet(); if (FAILED(hr)) return FALSE; // error reported already m_pRepSet->m_hr = S_OK; // the only way out successfully return TRUE; } void CNewReplicaSetPage3::_Reset() { m_pRepSet->m_hr = S_FALSE; m_pRepSet->m_bstrFileFilter.Empty(); m_pRepSet->m_bstrDirFilter.Empty(); } HRESULT CNewReplicaSetPage3::_CreateReplicaSet() { HRESULT hr = S_OK; CComPtr piReplicaSet; BOOL bUndo = FALSE; AltRepList* pList = &(m_pRepSet->m_AltRepList); AltRepList::iterator i; do { for (i = pList->begin(); i != pList->end(); i++) { if (FRSSHARE_TYPE_OK == (*i)->m_nFRSShareType) { (void) CreateAndHideStagingPath( (*i)->m_bstrDnsHostName, (*i)->m_bstrStagingPath ); hr = ConfigAndStartNtfrs((*i)->m_bstrDnsHostName); if (FAILED(hr)) { if (IDYES != DisplayMessageBox( m_hWnd, MB_YESNO, hr, IDS_MSG_FRS_BADSERVICE, (*i)->m_bstrDisplayName, (*i)->m_bstrDnsHostName)) { bUndo = TRUE; break; } hr = S_OK; } } } // for BREAK_IF_FAILED(hr); // // Create replica set object with attribute: // TopologyPref/HubMember/PrimaryMember/FileFilter/DirFilter // hr = CoCreateInstance(CLSID_ReplicaSet, NULL, CLSCTX_INPROC_SERVER, IID_IReplicaSet, (void**)&piReplicaSet); BREAK_IF_FAILED(hr); hr = piReplicaSet->Create( m_pRepSet->m_bstrDomain, m_pRepSet->m_bstrReplicaSetDN, FRS_RSTYPE_DFS, m_pRepSet->m_bstrTopologyPref, NULL, // HubMemberDN, will set later after we know member DN NULL, // PrimaryMemberDN, will set later after we know member DN m_pRepSet->m_bstrFileFilter, m_pRepSet->m_bstrDirFilter ); if (FAILED(hr)) { piReplicaSet.Release(); // no need to call DeleteReplicaSet method when Undo break; } // // create each member // BOOL bPrimaryServerFound = FALSE; CComBSTR bstrPrimaryMemberDN; BOOL bHubSpoke = !lstrcmpi(FRS_RSTOPOLOGYPREF_HUBSPOKE, m_pRepSet->m_bstrTopologyPref); BOOL bHubServerFound = FALSE; CComBSTR bstrHubMemberDN; for (i = pList->begin(); i != pList->end(); i++) { if (FRSSHARE_TYPE_OK == (*i)->m_nFRSShareType) { CComBSTR bstrMemberDN; hr = piReplicaSet->AddMember( (*i)->m_bstrDnsHostName, (*i)->m_bstrRootPath, (*i)->m_bstrStagingPath, FALSE, // add connection later &bstrMemberDN); BREAK_IF_FAILED(hr); if (!bPrimaryServerFound && !lstrcmpi((*i)->m_bstrDnsHostName, m_pRepSet->m_bstrPrimaryServer)) { bPrimaryServerFound = TRUE; bstrPrimaryMemberDN = bstrMemberDN; BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrPrimaryMemberDN, &hr); } if (bHubSpoke && !bHubServerFound && !lstrcmpi((*i)->m_bstrDnsHostName, m_pRepSet->m_bstrHubServer)) { bHubServerFound = TRUE; bstrHubMemberDN = bstrMemberDN; BREAK_OUTOFMEMORY_IF_NULL((BSTR)bstrHubMemberDN, &hr); } } } BREAK_IF_FAILED(hr); // // set PrimaryMember and HubMember // hr = piReplicaSet->put_PrimaryMemberDN(bstrPrimaryMemberDN); BREAK_IF_FAILED(hr); if (bHubSpoke) { hr = piReplicaSet->put_HubMemberDN(bstrHubMemberDN); BREAK_IF_FAILED(hr); } // // build connection based on specified TopologyPref // hr = piReplicaSet->CreateConnections(); BREAK_IF_FAILED(hr); } while (0); if (!bUndo && FAILED(hr)) { DisplayMessageBox(m_hWnd, MB_OK, hr, IDS_NEWFRSWIZ_FAILURE); bUndo = TRUE; } if (bUndo) { // // Delete replica set // if ((IReplicaSet *)(piReplicaSet)) { piReplicaSet->Delete(); piReplicaSet.Release(); } } else { m_pRepSet->m_piReplicaSet = piReplicaSet; } return hr; } */ ///////////////////////////////////////////////// // // CNewReplicaSet // HRESULT CNewReplicaSet::Initialize( BSTR i_bstrDomain, BSTR i_bstrReplicaSetDN, DFS_REPLICA_LIST* i_pMmcRepList ) { RETURN_INVALIDARG_IF_NULL(i_bstrDomain); RETURN_INVALIDARG_IF_NULL(i_bstrReplicaSetDN); RETURN_INVALIDARG_IF_NULL(i_pMmcRepList); _Reset(); m_bstrDomain = i_bstrDomain; RETURN_OUTOFMEMORY_IF_NULL((BSTR)m_bstrDomain); m_bstrReplicaSetDN = i_bstrReplicaSetDN; RETURN_OUTOFMEMORY_IF_NULL((BSTR)m_bstrReplicaSetDN); HRESULT hr = S_OK; BOOL bTargetsOnSameServers = FALSE; CAlternateReplicaInfo* pInfo = NULL; DFS_REPLICA_LIST::iterator i; for (i = i_pMmcRepList->begin(); i != i_pMmcRepList->end(); i++) { hr = ((*i)->pReplica)->GetReplicationInfoEx(&pInfo); BREAK_IF_FAILED(hr); if (_InsertList(pInfo)) bTargetsOnSameServers = TRUE; // should return S_FALSE pInfo = NULL; } if (FAILED(hr)) _Reset(); else if (bTargetsOnSameServers) hr = S_FALSE; return hr; } BOOL CNewReplicaSet::_InsertList(CAlternateReplicaInfo* pInfo) { BOOL bFound = FALSE; if (pInfo) { AltRepList::iterator i; for (i = m_AltRepList.begin(); i != m_AltRepList.end(); i++) { if (FRSSHARE_TYPE_OK == pInfo->m_nFRSShareType && !lstrcmpi(pInfo->m_bstrDnsHostName, (*i)->m_bstrDnsHostName)) { bFound = TRUE; break; } } if (!bFound) { m_AltRepList.push_back(pInfo); } else { if ( (FRSSHARE_TYPE_OK != (*i)->m_nFRSShareType && FRSSHARE_TYPE_OK == pInfo->m_nFRSShareType) || (FRSSHARE_TYPE_UNKNOWN == (*i)->m_nFRSShareType && FRSSHARE_TYPE_UNKNOWN != pInfo->m_nFRSShareType && FRSSHARE_TYPE_OK != pInfo->m_nFRSShareType) ) { // replace the element CAlternateReplicaInfo* pTemp = *i; *i = pInfo; delete pTemp; } else { // no change delete pInfo; } } } return bFound; } void CNewReplicaSet::_Reset() { m_bstrDomain.Empty(); m_bstrReplicaSetDN.Empty(); m_bstrPrimaryServer.Empty(); m_bstrTopologyPref.Empty(); m_bstrHubServer.Empty(); m_bstrFileFilter.Empty(); m_bstrDirFilter.Empty(); m_hr = S_FALSE; FreeAltRepList(&m_AltRepList); if ((IReplicaSet *)m_piReplicaSet) m_piReplicaSet.Release(); } void FreeAltRepList(AltRepList* pList) { if (pList && !pList->empty()) { AltRepList::iterator i; for (i = pList->begin(); i != pList->end(); i++) delete (*i); pList->clear(); } }