|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 2000.
//
// File: IRest.hxx
//
// Contents: Internal query restrictions
//
// Classes: CInternalPropertyRestriction
// COccRestriction
// CWordRestriction
// CSynRestriction
// CRangeRestriction
// CUnfilteredRestriction
// CScopeRestriction
// CPhraseRestriction
//
// History: 19-Sep-91 BartoszM Implemented.
// 30-Nov-92 KyleP Removed CPhraseXpr
//
//----------------------------------------------------------------------------
#pragma once
DECLARE_SMARTP( Restriction ) DECLARE_SMARTP( NodeRestriction ) DECLARE_SMARTP( NotRestriction )
#define INIT_PHRASE_WORDS 4
#if CIDBG == 1
void Display( CRestriction * pxp, int indent, ULONG infolevel ); #endif // DBG == 1
//
// Internal node types
//
int const RTWord = 0xffffffff; int const RTSynonym = 0xfffffffe; int const RTPhrase = 0xfffffffd; int const RTRange = 0xfffffffc; int const RTIndexedProp = 0xfffffffb; int const RTInternalProp = 0xfffffffa;
const ULONG RTScope = 9; // moved from querys.idl
// This is a helper function for unmarshalling a wide string from a stream.
// This can't be in memdeser since it calls CoTaskMemAlloc, which isn't
// available in ntdll.dll
WCHAR * UnMarshallWideString( PDeSerStream & stm ); WCHAR * UnMarshallWideStringNew( PDeSerStream & stm );
BOOL ValidateScopeRestriction( CRestriction * prestScope );
//+-------------------------------------------------------------------------
//
// Class: CInternalPropertyRestriction
//
// Purpose: Property <relop> constant restriction
//
// History: 21-Jan-92 KyleP Created
//
// Notes: Identical to CPropertyRestriction except the Property
// name string is replaced with a pid.
//
//--------------------------------------------------------------------------
class CInternalPropertyRestriction : public CRestriction { public:
//
// Constructors
//
inline CInternalPropertyRestriction();
CInternalPropertyRestriction( ULONG relop, PROPID pid, CStorageVariant const & prval, CRestriction * pcrstHelper = 0 ); CInternalPropertyRestriction( CInternalPropertyRestriction const & intPropRst ); CInternalPropertyRestriction *Clone() const;
//
// Destructor
//
~CInternalPropertyRestriction();
//
// Validity check
//
inline BOOL IsValid() const;
//
// Serialization
//
void Marshall( PSerStream & stm ) const; CInternalPropertyRestriction( ULONG ulWeight, PDeSerStream & stm );
//
// Member variable access
//
inline void SetRelation( ULONG relop ); inline ULONG Relation() const;
inline void SetPid( PROPID pid ); inline PROPID Pid() const;
inline void SetValue( double dValue ); inline void SetValue( ULONG ulValue ); inline void SetValue( LONG lValue ); inline void SetValue( BOOL fValue );
inline void SetValue( FILETIME ftValue );
void SetValue( BLOB & bValue ); void SetValue( GUID & guidValue ); void SetValue( WCHAR * pwcsValue );
inline CStorageVariant const & Value() const;
//
// A content helper is a content index restriction that
// may help to resolve the property restriction.
//
inline CRestriction * GetContentHelper() const; inline CRestriction * AcquireContentHelper(); inline void SetContentHelper( CRestriction * pcrst );
private:
ULONG _relop; // Relation
PROPID _pid; // Property
CStorageVariant _prval; // Constant value
CRestriction * _pcrst; // Expanded content restriction (for strings)
};
//+---------------------------------------------------------------------------
//
// Class: COccRestriction
//
// Purpose: Occurrence restriction
//
// History: 29-Nov-94 SitaramR Created
//
//----------------------------------------------------------------------------
class COccRestriction : public CRestriction { public: COccRestriction( ULONG ulType, ULONG ulWeight, OCCURRENCE occ, ULONG cPrevNoiseWords, ULONG cPostNoiseWords ); ~COccRestriction();
//
// Validity check
//
BOOL IsValid() const;
//
// serialization
//
void Marshall( PSerStream& stm) const; COccRestriction( ULONG ulType, ULONG ulWeight, PDeSerStream& stm);
COccRestriction *Clone() const;
OCCURRENCE Occurrence() const { return _occ; } void SetOccurrence( OCCURRENCE occ) { _occ = occ; }
ULONG CountPrevNoiseWords() const { return _cPrevNoiseWords; } ULONG CountPostNoiseWords() const { return _cPostNoiseWords; } void AddCountPostNoiseWords( ULONG cWords ) { _cPostNoiseWords += cWords; }
protected: OCCURRENCE _occ; ULONG _cPrevNoiseWords; ULONG _cPostNoiseWords; };
//+---------------------------------------------------------------------------
//
// Class: CWordRestriction
//
// Purpose: Word expression
//
// Interface:
//
// History: 19-Sep-91 BartoszM Created
// 05-Sep-92 MikeHew Added Serialization
// 14-Jan-93 KyleP Converted to restriction
//
//----------------------------------------------------------------------------
class CWordRestriction : public COccRestriction { public:
//
// Constructors
//
CWordRestriction ( const CKeyBuf& keybuf, OCCURRENCE occ, ULONG cPrevNoiseWords, ULONG cPostNoiseWords, BOOL isRange ); CWordRestriction ( const CWordRestriction& wordRst );
//
// Destructor
//
~CWordRestriction();
//
// Validity check
//
inline BOOL IsValid() const;
//
// Serialization
//
void Marshall( PSerStream & stm ) const; CWordRestriction( ULONG ulWeight, PDeSerStream & stm );
CWordRestriction *Clone() const;
//
// Member variable access
//
BOOL IsRange() const { return _isRange; } const CKey* GetKey() const { return &_key; } PROPID Pid() const { return _key.Pid(); } void SetPid( PROPID pid ) { _key.SetPid( pid ); }
private: CKey _key; BOOL _isRange; };
//+---------------------------------------------------------------------------
//
// Class: CSynRestriction
//
// Purpose: Synonym expression
//
// History: 07-Feb-92 BartoszM Created
// 05-Sep-92 MikeHew Added Serialization
// 14-Jan-93 KyleP Converted to restriction
//
//----------------------------------------------------------------------------
class CSynRestriction : public COccRestriction { public: //
// Constructors
//
CSynRestriction ( const CKey& key, OCCURRENCE occ, ULONG cPrevNoiseWords, ULONG cPostNoiseWords, BOOL isRange ); CSynRestriction( CSynRestriction& synRst );
//
// Destructor
//
~CSynRestriction();
//
// Validity check
//
inline BOOL IsValid() const;
//
// Serialization
//
void Marshall( PSerStream & stm ) const; CSynRestriction( ULONG ulWeight, PDeSerStream & stm );
CSynRestriction *Clone() const;
//
// Member variable access
//
void AddKey ( const CKeyBuf& Key ); CKeyArray& GetKeys() { return _keyArray; }
BOOL IsRange() { return _isRange; }
private: CKeyArray _keyArray; BOOL _isRange; };
//+---------------------------------------------------------------------------
//
// Class: CRangeRestriction
//
// Purpose: Range expression
//
// History: 24-Sep-91 BartoszM Created
// 14-Jan-93 KyleP Converted to restriction
//
//----------------------------------------------------------------------------
class CRangeRestriction : public CRestriction { public: //
// Constructors
//
CRangeRestriction (); CRangeRestriction( const CRangeRestriction& rangeRst ); CRangeRestriction *Clone() const;
//
// Destructor
//
~CRangeRestriction();
//
// Validity check
//
inline BOOL IsValid() const;
//
// Serialization
//
void Marshall( PSerStream & stm ) const; CRangeRestriction( ULONG ulWeight, PDeSerStream & stm );
//
// Member variable access
//
void SetStartKey ( const CKeyBuf& keyStart ); void SetEndKey ( const CKeyBuf& keyEnd );
PROPID Pid() const { Win4Assert(_keyStart.Pid() == _keyEnd.Pid() ); return _keyStart.Pid(); }
const CKey* GetStartKey() const { return &_keyStart; } const CKey* GetEndKey() const { return &_keyEnd; }
private: CKey _keyStart; CKey _keyEnd; };
class CUnfilteredRestriction : public CRangeRestriction { public:
CUnfilteredRestriction(); };
//+-------------------------------------------------------------------------
//
// Class: CScopeRestriction
//
// Purpose: Scope restriction
//
// History: 07-Jan-93 KyleP Created
//
//--------------------------------------------------------------------------
class CScopeRestriction : public CRestriction { public:
//
// Constructors
//
inline CScopeRestriction(); CScopeRestriction( WCHAR const * pwcsPath, BOOL fRecursive, BOOL fVirtual );
//
// Copy constructors/assignment/clone
//
CScopeRestriction & operator =( CScopeRestriction const & source ); CScopeRestriction * Clone() const;
//
// Destructor
//
~CScopeRestriction();
//
// Validity check
//
inline BOOL IsValid() const;
//
// Serialization
//
void Marshall( PSerStream & stm ) const; CScopeRestriction( ULONG ulWeight, PDeSerStream & stm );
//
// Member variable access
//
void SetPath( WCHAR const * pwcsPath ); inline WCHAR const * GetPath() const; inline ULONG PathLength() const; inline const CLowerFunnyPath & GetFunnyPath() const;
//
// Query depth
//
inline void MakeDeep(); inline void MakeShallow();
inline BOOL IsDeep() const; inline BOOL IsShallow() const;
//
// Virtual/Physical scoping.
//
inline void MakePhysical(); inline void MakeVirtual();
inline BOOL IsPhysical() const; inline BOOL IsVirtual() const;
# ifdef CIEXTMODE
void CiExtDump(void *ciExtSelf); # endif
private: BOOL _fValid; CLowerFunnyPath _lowerFunnyPath; ULONG _fRecursive; // Should be BOOL, but MIDL dislikes
ULONG _fVirtual; // Should be BOOL, but MIDL dislikes
};
//+-------------------------------------------------------------------------
//
// Class: CPhraseRestriction
//
// Purpose: Phrase restriction whose children are occurrence restrictions
//
// History: 29-Nov-94 SitaramR Created
//
//--------------------------------------------------------------------------
class CPhraseRestriction : public CNodeRestriction { public:
CPhraseRestriction( unsigned cInitAllocated = 2 ) : CNodeRestriction( RTPhrase, cInitAllocated ) { } ~CPhraseRestriction();
//
// De-serialization (serialization is done by CNodeRestriction only, because
// there are no data members in CPhraseRestriction)
//
CPhraseRestriction( ULONG ulWeight, PDeSerStream & stm );
//
// Node manipulation
//
void AddChild( CRestriction * presChild, unsigned & pos ) { Win4Assert( presChild->Type() == RTWord || presChild->Type() == RTSynonym ); CNodeRestriction::AddChild( presChild, pos ); }
void AddChild( CRestriction * presChild ) { Win4Assert( presChild->Type() == RTWord || presChild->Type() == RTSynonym ); CNodeRestriction::AddChild( presChild ); }
COccRestriction * RemoveChild( unsigned pos ) { CRestriction *pRst = CNodeRestriction::RemoveChild( pos );
#if CIDBG == 1
if ( pRst ) Win4Assert( pRst->Type() == RTWord || pRst->Type() == RTSynonym ); #endif
return (COccRestriction *)pRst; }
//
// Member variable access
//
void SetChild( CRestriction * presChild, unsigned pos ) { Win4Assert( presChild->Type() == RTWord || presChild->Type() == RTSynonym ); CNodeRestriction::SetChild( presChild, pos ); }
COccRestriction * GetChild( unsigned pos ) const { CRestriction *pRst = CNodeRestriction::GetChild( pos );
#if CIDBG == 1
if ( pRst ) Win4Assert( pRst->Type() == RTWord || pRst->Type() == RTSynonym ); #endif
return (COccRestriction *)pRst; } };
DECLARE_SMARTP( ScopeRestriction )
inline CInternalPropertyRestriction::CInternalPropertyRestriction() : CRestriction( RTInternalProp, MAX_QUERY_RANK ) { }
inline BOOL CInternalPropertyRestriction::IsValid() const { return ( _pid != pidInvalid && _prval.IsValid() && ( 0 == _pcrst || _pcrst->IsValid() ) ); }
inline void CInternalPropertyRestriction::SetRelation( ULONG relop ) { _relop = relop; }
inline ULONG CInternalPropertyRestriction::Relation() const { return _relop; }
inline void CInternalPropertyRestriction::SetPid( PROPID pid ) { _pid = pid; }
inline PROPID CInternalPropertyRestriction::Pid() const { return _pid; }
inline void CInternalPropertyRestriction::SetValue( double dValue ) { _prval = dValue; }
inline void CInternalPropertyRestriction::SetValue( ULONG ulValue ) { _prval.SetUI4( ulValue ); }
inline void CInternalPropertyRestriction::SetValue( LONG lValue ) { _prval = lValue; }
inline void CInternalPropertyRestriction::SetValue( BOOL fValue ) { _prval.SetBOOL( fValue ? VARIANT_TRUE : VARIANT_FALSE ); }
inline void CInternalPropertyRestriction::SetValue( FILETIME ftValue ) { _prval = ftValue; }
inline CStorageVariant const & CInternalPropertyRestriction::Value() const { return( _prval ); }
inline CRestriction * CInternalPropertyRestriction::GetContentHelper() const { return( _pcrst ); }
inline CRestriction * CInternalPropertyRestriction::AcquireContentHelper() { CRestriction * pTemp = _pcrst; _pcrst = 0; return( pTemp ); }
inline void CInternalPropertyRestriction::SetContentHelper( CRestriction * pcrst ) { Win4Assert( _pcrst == 0 ); _pcrst = pcrst; }
//
// CWordRestriction inline
//
inline BOOL CWordRestriction::IsValid() const { return ( 0 != _key.GetBuf() ); }
//
// CSynRestriction inline
//
inline BOOL CSynRestriction::IsValid() const { for ( int i = 0; i < _keyArray.Count(); i++ ) { if ( 0 == _keyArray.Get(i).GetBuf() ) return FALSE; }
return TRUE; }
//
// CRangeRestriction inline
//
inline BOOL CRangeRestriction::IsValid() const { return ( 0 != _keyStart.GetBuf() && 0 != _keyEnd.GetBuf() ); }
//
// CScopeRestriction inline
//
inline CScopeRestriction::CScopeRestriction() : CRestriction( RTScope, MAX_QUERY_RANK ), _fValid(FALSE) { }
inline BOOL CScopeRestriction::IsValid() const { return ( _fValid ); }
// returns the Actual Path
inline WCHAR const * CScopeRestriction::GetPath() const { return _fValid ? _lowerFunnyPath.GetActualPath() : NULL; }
// returns the actual path length
inline ULONG CScopeRestriction::PathLength() const { return _lowerFunnyPath.GetActualLength(); }
// Returns funny path
inline const CLowerFunnyPath & CScopeRestriction::GetFunnyPath() const { return _lowerFunnyPath; }
inline void CScopeRestriction::MakeDeep() { _fRecursive = TRUE; }
inline void CScopeRestriction::MakeShallow() { _fRecursive = FALSE; }
inline BOOL CScopeRestriction::IsDeep() const { return ( _fRecursive == TRUE ); }
inline BOOL CScopeRestriction::IsShallow() const { return ( _fRecursive == FALSE ); }
inline void CScopeRestriction::MakePhysical() { _fVirtual = FALSE; }
inline void CScopeRestriction::MakeVirtual() { _fVirtual = TRUE; }
inline BOOL CScopeRestriction::IsPhysical() const { return ( _fVirtual == FALSE ); }
inline BOOL CScopeRestriction::IsVirtual() const { return ( _fVirtual == TRUE ); }
|