#ifndef _INC_DOCFIND #define _INC_DOCFIND // for the OLEDB query stuff #define OLEDBVER 0x0250 // enable ICommandTree interface #include #include #include #include #include #include #include #include // reg location where we store bad paths that ci should not have indexed #define CI_SPECIAL_FOLDERS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Search\\SpecialFolders") // Define some options that are used between filter and search code #define DFOO_INCLUDESUBDIRS 0x0001 // Include sub directories. #define DFOO_SHOWALLOBJECTS 0x1000 // Show all files #define DFOO_CASESEN 0x0008 // Do case sensitive search #define DFOO_SEARCHSYSTEMDIRS 0x0010 // Search into system directories // Some error happended on the get next file... #define GNF_ERROR -1 #define GNF_DONE 0 #define GNF_MATCH 1 #define GNF_NOMATCH 2 #define GNF_ASYNC 3 // Define a FACILITY That we can check errors for... #define FACILITY_SEARCHCOMMAND 99 #undef INTERFACE #define INTERFACE IFindEnum DECLARE_INTERFACE_(IFindEnum, IUnknown) { // IUnknown STDMETHOD(QueryInterface) (THIS_ REFIID riid, void ** ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IFindEnum STDMETHOD(Next)(THIS_ LPITEMIDLIST *ppidl, int *pcObjectSearched, int *pcFoldersSearched, BOOL *pfContinue, int *pState) PURE; STDMETHOD (Skip)(THIS_ int celt) PURE; STDMETHOD (Reset)(THIS) PURE; STDMETHOD (StopSearch)(THIS) PURE; STDMETHOD_(BOOL,FQueryIsAsync)(THIS) PURE; STDMETHOD (GetAsyncCount)(THIS_ DBCOUNTITEM *pdwTotalAsync, int *pnPercentComplete, BOOL *pfQueryDone) PURE; STDMETHOD (GetItemIDList)(THIS_ UINT iItem, LPITEMIDLIST *ppidl) PURE; STDMETHOD (GetItemID)(THIS_ UINT iItem, DWORD *puWorkID) PURE; STDMETHOD (SortOnColumn)(THIS_ UINT iCol, BOOL fAscending) PURE; }; // We overloaded Async case when we are in mixed (some async some sync mode) #define DF_QUERYISMIXED ((BOOL)42) typedef interface IFindFolder IFindFolder; #undef INTERFACE #define INTERFACE IFindFilter DECLARE_INTERFACE_(IFindFilter, IUnknown) { // IUnknown STDMETHOD(QueryInterface) (THIS_ REFIID riid, void ** ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IFindFilter STDMETHOD(GetStatusMessageIndex)(THIS_ UINT uContext, UINT *puMsgIndex) PURE; STDMETHOD(GetFolderMergeMenuIndex)(THIS_ UINT *puBGMainMergeMenu, UINT *puBGPopupMergeMenu) PURE; STDMETHOD(FFilterChanged)(THIS) PURE; STDMETHOD(GenerateTitle)(THIS_ LPTSTR *ppszTile, BOOL fFileName) PURE; STDMETHOD(PrepareToEnumObjects)(THIS_ HWND hwnd, DWORD *pdwFlags) PURE; STDMETHOD(ClearSearchCriteria)(THIS) PURE; STDMETHOD(EnumObjects)(THIS_ IShellFolder *psf, LPCITEMIDLIST pidlStart, DWORD grfFlags, int iColSort, LPTSTR pszProgressText, IRowsetWatchNotify *prwn, IFindEnum **ppdfenum) PURE; STDMETHOD(GetColumnsFolder)(THIS_ IShellFolder2 **ppsf) PURE; STDMETHOD_(BOOL,MatchFilter)(THIS_ IShellFolder *psf, LPCITEMIDLIST pidl) PURE; STDMETHOD(SaveCriteria)(THIS_ IStream * pstm, WORD fCharType) PURE; STDMETHOD(RestoreCriteria)(THIS_ IStream * pstm, int cCriteria, WORD fCharType) PURE; STDMETHOD(DeclareFSNotifyInterest)(THIS_ HWND hwndDlg, UINT uMsg) PURE; STDMETHOD(GetColSaveStream)(THIS_ WPARAM wParam, IStream **ppstm) PURE; STDMETHOD(GenerateQueryRestrictions)(THIS_ LPWSTR *ppwszQuery, DWORD *pdwGQRFlags) PURE; STDMETHOD(ReleaseQuery)(THIS) PURE; STDMETHOD(UpdateField)(THIS_ LPCWSTR pszField, VARIANT vValue) PURE; STDMETHOD(ResetFieldsToDefaults)(THIS) PURE; STDMETHOD(GetItemContextMenu)(THIS_ HWND hwndOwner, IFindFolder* pdfFolder, IContextMenu** ppcm) PURE; STDMETHOD(GetDefaultSearchGUID)(THIS_ IShellFolder2 *psf2, LPGUID lpGuid) PURE; STDMETHOD(EnumSearches)(THIS_ IShellFolder2 *psf2, LPENUMEXTRASEARCH *ppenum) PURE; STDMETHOD(GetSearchFolderClassId)(THIS_ LPGUID lpGuid) PURE; STDMETHOD(GetNextConstraint)(THIS_ VARIANT_BOOL fReset, BSTR *pName, VARIANT *pValue, VARIANT_BOOL *pfFound) PURE; STDMETHOD(GetQueryLanguageDialect)(THIS_ ULONG * pulDialect); STDMETHOD(GetWarningFlags)(THIS_ DWORD *pdwWarningFlags); }; // Define the flags that GenerateQueryRestrictions may return typedef enum { GQR_MAKES_USE_OF_CI = 0x0001, // some constraint makes resonable use of Content index GQR_REQUIRES_CI = 0x0002, // The query requires the CI to work GQR_BYBASS_CI = 0x0004, // The query should bybass CI. } GQR_FLAGS; // Docfind UI warning bits. #define DFW_DEFAULT 0x00000000 #define DFW_IGNORE_CISCOPEMISMATCH 0x00000001 // CI query requested search scopes beyond indexed scopes #define DFW_IGNORE_INDEXNOTCOMPLETE 0x00000002 // ci not done indexing #define ESFITEM_ICONOVERLAYSET 0x00000001 typedef struct { DWORD dwMask; DWORD dwState; // State of the item; int iIcon; ITEMIDLIST idl; // find pidl bits (with hidden stuff embedded), variable length } FIND_ITEM; // Currently the state above is LVIS_SELECTED and LVIS_FOCUSED (low two bits) // Add a bit to use in the processing of updatedir #define CDFITEM_STATE_MAYBEDELETE 0x80000000L #define CDFITEM_STATE_MASK (LVIS_SELECTED) // Which states we will hav LV have us track // Definition of the data items that we cache per directory. typedef struct { IShellFolder * psf; // Cache of MRU items BOOL fUpdateDir:1; // Was this node touched by an updatedir... BOOL fDeleteDir:1; // Was this directory removed from the list? // Allocate the pidl at end as variable length ITEMIDLIST idl; // the pidl } FIND_FOLDER_ITEM; #pragma pack(1) typedef struct { HIDDENITEMID hid; WORD iFolder; // index to the folder DPA WORD wFlags; UINT uRow; // Which row in the CI; DWORD dwItemID; // Only used for Async support... ULONG ulRank; // The rank returned by CI... ITEMIDLIST idlParent; // the pidl of the folder this thing came from (fully qualified!) } HIDDENDOCFINDDATA; #pragma pack() #define DFDF_NONE 0x0000 #define DFDF_EXTRADATA 0x0001 typedef UNALIGNED HIDDENDOCFINDDATA * PHIDDENDOCFINDDATA; typedef const UNALIGNED HIDDENDOCFINDDATA * PCHIDDENDOCFINDDATA; // // Define structure that will be saved out to disk. // #define DOCFIND_SIG (TEXT('D') | (TEXT('F') << 8)) typedef struct { WORD wSig; // Signature WORD wVer; // Version DWORD dwFlags; // Flags that controls the sort WORD wSortOrder; // Current sort order WORD wcbItem; // Size of the fixed portion of each item. DWORD oCriteria; // Offset to criterias in list long cCriteria; // Count of Criteria DWORD oResults; // Starting location of results in file long cResults; // Count of items that have been saved to file UINT ViewMode; // The view mode of the file... } DFHEADER_WIN95; typedef struct { WORD wSig; // Signature WORD wVer; // Version DWORD dwFlags; // Flags that controls the sort WORD wSortOrder; // Current sort order WORD wcbItem; // Size of the fixed portion of each item. DWORD oCriteria; // Offset to criterias in list long cCriteria; // Count of Criteria DWORD oResults; // Starting location of results in file long cResults; // Count of items that have been saved to file UINT ViewMode; // The view mode of the file... DWORD oHistory; // IPersistHistory::Save offset } DFHEADER; // The check in Win95/NT4 would fail to read the DFHEADER structure if // the wVer field was > 3, which is unfortunate since the DFHEADER struct is // backwards compiatible (that's why it uses offsets). So we either // go through the pain of revving the stream format in a backwards // compatible way (not impossible, just a pain in the brain), or simply // rev the version and add our new fields and call the Win95/NT4 problem // a bug and punt. I'm leaning towards "bug" as this is a rarely used feature. #define DF_CURFILEVER_WIN95 3 #define DF_CURFILEVER 4 // define the format of the column information. typedef struct { WORD wNum; // Criteria number (cooresponds to dlg item id) WORD cbText; // size of text including null char (DavePl: code using this now assumes byte count) } DFCRITERIA; // Formats for saving find criteria. #define DFC_FMT_UNICODE 1 #define DFC_FMT_ANSI 2 // This is a subset of fileinfo structure typedef struct { WORD flags; // FIF_ bits WORD timeLastWrite; WORD dateLastWrite; WORD dummy; // 16/32 bit compat. //the compiler adds this padding // remove and use if needed DWORD dwSize; // size of the file WORD cbPath; // size of the text (0 implies use previous files) WORD cbName; // Size of name including NULL. } DFITEM; STDAPI CreateNameSpaceFindFilter(IFindFilter **ppff); STDAPI_(BOOL) SetupWildCardingOnFileSpec(LPTSTR pszSpecIn, LPTSTR * pszSpecOut); STDAPI CreateDefaultComputerFindFilter(IFindFilter **ppff); STDAPI CreateOleDBEnum( IFindFilter * pdfff, IShellFolder *psf, LPWSTR *apwszPaths, UINT *pcPaths, DWORD grfFlags, int iColSort, LPTSTR pszProgressText, IRowsetWatchNotify *prwn, IFindEnum **ppdfenum); #undef INTERFACE #define INTERFACE IFindControllerNotify // This interface is used to let the callback class talk to the class that is actually controlling // the queries and the like. DECLARE_INTERFACE_(IFindControllerNotify, IUnknown) { // IUnknown STDMETHOD(QueryInterface) (THIS_ REFIID riid, void ** ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IFindControllerNotify methods *** STDMETHOD(DoSortOnColumn)(THIS_ UINT iCol, BOOL fSameCol) PURE; STDMETHOD(SaveSearch)(THIS) PURE; STDMETHOD(RestoreSearch)(THIS) PURE; STDMETHOD(StopSearch)(THIS) PURE; STDMETHOD(GetItemCount)(THIS_ UINT *pcItems) PURE; STDMETHOD(SetItemCount)(THIS_ UINT cItems) PURE; STDMETHOD(ViewDestroyed)(THIS) PURE; }; typedef struct { LPITEMIDLIST pidlSaveFile; // [in, out] most recent pidl saved to DWORD dwFlags; // [in, out] current flag state int SortMode; // [in] current sort mode } DFBSAVEINFO; #undef INTERFACE #define INTERFACE IFindFolder DECLARE_INTERFACE_(IFindFolder, IUnknown) { // IUnknown STDMETHOD(QueryInterface) (THIS_ REFIID riid, void ** ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IFindFolder STDMETHOD(GetFindFilter)(THIS_ IFindFilter **pdfff) PURE; STDMETHOD(AddPidl)(THIS_ int i, LPCITEMIDLIST pidl, DWORD dwItemID, FIND_ITEM **ppItem) PURE; STDMETHOD(GetItem)(THIS_ int iItem, FIND_ITEM **ppItem) PURE; STDMETHOD(DeleteItem)(THIS_ int iItem) PURE; STDMETHOD(GetItemCount)(THIS_ INT *pcItems) PURE; STDMETHOD(ValidateItems)(THIS_ IUnknown *punk, int iItemFirst, int cItems, BOOL bSearchComplete) PURE; STDMETHOD(GetFolderListItemCount)(THIS_ INT *pcCount) PURE; STDMETHOD(GetFolderListItem)(THIS_ int iItem, FIND_FOLDER_ITEM **ppItem) PURE; STDMETHOD(GetFolder)(THIS_ int iFolder, REFIID riid, void **ppv) PURE; STDMETHOD_(UINT,GetFolderIndex)(THIS_ LPCITEMIDLIST pidl) PURE; STDMETHOD(SetItemsChangedSinceSort)(THIS) PURE; STDMETHOD(ClearItemList)(THIS) PURE; STDMETHOD(ClearFolderList)(THIS) PURE; STDMETHOD(AddFolder)(THIS_ LPITEMIDLIST pidl, BOOL fCheckForDup, int *piFolder) PURE; STDMETHOD(SetAsyncEnum)(THIS_ IFindEnum *pdfEnumAsync) PURE; STDMETHOD(GetAsyncEnum)(THIS_ IFindEnum **ppdfEnumAsync) PURE; STDMETHOD(SetAsyncCount)(THIS_ DBCOUNTITEM cCount) PURE; STDMETHOD(CacheAllAsyncItems)(THIS) PURE; STDMETHOD_(BOOL,AllAsyncItemsCached)(THIS) PURE; STDMETHOD(ClearSaveStateList)(THIS) PURE; STDMETHOD(GetStateFromSaveStateList)(THIS_ DWORD dwItemID, DWORD *pdwState) PURE; STDMETHOD(MapToSearchIDList)(LPCITEMIDLIST pidl, BOOL fMapToReal, LPITEMIDLIST *ppidl) PURE; STDMETHOD(GetParentsPIDL)(LPCITEMIDLIST pidl, LPITEMIDLIST *ppidlParent) PURE; STDMETHOD(RememberSelectedItems)(THIS) PURE; STDMETHOD(SetControllerNotifyObject)(IFindControllerNotify *pdfcn) PURE; STDMETHOD(GetControllerNotifyObject)(IFindControllerNotify **ppdfcn) PURE; STDMETHOD(SaveFolderList)(THIS_ IStream *pstm) PURE; STDMETHOD(RestoreFolderList)(THIS_ IStream *pstm) PURE; STDMETHOD(SaveItemList)(THIS_ IStream *pstm) PURE; STDMETHOD(RestoreItemList)(THIS_ IStream *pstm, int *pcItems) PURE; STDMETHOD(RestoreSearchFromSaveFile)(LPCITEMIDLIST pidlSaveFile, IShellFolderView *psfv) PURE; STDMETHOD_(BOOL,HandleUpdateDir)(LPCITEMIDLIST pidl, BOOL fCheckSubDirs) PURE; STDMETHOD_(void,HandleRMDir)(IShellFolderView *psfv, LPCITEMIDLIST pidl) PURE; STDMETHOD_(void,UpdateOrMaybeAddPidl)(IShellFolderView *psfv, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlOld) PURE; STDMETHOD_(void,Save)(IFindFilter* pdfff, HWND hwnd, DFBSAVEINFO * pSaveInfo, IShellView* psv, IUnknown * pObject) PURE; STDMETHOD(OpenContainingFolder)(IUnknown *punkSite) PURE; STDMETHOD(AddDataToIDList)(LPCITEMIDLIST pidl, int iFolder, LPCITEMIDLIST pidlFolder, UINT uFlags, UINT uRow, DWORD dwItemID, ULONG ulRank, LPITEMIDLIST *ppidl) PURE; }; STDAPI CFindItem_Create(HWND hwnd, IFindFolder *pdfFolder, IContextMenu **ppcm); EXTERN_C const GUID IID_IFindFolder; EXTERN_C const GUID IID_IFindFilter; EXTERN_C const GUID IID_IFindControllerNotify; #endif // !_INC_DOCFIND