📄 priv.h
字号:
#define FDII_HFPL 0
#define FDII_WFDA 3
void FtpDlg_InitDlg(HWND hdlg, UINT id, CFtpFolder * pff, LPCVOID pv, UINT fdii);
#define FDI_FILEICON { IDC_FILEICON, FDIO_ICON, }
#define FDI_FILENAME { IDC_FILENAME, FDIO_NAME, }
#define FDI_FILETYPE { IDC_FILETYPE, FDIO_TYPE, }
#define FDI_LOCATION { IDC_LOCATION, FDIO_LOCATION, }
#define FDI_FILESIZE { IDC_FILESIZE, FDIO_SIZE, }
#define FDI_FILETIME { IDC_FILETIME, FDIO_DATE, }
#define imiTop 0
#define imiBottom ((UINT)-1)
typedef void (*GLOBALTIMEOUTPROC)(LPVOID);
/*****************************************************************************\
UNIX Chmod Bits
\*****************************************************************************/
#define UNIX_CHMOD_READ_OWNER 0x00000400
#define UNIX_CHMOD_WRITE_OWNER 0x00000200
#define UNIX_CHMOD_EXEC_OWNER 0x00000100
#define UNIX_CHMOD_READ_GROUP 0x00000040
#define UNIX_CHMOD_WRITE_GROUP 0x00000020
#define UNIX_CHMOD_EXEC_GROUP 0x00000010
#define UNIX_CHMOD_READ_ALL 0x00000004
#define UNIX_CHMOD_WRITE_ALL 0x00000002
#define UNIX_CHMOD_EXEC_ALL 0x00000001
/*****************************************************************************\
STRINGS
\*****************************************************************************/
// BUGBUG: Fix the names
#define SZ_FTPURLA "ftp://"
#define SZ_EMPTYA ""
#define SZ_MESSAGE_FILEA "MESSAGE.TXT"
#define SZ_ALL_FILESA "*.*"
#define SZ_URL_SLASHA "/"
#define SZ_FTP_URL_TYPEA ";type=" // This is the section of the url that contains the download type.
#define SZ_ESCAPED_SPACEA "%20"
#define SZ_ESCAPED_SLASHA "%5c"
#define SZ_DOTA "."
#define SZ_ASTRICSA "*"
#define SZ_DOS_SLASHA "\\"
#define SZ_SPACEA " "
#define SZ_HASH_ENCODEDA "%23"
#define SZ_FTPURLW L"ftp://"
#define SZ_EMPTYW L""
#define SZ_MESSAGE_FILEW L"MESSAGE.TXT"
#define SZ_ALL_FILESW L"*.*"
#define SZ_URL_SLASHW L"/"
#define SZ_FTP_URL_TYPEW L";type=" // This is the section of the url that contains the download type.
#define SZ_ESCAPED_SPACEW L"%20"
#define SZ_ESCAPED_SLASHW L"%5c"
#define SZ_DOTW L"."
#define SZ_ASTRICSW L"*"
#define SZ_DOS_SLASHW L"\\"
#define SZ_SPACEW L" "
#define SZ_HASH_ENCODEDW L"%23"
#define SZ_FTPURL TEXT(SZ_FTPURLA)
#define SZ_EMPTY TEXT(SZ_EMPTYA)
#define SZ_MESSAGE_FILE TEXT(SZ_MESSAGE_FILEA)
#define SZ_ALL_FILES TEXT(SZ_ALL_FILESA)
#define SZ_URL_SLASH TEXT(SZ_URL_SLASHA)
#define SZ_FTP_URL_TYPE TEXT(SZ_FTP_URL_TYPEA) // This is the section of the url that contains the download type.
#define SZ_ESCAPED_SPACE TEXT(SZ_ESCAPED_SPACEA)
#define SZ_ESCAPED_SLASH TEXT(SZ_ESCAPED_SLASHA)
#define SZ_DOT TEXT(SZ_DOTA)
#define SZ_ASTRICS TEXT(SZ_ASTRICSA)
#define SZ_DOS_SLASH TEXT(SZ_DOS_SLASHA)
#define SZ_SPACE TEXT(SZ_SPACEA)
#define SZ_HASH_ENCODED TEXT(SZ_HASH_ENCODEDA)
#define SZ_ANONYMOUS TEXT("anonymous")
#define CH_URL_SLASHA '\\'
#define CH_URL_URL_SLASHA '/'
#define CH_URL_LOGON_SEPARATORA '@'
#define CH_URL_PASSWORD_SEPARATORA ':'
#define CH_URL_TEMP_LOGON_SEPARATORA '-'
#define CH_HASH_DECODEDA '#'
#define CH_URL_SLASHW L'\\'
#define CH_URL_URL_SLASHW L'/'
#define CH_URL_LOGON_SEPARATORW L'@'
#define CH_URL_PASSWORD_SEPARATORW L':'
#define CH_URL_TEMP_LOGON_SEPARATORW L'-'
#define CH_HASH_DECODEDW L'#'
#define CH_URL_SLASH TEXT(CH_URL_SLASHA)
#define CH_URL_URL_SLASH TEXT(CH_URL_URL_SLASHA)
#define CH_URL_LOGON_SEPARATOR TEXT(CH_URL_LOGON_SEPARATORA)
#define CH_URL_PASSWORD_SEPARATOR TEXT(CH_URL_PASSWORD_SEPARATORA)
#define CH_URL_TEMP_LOGON_SEPARATOR TEXT(CH_URL_TEMP_LOGON_SEPARATORA)
#define CH_HASH_DECODED TEXT(CH_HASH_DECODEDA)
// FTP Commands
#define FTP_CMD_SYSTEM "syst"
#define FTP_CMD_SITE "site"
#define FTP_CMD_SITE_HELP "site help"
#define FTP_CMD_SITE_CHMOD_TEMPL "site chmod %lx %s"
#define FTP_CMD_FEAT "feat"
#define FTP_CMD_UTF8 "opts utf8 on"
#define FTP_CMD_NO_OP "noop"
// UNIX Commands (Used via SITE FTP command)
#define FTP_UNIXCMD_CHMODA "chmod"
#define FTP_SYST_VMS "VMS "
/*****************************************************************************\
REG Keys and Values
\*****************************************************************************/
// FTP Registry Keys
#define SZ_REGKEY_FTPCLASS TEXT("ftp")
#define SZ_REGKEY_MICROSOFTSOFTWARE TEXT("Software\\Microsoft")
#define SZ_REGKEY_FTPFOLDER TEXT("Software\\Microsoft\\Ftp")
#define SZ_REGKEY_FTPFOLDER_ACCOUNTS TEXT("Software\\Microsoft\\Ftp\\Accounts\\")
#define SZ_REGKEY_INTERNET_SETTINGS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")
#define SZ_REGKEY_INTERNET_SETTINGS_LAN TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\LAN")
#define SZ_REGKEY_INTERNET_EXPLORER TEXT("Software\\Microsoft\\Internet Explorer")
// FTP Registry Values
#define SZ_REGVALUE_PASSWDSIN_ADDRBAR TEXT("PasswordsInAddressBar")
#define SZ_REGVALUE_DOWNLOAD_DIR TEXT("Download Directory")
#define SZ_REGVALUE_DOWNLOAD_TYPE TEXT("Download Type")
#define SZ_REGVALUE_WARN_ABOUT_PROXY TEXT("Warn About Proxy")
#define SZ_REGVALUE_DEFAULT_FTP_CLIENT TEXT("ShellFolder")
#define SZ_REGVALUE_PREVIOUS_FTP_CLIENT TEXT("Previous FTP Client")
#define SZ_REGVALUE_PROXY_SERVER TEXT("ProxyServer")
#define SZ_REGVALUE_URL_ENCODING TEXT("UrlEncoding")
#define SZ_REGVALUE_DISABLE_PASSWORD_CACHE TEXT("DisablePasswordCaching")
// FTP Registry Data
#define SZ_REGDATA_IE_FTP_CLIENT TEXT("{63da6ec0-2e98-11cf-8d82-444553540000}")
// Accounts
#define SZ_REGVALUE_DEFAULT_USER TEXT("Default User")
#define SZ_REGVALUE_ACCOUNTNAME TEXT("Name")
#define SZ_REGVALUE_PASSWORD TEXT("Password")
#define SZ_ACCOUNT_PROP TEXT("CAccount_This")
#define SZ_REGKEY_LOGIN_ATTRIBS TEXT("Login Attributes")
#define SZ_REGKEY_EMAIL_NAME TEXT("EmailName")
#define SZ_REGKEY_USE_OLD_UI TEXT("Use Web Based FTP")
/*****************************************************************************\
FEATURES
\*****************************************************************************/
// Features
//#define FEATURE_DIALER
//#define FEATURE_OFFLINE
// Feature Tests
#define FEATURE_TEST_OFFLINE
#define FEATURE_TEST_DIALER
#define FEATURE_SAVE_PASSWORD
//#define FEATURE_PASSIVE_MODE
#define FEATURE_CHANGE_PERMISSIONS // UNIX CHMOD command
#ifdef FEATURE_PASSIVE_MODE
#define FEATURE_PASSIVE_ON_OR_OFF INTERNET_FLAG_PASSIVE
#else // FEATURE_PASSIVE_MODE
#define FEATURE_PASSIVE_ON_OR_OFF 0
#endif // FEATURE_PASSIVE_MODE
// #define FEATURE_FTP_TO_FTP_COPY
#define FEATURE_CUT_MOVE
// #define ADD_ABOUTBOX
/*****************************************************************************\
UNIQUE IDENTIFIERS
\*****************************************************************************/
// CLSIDs/IIDs Private to msieftp.dll
// WARNING: Never move these CLSID/IID definitions outside of the DLL.
//
// {299D0193-6DAA-11d2-B679-006097DF5BD4}
extern const GUID CLSID_FtpDataObject;
// {A11501B3-6EA4-11d2-B679-006097DF5BD4}
extern const GUID IID_CFtpFolder;
/*****************************************************************************\
Local Includes
\*****************************************************************************/
class CFtpFolder;
class CFtpSite;
class CFtpStm;
#include "codepage.h"
#include "encoding.h"
#include "dllload.h"
#include "ftpdir.h"
#include "ftplist.h"
#include "ftppidl.h"
#include "ftpinet.h"
#include "ftppl.h"
#include "util.h"
#include "ftpapi.h"
/*****************************************************************************
* Object Constructors
*****************************************************************************/
HRESULT CFtpFactory_Create(REFCLSID rclsid, REFIID riid, LPVOID * ppvObj);
HRESULT CFtpMenu_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, HWND hwnd, REFIID riid, LPVOID * ppvObj, BOOL fFromCreateViewObject);
HRESULT CFtpMenu_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, HWND hwnd, BOOL fFromCreateViewObject, CFtpMenu ** ppfm);
HRESULT CFtpDrop_Create(CFtpFolder * pff, HWND hwnd, CFtpDrop ** ppfm);
HRESULT CFtpEfe_Create(DWORD dwSize, FORMATETC rgfe[], STGMEDIUM rgstg[], CFtpObj * pfo, IEnumFORMATETC ** ppenum);
HRESULT CFtpEidl_Create(CFtpDir * pfd, CFtpFolder * pff, HWND hwndOwner, DWORD shcontf, IEnumIDList ** ppenum);
HRESULT CFtpFolder_Create(REFIID riid, LPVOID * ppvObj);
HRESULT CFtpInstaller_Create(REFIID riid, LPVOID * ppvObj);
IUnknown * CFtpGlob_Create(HGLOBAL hglob);
CFtpGlob * CFtpGlob_CreateStr(LPCTSTR pszStr);
HRESULT CFtpIcon_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, REFIID riid, LPVOID * ppv);
HRESULT CFtpIcon_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, CFtpIcon ** ppfm);
HRESULT CFtpList_Create(int cpvInit, PFNDPAENUMCALLBACK pfn, UINT nGrow, CFtpList ** ppfl);
HRESULT CFtpObj_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, REFIID riid, LPVOID * ppvObj);
HRESULT CFtpObj_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, CFtpObj ** ppfo);
HRESULT CFtpObj_Create(REFIID riid, void ** ppvObj);
HRESULT CFtpProp_Create(CFtpPidlList * pflHfpl, CFtpFolder * pff, HWND hwnd, CFtpProp ** ppfp);
HRESULT CFtpStm_Create(CFtpDir * pfd, LPCITEMIDLIST pidl, DWORD dwAccess, CFtpStm ** ppstream, ULARGE_INTEGER uliComplete, ULARGE_INTEGER uliTotal, IProgressDialog * ppd, BOOL fClosePrgDlg);
HRESULT CFtpView_Create(CFtpFolder * pff, HWND hwndOwner, CFtpView ** ppfv);
HRESULT CFtpSite_Create(LPCSTR pszSite, CFtpSite ** ppfs);
HRESULT CFtpPidlList_Create(int cpidl, LPCITEMIDLIST rgpidl[], CFtpPidlList ** ppfl);
void TriggerDelayedAction(LPGLOBALTIMEOUTINFO * phgti);
STDMETHODIMP SetDelayedAction(DELAYEDACTIONPROC pfn, LPVOID pvRef, LPGLOBALTIMEOUTINFO * phgti);
HRESULT PurgeDelayedActions(void);
BOOL AreOutstandingDelayedActions(void);
UINT FtpConfirmDeleteDialog(HWND hwnd, CFtpPidlList * pflHfpl, CFtpFolder * pff);
UINT FtpConfirmReplaceDialog(HWND hwnd, LPWIN32_FIND_DATA pwfdLocal, LPFTP_FIND_DATA pwfdRemote, int cobj, CFtpFolder * pff);
UINT FtpConfirmReplaceDialog(HWND hwnd, LPFTP_FIND_DATA pwfdLocal, LPWIN32_FIND_DATA pwfdRemote, int cobj, CFtpFolder * pff);
CFtpView * GetCFtpViewFromDefViewSite(IUnknown * punkSite);
/*****************************************************************************\
FTP Notes and Issues
Time/Date Stamps on FTP Files:
There are two issues, the date on the server isn't time zone independent,
and FTP/Wininet only do LastWriteTime (not CreationTime & LastAccessedTime).
1. Corrdinated Universal Time (UTC) is the format to use to store time in
a time zone indepndent manner. Time displayed to the user then gets
converted at the last moment so it's correct wrt the time zone. FindFirstFile()
does fill in the WIN32_FIND_DATA structure with UTC time, but wininet doesn't.
This means that this FTP code can't do the UTC->LocalTime convertion when
displaying the date/time.
2. Only the modified date is sent via FTP. Oh well, not to sever.
Threading Issues:
FTP can be called from several threads:
1. Main UI Thread: CFtpFolder, ....
2. Folder Contents Enum: CFtpFolder, IEnumIDList, CFtpDir, CFtpSite.
2. AutoComplete Enum: CFtpFolder, IEnumIDList, CFtpDir, CFtpSite.
BUGBUG/TODO: Go thru all of the code and make sure it's thread safe
and add asserts to assert which classes are single threaded
and which need to be thread safe.
PERF:
1. We only cache an FTP session (InternetConnect()) for 10 seconds. We should
increase this to 50sec to 90 or maybe 120sec. This is currently done because
we need to force the session to close down early when we are going to shutdown
the process or try to unload our dll.
2. Our Tree Walker code for recusrive operations (upload, download, delete) (in ftppl.cpp)
calls FtpGetCurrentDirectory() and FtpSetCurrentDirectory() too often. To fix
this, we need to verify we don't recurse into SOFTLINK directories because
this is what requires the FtpGetCurrentDirectory. This also could cause a
recursion death bug and infinite loop. We would then create
::_CacheChangeDir() and ::_CommitChangeDir() so the could remain
simple but we would cache several Change Directories.
3. If the desktop or desktop toolbars have FTP Shortcuts, the icon is
extracted in such a way that we hit the net. This figgen sucks!!!
Fix this, even if this mean hacking.
\*****************************************************************************/
// WARNING: Don't put any #defines or typedefs after the includes or they won't be recognized.
#endif // _PRIV_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -