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

109 lines
4.6 KiB
C++

/*****************************************************************************
* ftpdir.h
*****************************************************************************/
#ifndef _FTPDIR_H
#define _FTPDIR_H
#include "ftpsite.h"
#include "ftpfoldr.h"
#include "ftplist.h"
#include "ftpglob.h"
#include "ftppl.h"
typedef struct tagSETNAMEOFINFO
{
LPCITEMIDLIST pidlOld;
LPCITEMIDLIST pidlNew;
} SETNAMEOFINFO, * LPSETNAMEOFINFO;
int CALLBACK _CompareDirs(LPVOID pvPidl, LPVOID pvFtpDir, LPARAM lParam);
/*****************************************************************************\
CLASS: CFtpDir
DESCRIPTION:
This class is the cache of a directory on some server. m_pfs identifies
the server.
PERF - PERF - PERF - PERF
This directory contains the folder contents in the form of a list of
pidls (m_pflHfpl). We need to keep them in order based on name so that
way looking up and changing is fast because of all the work we need to do
with change notify. Also, when we go to parse a display name, we look here
first, so that needs to be fast.
\*****************************************************************************/
class CFtpDir : public IUnknown
{
public:
//////////////////////////////////////////////////////
// Public Interfaces
//////////////////////////////////////////////////////
// *** IUnknown ***
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
public:
CFtpDir();
~CFtpDir(void);
// Public Member Functions
void CollectMotd(HINTERNET hint);
void SetCache(CFtpPidlList * pflHfpl);
CFtpPidlList * GetHfpl(void);
HRESULT GetHint(HWND hwnd, CStatusBar * psb, HINTERNET * phint, IUnknown * punkSite, CFtpFolder * pff);
void ReleaseHint(HINTERNET hint);
STDMETHODIMP WithHint(CStatusBar * psb, HWND hwnd, HINTPROC hp, LPCVOID pv, IUnknown * punkSite, CFtpFolder * pff);
HRESULT SetNameOf(CFtpFolder * pff, HWND hwndOwner, LPCITEMIDLIST pidl, LPCTSTR pszName, DWORD dwReserved, LPITEMIDLIST *ppidlOut);
BOOL IsRoot(void);
BOOL IsCHMODSupported(void) {return m_pfs->IsCHMODSupported();};
BOOL IsUTF8Supported(void) {return m_pfs->IsUTF8Supported();};
HRESULT GetFindDataForDisplayPath(HWND hwnd, LPCWSTR pwzDisplayPath, LPFTP_FIND_DATA pwfd, CFtpFolder * pff);
HRESULT GetFindData(HWND hwnd, LPCWIRESTR pwWireName, LPFTP_FIND_DATA pwfd, CFtpFolder * pff);
HRESULT GetNameOf(LPCITEMIDLIST pidl, DWORD shgno, LPSTRRET pstr);
// HRESULT DisambiguatePidl(LPCITEMIDLIST pidl);
CFtpSite * GetFtpSite(void);
CFtpDir * GetSubFtpDir(CFtpFolder * pff, LPCITEMIDLIST pidl, BOOL fPublic);
HRESULT GetDisplayPath(LPTSTR pszUrlPath, DWORD cchSize);
LPCITEMIDLIST GetPathPidlReference(void) { return m_pidlFtpDir;};
LPCITEMIDLIST GetPidlReference(void) { return m_pidl;};
LPCITEMIDLIST GetPidlFromWireName(LPCWIRESTR pwWireName);
LPCITEMIDLIST GetPidlFromDisplayName(LPCWSTR pwzDisplayName);
LPITEMIDLIST GetSubPidl(CFtpFolder * pff, LPCITEMIDLIST pidlRelative, BOOL fPublic);
HRESULT AddItem(LPCITEMIDLIST pidl);
HRESULT ChangeFolderName(LPCITEMIDLIST pidlFtpPath);
HRESULT ReplacePidl(LPCITEMIDLIST pidlSrc, LPCITEMIDLIST pidlDest) { if (!m_pflHfpl) return S_OK; return m_pflHfpl->ReplacePidl(pidlSrc, pidlDest); };
HRESULT DeletePidl(LPCITEMIDLIST pidl) { if (!m_pflHfpl) return S_OK; return m_pflHfpl->CompareAndDeletePidl(pidl); };
static HRESULT _SetNameOfCB(HINTERNET hint, HINTPROCINFO * phpi, LPVOID pv, BOOL * pfReleaseHint);
static HRESULT _GetFindData(HINTERNET hint0, HINTPROCINFO * phpi, LPVOID pv, BOOL * pfReleaseHint);
// Friend Functions
friend HRESULT CFtpDir_Create(CFtpSite * pfs, LPCITEMIDLIST pidl, CFtpDir ** ppfd);
friend int CALLBACK _CompareDirs(LPVOID pvPidl, LPVOID pvFtpDir, LPARAM lParam);
protected:
int m_cRef;
CFtpSite * m_pfs; // The FTP site I belong to. (WARNING: No Ref Held)
CFtpPidlList * m_pflHfpl; // The items inside this directory
CFtpGlob * m_pfgMotd; // The message of the day
LPITEMIDLIST m_pidlFtpDir; // Name of subdirectory w/o Virtual Root and decoded. Doesn't include Server ID
LPITEMIDLIST m_pidl; // Where we live. May include the virtual root
BOOL _DoesItemExist(HWND hwnd, CFtpFolder * pff, LPCITEMIDLIST pidl);
BOOL _ConfirmReplaceWithRename(HWND hwnd);
HRESULT _SetFtpDir(CFtpSite * pfs, CFtpDir * pfd, LPCITEMIDLIST pidl);
};
#endif // _FTPDIR_H