windows-nt/Source/XPSP1/NT/inetsrv/query/apps/srch/brmodel.cxx
2020-09-26 16:20:57 +08:00

189 lines
5 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: model.cxx
//
// Contents: The Model part of the browser
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#define TheSearch _pSearch
//+-------------------------------------------------------------------------
//
// Member: Model::Model, public
//
// Synopsis:
//
//--------------------------------------------------------------------------
Model::Model ()
: _pResult(0),
_aDoc(0),
_cForce(0),
_fHiliteAll( FALSE ),
_iDoc(0),
_pSearch(0)
{}
//+-------------------------------------------------------------------------
//
// Member: Model::~Model, public
//
// Synopsis:
//
//--------------------------------------------------------------------------
Model::~Model()
{
for ( unsigned i = 0; i < _cDoc; i++ )
delete _aDoc[i];
delete []_aDoc;
delete _pResult;
if (TheSearch)
TheSearch->Release();
}
//+-------------------------------------------------------------------------
//
// Member: Model::Force, public
//
// Synopsis: Display a subset of files
//
//--------------------------------------------------------------------------
void Model::Force ( char* pStr )
{
while (_cForce < MAX_FORCE && isdigit(*pStr) )
{
_aForce[_cForce] = (unsigned)atoi ( pStr );
_cForce++;
while (*pStr && isdigit(*pStr) )
pStr++;
while (*pStr && isspace(*pStr))
pStr++;
}
}
typedef HRESULT (__stdcall * PFnMakeISearch)( ISearchQueryHits ** ppSearch,
DBCOMMANDTREE const * pRst,
WCHAR const * pwcPath );
PFnMakeISearch g_pMakeISearch = 0;
SCODE MyMakeISearch( ISearchQueryHits **ppSearch,
DBCOMMANDTREE const * pRst,
WCHAR const * pwcPath )
{
if ( 0 == g_pMakeISearch )
{
#ifdef _WIN64
char const * pcMakeISearch = "?MakeISearch@@YAJPEAPEAUISearchQueryHits@@PEAVCDbRestriction@@PEBG@Z";
#else
char const * pcMakeISearch = "?MakeISearch@@YGJPAPAUISearchQueryHits@@PAVCDbRestriction@@PBG@Z";
#endif
g_pMakeISearch = (PFnMakeISearch) GetProcAddress( GetModuleHandle( L"query.dll" ), pcMakeISearch );
if ( 0 == g_pMakeISearch )
return HRESULT_FROM_WIN32( GetLastError() );
}
return g_pMakeISearch( ppSearch,
pRst,
pwcPath );
} //MyMakeISearch
//+-------------------------------------------------------------------------
//
// Member: Model::CollectFiles, public
//
// Synopsis: Parse command line, get restriction and list of docs,
// create array of docs, initialize the first one.
// In response to window creation
//
//--------------------------------------------------------------------------
SCODE Model::CollectFiles ( CQueryResult *pResult )
{
_pResult = pResult;
_cDoc = 1;
_aDoc = new Document * [ _cDoc ];
unsigned countSoFar = 0;
for ( unsigned iDoc = 0; iDoc< _cDoc; iDoc++)
{
if (_cForce == 0 || isForced(iDoc))
{
Document * newDoc = new Document( pResult->_pwcPath,
1000,
pResult->_fDeleteWhenDone );
//
// Insert into sorted list of documents
//
unsigned i=0;
while ( i < countSoFar && newDoc->Rank() <= _aDoc[i]->Rank() )
i++;
// _aDoc[i]->Rank() > newDoc->Rank() || i == countSoFar
for ( unsigned j = countSoFar; j > i; j-- )
_aDoc[j] = _aDoc[j-1];
_aDoc[i] = newDoc;
countSoFar++;
}
}
_iDoc = 0;
_cDoc = countSoFar;
SCODE sc = MyMakeISearch( &TheSearch, _pResult->_pTree, pResult->_pwcPath );
if ( !FAILED( sc ) && 0 != TheSearch )
return InitDocument();
return sc;
}
//+-------------------------------------------------------------------------
//
// Member: Model::isForced, public
//
// Synopsis: Check if idx is on a forced list
//
//--------------------------------------------------------------------------
BOOL Model::isForced(unsigned idx)
{
for (unsigned i = 0; i < _cForce; i++)
if (_aForce[i] == idx)
return(TRUE);
return(FALSE);
}
//+-------------------------------------------------------------------------
//
// Member: Model::InitDocument, public
//
// Synopsis: Initialize current document
//
//--------------------------------------------------------------------------
SCODE Model::InitDocument()
{
if ( 0 == _cDoc )
return E_FAIL;
SCODE sc = S_OK;
if ( !_aDoc[_iDoc]->IsInit() )
sc = _aDoc[_iDoc]->Init( TheSearch );
if ( SUCCEEDED( sc ) )
_hitIter.Init ( _aDoc[_iDoc] );
return sc;
}