windows-nt/Source/XPSP1/NT/inetsrv/query/h/fdaemon.hxx
2020-09-26 16:20:57 +08:00

251 lines
7.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 2000.
//
// File: FDAEMON.HXX
//
// Contents: Filter Daemon
//
// Classes: CFilterDaemon
//
// History: 26-Mar-93 AmyA Created
//
//----------------------------------------------------------------------------
#pragma once
#include <pfilter.hxx> // STATUS
#include <perfobj.hxx>
#include <time.h>
#include <imprsnat.hxx>
#include <ciintf.h>
#include <lang.hxx>
#include <pidmap.hxx>
class CFullPropSpec;
class CStorageVariant;
class CCI;
class PCatalog;
//+---------------------------------------------------------------------------
//
// Class: CNonStoredProps
//
// Purpose: Tracks properties that shouldn't be stored in the property cache
//
// History: 9-Feb-97 dlee Created.
//
//----------------------------------------------------------------------------
class CNonStoredProps
{
public:
enum { maxCachedSpecs = 20 };
CNonStoredProps() : _cSpecs( 0 ), _cMetaSpecs( 0 )
{
RtlZeroMemory( _afStgPropNonStored, sizeof _afStgPropNonStored );
}
void Add( CFullPropSpec const & ps );
BOOL IsNonStored( CFullPropSpec const & ps );
private:
BOOL _afStgPropNonStored[ CSTORAGEPROPERTY ];
int _cMetaSpecs;
CFullPropSpec _aMetaSpecs[ maxCachedSpecs ];
int _cSpecs;
CFullPropSpec _aSpecs[ maxCachedSpecs ];
};
//+-------------------------------------------------------------------------
//
// Class: CiProxy
//
// Purpose: Channel between filter daemon and content index
//
// History: 01-Aug-93 KyleP Modified
//
//--------------------------------------------------------------------------
class CiProxy : public PPidConverter
{
public:
virtual ~CiProxy() {}
virtual SCODE FilterReady( BYTE * docBuffer,
ULONG & cb,
ULONG cMaxDocs ) = 0;
virtual SCODE FilterDataReady ( BYTE const * pEntryBuf,
ULONG cb ) = 0;
virtual SCODE FilterMore( STATUS const * aStatus, ULONG cStatus ) = 0;
virtual SCODE FilterDone( STATUS const * aStatus, ULONG cStatus ) = 0;
virtual SCODE FilterStoreValue( WORKID widFake,
CFullPropSpec const & ps,
CStorageVariant const & var,
BOOL & fCanStore ) = 0;
virtual SCODE FilterStoreSecurity( WORKID widFake,
PSECURITY_DESCRIPTOR pSD,
ULONG cbSD,
BOOL & fCanStore ) = 0;
};
class CCiFrameworkParams;
//+---------------------------------------------------------------------------
//
// Class: CFilterDaemon
//
// Purpose: Contains the filter driver and a reference to CCI.
//
// History: 26-Mar-93 AmyA Created.
//
// Notes:
//
//----------------------------------------------------------------------------
class CFilterDaemon
{
friend class CFilterDocument;
public:
CFilterDaemon ( CiProxy & proxy,
CCiFrameworkParams & params,
CLangList & LangList,
BYTE * buf,
ULONG cbMax,
ICiCFilterClient *pICiCFilterClient );
~CFilterDaemon();
SCODE FilterDataReady ( const BYTE * pEntryBuf, ULONG cb );
SCODE FilterStoreValue( WORKID widFake,
CFullPropSpec const & ps,
CStorageVariant const & var,
BOOL & fCanStore );
SCODE FilterStoreSecurity( WORKID widFake,
PSECURITY_DESCRIPTOR pSD,
ULONG cbSD,
BOOL & fCanStore );
SCODE DoUpdates();
const ULONG GetFilteredDocuments() const { return _cFilteredDocuments; }
const ULONG GetFilteredBlocks() const { return _cFilteredBlocks; }
VOID StopFiltering();
BOOL IsFilteringStopped() const { return _fStopFilter; }
BOOL IsWaitingForDocument();
private:
void FilterDocs();
BYTE * _docBuffer;
ULONG _cbTotal;
ULONG _cbHdr;
ULONG _cbDocBuffer;
CiProxy & _proxy;
XInterface<ICiCAdviseStatus> _xAdviseStatus;
XInterface<ICiCFilterClient> _xFilterClient;
XInterface<ICiCFilterStatus> _xFilterStatus;
CCiFrameworkParams & _params;
CI_CLIENT_FILTER_CONFIG_INFO _configInfo;
CPidMapper _pidmap; // Must be after _proxy
CLangList & _LangList;
ULONG _cFilteredDocuments;
ULONG _cFilteredBlocks;
BYTE const * _pbCurrentDocument;
ULONG _cbCurrentDocument;
BOOL _fStopFilter;
BOOL _fWaitingForDocument;
CMutexSem _mutex;
BOOL _fOwned; // Set to TRUE if the buffer is owned
BYTE * _entryBuffer; // buffer for CEntryBuffer
ULONG _cbMax; // Number of bytes in the buffer
CNonStoredProps _NonStoredProps;
};
//+---------------------------------------------------------------------------
//
// Member: CFilterDaemon::FilterStoreValue
//
// Synopsis: Store a property value.
//
// Arguments: [widFake] -- Fake workid (1 - MAX_DOCS_IN_WORDLIST)
// [ps] -- Property descriptor
// [var] -- Value
// [fCanStore] -- on return, TRUE if store succeeded
//
// History: 21-Dec-95 KyleP Created
//
//----------------------------------------------------------------------------
inline SCODE CFilterDaemon::FilterStoreValue( WORKID widFake,
CFullPropSpec const & ps,
CStorageVariant const & var,
BOOL & fCanStore )
{
return _proxy.FilterStoreValue( widFake, ps, var, fCanStore );
}
//+---------------------------------------------------------------------------
//
// Member: CFilterDaemon::FilterStoreSecurity
//
// Synopsis: Store a file's security descriptor, and map to SDID
//
// Arguments: [widFake] -- Fake workid (1 - MAX_DOCS_IN_WORDLIST)
// [pSD] -- pointer to security descriptor
// [cbSD] -- size in bytes of security descriptor
// [fCanStore] -- on return, TRUE if store succeeded
//
// History: 07 Feb 96 AlanW Created
//
//----------------------------------------------------------------------------
inline SCODE CFilterDaemon::FilterStoreSecurity( WORKID widFake,
PSECURITY_DESCRIPTOR pSD,
ULONG cbSD,
BOOL & fCanStore )
{
return _proxy.FilterStoreSecurity( widFake, pSD, cbSD, fCanStore );
}
// Default implementation of CiProxy::FilterStoreSecurity; only used for
// downlevel index.
inline SCODE CiProxy::FilterStoreSecurity( WORKID widFake,
PSECURITY_DESCRIPTOR pSD,
ULONG cbSD,
BOOL & fCanStore )
{
fCanStore = FALSE;
return S_OK;
}