//  10/12/99    scotthan    created

#ifndef __FILTGREP_H__
#define __FILTGREP_H__

#if WINNT

#ifndef _USE_FILTERGREP_
#define _USE_FILTERGREP_
#endif//_USE_FILTERGREP_

#include <filter.h> // STAT_CHUNK

//  CFilterGrep::Initialize() dwFlags values:
#define FGIF_CASESENSITIVE      0x00000001  // grep in case-sensitive manner
#define FGIF_GREPFILENAME       0x00000002  // grep filename
#define FGIF_GREPCONTENT        0x00000004  // grep content
#define FGIF_GREPPROPERTIES     0x00000008  // grep properties
#define FGIF_BLANKETGREP        (FGIF_GREPCONTENT|FGIF_GREPPROPERTIES)

#ifdef __cplusplus

class CGrepTokens;

class CFilterGrep  // filtergrep state engine
{
public:
    //  Methods
    STDMETHODIMP Initialize(UINT nCodePage, LPCWSTR pszMatch, LPCWSTR pszExclude, DWORD dwFlags);
    STDMETHODIMP Grep(IShellFolder *psf, LPCITEMIDLIST pidl, LPCTSTR pszName);
    STDMETHODIMP Reset();

    //  Properties
    STDMETHODIMP GetMatchTokens( OUT LPWSTR pszMatch, UINT cchMatch ) const;
    STDMETHODIMP GetExcludeTokens( OUT LPWSTR pszMatch, UINT cchMatch ) const;

private:
    //  Helpers
    STDMETHODIMP _GetThreadGrepBuffer( DWORD dwThreadID, ULONG cchNeed, LPWSTR* ppszBuf );
    STDMETHODIMP_(void)     _ClearGrepBuffers();

    STDMETHODIMP _GrepText( IFilter* pFilter, STAT_CHUNK* pstat, DWORD dwThreadID );
    STDMETHODIMP _GrepValue( IFilter* pFilter, STAT_CHUNK* pstat );
    
    STDMETHODIMP _GrepProperties(IPropertySetStorage *pss);
    STDMETHODIMP _GrepPropStg(IPropertyStorage* pstg, ULONG cspec, PROPSPEC rgspec[]);
    STDMETHODIMP _GrepEnumPropStg(IPropertyStorage* pstg);
    STDMETHODIMP_(BOOL) _IsRestrictedFileType(LPCWSTR pwszFile);

    void         _EnterCritical()   { EnterCriticalSection( &_critsec ); }
    void         _LeaveCritical()   { LeaveCriticalSection( &_critsec ); }

    //  Data
    HDPA             _hdpaGrepBuffers;
    CRITICAL_SECTION _critsec;
    BOOL             _fcritsec;
    CGrepTokens*     _pTokens;
    DWORD            _dwFlags;
    LPWSTR           _pwszContentRestricted,
                     _pwszPropertiesRestricted;

public:
    //  Ctor, Dtor
    CFilterGrep(); 
    ~CFilterGrep();

    STDMETHODIMP InitSelf(void);
};

#endif //__cplusplus

#define FACILITY_FILTERGREP         77 // arbitrary
#define MAKE_FILTGREP_ERROR(sc)     MAKE_HRESULT(SEVERITY_ERROR,FACILITY_FILTERGREP,sc)
#define MAKE_FILTGREP_WARNING(sc)   MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_FILTERGREP,sc)

#define FG_E_NOFILTER               MAKE_FILTGREP_ERROR(0x0001) 


#endif WINNT

#endif __FILTGREP_H__