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

343 lines
12 KiB
C++

#ifndef OFFLINE_CPP_H
#define OFFLINE_CPP_H
#ifdef __cplusplus
// #include <debug.h>
// #include <crtfree.h>
// Forward class declarations
class COfflineFolderEnum;
class COfflineFolder;
class COfflineObjectItem;
class COfflineDropTarget;
#define PROP_WEBCRAWL_SIZE 0x00000001
#define PROP_WEBCRAWL_FLAGS 0x00000002
#define PROP_WEBCRAWL_LEVEL 0x00000004
#define PROP_WEBCRAWL_ACTUALSIZE 0x00000008
#define PROP_WEBCRAWL_URL 0x00000010
#define PROP_WEBCRAWL_NAME 0x00000020
#define PROP_WEBCRAWL_EMAILNOTF 0x00000040
#define PROP_WEBCRAWL_PSWD 0x00000080
#define PROP_WEBCRAWL_UNAME 0x00000100
#define PROP_WEBCRAWL_DESKTOP 0x00000200
#define PROP_WEBCRAWL_RESCH 0x00000400
#define PROP_WEBCRAWL_COOKIE 0x00000800
#define PROP_WEBCRAWL_LAST 0x00001000
#define PROP_WEBCRAWL_STATUS 0x00002000
#define PROP_WEBCRAWL_CHANNEL 0x00004000
#define PROP_WEBCRAWL_PRIORITY 0x00008000
#define PROP_WEBCRAWL_GLEAM 0x00010000
#define PROP_WEBCRAWL_CHANGESONLY 0x00020000
#define PROP_WEBCRAWL_CHANNELFLAGS 0x00040000
#define PROP_WEBCRAWL_ALL 0x0007FFFF
#define PROP_WEBCRAWL_EXTERNAL PROP_WEBCRAWL_ACTUALSIZE | PROP_WEBCRAWL_URL | \
PROP_WEBCRAWL_NAME | PROP_WEBCRAWL_EMAILNOTF | \
PROP_WEBCRAWL_RESCH | PROP_WEBCRAWL_LAST | \
PROP_WEBCRAWL_DESKTOP | PROP_WEBCRAWL_CHANNEL |\
PROP_WEBCRAWL_STATUS | PROP_WEBCRAWL_PRIORITY
#define PROP_GENERAL_MASK PROP_WEBCRAWL_PSWD | PROP_WEBCRAWL_UNAME
#define PROP_RECEIVING_MASK PROP_WEBCRAWL_SIZE | PROP_WEBCRAWL_FLAGS | \
PROP_WEBCRAWL_CHANGESONLY | PROP_WEBCRAWL_EMAILNOTF \
PROP_WEBCRAWL_PRIORITY | PROP_WEBCRAWL_LEVEL | \
PROP_WEBCRAWL_CHANNELFLAGS
#define PROP_SCHEDULE_MASK PROP_WEBCRAWL_CHANNELFLAGS | PROP_WEBCRAWL_RESCH
// Forwawd declarations for create instance functions
HRESULT COfflineObjectItem_CreateInstance(COfflineFolder *pOOFolder, UINT cidl, LPCITEMIDLIST *ppidl, REFIID riid, void **ppvOut);
HRESULT DoDeleteSubscription(POOEntry);
HRESULT FindURLProps(LPCTSTR, PROPVARIANT *);
SUBSCRIPTIONSCHEDULE GetGroup(BOOL bDesktop, const CLSID& clsidDest,
DWORD fChannelFlags, const NOTIFICATIONCOOKIE& groupCookie);
inline SUBSCRIPTIONSCHEDULE GetGroup(POOEBuf pBuf)
{
ASSERT(pBuf);
return GetGroup(pBuf->bDesktop, pBuf->clsidDest, pBuf->fChannelFlags, pBuf->groupCookie);
}
inline SUBSCRIPTIONSCHEDULE GetGroup(POOEntry pooe)
{
ASSERT(pooe);
return GetGroup(pooe->bDesktop, pooe->clsidDest, pooe->fChannelFlags, pooe->groupCookie);
}
SUBSCRIPTIONTYPE GetItemCategory(BOOL bDesktop, const CLSID& clsidDest);
inline SUBSCRIPTIONTYPE GetItemCategory(POOEBuf pBuf)
{
ASSERT(pBuf);
return GetItemCategory(pBuf->bDesktop, pBuf->clsidDest);
}
inline SUBSCRIPTIONTYPE GetItemCategory(POOEntry pEntry)
{
ASSERT(pEntry);
return GetItemCategory(pEntry->bDesktop, pEntry->clsidDest);
}
//////////////////////////////////////////////////////////////////////////////
//
// COfflineFolderEnum Object
//
//////////////////////////////////////////////////////////////////////////////
class COfflineFolderEnum : public IEnumIDList
{
public:
COfflineFolderEnum(DWORD grfFlags);
// IUnknown Methods
STDMETHODIMP QueryInterface(REFIID,void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IEnumIDList Methods
STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched);
STDMETHODIMP Skip(ULONG celt);
STDMETHODIMP Reset();
STDMETHODIMP Clone(LPENUMIDLIST *ppenum);
// Helper functions
static LPMYPIDL NewPidl(DWORD);
static void FreePidl(LPMYPIDL);
static void EnsureMalloc();
static IMalloc *s_pMalloc;
HRESULT Initialize(COfflineFolder *pFolder);
protected:
~COfflineFolderEnum();
UINT m_cRef; // ref count
UINT m_grfFlags; // enumeration flags
private:
ULONG m_nCount;
ULONG m_nCurrent;
SUBSCRIPTIONCOOKIE *m_pCookies;
COfflineFolder *m_pFolder;
};
//////////////////////////////////////////////////////////////////////////////
//
// COfflineFolder Object
//
//////////////////////////////////////////////////////////////////////////////
class COfflineFolder : public IShellFolder,
public IPersistFolder2,
public IContextMenu
{
// COfflineFolder interfaces
friend COfflineObjectItem;
friend COfflineDropTarget;
friend COfflineFolderEnum;
friend HRESULT OfflineFolderView_CreateInstance(COfflineFolder *pOOFolder, LPCITEMIDLIST pidl, void **ppvOut);
friend HRESULT OfflineFolderView_DidDragDrop(HWND, IDataObject *pdo, DWORD dwEffect);
friend LPMYPIDL ScheduleDefault(LPCTSTR, LPCTSTR, COfflineFolder *);
public:
COfflineFolder(void);
// IUnknown Methods
STDMETHODIMP QueryInterface(REFIID,void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IShellFolder methods
STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbcReserved,
LPOLESTR lpszDisplayName, ULONG *pchEaten,
LPITEMIDLIST *ppidl, ULONG *pdwAttributes);
STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD grfFlags,
LPENUMIDLIST *ppenumIDList);
STDMETHODIMP BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved,
REFIID riid, void **ppvOut);
STDMETHODIMP BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved,
REFIID riid, void **ppvObj);
STDMETHODIMP CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, void **ppvOut);
STDMETHODIMP GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl,
ULONG * rgfInOut);
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl,
REFIID riid, UINT * prgfInOut, void **ppvOut);
STDMETHODIMP GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName);
STDMETHODIMP SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl,
LPCOLESTR lpszName, DWORD uFlags, LPITEMIDLIST * ppidlOut);
// IPersist Methods
STDMETHODIMP GetClassID(LPCLSID lpClassID);
// IPersistFolder
STDMETHODIMP Initialize(LPCITEMIDLIST pidl);
// IPersistFolder2
STDMETHODIMP GetCurFolder(LPITEMIDLIST *ppidl);
// IContextMenu Methods -- This handles the background context menus
STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst,
UINT idCmdLast, UINT uFlags);
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType,UINT *pwReserved,
LPSTR pszName, UINT cchMax);
protected:
~COfflineFolder();
UINT _cRef;
LPITEMIDLIST _pidl; // Clone;
#define VIEWMODE_WEBCRAWLONLY 1
UINT viewMode;
};
class COfflineDetails : public IShellDetails
{
public:
COfflineDetails(HWND hwndOwner);
// IUnknown members
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IShellDetails Methods
STDMETHODIMP GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, LPSHELLDETAILS pDetails);
STDMETHODIMP ColumnClick(UINT iColumn);
private:
~COfflineDetails() {}
HWND m_hwndOwner;
ULONG m_cRef;
};
////////////////////////////////////////////////////////////////////////////
//
// COfflineObjectItem Object
//
////////////////////////////////////////////////////////////////////////////
class COfflineObjectItem : public IContextMenu,
#ifdef UNICODE
public IExtractIconA,
#endif
public IExtractIcon,
public IDataObject,
public IQueryInfo
{
// COfflineObjectItem interfaces
friend HRESULT OfflineFolderView_DidDragDrop(HWND, IDataObject *pdo, DWORD dwEffect);
public:
COfflineObjectItem();
HRESULT Initialize(COfflineFolder *pOOFolder, UINT cidl, LPCITEMIDLIST *ppidl);
// IUnknown Methods
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP QueryInterface(REFIID,void **);
// IContextMenu Methods
STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst,
UINT idCmdLast, UINT uFlags);
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType,UINT *pwReserved,
LPSTR pszName, UINT cchMax);
// IDataObject Methods...
STDMETHODIMP GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM);
STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
STDMETHODIMP QueryGetData(LPFORMATETC pFE);
STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut);
STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease);
STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum);
STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink,
LPDWORD pdwConnection);
STDMETHODIMP DUnadvise(DWORD dwConnection);
STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *ppEnum);
// IDataObject helper functions
HRESULT _CreateHDROP(STGMEDIUM *pmedium);
HRESULT _CreateNameMap(STGMEDIUM *pmedium);
HRESULT _CreateFileDescriptor(STGMEDIUM *pSTM);
HRESULT _CreateFileContents(STGMEDIUM *pSTM, LONG lindex);
HRESULT _CreateURL(STGMEDIUM *pSTM);
HRESULT _CreatePrefDropEffect(STGMEDIUM *pSTM);
#ifdef UNICODE
// IExtractIconA
STDMETHODIMP GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags);
STDMETHODIMP Extract(LPCSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize);
#endif
// IExtractIconT Methods
STDMETHODIMP GetIconLocation(UINT, LPTSTR, UINT, int *, UINT *);
STDMETHODIMP Extract(LPCTSTR, UINT, HICON *, HICON *, UINT);
// IQueryInfo Methods
STDMETHODIMP GetInfoTip(DWORD dwFlags, WCHAR ** ppwszTip);
STDMETHODIMP GetInfoFlags(DWORD *pdwFlags);
protected:
~COfflineObjectItem();
UINT _cRef; // reference count
COfflineFolder* _pOOFolder; // back pointer to our shell folder
UINT _cItems; // number of items we represent
LPMYPIDL* _ppooi; // variable size array of items
IUnknown *m_pUIHelper; // UI helper. For 1 item only.
};
class COfflineDropTarget : public IDropTarget
{
private:
LPDATAOBJECT m_pDataObj;
ULONG m_cRefs;
DWORD m_grfKeyStateLast;
BOOL m_fHasHDROP;
BOOL m_fHasSHELLURL;
BOOL m_fHasTEXT;
DWORD m_dwEffectLastReturned;
HWND m_hwndParent;
public:
COfflineDropTarget(HWND hwndParent);
~COfflineDropTarget();
STDMETHODIMP QueryInterface (REFIID riid,LPVOID FAR *ppv);
STDMETHODIMP_(ULONG) AddRef ();
STDMETHODIMP_(ULONG) Release ();
STDMETHODIMP DragEnter (LPDATAOBJECT pDataObj,
DWORD grfKeyState,
POINTL pt,
LPDWORD pdwEffect);
STDMETHODIMP DragOver (DWORD grfKeyState,
POINTL pt,
LPDWORD pdwEffect);
STDMETHODIMP DragLeave ();
STDMETHODIMP Drop (LPDATAOBJECT pDataObj,
DWORD grfKeyState,
POINTL pt,
LPDWORD pdwEffect);
DWORD GetDropEffect (LPDWORD pdwEffect);
};
#endif // __cplusplus
#endif // OFFLINE_CPP_H