#include "fstreex.h" // public stuff #include "filetbl.h" #include #include #include "lmcons.h" #include "pidl.h" #include class CFSDropTarget; class CFSFolderViewCB; class CFileSysEnum; class CFSFolderEnumSTATSTG; class CFSFolder; class CFileSysItemString; #define INDEX_PROPERTYBAG_HKCU 0 #define INDEX_PROPERTYBAG_HKLM 1 #define INDEX_PROPERTYBAG_DESKTOPINI 2 class CFSFolderPropertyBag : public IPropertyBag { friend CFSFolder; public: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void **ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IPropertyBag STDMETHODIMP Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog); STDMETHODIMP Write(LPCOLESTR pszPropName, VARIANT *pVar); protected: CFSFolderPropertyBag(CFSFolder *pff, DWORD grfMode); HRESULT _Init(LPCIDFOLDER pidfLast); private: virtual ~CFSFolderPropertyBag(); LONG _cRef; DWORD _grfMode; CFSFolder* _pFSFolder; IPropertyBag* _pPropertyBags[3]; }; #define UASTROFFW(pfsi, cb) (LPNWSTR)(((LPBYTE)(pfsi)) + (cb)) #define UASTROFFA(pfsi, cb) (LPSTR)(((LPBYTE)(pfsi)) + (cb)) // This enum is simply an index into c_rgFolderType and c_wvContent (TODO: merge these), // therefore this *is* the Folder Type: typedef enum { FVCBFT_NOTSPECIFIED = -1, FVCBFT_DOCUMENTS = 0, // "0" is default until otherwise specified FVCBFT_MYDOCUMENTS, FVCBFT_PICTURES, FVCBFT_MYPICTURES, FVCBFT_PHOTOALBUM, FVCBFT_MUSIC, FVCBFT_MYMUSIC, FVCBFT_MUSICARTIST, FVCBFT_MUSICALBUM, FVCBFT_VIDEOS, FVCBFT_MYVIDEOS, FVCBFT_VIDEOALBUM, FVCBFT_USELEGACYHTT, FVCBFT_COMMONDOCUMENTS, FVCBFT_NUM_FOLDERTYPES } FVCBFOLDERTYPE; typedef enum { FSINAME_NONE = 0x0000, FSINAME_FS = 0x0001, FSINAME_UI = 0x0002, FSINAME_FSUI = 0x0003, FSINAME_RESOURCE = 0x0004, FSINAME_CLASS = 0x0008, } FSINAME; class CFileSysItem { public: CFileSysItem(LPCIDFOLDER pidf); BOOL HasResourceName() { return ((_pidfx && _pidfx->offResourceA)); } BOOL IsLegacy() { return _pidfx == NULL; } BOOL CantRename(CFSFolder *pfs); LPCWSTR MayCopyFSName(BOOL fMustCopy, LPWSTR psz, DWORD cch); LPCWSTR MayCopyClassName(BOOL fMustCopy, LPTSTR pszClass, UINT cch); protected: // methods TRIBIT _IsMine(CFSFolder *pfs); BOOL _IsPersonalized(); protected: // members LPCIDFOLDER _pidf; PCIDFOLDEREX _pidfx; PCIDPERSONALIZED _pidp; }; class CFileSysItemString : public CFileSysItem { public: CFileSysItemString(LPCIDFOLDER pidf); LPCWSTR FSName(); LPCSTR AltName(); LPCWSTR UIName(CFSFolder *pfs); LPCWSTR ResourceName(); LPCWSTR Class(); HRESULT GetFindData(WIN32_FIND_DATAW *pfd); HRESULT GetFindDataSimple(WIN32_FIND_DATAW *pfd); BOOL ShowExtension(BOOL fDefShowExt); PERCEIVED PerceivedType(); BOOL IsShimgvwImage(); BOOL GetJunctionClsid(CLSID *pclsid, BOOL fShellExtOk); HRESULT AssocCreate(CFSFolder *pfs, BOOL fForCtxMenu, REFIID riid, void **ppv); DWORD ClassFlags(BOOL fNeedsIconBits) { return _ClassFlags(NULL, fNeedsIconBits); } protected: // methods BOOL _LoadResource(CFSFolder *pfs); BOOL _MakePossessiveName(LPCWSTR pszFormat); int _GetPersonalizedRes(int csidl, BOOL fIsMine); void _FormatTheirs(LPCWSTR pszFormat); BOOL _ResourceName(LPWSTR psz, DWORD cch, BOOL fIsTheirs); LPCWSTR _Class(); DWORD _ClassFlags(IUnknown *punkAssoc, BOOL fNeedsIconBits); void _QueryClassFlags(IAssociationArray *paa); void _QueryIconIndex(IAssociationArray *paa); protected: // members LPCWSTR _pszFSName; // points inside the pidfx LPCWSTR _pszUIName; // points inside the pidfx LPCWSTR _pszClass; // points inside the pidfx DWORD _dwClass; FSINAME _fsin; WCHAR _sz[MAX_PATH]; }; class CFSAssocEnumData : public CEnumAssociationElements { public: CFSAssocEnumData(BOOL fIsUnknown, CFSFolder *pfs, LPCIDFOLDER pidf); ~CFSAssocEnumData() { if (_pidl) ILFree(_pidl); } protected: virtual BOOL _Next(IAssociationElement **ppae); protected: BOOL _fIsUnknown; BOOL _fIsSystemFolder; WCHAR _szPath[MAX_PATH]; LPITEMIDLIST _pidl; }; // This struct is used for caching the column info typedef struct { SHCOLUMNINFO shci; IColumnProvider *pcp; UINT iColumnId; // This is the 'real' column number, think of it as an index to the scid, which can be provided multiple times // ie 3 column handlers each provide the same 5 cols, this goes from 0-4 } COLUMNLISTENTRY; typedef struct { UINT cbResource; CHAR szResource[MAX_PATH]; IDPERSONALIZED idp; } EXSTRINGS; STDAPI_(BOOL) SetFolderString(BOOL fCreate, LPCTSTR pszFolder, LPCTSTR pszProvider, LPCTSTR pszSection, LPCTSTR pszKey, LPCTSTR pszData); STDAPI_(BOOL) GetFolderString(LPCTSTR pszFolder, LPCTSTR pszProvider, LPTSTR pszOut, int cch, LPCTSTR pszKey); STDAPI SHMultiFileProperties(IDataObject *pdtobj, DWORD dwFlags); STDAPI CFSFolder_CreateLinks(HWND hwnd, IShellFolder *psf, IDataObject *pdtobj, LPCTSTR pszDir, DWORD fMask); STDAPI CFSFolder_IconEvent(LONG lEvent, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlExtra); STDAPI_(void) CFSFolder_UpdateIcon(IShellFolder *psf, LPCITEMIDLIST pidl); class CFSFolder : public CAggregatedUnknown, public IShellFolder2, public IShellIcon, public IShellIconOverlay, public IPersistFolder3, public IStorage, public ITransferDest, public IPropertySetStorage, public IItemNameLimits, public IContextMenuCB, public ISetFolderEnumRestriction, public IOleCommandTarget { friend CFSFolderViewCB; friend CFSDropTarget; friend CFileSysEnum; friend CFSFolderEnumSTATSTG; friend CFSFolderPropertyBag; friend CFileSysItem; friend CFileSysItemString; friend CFSAssocEnumData; // these are evil, get rid of as many of these as possible friend HRESULT SHMultiFileProperties(IDataObject *pdtobj, DWORD dwFlags); friend HRESULT CFSFolder_CreateLinks(HWND hwnd, IShellFolder *psf, IDataObject *pdtobj, LPCTSTR pszDir, DWORD fMask); friend HRESULT CFSFolder_IconEvent(LONG lEvent, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlExtra); friend void CFSFolder_UpdateIcon(IShellFolder *psf, LPCITEMIDLIST pidl); friend HRESULT CFSFolder_CompareNames(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); friend DWORD CFSFolder_PropertiesThread(void *pv); friend HRESULT CFSFolder_CreateFolder(IUnknown *punkOuter, LPBC pbc, LPCITEMIDLIST pidl, const PERSIST_FOLDER_TARGET_INFO *pf, REFIID riid, void **ppv); friend LPCIDFOLDER CFSFolder_IsValidID(LPCITEMIDLIST pidl); friend BOOL CFSFolder_IsCommonItem(LPCITEMIDLIST pidl); public: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { return CAggregatedUnknown::QueryInterface(riid, ppv); }; STDMETHODIMP_(ULONG) AddRef(void) { return CAggregatedUnknown::AddRef(); }; STDMETHODIMP_(ULONG) Release(void) { return CAggregatedUnknown::Release(); }; // IShellFolder STDMETHODIMP ParseDisplayName(HWND hwnd, LPBC pbc, LPOLESTR pszName, ULONG *pchEaten, LPITEMIDLIST *ppidl, ULONG *pdwAttributes); STDMETHODIMP EnumObjects(HWND hwnd, DWORD grfFlags, IEnumIDList **ppenumIDList); STDMETHODIMP BindToObject(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv); STDMETHODIMP BindToStorage(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv); STDMETHODIMP CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); STDMETHODIMP CreateViewObject (HWND hwndOwner, REFIID riid, void **ppv); STDMETHODIMP GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl, ULONG *rgfInOut); STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, void **ppv); STDMETHODIMP GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD uFlags, STRRET *pName); STDMETHODIMP SetNameOf(HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR pszName, DWORD uFlags, LPITEMIDLIST * ppidlOut); // IShellFolder2 STDMETHODIMP GetDefaultSearchGUID(GUID *pGuid); STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum); STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pbState); STDMETHODIMP GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); STDMETHODIMP GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *pDetails); STDMETHODIMP MapColumnToSCID(UINT iColumn, SHCOLUMNID *pscid); // IPersist STDMETHODIMP GetClassID(LPCLSID lpClassID); // IPersistFolder STDMETHODIMP Initialize(LPCITEMIDLIST pidl); // IPersistFolder2 STDMETHODIMP GetCurFolder(LPITEMIDLIST *ppidl); // IPersistFolder3 STDMETHODIMP InitializeEx(IBindCtx *pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO *pfti); STDMETHODIMP GetFolderTargetInfo(PERSIST_FOLDER_TARGET_INFO *pfti); // IShellIcon methods STDMETHODIMP GetIconOf(LPCITEMIDLIST pidl, UINT flags, int *piIndex); // IShellIconOverlay methods STDMETHODIMP GetOverlayIndex(LPCITEMIDLIST pidl, int * pIndex); STDMETHODIMP GetOverlayIconIndex(LPCITEMIDLIST pidl, int * pIndex); // IStorage STDMETHODIMP CreateStream(LPCWSTR pszRel, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm); STDMETHODIMP OpenStream(LPCWSTR pszRel, VOID *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm); STDMETHODIMP CreateStorage(LPCWSTR pszRel, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg); STDMETHODIMP OpenStorage(LPCWSTR pszRel, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg);; STDMETHODIMP CopyTo(DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest); STDMETHODIMP MoveElementTo(LPCWSTR pszRel, IStorage *pstgDest, LPCWSTR pwcsNewName, DWORD grfFlags); STDMETHODIMP Commit(DWORD grfCommitFlags); STDMETHODIMP Revert(); STDMETHODIMP EnumElements(DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum); STDMETHODIMP DestroyElement(LPCWSTR pszRel); STDMETHODIMP RenameElement(LPCWSTR pwcsOldName, LPCWSTR pwcsNewName); STDMETHODIMP SetElementTimes(LPCWSTR pszRel, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime); STDMETHODIMP SetClass(REFCLSID clsid); STDMETHODIMP SetStateBits(DWORD grfStateBits, DWORD grfMask); STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag); // ITransferDest STDMETHODIMP Advise(ITransferAdviseSink *pAdvise, DWORD *pdwCookie); STDMETHODIMP Unadvise(DWORD dwCookie); STDMETHODIMP OpenElement(const WCHAR *pwcsName, STGXMODE grfMode, DWORD *pdwType, REFIID riid, void **ppunk); STDMETHODIMP CreateElement(const WCHAR *pwcsName, IShellItem *psiTemplate, STGXMODE grfMode, DWORD dwType, REFIID riid, void **ppunk); STDMETHODIMP MoveElement(IShellItem *psiItem, WCHAR *pwcsNewName, STGXMOVE grfOptions); STDMETHODIMP DestroyElement(const WCHAR *pwcsName, STGXDESTROY grfOptions); // IPropertySetStorage methods STDMETHODIMP Create(REFFMTID fmtid, const CLSID * pclsid, DWORD grfFlags, DWORD grfMode, IPropertyStorage** ppPropStg); STDMETHODIMP Open(REFFMTID fmtid, DWORD grfMode, IPropertyStorage** ppPropStg); STDMETHODIMP Delete(REFFMTID fmtid); STDMETHODIMP Enum(IEnumSTATPROPSETSTG** ppenum); // IContextMenuCB STDMETHODIMP CallBack(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam); // IItemNameLimits STDMETHODIMP GetValidCharacters(LPWSTR *ppwszValidChars, LPWSTR *ppwszInvalidChars); STDMETHODIMP GetMaxLength(LPCWSTR pszName, int *piMaxNameLen); // ISetFolderEnumRestriction STDMETHODIMP SetEnumRestriction(DWORD dwRequired, DWORD dwForbidden); // IOleCommandTarget STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext); STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); CFSFolder(IUnknown *punkOuter); protected: LPCITEMIDLIST _GetIDList() { return _pidl; }; HRESULT v_InternalQueryInterface(REFIID riid, void **ppv); virtual ~CFSFolder(); HRESULT _GetPathForItems(LPCIDFOLDER pidfParent, LPCIDFOLDER pidfLast, LPTSTR pszPath, DWORD cchPath); HRESULT _GetPathForItem(LPCIDFOLDER pidf, LPWSTR pszPath, DWORD cchPath); HRESULT _GetPath(PTSTR pszPath, DWORD cchPath); static HRESULT _GetAltDisplayName(LPCIDFOLDER pidf, LPTSTR pszName, DWORD cchName); static HRESULT _MakePossessiveName(LPCTSTR pszFile, LPCTSTR pszOwner, LPTSTR pszBuffer, INT cchBuffer); HRESULT _GetUsersDisplayName(LPCTSTR pszOwner, LPTSTR pszBuffer, INT cchBuffer); HRESULT _SetLocalizedDisplayName(LPCIDFOLDER pidf, LPCTSTR pszName); void _UpdateItem(LPCIDFOLDER pidf); DWORD _Attributes(); UINT _GetCSIDL(); BOOL _IsCSIDL(UINT csidl); UINT _GetItemExStrings(LPCIDFOLDER pidfSimpleParent, const WIN32_FIND_DATA *pfd, EXSTRINGS *pxs); HRESULT _CreateIDList(const WIN32_FIND_DATA *pfd, LPCIDFOLDER pidfSimpleParent, LPITEMIDLIST *ppidl); HRESULT _Properties(LPCITEMIDLIST pidlParent, IDataObject *pdtobj, LPCTSTR pStartPage); HRESULT _Reset(); HRESULT _CreateInstance(HWND hwnd, IDropTarget** ppdt); HRESULT _CreateEnum(IUnknown *punk, HWND hwnd, DWORD grfFlags, IEnumIDList **ppenum); HRESULT _GetJunctionForBind(LPCIDFOLDER pidf, LPIDFOLDER *ppidfBind, LPCITEMIDLIST *ppidlRight); LPCTSTR _BindHandlerName(REFIID riid); HRESULT _Bind(LPBC pbc, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _LoadHandler(LPCIDFOLDER pidf, DWORD grfMode, LPCTSTR pszHandlerType, REFIID riid, void **ppv); HRESULT _HandlerCreateInstance(LPCIDFOLDER pidf, PCWSTR pszClsid, DWORD grfMode, REFIID riid, void **ppv); HRESULT _CreateShimgvwExtractor(LPCIDFOLDER pidf, REFIID riid, void **ppv); BOOL _IsSlowPath(); HRESULT _GetToolTipForItem(LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetIntroText(LPCIDFOLDER pidf, WCHAR* pwszIntroText, UINT cchIntroText); // GetUIObjectOf() helpers. HRESULT _GetContextMenu(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetDataObject(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetDropTarget(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetAssoc(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetExtractIcon(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetCustomIconManager(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetExtractImage(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetExtractLogo(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); HRESULT _GetQueryInfo(HWND hwnd, LPCITEMIDLIST *apidl, UINT cidl, LPCIDFOLDER pidf, REFIID riid, void **ppv); // GetDetailsEx() helpers. HRESULT _GetFindData(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetDescriptionId(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetFolderIntroText(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetSize(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetFreeSpace(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetLastWriteTime(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetCreateTime(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetLastAccessTime(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetDirectory(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetInfotip(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetHtmlInfotipFile(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetAttributesDescription(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetAttributesDescriptionBuilder(LPWSTR szAttributes, size_t cchAttributes, LPWSTR szAttribute); HRESULT _GetLinkTarget(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetNetworkLocation(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetComputerName(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); HRESULT _GetComputerName_FromPath(PCWSTR pwszPath, VARIANT *pv); HRESULT _GetComputerName_FromUNC(PWSTR pwszPath, VARIANT *pv); HRESULT _GetCSCStatus(LPCIDFOLDER pidf, LPCSHCOLUMNID pscid, VARIANT *pv); BOOL _GetFolderFlags(LPCIDFOLDER pidf, UINT *prgfFlags); BOOL _GetFolderIconPath(LPCIDFOLDER pidf, LPTSTR pszIcon, int cchMax, UINT *pIndex); static DWORD CALLBACK _PropertiesThread(void *pv); static DWORD _GetClassFlags(LPCIDFOLDER pidf); UINT _GetContextMenuKeys(LPCIDFOLDER pidf, HKEY *aKeys, UINT cKeys, IAssociationArray **ppaa); BOOL _CheckDefaultIni(LPCIDFOLDER pidfLast, LPTSTR pszIniPath, DWORD cchIniPath); HRESULT _CompareExtendedProp(int iColumn, LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); static HRESULT _CompareModifiedDate(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); static HRESULT _CompareCreateTime(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); static HRESULT _CompareAccessTime(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); static HRESULT _CompareAttribs(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); static HRESULT _CompareFileTypes(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); HRESULT _CompareNames(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2, BOOL fCaseSensitive, BOOL fCanonical); static HRESULT _CompareFolderness(LPCIDFOLDER pidf1, LPCIDFOLDER pidf2); BOOL _DefaultShowExt(); BOOL _ShowExtension(LPCIDFOLDER pidf); static HRESULT _GetClassKey(LPCIDFOLDER pidf, HKEY *phkeyProgID); // file system, non junction point folder static BOOL _IsJunction(LPCIDFOLDER pidf); static BYTE _GetType(LPCIDFOLDER pidf); static BOOL _IsSimpleID(LPCIDFOLDER pidf); static LPIDFOLDER _FindLastID(LPCIDFOLDER pidf); static LPIDFOLDER _Next(LPCIDFOLDER pidf); static LPCIDFOLDER _IsValidID(LPCITEMIDLIST pidl); static LPCIDFOLDER _IsValidIDHack(LPCITEMIDLIST pidl); static BOOL _IsCommonItem(LPCITEMIDLIST pidl); static BOOL _IsFile(LPCIDFOLDER pidf); static BOOL _IsFolder(LPCIDFOLDER pidf); static BOOL _IsFileFolder(LPCIDFOLDER pidf); static BOOL _IsSystemFolder(LPCIDFOLDER pidf); static BOOL _IsReal(LPCIDFOLDER pidf); BOOL _IsSelfSystemFolder(); BOOL _HasLocalizedFileNames(); static BOOL _IsOffline(LPCIDFOLDER pidf) { return pidf && (pidf->wAttrs & FILE_ATTRIBUTE_OFFLINE); } BOOL _IsOfflineCSC(LPCIDFOLDER pidf); BOOL _IsOfflineCSC(LPCTSTR pszPath); HRESULT _InitFolder(IBindCtx *pbc, LPCIDFOLDER pidf, IUnknown **ppunk); BOOL _GetMountingPointInfo(LPCIDFOLDER pidf, LPTSTR pszMountPoint, DWORD cchMountPoint); HRESULT _CreateContextMenu(HWND hwnd, LPCIDFOLDER pidf, LPCITEMIDLIST *apidl, UINT cidl, IContextMenu **ppcm); HRESULT _AssocCreate(LPCIDFOLDER pidf, REFIID riid, void **ppv); static BOOL _GetJunctionClsid(LPCIDFOLDER pidf, CLSID *pclsidRet); static LPCTSTR _GetTypeName(LPCIDFOLDER pidf); static HRESULT _GetTypeNameBuf(LPCIDFOLDER pidf, LPTSTR pszName, int cchNameMax); static LPWSTR _CopyName(LPCIDFOLDER pidf, LPWSTR pszName, UINT cchName); static int _CopyUIName(LPCIDFOLDER pidf, LPTSTR pszName, UINT cchName); static HRESULT _AppendItemToPath(PTSTR pszPath, DWORD cchPath, LPCIDFOLDER pidl); static LPTSTR _CopyAltName(LPCIDFOLDER pidf, LPTSTR pszName, UINT cchName); static LPCSTR _GetAltName(LPCIDFOLDER pidf); static HRESULT _FindDataFromIDFolder(LPCIDFOLDER pidf, WIN32_FIND_DATAW *pfd, BOOL fAllowSimplePid); static DWORD _GetUID(LPCIDFOLDER pidf); static LPCIDFOLDER _FindJunction(LPCIDFOLDER pidf); static LPCITEMIDLIST _FindJunctionNext(LPCIDFOLDER pidf); ULONGLONG _Size(LPCIDFOLDER pidf); HRESULT _NormalGetDisplayNameOf(LPCIDFOLDER pidf, STRRET *pStrRet); HRESULT _NormalDisplayName(LPCIDFOLDER pidf, LPWSTR psz, UINT cch); BOOL _GetBindCLSID(IBindCtx *pbc, LPCIDFOLDER pidf, CLSID *pclsid); HRESULT _InitColData(LPCIDFOLDER pidf, SHCOLUMNDATA* pscd); LPIDFOLDER _MarkAsJunction(LPCIDFOLDER pidfSimpleParent, LPIDFOLDER pidf, LPCTSTR pszName); HRESULT _CreateIDListFromName(LPCTSTR pszName, DWORD dwAttribs, IBindCtx *pbc, LPITEMIDLIST *ppidl); BOOL _CanSeeInThere(LPCTSTR pszName); HRESULT _ParseSimple(LPCWSTR pszPath, const WIN32_FIND_DATA *pfdLast, LPITEMIDLIST *ppidl); HRESULT _FindDataFromName(LPCTSTR pszName, DWORD dwAttribs, IBindCtx *pbc, WIN32_FIND_DATA **ppfd); HRESULT _CheckDriveRestriction(HWND hwnd, REFIID riid); HRESULT _CreateUIHandler(REFIID riid, void **ppv); BOOL _IsNetPath(); int _GetDefaultFolderIcon(); HRESULT _CreateDefExtIcon(LPCIDFOLDER pidf, REFIID riid, void **ppxicon); HRESULT _CreateFileFolderDefExtIcon(LPCIDFOLDER pidf, REFIID riid, void **ppxicon); HRESULT _CreatePerInstanceDefExtIcon(LPCIDFOLDER pidf, DWORD shcf, REFIID riid, void **ppxicon); HRESULT _CreatePerClassDefExtIcon(LPCIDFOLDER pidf, DWORD shcf, REFIID riid, void **ppxicon); BOOL _FindColHandler(UINT iCol, UINT iN, COLUMNLISTENTRY *pcle); void _AdjustDefShowColumn(UINT iColumn, DWORD *pdwState); BOOL _ShouldShowExtendedColumn(const SHCOLUMNID* pscid); HRESULT _MapSCIDToColumn(const SHCOLUMNID* pscid, UINT* puCol); HRESULT _ExtendedColumn(LPCIDFOLDER pidf, UINT iColumn, SHELLDETAILS *pDetails); HRESULT _LoadColumnHandlers(); HRESULT _GetOverlayInfo(LPCITEMIDLIST pidl, int * pIndex, DWORD dwFlags); void _DestroyColHandlers(); HRESULT _GetFullPath(LPCWSTR pszRelPath, LPWSTR pszFull); HRESULT _Delete(LPCWSTR pszFile); HRESULT _OpenCreateStorage(LPCWSTR pwcsName, DWORD grfMode, IStorage **ppstg, BOOL fCreate); HRESULT _OpenCreateStream(LPCWSTR pwcsName, DWORD grfMode, IStream **ppstm, BOOL fCreate); HRESULT _SetStgMode(DWORD grfMode); HRESULT _LoadPropHandler(); HRESULT _CreateFolderPropertyBag(DWORD grfMode, LPCIDFOLDER pidfLast, REFIID riid, void **ppv); HRESULT _GetPropertyUI(); LPITEMIDLIST _pidl; // Absolute IDList (location in the name space) LPITEMIDLIST _pidlTarget; // Absolute IDList for folder target (location in namespace to enumerate) // WARNING: _csidlTrack overrides _pidlTarget LPTSTR _pszPath; // file system path (may be different from _pidl) LPTSTR _pszNetProvider; // network provider (for net calls we may need to make) CLSID _clsidBind; // use CLSID_NULL for normal case int _cHiddenFiles; // view callback and enumerator share these ULONGLONG _cbSize; UINT _csidl; // CSIDL_ value of this folder (if known) DWORD _dwAttributes; // attributes of this folder (if known) int _csidlTrack; // CSIDL_ that we follow dynamically BOOL _fCachedCLSID : 1; // clsidView is already cached BOOL _fHasCLSID : 1; // clsidView has a valid CLSID CLSID _clsidView; // CLSID for View object HDSA _hdsaColHandlers; // cached list of columns and handlers DWORD _dwColCount; // count of unique columns int _iFolderIcon; // icon for sub folders to inherit BOOL _bUpdateExtendedCols; // set to TRUE in response to SFVM_INSERTITEM callback, passed to IColumnProvider::GetItemData then cleared BOOL _bSlowPath; // Lazy-calculated value of whether the folder is on a slow path BOOL _fDontForceCreate; // don't succeed with STGM_CREATE passed to ParseDisplayName for a non-existent item FVCBFOLDERTYPE _nFolderType; TRIBIT _tbHasLocalizedFileNamesSection; // Lazy-calculated value of whether the folder has a desktop.ini with a LocalizedFileNames section TRIBIT _tbDefShowExt; // cache of SHGetSetSettings(SSF_SHOWEXTENSIONS) TRIBIT _tbOfflineCSC; // cache of _IsOfflineCSC(_pidl) DWORD _grfFlags; DWORD _dwEnumRequired; // SetEnumRestriction DWORD _dwEnumForbidden; // SetEnumRestriction IPropertySetStorage *_pstg; IPropertyUI *_pPropertyUI; ITransferAdviseSink * _pAdvise; }; // fstree.cpp STDAPI CFSFolderCallback_Create(CFSFolder *pFSFolder, IShellFolderViewCB **ppsfvcb); STDAPI CFSDropTarget_CreateInstance(CFSFolder* pFSFolder, HWND hwnd, IDropTarget** ppdt); STDAPI CFSFolder_CreateEnum(CFSFolder *pfsf, HWND hwnd, DWORD grfFlags, IEnumIDList **ppenum); STDAPI CFolderExtractImage_Create(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, void **ppvObj); class CFSIconManager : public ICustomIconManager { public: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void **ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ICustomIconManager STDMETHODIMP SetIcon(LPCWSTR pszIconPath,int iIcon); STDMETHODIMP SetDefaultIcon(); STDMETHODIMP GetDefaultIconHandle(HICON *phIcon); STDMETHODIMP GetIcon(LPWSTR pszIconPath, int cchszIconPath, int *piIconIndex) = 0; protected: HRESULT _Init(LPCITEMIDLIST pidl, IShellFolder *psf); WCHAR _wszPath[MAX_PATH]; CFSIconManager(); virtual STDMETHODIMP _SetIconEx(LPCWSTR pszIconPath,int iIconIndex, BOOL fChangeNotify) = 0; virtual STDMETHODIMP _SetDefaultIconEx(BOOL fChangeNotify) = 0; private: long _cRef; }; class CFileFolderIconManager : public CFSIconManager { public: friend HRESULT CFileFolderIconManager_Create(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, void **ppv); // ICustomIconManager STDMETHODIMP GetIcon(LPWSTR pszIconPath, int cchszIconPath, int *piIconIndex); protected: STDMETHODIMP _SetIconEx(LPCWSTR pszIconPath,int iIconIndex, BOOL fChangeNotify); STDMETHODIMP _SetDefaultIconEx(BOOL fChangeNotify); };