189 lines
5 KiB
C++
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;
|
||
|
}
|