windows-nt/Source/XPSP1/NT/shell/ext/ftp/ftpdhlp.cpp
2020-09-26 16:20:57 +08:00

754 lines
23 KiB
C++

/*****************************************************************************\
FILE: ftpdhlp.cpp
DESCRIPTION:
Replace strings in a dialog template with attributes about an FTP
item (ftp server, ftp dir, or ftp file).
\*****************************************************************************/
#include "priv.h"
#include "ftpurl.h"
#include "ftpdhlp.h"
#define SZ_WSPRINTFSTR_S TEXT("%s")
#define SZ_WSPRINTFSTR_U TEXT("%u")
class CSizeHolder
{
public:
BOOL IsAllFolders(void) {return m_fAllFolders;};
void FoundNonFolder(void) {m_fAllFolders = FALSE;};
HRESULT GetError(void) {return m_hr;};
void SetError(HRESULT hr) {m_hr = hr;};
void AddSize(ULONGLONG ullSizeToAdd) { m_ullTotalSize += ullSizeToAdd;};
ULONGLONG GetTotalSize(void) {return m_ullTotalSize;};
CSizeHolder() {m_ullTotalSize = 0; m_fAllFolders = TRUE; m_hr = S_OK;};
~CSizeHolder() {};
private:
BOOL m_fAllFolders;
HRESULT m_hr;
ULONGLONG m_ullTotalSize;
};
HRESULT CFtpDialogTemplate::_ReinsertDlgText(HWND hwnd, LPCVOID pv, LPCTSTR ptszFormat)
{
TCHAR szDlgTemplate[256];
TCHAR szFinalString[1024]; // wnsprintf maxes at 1024
GetWindowText(hwnd, szDlgTemplate, ARRAYSIZE(szDlgTemplate));
wnsprintf(szFinalString, ARRAYSIZE(szFinalString), szDlgTemplate, pv);
// Are they the same?
if (!StrCmp(szDlgTemplate, szFinalString))
wnsprintf(szFinalString, ARRAYSIZE(szFinalString), ptszFormat, pv); // Yes
SetWindowText(hwnd, szFinalString);
return S_OK;
}
/*****************************************************************************\
FUNCTION: _ReplaceIcon
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_ReplaceIcon(HWND hwnd, HICON hicon)
{
hicon = (HICON)SendMessage(hwnd, STM_SETICON, (WPARAM)hicon, 0L);
if (hicon)
{
DestroyIcon(hicon);
}
return S_OK;
}
/*****************************************************************************\
FUNCTION: _InitIcon
DESCRIPTION:
_HACKHACK_ We go straight to CFtpIcon to get the pxi
instead of going through CFtpFolder. Same effect, but
saves some memory allocations. What's more important,
we don't necessarily have a psf to play with, so we really
have no choice.
Yes, it's gross.
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitIcon(HWND hwnd, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
IExtractIcon * pxi;
HRESULT hr;
if (pflHfpl && pflHfpl->GetCount() == 1)
{
SHFILEINFO sfi;
hr = FtpPidl_GetFileInfo(pflHfpl->GetPidl(0), &sfi, SHGFI_ICON | SHGFI_LARGEICON);
if (SUCCEEDED(hr))
hr = _ReplaceIcon(hwnd, sfi.hIcon);
}
else
{
hr = CFtpIcon_Create(pff, pflHfpl, IID_IExtractIcon, (LPVOID *)&pxi);
if (SUCCEEDED(hr))
{
TCHAR szPath[MAX_PATH];
int i;
UINT ui;
hr = pxi->GetIconLocation(0, szPath, ARRAYSIZE(szPath), &i, &ui);
if (EVAL(SUCCEEDED(hr)))
{
CHAR szPathAnsi[MAX_PATH];
SHTCharToAnsi(szPath, szPathAnsi, ARRAYSIZE(szPathAnsi));
hr = _ReplaceIcon(hwnd, ExtractIconA(g_hinst, szPathAnsi, i));
}
ASSERT(pxi);
pxi->Release();
}
}
return hr;
}
void GetItemName(CFtpFolder * pff, CFtpPidlList * pflHfpl, LPWSTR pwzName, DWORD cchSize)
{
// Are multiple items selected?
if (1 < pflHfpl->GetCount())
LoadString(HINST_THISDLL, IDS_SEVERAL_SELECTED, pwzName, cchSize);
else
{
LPCITEMIDLIST pidl;
if (0 == pflHfpl->GetCount())
pidl = FtpID_GetLastIDReferense(pff->GetPrivatePidlReference());
else
pidl = FtpID_GetLastIDReferense(pflHfpl->GetPidl(0));
if (pidl)
FtpPidl_GetDisplayName(pidl, pwzName, cchSize);
}
}
BOOL CanEditName(CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
int nNumItems = pflHfpl->GetCount();
BOOL fCanRename = TRUE;
// we can edit except for multiply selected items
if (2 <= nNumItems)
fCanRename = FALSE;
else
{
// If they chose the background properties for a server,
// we won't let the change the server name.
if (0 == nNumItems)
{
LPCITEMIDLIST pidlFolder = pff->GetPrivatePidlReference();
if (pidlFolder && (ILIsEmpty(pidlFolder) || (ILIsEmpty(_ILNext(pidlFolder)))))
{
fCanRename = FALSE;
}
}
else if (1 == nNumItems)
{
// Now I'm worried that pflHfpl->GetPidl(0) is a PIDL pointing to
// an FTP Server.
LPCITEMIDLIST pidl = pflHfpl->GetPidl(0);
if (pidl && !ILIsEmpty(pidl) &&
FtpID_IsServerItemID(pidl) && ILIsEmpty(_ILNext(pidl)))
{
fCanRename = FALSE;
}
}
}
return fCanRename;
}
/*****************************************************************************\
FUNCTION: _InitName
DESCRIPTION:
Get the name of the object in the pflHfpl. If there is more than one
thing, use ellipses.
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitName(HWND hwnd, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
HRESULT hr = S_OK;
WCHAR wzName[MAX_PATH];
GetItemName(pff, pflHfpl, wzName, ARRAYSIZE(wzName));
hr = _ReinsertDlgText(hwnd, wzName, SZ_WSPRINTFSTR_S);
// We only use the static filename when more than one item is selected
// because that is the case that we can't do a rename. Are there
// multiple items selected?
if (m_fEditable && CanEditName(pff, pflHfpl))
{
// Hide because we will use IDC_FILENAME_EDITABLE instead.
ShowEnableWindow(hwnd, FALSE);
}
return hr;
}
/*****************************************************************************\
FUNCTION: _InitNameEditable
DESCRIPTION:
Get the name of the object in the pflHfpl. If there is more than one
thing, use ellipses.
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitNameEditable(HWND hwnd, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
HRESULT hr = S_OK;
TCHAR szName[MAX_PATH];
GetItemName(pff, pflHfpl, szName, ARRAYSIZE(szName));
hr = _ReinsertDlgText(hwnd, szName, SZ_WSPRINTFSTR_S);
// We only use the static filename when more than one item is selected
// because that is the case that we can't do a rename. Are there
// multiple items selected?
if (!m_fEditable || !CanEditName(pff, pflHfpl))
{
// Hide because we will use IDC_FILENAME_EDITABLE instead.
ShowEnableWindow(hwnd, FALSE);
}
return hr;
}
void GetNameFromPidlList(CFtpFolder * pff, CFtpPidlList * pflHfpl, LPWSTR pwzName, DWORD cchSize)
{
LPCITEMIDLIST pidl;
if (0 == pflHfpl->GetCount())
pidl = FtpID_GetLastIDReferense(pff->GetPrivatePidlReference());
else
pidl = FtpID_GetLastIDReferense(pflHfpl->GetPidl(0));
if (pidl)
{
FtpPidl_GetLastItemDisplayName(pidl, pwzName, cchSize);
}
}
/*****************************************************************************\
FUNCTION: _InitType
DESCRIPTION:
Get the type of the pidls identified by pflHfpl.
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitType(HWND hwnd, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
TCHAR szType[MAX_URL_STRING];
szType[0] = 0;
switch (pflHfpl->GetCount())
{
case 0:
{
// Find out if it's a folder or an ftp server root.
LPCITEMIDLIST pidl = FtpID_GetLastIDReferense(pff->GetPrivatePidlReference());
if (pidl)
LoadString(HINST_THISDLL, (FtpID_IsServerItemID(pidl) ? IDS_ITEMTYPE_SERVER : IDS_ITEMTYPE_FOLDER), szType, ARRAYSIZE(szType));
}
break;
case 1:
// Just one item is selected, so get it's type.
FtpPidl_GetFileType(pflHfpl->GetPidl(0), szType, ARRAYSIZE(szType));
break;
default:
// Display "Several Selected" because they can span 1 type.
LoadString(HINST_THISDLL, IDS_SEVERAL_SELECTED, szType, ARRAYSIZE(szType));
break;
}
return _ReinsertDlgText(hwnd, szType, SZ_WSPRINTFSTR_S);
}
/*****************************************************************************\
FUNCTION: _InitLocation
DESCRIPTION:
Get the name of the folder identified by pidl.
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitLocation(HWND hwnd, CFtpFolder * pff, CFtpPidlList * pidlList)
{
HRESULT hr = E_FAIL;
TCHAR szUrl[MAX_PATH];
LPITEMIDLIST pidl = GetPidlFromFtpFolderAndPidlList(pff, pidlList);
ASSERT(pidlList && pff);
if (pidl)
{
// If more than one items are selected, then we only want to
// show the common location.
if (1 < pidlList->GetCount())
ILRemoveLastID(pidl);
hr = UrlCreateFromPidl(pidl, SHGDN_FORADDRESSBAR, szUrl, ARRAYSIZE(szUrl), 0, TRUE);
if (SUCCEEDED(hr))
{
hr = _ReinsertDlgText(hwnd, szUrl, SZ_WSPRINTFSTR_S);
}
ILFree(pidl);
}
return hr;
}
/*****************************************************************************\
FUNCTION: _InitSizeTally
DESCRIPTION:
Total up the size of each file referred to in the pidl.
\*****************************************************************************/
int CFtpDialogTemplate::_InitSizeTally(LPVOID pvPidl, LPVOID pvSizeHolder)
{
BOOL fSuccess = TRUE;
LPCITEMIDLIST pidl = (LPCITEMIDLIST) pvPidl;
CSizeHolder * pSizeHolder = (CSizeHolder *) pvSizeHolder;
// Did we get a valid size and is pSizeHolder still valid?
if (SUCCEEDED(pSizeHolder->GetError()))
{
// Yes, so keep accumulating if it's a file.
if (!FtpID_IsServerItemID(pidl) && !FtpItemID_IsDirectory(pidl, FALSE))
{
ULARGE_INTEGER uliPidlFileSize;
uliPidlFileSize.QuadPart = FtpItemID_GetFileSize(pidl);
pSizeHolder->AddSize(uliPidlFileSize.QuadPart);
pSizeHolder->FoundNonFolder(); // Show that at least one was a file.
if (!uliPidlFileSize.QuadPart)
fSuccess = FALSE;
}
}
else
{
pSizeHolder->SetError(E_FAIL);
fSuccess = FALSE;
}
return fSuccess;
}
#define MAX_FILE_SIZE 64
HRESULT GetFileSizeFromULargeInteger(ULARGE_INTEGER uliSize, LPTSTR pszSizeStr, DWORD cchSize)
{
WCHAR wzSizeStr[MAX_FILE_SIZE];
LONGLONG llSize = (LONGLONG) uliSize.QuadPart;
if (StrFormatByteSizeW(llSize, wzSizeStr, ARRAYSIZE(wzSizeStr)))
SHUnicodeToTChar(wzSizeStr, pszSizeStr, cchSize);
else
{
CHAR szStrStrA[MAX_FILE_SIZE];
StrFormatByteSizeA(uliSize.LowPart, szStrStrA, ARRAYSIZE(szStrStrA));
SHAnsiToTChar(szStrStrA, pszSizeStr, cchSize);
}
return S_OK;
}
// From shlwapi.
void Int64ToStr(LONGLONG n, LPTSTR lpBuffer, DWORD cchSize)
{
TCHAR szTemp[40];
LONGLONG iChr = 0;
ASSERT(cchSize > ARRAYSIZE(szTemp));
do
{
szTemp[iChr++] = TEXT('0') + (TCHAR)(n % 10);
n = n / 10;
}
while (n != 0);
do
{
iChr--;
*lpBuffer++ = szTemp[iChr];
}
while (iChr != 0);
*lpBuffer++ = TEXT('\0');
}
/*****************************************************************************\
FUNCTION: _InitSize
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitSize(HWND hwnd, HWND hwndLabel, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
HRESULT hr;
TCHAR szSizeStr[MAX_FILE_SIZE];
CSizeHolder sizeHolder;
szSizeStr[0] = 0;
// GetCount maybe 0 if we are doing the background folder.
if (0 < pflHfpl->GetCount())
{
pflHfpl->Enum(CFtpDialogTemplate::_InitSizeTally, (LPVOID) &sizeHolder);
if (SUCCEEDED(sizeHolder.GetError()))
{
// Are there files sizes to display?
if (!sizeHolder.IsAllFolders())
{
TCHAR szBytesStr[MAX_FILE_SIZE];
TCHAR szBytesStrFormatted[MAX_FILE_SIZE];
TCHAR szCondencedSizeStr[MAX_FILE_SIZE];
ULARGE_INTEGER uliTotal;
uliTotal.QuadPart = sizeHolder.GetTotalSize();
NUMBERFMT numfmt = {0, 0, 3, TEXT(""), TEXT(","), 0};
EVAL(SUCCEEDED(GetFileSizeFromULargeInteger(uliTotal, szCondencedSizeStr, ARRAYSIZE(szCondencedSizeStr))));
Int64ToStr(uliTotal.QuadPart, szBytesStr, ARRAYSIZE(szBytesStr));
GetNumberFormat(LOCALE_USER_DEFAULT, 0, szBytesStr, &numfmt, szBytesStrFormatted, ARRAYSIZE(szBytesStrFormatted));
wnsprintf(szSizeStr, ARRAYSIZE(szSizeStr), TEXT("%s (%s bytes)"), szCondencedSizeStr, szBytesStrFormatted);
}
}
}
if (szSizeStr[0])
{
hr = _ReinsertDlgText(hwnd, szSizeStr, SZ_WSPRINTFSTR_S);
}
else
{
// If more than one item was selected...
// remove both the label and the value.
ShowEnableWindow(hwnd, FALSE);
if (hwndLabel)
ShowEnableWindow(hwndLabel, FALSE);
hr = S_OK;
}
return hr;
}
// WINVER 0x0500 definition
#ifndef WS_EX_LAYOUTRTL
#define WS_EX_LAYOUTRTL 0x00400000L // Right to left mirroring
#endif
/*****************************************************************************\
FUNCTION: _InitTime
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitTime(HWND hwnd, HWND hwndLabel, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
TCHAR szDateTime[MAX_PATH];
HRESULT hr = E_FAIL;
DWORD dwFlags = FDTF_SHORTTIME | FDTF_LONGDATE;
LCID locale = GetUserDefaultLCID();
if ((PRIMARYLANGID(LANGIDFROMLCID(locale)) == LANG_ARABIC)
|| (PRIMARYLANGID(LANGIDFROMLCID(locale)) == LANG_HEBREW))
{
DWORD dwExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
if ((BOOLIFY(dwExStyle & WS_EX_RTLREADING)) != (BOOLIFY(dwExStyle & WS_EX_LAYOUTRTL)))
dwFlags |= FDTF_RTLDATE;
else
dwFlags |= FDTF_LTRDATE;
}
switch (pflHfpl->GetCount())
{
// one item was selected so get the time for that item.
case 1:
if (!FtpID_IsServerItemID(pflHfpl->GetPidl(0)))
{
FILETIME ftLastModified = FtpPidl_GetFileTime(pflHfpl->GetPidl(0));
Misc_StringFromFileTime(szDateTime, ARRAYSIZE(szDateTime), &ftLastModified, dwFlags);
hr = S_OK;
}
break;
// zero items selected means get the properties for the background folder
case 0:
{
LPCITEMIDLIST pidl = FtpID_GetLastIDReferense(pff->GetPrivatePidlReference());
// The user will get 'N/A' for the 'Server' folder. (i.e. ftp://ohserv/)
if (EVAL(pidl) && !FtpID_IsServerItemID(pidl))
{
FILETIME ftLastModified = FtpPidl_GetFileTime(pidl);
Misc_StringFromFileTime(szDateTime, ARRAYSIZE(szDateTime), &ftLastModified, dwFlags);
hr = S_OK;
}
// Don't free pidl because we have a pointer to someone else's copy.
}
}
if (SUCCEEDED(hr))
{
hr = _ReinsertDlgText(hwnd, szDateTime, SZ_WSPRINTFSTR_S);
}
else
{
// If more than one item was selected...
// remove both the label and the value.
ShowEnableWindow(hwnd, FALSE);
if (hwndLabel)
ShowEnableWindow(hwndLabel, FALSE);
hr = S_OK;
}
return hr;
}
/*****************************************************************************\
FUNCTION: _InitCount
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpDialogTemplate::_InitCount(HWND hwnd, CFtpFolder * pff, CFtpPidlList * pflHfpl)
{
return _ReinsertDlgText(hwnd, IntToPtr(pflHfpl->GetCount()), SZ_WSPRINTFSTR_U);
}
/*****************************************************************************\
FUNCTION: InitDialog
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpDialogTemplate::InitDialog(HWND hDlg, BOOL fEditable, UINT id, CFtpFolder * pff, CFtpPidlList * pPidlList)
{
HRESULT hr = S_OK;
int nDlgTemlItem;
m_fEditable = fEditable;
for (nDlgTemlItem = 0; nDlgTemlItem < DLGTEML_MAX; nDlgTemlItem++)
{
HRESULT hrTemp = S_OK;
HWND hwnd = GetDlgItem(hDlg, id + nDlgTemlItem);
HWND hwndLabel = GetDlgItem(hDlg, id + nDlgTemlItem + DLGTEML_LABEL);
if (hwnd)
{
switch (nDlgTemlItem)
{
case DLGTEML_FILENAME: hrTemp = _InitName(hwnd, pff, pPidlList); break;
case DLGTEML_FILENAMEEDITABLE: hrTemp = _InitNameEditable(hwnd, pff, pPidlList); break;
case DLGTEML_FILEICON: hrTemp = _InitIcon(hwnd, pff, pPidlList); break;
case DLGTEML_FILESIZE: hrTemp = _InitSize(hwnd, hwndLabel, pff, pPidlList); break;
case DLGTEML_FILETIME: hrTemp = _InitTime(hwnd, hwndLabel, pff, pPidlList); break;
case DLGTEML_FILETYPE: hrTemp = _InitType(hwnd, pff, pPidlList); break;
case DLGTEML_LOCATION: hrTemp = _InitLocation(hwnd, pff, pPidlList); break;
case DLGTEML_COUNT: hrTemp = _InitCount(hwnd, pff, pPidlList); break;
default:
ASSERT(0); // What are you thinking?
break;
}
}
if (EVAL(SUCCEEDED(hr)))
hr = hrTemp; // Propogate out the worst error.
}
return hr;
}
/*****************************************************************************\
FUNCTION: OnClose
DESCRIPTION:
\*****************************************************************************/
BOOL CFtpDialogTemplate::OnClose(HWND hdlg, HWND hwndBrowser, CFtpFolder * pff, CFtpPidlList * pPidlList)
{
BOOL fCanClose = TRUE;
// If the IDC_FILENAME_EDITABLE field is showing, then the user may have done
// a rename. Check if that happened and if so, do it now.
if (IsWindowVisible(GetDlgItem(hdlg, IDC_FILENAME_EDITABLE)))
{
WCHAR wzOldName[MAX_PATH];
WCHAR wzNewName[MAX_PATH];
GetNameFromPidlList(pff, pPidlList, wzOldName, ARRAYSIZE(wzOldName));
EVAL(GetWindowTextW(GetDlgItem(hdlg, IDC_FILENAME_EDITABLE), wzNewName, ARRAYSIZE(wzNewName)));
// Was the name changed?
if (StrCmpW(wzOldName, wzNewName))
{
// Yes, so change it.
IShellFolder * psfParent = NULL;
CFtpFolder * pffParent = pff;
LPCITEMIDLIST pidlItem;
if (0 == pPidlList->GetCount())
{
// We use pidlTarget mainly because we want to assure that the
// ChangeNotifies are fired with pidlTarget.
LPITEMIDLIST pidlParent = pff->GetPublicTargetPidlClone();
if (pidlParent)
{
ILRemoveLastID(pidlParent);
pidlItem = FtpID_GetLastIDReferense(pff->GetPrivatePidlReference());
IEBindToObject(pidlParent, &psfParent);
ILFree(pidlParent);
}
}
else
{
pidlItem = FtpID_GetLastIDReferense(pPidlList->GetPidl(0));
EVAL(SUCCEEDED(pff->QueryInterface(IID_IShellFolder, (void **) &psfParent)));
}
if (psfParent)
{
if (EVAL(pidlItem))
fCanClose = ((S_OK == psfParent->SetNameOf(hwndBrowser, pidlItem, wzNewName, NULL, NULL)) ? TRUE : FALSE);
psfParent->Release();
}
}
}
return fCanClose;
}
/*****************************************************************************\
FUNCTION: OnDestroy
DESCRIPTION:
\*****************************************************************************/
BOOL CFtpDialogTemplate::OnDestroy(HWND hDlg, BOOL fEditable, UINT id, CFtpFolder* pff, CFtpPidlList* pPidlList)
{
HRESULT hr = S_OK;
int nDlgTemlItem;
for (nDlgTemlItem = 0; nDlgTemlItem < DLGTEML_MAX; nDlgTemlItem++)
{
HRESULT hrTemp = S_OK;
HWND hwnd = GetDlgItem(hDlg, id + nDlgTemlItem);
HWND hwndLabel = GetDlgItem(hDlg, id + nDlgTemlItem + DLGTEML_LABEL);
if (hwnd)
{
switch (nDlgTemlItem)
{
case DLGTEML_FILEICON:
hrTemp = _ReplaceIcon(hwnd, NULL);
break;
case DLGTEML_FILENAME:
case DLGTEML_FILENAMEEDITABLE:
case DLGTEML_FILESIZE:
case DLGTEML_FILETIME:
case DLGTEML_FILETYPE:
case DLGTEML_LOCATION:
case DLGTEML_COUNT:
break;
default:
ASSERT(0); // What are you thinking?
break;
}
}
if (SUCCEEDED(hr))
{
// Propogate out the worst error.
hr = hrTemp;
}
}
return hr;
}
BOOL CFtpDialogTemplate::HasNameChanged(HWND hdlg, CFtpFolder * pff, CFtpPidlList * pPidlList)
{
BOOL fNameChanged = FALSE;
// If the IDC_FILENAME_EDITABLE field is showing, then the user may have done
// a rename. Check if that happened and if so, do it now.
if (IsWindowVisible(GetDlgItem(hdlg, IDC_FILENAME_EDITABLE)))
{
TCHAR szOldName[MAX_PATH];
TCHAR szNewName[MAX_PATH];
GetNameFromPidlList(pff, pPidlList, szOldName, ARRAYSIZE(szOldName));
EVAL(GetWindowText(GetDlgItem(hdlg, IDC_FILENAME_EDITABLE), szNewName, ARRAYSIZE(szNewName)));
// Was the name changed?
if (StrCmp(szOldName, szNewName))
{
// Yes, so change it.
fNameChanged = TRUE;
}
}
return fNameChanged;
}
HRESULT CFtpDialogTemplate::InitDialogWithFindData(HWND hDlg, UINT id, CFtpFolder * pff, const FTP_FIND_DATA * pwfd, LPCWIRESTR pwWirePath, LPCWSTR pwzDisplayPath)
{
FTP_FIND_DATA wfd = *pwfd;
LPITEMIDLIST pidl;
HRESULT hr;
ASSERT(pwfd);
StrCpyNA(wfd.cFileName, pwWirePath, ARRAYSIZE(wfd.cFileName));
hr = FtpItemID_CreateReal(&wfd, pwzDisplayPath, &pidl);
if (SUCCEEDED(hr))
{
CFtpPidlList * pfpl = NULL;
hr = CFtpPidlList_Create(1, (LPCITEMIDLIST *) &pidl, &pfpl);
if (SUCCEEDED(hr))
{
hr = InitDialog(hDlg, FALSE, id, pff, pfpl);
pfpl->Release();
}
ILFree(pidl);
}
return hr;
}