📄 ftpdhlp.cpp
字号:
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;
}
/*****************************************************************************\
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 (EVAL(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))));
// BUGBUG: How do we wsprintf 64 bits?
wnsprintf(szBytesStr, ARRAYSIZE(szBytesStr), TEXT("%u"), (DWORD)uliTotal.LowPart);
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_GetFTPFileTime(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_GetFTPFileTime(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, (LPVOID)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 (EVAL(psfParent))
{
if (EVAL(pidlItem))
fCanClose = ((S_OK == psfParent->SetNameOf(hwndBrowser, pidlItem, wzNewName, NULL, NULL)) ? TRUE : FALSE);
psfParent->Release();
}
}
}
return fCanClose;
}
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 (EVAL(SUCCEEDED(hr)))
{
CFtpPidlList * pfpl = NULL;
hr = CFtpPidlList_Create(1, (LPCITEMIDLIST *) &pidl, &pfpl);
if (EVAL(SUCCEEDED(hr)))
{
hr = InitDialog(hDlg, FALSE, id, pff, pfpl);
pfpl->Release();
}
ILFree(pidl);
}
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -