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

164 lines
8.1 KiB
C++

/*****************************************************************************\
FILE: ftpfoldr.h
DESCRIPTION:
This class inherits from CBaseFolder for a base ShellFolder implementation
of IShellFolder and overrides methods to give Ftp Specific features.
\*****************************************************************************/
#ifndef _FTPFOLDER_H
#define _FTPFOLDER_H
#include "isf.h"
#include "ftpdir.h"
#include "ftpsite.h"
#include "ftplist.h"
#include "ftpglob.h"
#include "ftppidl.h"
#include "cowsite.h"
#include "util.h"
class CFtpDir;
class CFtpSite;
/*****************************************************************************\
CFtpFolder
The stuff that tracks the state of a folder.
The cBusy field tracks how many sub-objects have been created
(e.g., IEnumIDList) which still contain references to this
folder's identity. You cannot change the folder's identity
(via IPersistFolder::Initialize) while there are outstanding
subobjects.
The number of cBusy's never exceeds the number of cRef's, because
each subobject that requires the folder identity must retain a
reference to the folder itself. That way, the folder won't be
Release()d while the identity is still needed.
\*****************************************************************************/
class CFtpFolder : public CBaseFolder
, public IShellIcon
, public IShellIconOverlay
, public IDelegateFolder
, public IShellPropSheetExt
, public IBrowserFrameOptions
{
public:
//////////////////////////////////////////////////////
// Public Interfaces
//////////////////////////////////////////////////////
// *** IUnknown ***
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void) {return CBaseFolder::AddRef();};
virtual STDMETHODIMP_(ULONG) Release(void) {return CBaseFolder::Release();};
// *** IShellFolder ***
virtual STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName,
ULONG * pchEaten, LPITEMIDLIST * ppidl, ULONG *pdwAttributes);
virtual STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD grfFlags, LPENUMIDLIST * ppenumIDList);
virtual STDMETHODIMP BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut);
virtual STDMETHODIMP BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvObj);
virtual STDMETHODIMP CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
virtual STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvOut);
virtual STDMETHODIMP GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl, ULONG * rgfInOut);
virtual STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut);
virtual STDMETHODIMP GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName);
virtual STDMETHODIMP SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpszName, DWORD uFlags, LPITEMIDLIST * ppidlOut);
// *** IShellFolder2 ***
virtual STDMETHODIMP GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv);
// *** IPersistFolder ***
virtual STDMETHODIMP Initialize(LPCITEMIDLIST pidl); // Override default behavior
// *** IShellIcon ***
virtual STDMETHODIMP GetIconOf(LPCITEMIDLIST pidl, UINT flags, LPINT lpIconIndex);
// *** IShellIconOverlay ***
virtual STDMETHODIMP GetOverlayIndex(LPCITEMIDLIST pidl, int * pIndex) {return GetOverlayIndexHelper(pidl, pIndex, SIOM_OVERLAYINDEX);};
virtual STDMETHODIMP GetOverlayIconIndex(LPCITEMIDLIST pidl, int * pIconIndex) {return GetOverlayIndexHelper(pidl, pIconIndex, SIOM_ICONINDEX);};
// *** IDelegateFolder ***
virtual STDMETHODIMP SetItemAlloc(IMalloc *pm);
// *** IShellPropSheetExt ***
virtual STDMETHODIMP AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) {return AddFTPPropertyPages(pfnAddPage, lParam, &m_hinstInetCpl, _punkSite);};
virtual STDMETHODIMP ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplaceWith, LPARAM lParam) {return E_NOTIMPL;};
// *** IBrowserFrameOptions ***
virtual STDMETHODIMP GetFrameOptions(IN BROWSERFRAMEOPTIONS dwMask, OUT BROWSERFRAMEOPTIONS * pdwOptions);
public:
CFtpFolder();
~CFtpFolder(void);
// Public Member Functions
void InvalidateCache(void);
CFtpDir * GetFtpDir(void);
CFtpDir * GetFtpDirFromPidl(LPCITEMIDLIST pidl);
BOOL IsRoot(void) { return ILIsEmpty(GetPrivatePidlReference()); };
BOOL IsUTF8Supported(void);
BOOL _IsValidPidlParameter(LPCITEMIDLIST pidl);
HRESULT GetItemAllocator(IMalloc **ppm);
IMalloc * GetItemAllocatorDirect(void) {ASSERT(m_pm); return m_pm;};
HRESULT GetUIObjectOfHfpl(HWND hwndOwner, CFtpPidlList * pflHfpl, REFIID riid, LPVOID * ppvObj, BOOL fFromCreateViewObject);
HRESULT CreateSubViewObject(HWND hwndOwner, CFtpPidlList * pflHfpl, REFIID riid, LPVOID * ppvObj);
HRESULT _PidlToMoniker(LPCITEMIDLIST pidl, IMoniker ** ppmk);
HRESULT _CreateShellView(HWND hwndOwner, void ** ppvObj);
CFtpGlob * GetSiteMotd(void);
CWireEncoding * GetCWireEncoding(void);
HRESULT _InitFtpSite(void);
IMalloc * GetIMalloc(void);
HRESULT _Initialize(LPCITEMIDLIST pidlTarget, LPCITEMIDLIST pidlRoot, int nBytesToPrivate);
HRESULT _BindToObject_OriginalFtpSupport(LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvObj);
HRESULT _FilterBadInput(LPCTSTR pszUrl, LPITEMIDLIST * ppidl);
HRESULT _BindToObject(LPCITEMIDLIST pidl, LPCITEMIDLIST pidlFull, IBindCtx * pbc, REFIID riid, LPVOID * ppvObj);
// HRESULT AddToUrlHistory(LPCTSTR pszUrl);
HRESULT AddToUrlHistory(LPCITEMIDLIST pidl);
HRESULT AddToUrlHistory(void) {return AddToUrlHistory(this->GetPrivatePidlReference());};
HRESULT GetOverlayIndexHelper(LPCITEMIDLIST pidl, int * pIndex, DWORD dwFlags);
HRESULT _GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut, BOOL fFromCreateViewObject);
static HRESULT FolderCompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
return FtpItemID_CompareIDs(lParam, pidl1, pidl2, FCMP_GROUPDIRS);
};
// Public Member Variables
CFtpSite * m_pfs;
IMalloc * m_pm; // today's itemid allocator
IUrlHistoryStg * m_puhs; // Used to add to the history list.
HINSTANCE m_hinstInetCpl; // HANDLE to Internet Control panel for View.Options.
IShellIconOverlayManager * m_psiom; // Used to get default icon overlays like shortcut cue.
// Friend Functions
friend HRESULT CFtpFolder_Create(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, int ib, REFIID riid, LPVOID * ppvObj);
friend HRESULT CFtpFolder_Create(REFIID riid, LPVOID * ppvObj);
protected:
HRESULT _FixQuestionablePidl(LPCITEMIDLIST pidl);
BOOL _IsProxyBlockingSite(LPCITEMIDLIST pidl);
BOOL _IsServerVMS(LPCITEMIDLIST pidl);
BOOL _NeedToFallBack(LPCITEMIDLIST pidl, BOOL * pfDisplayProxyFallBackDlg);
BOOL _NeedToFallBackRelative(LPCITEMIDLIST pidl, BOOL * pfDisplayProxyFallBackDlg);
HRESULT _CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvObj);
HRESULT _AddToUrlHistory(LPCWSTR pwzUrl);
HRESULT _GetCachedPidlFromDisplayName(LPCTSTR pszDisplayName, LPITEMIDLIST * ppidl);
HRESULT _ForPopulateAndEnum(CFtpDir * pfd, LPCITEMIDLIST pidlBaseDir, LPCTSTR pszUrl, LPCWIRESTR pwLastDir, LPITEMIDLIST * ppidl);
HRESULT _GetLegacyURL(LPCITEMIDLIST pidl, IBindCtx * pbc, LPTSTR pszUrl, DWORD cchSize);
HRESULT _GetLegacyPidl(LPCITEMIDLIST pidl, LPITEMIDLIST * ppidlLegacy);
HRESULT _INetBindToObject(LPCITEMIDLIST pidl, IBindCtx * pbc, REFIID riid, LPVOID * ppvObj);
HRESULT _InitLegacyShellFolder(IShellFolder * psfLegacy, LPCITEMIDLIST pidlInit);
HRESULT _ConvertPidlForRootedFix(LPCITEMIDLIST pidlBefore, LPITEMIDLIST * ppidlWithVRoot);
HRESULT _GetBindCtx(IBindCtx ** ppbc);
IShellFolder * _GetLegacyShellFolder(void);
};
#endif // _FTPFOLDER_H