Windows2003-3790/inetsrv/iis/admin/common/dirbrows.cpp
2020-09-30 16:53:55 +02:00

320 lines
6.8 KiB
C++

/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
dirbrows.cpp
Abstract:
Directory Browser Dialog. Allow browsing for directories only.
optionally allows UNC conversions for remote paths.
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "common.h"
#include "dirbrows.h"
#include <dlgs.h>
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern HINSTANCE hDLLInstance;
static
int
BrowseCallbackProc(
IN HWND hwnd,
IN UINT uMsg,
IN LPARAM lParam,
IN LPARAM lpData
)
/*++
Routine Description:
Callback function for the folder browser
Arguments:
hwnd : Handle to the browse dialog box. The callback function can
send the following messages to this window:
BFFM_ENABLEOK Enables the OK button if the wParam parameter
is nonzero or disables it if wParam is zero.
BFFM_SETSELECTION Selects the specified folder. The lParam
parameter is the PIDL of the folder to select
if wParam is FALSE, or it is the path of the
folder otherwise.
BFFM_SETSTATUSTEXT Sets the status text to the null-terminated
string specified by the lParam parameter.
uMsg : Value identifying the event. This parameter can be one of the
following values:
0 Initialize dir path. lParam is the path.
BFFM_INITIALIZED The browse dialog box has finished
initializing. lpData is NULL.
BFFM_SELCHANGED The selection has changed. lpData
is a pointer to the item identifier list for
the newly selected folder.
lParam : Message-specific value. For more information, see the
description of uMsg.
lpData : Application-defined value that was specified in the lParam
member of the BROWSEINFO structure.
Return Value:
0
--*/
{
lpData;
static LPCTSTR lpstrDir = NULL;
switch(uMsg)
{
case 0:
lpstrDir = (LPCTSTR)lParam;
break;
case BFFM_INITIALIZED:
//
// Dialog initialized -- select desired folder
//
if (lpstrDir != NULL)
{
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpstrDir);
}
break;
}
return 0;
}
CDirBrowseDlg::CDirBrowseDlg(
IN CWnd * pParent OPTIONAL,
IN LPCTSTR lpszInitialDir OPTIONAL
)
/*++
Routine Description:
Constructor for directory browser dialog
Arguments:
CWnd * pParent : Parent window or NULL
LPCTSTR lpszInitialDir : Initial directory, or NULL for current directory
Return Value:
N/A
--*/
: m_strInitialDir(lpszInitialDir)
{
VERIFY(m_bstrTitle.LoadString(hDLLInstance, IDS_BROWSE_DIRECTORY));
m_bi.pidlRoot = NULL;
m_bi.hwndOwner = pParent ? pParent->m_hWnd : NULL;
m_bi.pszDisplayName = m_szBuffer;
m_bi.lpszTitle = m_bstrTitle;
m_bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS,
m_bi.lpfn = BrowseCallbackProc;
m_bi.lParam = 0;
//
// Let the callback function know the default dir is
//
lpszInitialDir = !m_strInitialDir.IsEmpty()
? (LPCTSTR)m_strInitialDir : NULL;
BrowseCallbackProc(m_bi.hwndOwner, 0, (LPARAM)lpszInitialDir, NULL);
}
CDirBrowseDlg::~CDirBrowseDlg()
/*++
Routine Description:
Destructor for directory browser dialog
Arguments:
N/A
Return Value:
N/A
--*/
{
if (m_bi.pidlRoot != NULL)
{
LPITEMIDLIST pidl = (LPITEMIDLIST)m_bi.pidlRoot;
//
// Free using shell allocator
//
LPMALLOC pMalloc;
if (::SHGetMalloc(&pMalloc) == NOERROR)
{
pMalloc->Free(pidl);
pMalloc->Release();
}
}
}
/* virtual */
int
CDirBrowseDlg::DoModal()
/*++
Routine Description:
Display the browser dialog, and fill in the selected directory path.
Arguments:
None
Return Value:
IDOK if the OK button was pressed, IDCANCEL otherwise.
--*/
{
BOOL fSelectionMade = FALSE;
//
// Get the Shell's default allocator
//
LPMALLOC pMalloc;
if (::SHGetMalloc(&pMalloc) == NOERROR)
{
LPITEMIDLIST pidl;
if ((pidl = ::SHBrowseForFolder(&m_bi)) != NULL)
{
if (::SHGetPathFromIDList(pidl, m_szBuffer))
{
fSelectionMade = TRUE;
}
else
{
//
// OK Pressed, but no path found
//
::AfxMessageBox(IDS_BAD_BROWSE);
}
//
// Free the PIDL allocated by SHBrowseForFolder.
//
pMalloc->Free(pidl);
}
//
// Release the shell's allocator.
//
pMalloc->Release();
}
return fSelectionMade ? IDOK : IDCANCEL;
}
LPCTSTR
CDirBrowseDlg::GetFullPath(
OUT CString & strName,
IN BOOL fConvertToUNC
) const
/*++
Routine Description:
Get the full path selected. Optionally allow a remote path to be
converted to a UNC path.
Arguments:
CString & strName : String in which to return the directory path
BOOL fConvertToUNC : If TRUE, then if the drive selected is a network
drive, convert the path to a UNC path.
Return Value:
A pointer to the directory path string or NULL in case of error.
Notes:
This function should be called only after the dialog has been dismissed.
--*/
{
LPCTSTR lp = NULL;
try
{
strName = m_szBuffer;
lp = strName;
if (fConvertToUNC && lp != NULL)
{
//
// If it's network drive, convert it to a UNC path
//
CString strDrive, strUNC;
if (IsNetworkPath(strName, &strDrive, &strUNC))
{
strUNC += (lp + 2);
strName = strUNC;
}
lp = strName;
}
}
catch(CMemoryException * e)
{
TRACEEOLID("!!!exception getting path");
strName.Empty();
e->ReportError();
e->Delete();
}
return lp;
}