457 lines
8.4 KiB
C++
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;
|
|
}
|
|
|