937 lines
26 KiB
C++
937 lines
26 KiB
C++
/*++
|
|
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<CNewReplicaSetPage0>(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<CNewReplicaSetPage1>(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<CNewReplicaSetPage2>(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<IReplicaSet> 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<CNewReplicaSetPage3>(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<IReplicaSet> 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();
|
|
}
|
|
}
|
|
|