windows-nt/Source/XPSP1/NT/admin/snapin/dfsadmin/dfsgui/addrep.cpp
2020-09-26 16:20:57 +08:00

300 lines
5.1 KiB
C++

/*++
Module Name:
AddToDfs.cpp
Abstract:
This module contains the Implementation of CAddRep.
This class displays the Add Replica Dialog,which is used to add new Replica.
*/
#include "stdafx.h"
#include "AddRep.h"
#include "utils.h"
#include <shlobj.h>
#include <dsclient.h>
#include "dfshelp.h"
/////////////////////////////////////////////////////////////////////////////
// CAddRep
CAddRep::CAddRep() : m_RepType(REPLICATION_UNASSIGNED),
m_DfsType(DFS_TYPE_UNASSIGNED)
{
}
CAddRep::~CAddRep()
{
}
HRESULT CAddRep::put_EntryPath
(
BSTR i_bstrEntryPath
)
{
/*++
Routine Description:
Sets the path of the Junction point of this replica
This is used to display in the edit text.
Arguments:
i_bstrEntryPath - The junction point entry path.
*/
RETURN_INVALIDARG_IF_NULL(i_bstrEntryPath);
m_bstrEntryPath = i_bstrEntryPath;
RETURN_OUTOFMEMORY_IF_NULL((BSTR)m_bstrEntryPath);
return S_OK;
}
HRESULT CAddRep::get_Server
(
BSTR *o_pbstrServer
)
{
/*++
Routine Description:
Returns the server component of the share path.
Arguments:
o_pbstrServer - The server name is returned here.
*/
GET_BSTR(m_bstrServer, o_pbstrServer);
}
HRESULT CAddRep::get_Share
(
BSTR *o_pbstrShare
)
{
/*++
Routine Description:
Returns the share component of the share path.
Arguments:
o_pbstrShare - The share name is returned here.
*/
GET_BSTR(m_bstrShare, o_pbstrShare);
}
HRESULT CAddRep::get_NetPath
(
BSTR *o_pbstrNetPath
)
{
/*++
Routine Description:
Returns the complete share path typed in by the user in the edit box.
Arguments:
o_pbstrNetPath - The share path is returned here.
*/
GET_BSTR(m_bstrNetPath, o_pbstrNetPath);
}
LRESULT CAddRep::OnInitDialog
(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
SetDlgItemText(IDC_EDIT_ADDREP_DFSLINK_PATH, m_bstrEntryPath);
::SendMessage(GetDlgItem(IDC_EDITNETPATH), EM_LIMITTEXT, MAX_PATH, 0);
// Disable replication button for Std Dfs.
if (DFS_TYPE_FTDFS != m_DfsType)
{
::EnableWindow(GetDlgItem(IDC_ADDREP_REPLICATE), FALSE);
} else
{
// Check "replication" as default
CheckDlgButton(IDC_ADDREP_REPLICATE, BST_CHECKED);
}
return TRUE; // Let the system set the focus
}
/*++
This function is called when a user clicks the ? in the top right of a property sheet
and then clciks a control, or when they hit F1 in a control.
--*/
LRESULT CAddRep::OnCtxHelp(
IN UINT i_uMsg,
IN WPARAM i_wParam,
IN LPARAM i_lParam,
IN OUT BOOL& io_bHandled
)
{
LPHELPINFO lphi = (LPHELPINFO) i_lParam;
if (!lphi || lphi->iContextType != HELPINFO_WINDOW || lphi->iCtrlId < 0)
return FALSE;
::WinHelp((HWND)(lphi->hItemHandle),
DFS_CTX_HELP_FILE,
HELP_WM_HELP,
(DWORD_PTR)(PVOID)g_aHelpIDs_IDD_ADDREP);
return TRUE;
}
/*++
This function handles "What's This" help when a user right clicks the control
--*/
LRESULT CAddRep::OnCtxMenuHelp(
IN UINT i_uMsg,
IN WPARAM i_wParam,
IN LPARAM i_lParam,
IN OUT BOOL& io_bHandled
)
{
::WinHelp((HWND)i_wParam,
DFS_CTX_HELP_FILE,
HELP_CONTEXTMENU,
(DWORD_PTR)(PVOID)g_aHelpIDs_IDD_ADDREP);
return TRUE;
}
LRESULT CAddRep::OnNetBrowse
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
CComBSTR bstrPath;
HRESULT hr = BrowseNetworkPath(hWndCtl, &bstrPath);
if (S_OK == hr)
{
SetDlgItemText(IDC_EDITNETPATH, bstrPath);
::SetFocus(GetDlgItem(IDC_ADDREP_REPLICATE));
}
if (S_FALSE == hr)
::SetFocus(GetDlgItem(IDC_EDITNETPATH));
return (SUCCEEDED(hr));
}
LRESULT CAddRep::OnOK
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
BOOL bValidInput = FALSE;
int idString = 0;
HRESULT hr = S_OK;
do {
CWaitCursor wait;
DWORD dwTextLength = 0;
m_bstrNetPath.Empty();
hr = GetInputText(GetDlgItem(IDC_EDITNETPATH), &m_bstrNetPath, &dwTextLength);
if (FAILED(hr))
break;
if (0 == dwTextLength)
{
idString = IDS_MSG_EMPTY_FIELD;
break;
}
m_bstrServer.Empty();
m_bstrShare.Empty();
if (!ValidateNetPath(m_bstrNetPath, &m_bstrServer, &m_bstrShare))
break;
m_RepType = NO_REPLICATION;
if (IsDlgButtonChecked(IDC_ADDREP_REPLICATE))
m_RepType = NORMAL_REPLICATION;
bValidInput = TRUE;
} while (0);
if (FAILED(hr))
{
DisplayMessageBoxForHR(hr);
::SetFocus(GetDlgItem(IDC_EDITNETPATH));
return FALSE;
} else if (bValidInput)
{
EndDialog(S_OK);
return TRUE;
}
else
{
if (idString)
DisplayMessageBoxWithOK(idString);
::SetFocus(GetDlgItem(IDC_EDITNETPATH));
return FALSE;
}
}
LRESULT CAddRep::OnCancel
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
/*++
Routine Description:
Called OnCancel. Ends the dialog with S_FALSE;
*/
EndDialog(S_FALSE);
return(true);
}
CAddRep::REPLICATION_TYPE CAddRep::get_ReplicationType(
VOID
)
/*++
Routine Description:
This method gets the type of replication requested.
This value is based on the radio button selected when OK is pressed.
*/
{
return m_RepType;
}