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

457 lines
8.4 KiB
C++

/*++
Module Name:
AddToDfs.cpp
Abstract:
This module contains the implementation for CAddToDfs.
This class displays the Add To Dfs Dialog, which is used to add new Junctions Points.
*/
#include "stdafx.h"
#include "AddToDfs.h"
#include <shlobj.h>
#include <dsclient.h>
#include "utils.h"
#include "dfshelp.h"
#include "netutils.h"
/////////////////////////////////////////////////////////////////////////////
// CAddToDfs
CAddToDfs::CAddToDfs():m_lTime(1800)
{
}
CAddToDfs::~CAddToDfs()
{
}
HRESULT CAddToDfs::put_ParentPath
(
BSTR i_bstrParentPath
)
{
/*++
Routine Description:
Sets the path of the parent Junction point.
This is used to display in the edit text and append to the entry path.
*/
if (!i_bstrParentPath)
return(E_INVALIDARG);
m_bstrParentPath = i_bstrParentPath;
if (!m_bstrParentPath)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_Comment
(
BSTR *o_bstrComment
)
{
if (!o_bstrComment)
return(E_INVALIDARG);
*o_bstrComment = SysAllocString(m_bstrComment);
if (!*o_bstrComment)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_EntryPath
(
BSTR *o_bstrEntryPath
)
{
/*++
Routine Description:
Returns the complete entry path of the new Junction point to be created.
*/
if (!o_bstrEntryPath)
return(E_INVALIDARG);
*o_bstrEntryPath = SysAllocString(m_bstrEntryPath);
if (!*o_bstrEntryPath)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_JPName
(
BSTR *o_bstrJPName
)
{
if (!o_bstrJPName)
return(E_INVALIDARG);
*o_bstrJPName = SysAllocString(m_bstrJPName);
if (!*o_bstrJPName)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_NetPath
(
BSTR *o_bstrNetPath
)
{
/*++
Routine Description:
Returns the complete share path typed in by the user in the edit box.
*/
if (!o_bstrNetPath)
return(E_INVALIDARG);
*o_bstrNetPath = SysAllocString(m_bstrNetPath);
if (!*o_bstrNetPath)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_Server
(
BSTR *o_bstrServer
)
{
/*++
Routine Description:
Returns the server component of the share path.
*/
if (!o_bstrServer)
return(E_INVALIDARG);
*o_bstrServer = SysAllocString(m_bstrServer);
if (!*o_bstrServer)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_Share
(
BSTR *o_bstrShare
)
{
/*++
Routine Description:
Returns the share component of the share path.
*/
if (!o_bstrShare)
return(E_INVALIDARG);
*o_bstrShare = SysAllocString(m_bstrShare);
if (!*o_bstrShare)
return(E_OUTOFMEMORY);
return(S_OK);
}
HRESULT CAddToDfs::get_Time
(
long *o_plTime
)
{
if (!o_plTime)
return(E_INVALIDARG);
*o_plTime = m_lTime;
return(S_OK);
}
extern WNDPROC g_fnOldEditCtrlProc;
LRESULT CAddToDfs::OnInitDialog
(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
/*++
Routine Description:
Performs the dialog initialization.
Arguments:
As sent by Dialog Handler.
Return value:
*/
m_bstrEntryPath.Empty();
// Format the Parent enrty path and also display it in the static text.
m_bstrParentPath += _T("\\");
SetDlgItemText(IDC_EDIT_ADDLINK_DFSLINK_PATH, m_bstrParentPath);
// Set the default time out value after getting it from the string resource.
::SendMessage(GetDlgItem(IDC_EDITTIME), EM_LIMITTEXT, 10, 0);
TCHAR szTime[16];
_stprintf(szTime, _T("%u"), m_lTime);
SetDlgItemText(IDC_EDITTIME, szTime);
g_fnOldEditCtrlProc = reinterpret_cast<WNDPROC>(
::SetWindowLongPtr(
GetDlgItem(IDC_EDITTIME),
GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>(NoPasteEditCtrlProc)));
::SendMessage(GetDlgItem(IDC_EDITNETPATH), EM_LIMITTEXT, MAX_PATH, 0);
::SendMessage(GetDlgItem(IDC_EDITCOMMENT), EM_LIMITTEXT, MAXCOMMENTSZ, 0);
// Set the previous contents.
SetDlgItemText(IDC_EDITNETPATH, m_bstrNetPath);
SetDlgItemText(IDC_EDITCOMMENT, m_bstrComment);
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 CAddToDfs::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_ADDTODFS);
return TRUE;
}
/*++
This function handles "What's This" help when a user right clicks the control
--*/
LRESULT CAddToDfs::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_ADDTODFS);
return TRUE;
}
LRESULT CAddToDfs::OnOK
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
BOOL bValidInput = FALSE;
int idControl = 0;
int idString = 0;
HRESULT hr = S_OK;
do {
CWaitCursor wait;
DWORD dwTextLength = 0;
// Validate IDC_EDITCOMMENT
m_bstrComment.Empty();
hr = GetInputText(GetDlgItem(IDC_EDITCOMMENT), &m_bstrComment, &dwTextLength);
if (FAILED(hr))
break;
if (0 == dwTextLength)
m_bstrComment = _T("");
// Validate IDC_EDITCHLDNODE
idControl = IDC_EDITCHLDNODE;
m_bstrJPName.Empty();
hr = GetInputText(GetDlgItem(IDC_EDITCHLDNODE), &m_bstrJPName, &dwTextLength);
if (FAILED(hr))
break;
if (0 == dwTextLength)
{
idString = IDS_MSG_EMPTY_FIELD;
break;
}
m_bstrEntryPath = m_bstrParentPath;
m_bstrEntryPath += m_bstrJPName;
hr = CheckUNCPath(m_bstrEntryPath);
if (S_OK != hr)
{
hr = S_FALSE;
idString = IDS_INVALID_LINKNAME;
break;
}
// Validate IDC_EDITNETPATH
idControl = IDC_EDITNETPATH;
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;
// Validate IDC_EDITTIME
idControl = IDC_EDITTIME;
CComBSTR bstrTemp;
hr = GetInputText(GetDlgItem(IDC_EDITTIME), &bstrTemp, &dwTextLength);
if (FAILED(hr))
break;
ULONG ulTimeout = 0;
if (0 == dwTextLength || !ValidateTimeout(bstrTemp, &ulTimeout))
{
idString = IDS_MSG_TIMEOUT_INVALIDRANGE;
break;
}
m_lTime = ulTimeout;
bValidInput = TRUE;
} while (0);
if (FAILED(hr))
{
DisplayMessageBoxForHR(hr);
::SetFocus(GetDlgItem(idControl));
return FALSE;
} else if (bValidInput)
{
EndDialog(S_OK);
return TRUE;
} else
{
if (idString)
DisplayMessageBoxWithOK(idString);
::SetFocus(GetDlgItem(idControl));
return FALSE;
}
}
LRESULT CAddToDfs::OnCancel
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
EndDialog(S_FALSE);
return(true);
}
LRESULT CAddToDfs::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_EDITCOMMENT));
}
if (S_FALSE == hr)
::SetFocus(GetDlgItem(IDC_EDITNETPATH));
return (SUCCEEDED(hr));
}
LRESULT
CAddToDfs::OnChangeDfsLink(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled)
{
CComBSTR bstrDfsLinkName;
DWORD dwTextLength = 0;
(void)GetInputText(GetDlgItem(IDC_EDITCHLDNODE), &bstrDfsLinkName, &dwTextLength);
if ((BSTR)bstrDfsLinkName)
{
CComBSTR bstrFullPath = m_bstrParentPath;
bstrFullPath += bstrDfsLinkName;
SetDlgItemText(IDC_EDIT_ADDLINK_DFSLINK_PATH, bstrFullPath);
::SendMessage(GetDlgItem(IDC_EDIT_ADDLINK_DFSLINK_PATH), EM_SETSEL, 0, (LPARAM)-1);
::SendMessage(GetDlgItem(IDC_EDIT_ADDLINK_DFSLINK_PATH), EM_SETSEL, (WPARAM)-1, 0);
::SendMessage(GetDlgItem(IDC_EDIT_ADDLINK_DFSLINK_PATH), EM_SCROLLCARET, 0, 0);
}
return TRUE;
}