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

106 lines
4.4 KiB
C++

/*****************************************************************************
* ftpcm.h
*****************************************************************************/
#ifndef _FTPCONTEXTMENU_H
#define _FTPCONTEXTMENU_H
#include "ftpdrop.h"
typedef HRESULT (*INVOKEPROC)(CFtpMenu * pfcm, LPCMINVOKECOMMANDINFO pici, LPCTSTR pszCmd, LPCITEMIDLIST pidl);
typedef struct { /* enum invoke info */
CFtpMenu * pfcm;
LPCMINVOKECOMMANDINFO pici;
HRESULT hres;
INVOKEPROC pfn;
LPCTSTR ptszCmd;
} EII, *PEII;
/*****************************************************************************
*
* CFtpMenu
*
*
*****************************************************************************/
class CFtpMenu : public IContextMenu
, public CObjectWithSite
{
public:
//////////////////////////////////////////////////////
// Public Interfaces
//////////////////////////////////////////////////////
// *** IUnknown ***
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
// *** IContextMenu ***
virtual STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
virtual STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
virtual STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax);
public:
CFtpMenu();
~CFtpMenu(void);
// Public Member Variables
DWORD m_sfgao; // Shell attributes of objects
CFtpPidlList * m_pflHfpl; // The list of items (pidls) that the context menu represents.
CFtpFolder * m_pff; // CFtpFolder in which our pidls live
CFtpDir * m_pfd; // FtpDir in which our pidls live
HWND m_hwnd; // Owner window for UI
POINT m_ptNewItem; // Points where the context menu was invoked. Used to later position a new folder.
DWORD m_uFlags; // Flags used in ::QueryContextMenu() to determine if the menu was invoked by the file menu.
BOOL m_fBackground; // Is this a forground or background context menu?
// Friend Functions
friend HRESULT CFtpMenu_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, HWND hwnd, REFIID riid, LPVOID * ppvObj);
friend HRESULT CFtpMenu_Create(CFtpFolder * pff, CFtpPidlList * pflHfpl, HWND hwnd, CFtpMenu ** ppfm);
static DWORD CALLBACK _DownloadDialogThreadProc(LPVOID pvThis) { return ((CFtpMenu *) pvThis)->_DownloadDialogThreadProc(); };
protected:
int m_cRef;
LPTSTR m_pszDownloadDir; // Download Directory
DWORD m_dwDownloadType; // Download Directory
// Private Member Functions
int _RemoveContextMenuItems(HMENU hmenu, UINT idCmdFirst, DWORD sfgao);
int _InvokeOne(LPCITEMIDLIST pidl, PEII peii);
HRESULT _InvokeDelete(LPCMINVOKECOMMANDINFO pici);
HRESULT _InvokeRename(LPCMINVOKECOMMANDINFO pici);
HRESULT _InvokeCutCopy(UINT_PTR id, LPCMINVOKECOMMANDINFO pici);
HRESULT _DoDrop(IDropTarget * pdt, IDataObject * pdto);
HRESULT _InvokePaste(LPCMINVOKECOMMANDINFO pici);
HRESULT _InvokeDownloadVerb(LPCMINVOKECOMMANDINFO pici);
HRESULT _InvokeDeleteVerb(LPCMINVOKECOMMANDINFO pici);
HRESULT _InvokeLoginAsVerb(LPCMINVOKECOMMANDINFO pici);
HRESULT _InvokeNewFolderVerb(LPCMINVOKECOMMANDINFO pici);
HRESULT _AddToRecentDocs(LPCITEMIDLIST pidl);
CStatusBar * _GetStatusBar(void);
DWORD _DownloadDialogThreadProc(void);
DWORD _DownloadThreadProc(void);
BOOL _AreAllFolders(CFtpPidlList * pflHfpl);
LPITEMIDLIST GetSoftLinkDestination(LPCITEMIDLIST pidlToSoftLink);
static HRESULT _SoftLinkDestCB(HINTERNET hint, HINTPROCINFO * phpi, LPVOID pvsldcbs, BOOL * pfReleaseHint);
static int _InvokeOneCB(LPVOID pvPidl, LPVOID pv);
static HRESULT _ApplyOne(CFtpMenu * pfcm, LPCMINVOKECOMMANDINFO pici, LPCTSTR ptszCmd, LPCITEMIDLIST pidl);
static DWORD CALLBACK DownloadThreadProc(LPVOID pvThis) { return ((CFtpMenu *) pvThis)->_DownloadThreadProc(); };
STDMETHODIMP _EnumInvoke(LPCMINVOKECOMMANDINFO pici, INVOKEPROC pfn, LPCTSTR ptszCmd);
private:
BOOL _ContainsForgroundItems(void);
BOOL _IsCallerCaptionBar(UINT indexMenu, UINT uFlags);
};
#endif // _FTPCONTEXTMENU_H