#ifndef CAFOLDER_H__ #define CAFOLDER_H__ #ifdef __cplusplus #include #include "iface.h" // Forward class declarations class CCacheFolderEnum; class CCacheFolder; class CCacheItem; #define LOTS_OF_FILES (10) // PIDL format for cache folder... struct CEIPIDL : public BASEPIDL { // USHORT cb; // USHORT usSign; TCHAR szTypeName[80]; INTERNET_CACHE_ENTRY_INFO cei; }; typedef UNALIGNED CEIPIDL *LPCEIPIDL; #define IS_VALID_CEIPIDL(pidl) ((pidl) && \ (((LPCEIPIDL)pidl)->cb >= sizeof(CEIPIDL)) && \ (((LPCEIPIDL)pidl)->usSign == (USHORT)CEIPIDL_SIGN)) #define CEI_SOURCEURLNAME(pceipidl) ((LPTSTR)((DWORD_PTR)(pceipidl)->cei.lpszSourceUrlName + (LPBYTE)(&(pceipidl)->cei))) #define CEI_LOCALFILENAME(pceipidl) ((LPTSTR)((DWORD_PTR)(pceipidl)->cei.lpszLocalFileName + (LPBYTE)(&(pceipidl)->cei))) #define CEI_FILEEXTENSION(pceipidl) ((LPTSTR)((DWORD_PTR)(pceipidl)->cei.lpszFileExtension + (LPBYTE)(&(pceipidl)->cei))) #define CEI_CACHEENTRYTYPE(pcei) ((DWORD)(pcei)->cei.CacheEntryType) inline UNALIGNED const TCHAR* _GetURLTitle(LPCEIPIDL pcei) { return _FindURLFileName(CEI_SOURCEURLNAME(pcei)); } inline void _GetCacheItemTitle(LPCEIPIDL pcei, LPTSTR pszTitle, DWORD cchBufferSize) { int iLen; ualstrcpyn(pszTitle, _GetURLTitle(pcei), cchBufferSize); iLen = lstrlen(pszTitle) - 1; // we want the last char if (pszTitle[iLen] == TEXT('/')) pszTitle[iLen] = TEXT('\0'); } inline LPCTSTR CPidlToSourceUrl(LPCEIPIDL pidl) { return CEI_SOURCEURLNAME(pidl); } inline int _CompareCFolderPidl(LPCEIPIDL pidl1, LPCEIPIDL pidl2) { return StrCmpI(CPidlToSourceUrl(pidl1), CPidlToSourceUrl(pidl2)); } /////////////////////// // // Warn on Cookie deletion // enum { DEL_COOKIE_WARN = 0, DEL_COOKIE_YES, DEL_COOKIE_NO }; // Forward declarations for create instance functions HRESULT CCacheItem_CreateInstance(CCacheFolder *pHCFolder, HWND hwndOwner, UINT cidl, LPCITEMIDLIST *ppidl, REFIID riid, void **ppvOut); ////////////////////////////////////////////////////////////////////////////// // // CCacheFolderEnum Object // ////////////////////////////////////////////////////////////////////////////// class CCacheFolderEnum : public IEnumIDList { public: CCacheFolderEnum(DWORD grfFlags, CCacheFolder *pHCFolder); // IUnknown Methods STDMETHODIMP QueryInterface(REFIID,void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IEnumIDList STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched); STDMETHODIMP Skip(ULONG celt); STDMETHODIMP Reset(); STDMETHODIMP Clone(IEnumIDList **ppenum); protected: ~CCacheFolderEnum(); LONG _cRef; // ref count CCacheFolder *_pCFolder;// this is what we enumerate UINT _grfFlags; // enumeration flags UINT _uFlags; // local flags LPINTERNET_CACHE_ENTRY_INFO _pceiWorking; HANDLE _hEnum; }; class CCacheFolder : public IShellFolder2, public IShellIcon, public IPersistFolder2 { // CCacheFolder interfaces friend CCacheFolderEnum; friend CCacheItem; friend HRESULT CacheFolderView_CreateInstance(CCacheFolder *pHCFolder, void **ppvOut); friend HRESULT CacheFolderView_DidDragDrop(IDataObject *pdo, DWORD dwEffect); public: CCacheFolder(); // IUnknown Methods STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IShellFolder methods STDMETHODIMP ParseDisplayName(HWND hwnd, LPBC pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, LPITEMIDLIST *ppidl, ULONG *pdwAttributes); STDMETHODIMP EnumObjects(HWND hwnd, DWORD grfFlags, IEnumIDList **ppenumIDList); STDMETHODIMP BindToObject(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppvOut); STDMETHODIMP BindToStorage(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppvObj); STDMETHODIMP CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); STDMETHODIMP CreateViewObject(HWND hwnd, REFIID riid, void **ppvOut); STDMETHODIMP GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, ULONG *rgfInOut); STDMETHODIMP GetUIObjectOf(HWND hwnd, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, void **ppvOut); STDMETHODIMP GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName); STDMETHODIMP SetNameOf(HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR lpszName, DWORD uFlags, LPITEMIDLIST * ppidlOut); // IShellFolder2 STDMETHODIMP GetDefaultSearchGUID(LPGUID lpGuid) { return E_NOTIMPL; }; STDMETHODIMP EnumSearches(LPENUMEXTRASEARCH *ppenum) { *ppenum = NULL; return E_NOTIMPL; }; STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pbState) { return E_NOTIMPL; }; STDMETHODIMP GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) { return E_NOTIMPL; }; STDMETHODIMP GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *pDetails); STDMETHODIMP MapColumnToSCID(UINT iCol, SHCOLUMNID *pscid) { return E_NOTIMPL; }; // IShellIcon STDMETHODIMP GetIconOf(LPCITEMIDLIST pidl, UINT flags, LPINT lpIconIndex); // IPersist STDMETHODIMP GetClassID(CLSID *pClassID); // IPersistFolder STDMETHODIMP Initialize(LPCITEMIDLIST pidl); // IPersistFolder2 Methods STDMETHODIMP GetCurFolder(LPITEMIDLIST *ppidl); protected: ~CCacheFolder(); HRESULT GetDisplayNameOfCEI(LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName); HRESULT _CompareAlignedIDs(LPARAM lParam, LPCEIPIDL pidl1, LPCEIPIDL pidl2); HRESULT _GetInfoTip(LPCITEMIDLIST pidl, DWORD dwFlags, WCHAR **ppwszTip); STDMETHODIMP _GetDetail(LPCITEMIDLIST pidl, UINT iColumn, LPTSTR pszStr, UINT cchStr); HRESULT _GetFileSysFolder(IShellFolder2 **ppsf); static HRESULT CALLBACK _sViewCallback(IShellView *psv, IShellFolder *psf, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LONG _cRef; UINT _uFlags; // copied from CacheFolder struct LPITEMIDLIST _pidl; // copied from CacheFolder struct IShellFolder2* _pshfSys; // system IShellFolder }; class CCacheItem : public CBaseItem { // CCacheItem interfaces friend HRESULT CacheFolderView_DidDragDrop(IDataObject *pdo, DWORD dwEffect); public: CCacheItem(); HRESULT Initialize(CCacheFolder *pHCFolder, HWND hwnd, UINT cidl, LPCITEMIDLIST *ppidl); // IUnknown Methods STDMETHODIMP QueryInterface(REFIID,void **); // IQueryInfo Methods STDMETHODIMP GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip); // IContextMenu Methods STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici); // IDataObject Methods... STDMETHODIMP GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM); STDMETHODIMP QueryGetData(LPFORMATETC pFE); STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum); // IExtractIconA Methods STDMETHODIMP GetIconLocation(UINT uFlags, LPSTR pszIconFile, UINT ucchMax, PINT pniIcon, PUINT puFlags); protected: ~CCacheItem(); virtual LPCTSTR _GetUrl(int nIndex); virtual LPCTSTR _PidlToSourceUrl(LPCITEMIDLIST pidl); virtual UNALIGNED const TCHAR* _GetURLTitle(LPCITEMIDLIST pcei); BOOL _ZoneCheck(int nIndex, DWORD dwUrlAction); HRESULT _CreateHDROP(STGMEDIUM *pmedium); CCacheFolder* _pCFolder; // back pointer to our shell folder DWORD _dwDelCookie; static INT_PTR CALLBACK _sPropDlgProc(HWND, UINT, WPARAM, LPARAM); }; #endif // __cplusplus #endif