164 lines
8.1 KiB
C
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
|