451 lines
13 KiB
C++
451 lines
13 KiB
C++
/******************************************************************************
|
|
|
|
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);
|
|
}
|