windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/service/database/settings.cpp

451 lines
13 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
Settings.cpp
Abstract:
Handles interaction between a generic user configuration and the related DB.
Revision History:
******************************************************************************/
#include "stdafx.h"
#include <utility.h>
////////////////////////////////////////////////////////////////////////////////
HRESULT Taxonomy::Settings::SplitNodePath( /*[in]*/ LPCWSTR szNodeStr ,
/*[out]*/ MPC::WStringVector& vec )
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::SplitNodePath" );
HRESULT hr;
MPC::wstring strFull( L"<ROOT>" );
if(STRINGISPRESENT(szNodeStr))
{
strFull += L"/";
strFull += szNodeStr;
}
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::SplitAtDelimiter( vec, strFull.c_str(), L"/" ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
////////////////////////////////////////////////////////////////////////////////
Taxonomy::Settings::Settings( /*[in]*/ LPCWSTR szSKU, /*[in]*/ long lLCID ) : HelpSet( szSKU, lLCID )
{
}
Taxonomy::Settings::Settings( /*[in]*/ const HelpSet& ths )
{
*(HelpSet*)this = ths;
}
////////////////////////////////////////////////////////////////////////////////
HRESULT Taxonomy::Settings::BaseDir( /*[out]*/ MPC::wstring& strRES, /*[in]*/ bool fExpand ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::DatabaseFile" );
HRESULT hr;
strRES = HC_HELPSET_ROOT;
if(IsMachineHelp() == false)
{
WCHAR rgDir[MAX_PATH]; _snwprintf( rgDir, MAXSTRLEN(rgDir), L"%s\\%s_%04lx\\", HC_HELPSET_SUB_INSTALLEDSKUS, m_strSKU.c_str(), m_lLCID );
strRES.append( rgDir );
}
if(fExpand)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::SubstituteEnvVariables( strRES ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::HelpFilesDir( /*[out]*/ MPC::wstring& strRES, /*[in]*/ bool fExpand, /*[in]*/ bool fMUI ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::DatabaseFile" );
HRESULT hr;
WCHAR rgDir[MAX_PATH];
if(IsMachineHelp())
{
strRES = HC_HELPSVC_HELPFILES_DEFAULT;
}
else if(fMUI)
{
_snwprintf( rgDir, MAXSTRLEN(rgDir), L"%s\\MUI\\%04lx", HC_HELPSVC_HELPFILES_DEFAULT, m_lLCID );
strRES = rgDir;
}
else
{
__MPC_EXIT_IF_METHOD_FAILS(hr, BaseDir( strRES, fExpand ));
strRES.append( HC_HELPSET_SUB_HELPFILES );
}
if(fExpand)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::SubstituteEnvVariables( strRES ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::DatabaseDir( /*[out]*/ MPC::wstring& strRES ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::DatabaseDir" );
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, BaseDir( strRES ));
strRES.append( HC_HELPSET_SUB_DATABASE L"\\" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::DatabaseFile( /*[out]*/ MPC::wstring& strRES ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::DatabaseFile" );
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, DatabaseDir( strRES ));
strRES.append( HC_HELPSET_SUBSUB_DATABASEFILE );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::IndexFile( /*[out]*/ MPC::wstring& strRES, /*[in]*/ long lScoped ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::IndexFile" );
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, BaseDir( strRES ));
if(lScoped == -1)
{
strRES.append( HC_HELPSET_SUB_INDEX L"\\" HC_HELPSET_SUBSUB_INDEXFILE );
}
else
{
WCHAR rgDir[MAX_PATH];
_snwprintf( rgDir, MAXSTRLEN(rgDir), HC_HELPSET_SUB_INDEX L"\\scoped_%ld.hhk", lScoped );
strRES.append( rgDir );
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::GetDatabase( /*[out]*/ JetBlue::SessionHandle& handle ,
/*[out]*/ JetBlue::Database*& db ,
/*[in ]*/ bool fReadOnly ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::GetDatabase" );
USES_CONVERSION;
HRESULT hr;
MPC::wstring strDB;
db = NULL;
__MPC_EXIT_IF_METHOD_FAILS(hr, DatabaseFile( strDB ));
for(int pass=0; pass<2; pass++)
{
if(SUCCEEDED(hr = JetBlue::SessionPool::s_GLOBAL->GetSession( handle )) &&
SUCCEEDED(hr = handle->GetDatabase ( W2A( strDB.c_str() ), db, /*fReadOnly*/fReadOnly, /*fCreate*/false, /*fRepair*/false )) )
{
break;
}
handle.Release();
db = NULL;
if(pass == 1) __MPC_SET_ERROR_AND_EXIT(hr, hr);
//
// Try to recreate DB...
//
__MPC_EXIT_IF_METHOD_FAILS(hr, CPCHSetOfHelpTopics::RebuildSKU( *this ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
HRESULT Taxonomy::Settings::LookupNode( /*[in]*/ LPCWSTR szNodeStr ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::LookupNode" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupNode - start : %s", SAFEWSTR( szNodeStr ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.LookupNode( szNodeStr, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupNode - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::LookupSubNodes( /*[in]*/ LPCWSTR szNodeStr ,
/*[in]*/ bool fVisibleOnly ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::LookupSubNodes" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupSubNodes - start : %s", SAFEWSTR( szNodeStr ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.LookupSubNodes( szNodeStr, fVisibleOnly, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupSubNodes - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::LookupNodesAndTopics( /*[in]*/ LPCWSTR szNodeStr ,
/*[in]*/ bool fVisibleOnly ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::LookupNodesAndTopics" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupNodesAndTopics - start : %s", SAFEWSTR( szNodeStr ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.LookupNodesAndTopics( szNodeStr, fVisibleOnly, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupNodesAndTopics - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::LookupTopics( /*[in]*/ LPCWSTR szNodeStr ,
/*[in]*/ bool fVisibleOnly ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::LookupTopics" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupTopics - start : %s", SAFEWSTR( szNodeStr ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.LookupTopics( szNodeStr, fVisibleOnly, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LookupTopics - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::KeywordSearch( /*[in]*/ LPCWSTR szQueryStr ,
/*[in]*/ LPCWSTR szSubSite ,
/*[in]*/ CPCHQueryResultCollection* pColl ,
/*[in]*/ MPC::WStringList* lst ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::KeywordSearch" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::KeywordSearch - start : '%s' # %s", SAFEWSTR( szQueryStr ), SAFEWSTR( szSubSite ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.KeywordSearch( szQueryStr, szSubSite, pColl, lst ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::KeywordSearch - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::LocateContext( /*[in]*/ LPCWSTR szURL ,
/*[in]*/ LPCWSTR szSubSite ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::LocateContext" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LocateContext - start : %s # %s", SAFEWSTR( szURL ), SAFEWSTR( szSubSite ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.LocateContext( szURL, szSubSite, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::LocateContext - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::GatherNodes( /*[in]*/ LPCWSTR szNodeStr ,
/*[in]*/ bool fVisibleOnly ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::GatherNodes" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::GatherNodes - start : %s", SAFEWSTR( szNodeStr ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.GatherNodes( szNodeStr, fVisibleOnly, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::GatherNodes - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Settings::GatherTopics( /*[in]*/ LPCWSTR szNodeStr ,
/*[in]*/ bool fVisibleOnly ,
/*[in]*/ CPCHQueryResultCollection* pColl ) const
{
__HCP_FUNC_ENTRY( "Taxonomy::Settings::GatherTopics" );
HRESULT hr;
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::GatherTopics - start : %s", SAFEWSTR( szNodeStr ) );
__MPC_EXIT_IF_METHOD_FAILS(hr, GetDatabase ( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( *this, db, Taxonomy::Cache::s_GLOBAL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.GatherTopics( szNodeStr, fVisibleOnly, pColl ));
DEBUG_AppendPerf( DEBUG_PERF_QUERIES, L"Taxonomy::Settings::GatherTopics - done" );
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}