Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

279 lines
7.1 KiB

/********************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
SAFReg.cpp
Abstract:
File for Implementation of CSAFReg
Revision History:
gschua created 3/22/2000
********************************************************************/
#include "stdafx.h"
static const WCHAR g_rgMutexName [] = L"PCH_SEARCHENGINECONFIG";
static const WCHAR g_rgConfigFilename[] = HC_HCUPDATE_STORE_SE;
/////////////////////////////////////////////////////////////////////
CFG_BEGIN_FIELDS_MAP(SearchEngine::Config::Wrapper)
CFG_ATTRIBUTE( L"SKU" , wstring, m_ths.m_strSKU ),
CFG_ATTRIBUTE( L"LANGUAGE", long , m_ths.m_lLCID ),
CFG_ATTRIBUTE( L"ID" , BSTR , m_bstrID ),
CFG_ATTRIBUTE( L"OWNER" , BSTR , m_bstrOwner ),
CFG_ATTRIBUTE( L"CLSID" , BSTR , m_bstrCLSID ),
CFG_ATTRIBUTE( L"DATA" , BSTR , m_bstrData ),
CFG_END_FIELDS_MAP()
CFG_BEGIN_CHILD_MAP(SearchEngine::Config::Wrapper)
CFG_END_CHILD_MAP()
DEFINE_CFG_OBJECT(SearchEngine::Config::Wrapper,L"WRAPPER")
DEFINE_CONFIG_METHODS__NOCHILD(SearchEngine::Config::Wrapper)
/////////////////////////////////////////////////////////////////////
CFG_BEGIN_FIELDS_MAP(SearchEngine::Config)
CFG_ATTRIBUTE( L"VERSION", double, m_dVersion ),
CFG_END_FIELDS_MAP()
CFG_BEGIN_CHILD_MAP(SearchEngine::Config)
CFG_CHILD(SearchEngine::Config::Wrapper)
CFG_END_CHILD_MAP()
DEFINE_CFG_OBJECT(SearchEngine::Config, L"SEARCHENGINES")
DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(SearchEngine::Config,tag,defSubType)
if(tag == _cfg_table_tags[0])
{
defSubType = &(*(m_lstWrapper.insert( m_lstWrapper.end() )));
return S_OK;
}
DEFINE_CONFIG_METHODS_SAVENODE_SECTION(SearchEngine::Config,xdn)
hr = MPC::Config::SaveList( m_lstWrapper, xdn );
DEFINE_CONFIG_METHODS_END(SearchEngine::Config)
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
SearchEngine::Config::Config() : MPC::NamedMutex( g_rgMutexName )
{
m_bLoaded = false; // double m_dVersion;
m_dVersion = 1; // bool m_bLoaded;
// WrapperList m_lstWrapper;
MPC::NamedMutex::Acquire();
}
SearchEngine::Config::~Config()
{
MPC::NamedMutex::Release();
}
////////////////////////////////////////////////////////////////////////////////
HRESULT SearchEngine::Config::SyncConfiguration( /*[in]*/ bool fLoad )
{
__HCP_FUNC_ENTRY( "SearchEngine::Config::SyncConfiguration" );
HRESULT hr;
MPC::wstring strConfig( g_rgConfigFilename ); MPC::SubstituteEnvVariables( strConfig );
if(fLoad)
{
if(m_bLoaded == false)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::LoadFile( this, strConfig.c_str() ));
m_bLoaded = true;
}
}
else
{
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::SaveFile( this, strConfig.c_str() ));
m_bLoaded = true;
}
hr = S_OK;
__MPC_FUNC_CLEANUP;
__MPC_FUNC_EXIT(hr);
}
bool SearchEngine::Config::FindWrapper( /*[in]*/ const Taxonomy::HelpSet& ths, /*[in]*/ LPCWSTR szID, /*[out]*/ WrapperIter& it )
{
for(it = m_lstWrapper.begin(); it!= m_lstWrapper.end(); it++)
{
if(it->m_ths == ths && it->m_bstrID == szID) return true;
}
return false;
}
////////////////////
HRESULT SearchEngine::Config::RegisterWrapper( /*[in]*/ const Taxonomy::HelpSet& ths ,
/*[in]*/ LPCWSTR szID ,
/*[in]*/ LPCWSTR szOwner ,
/*[in]*/ LPCWSTR szCLSID ,
/*[in]*/ LPCWSTR szData )
{
__HCP_FUNC_ENTRY( "SearchEngine::Config::RegisterWrapper" );
HRESULT hr;
WrapperIter it;
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_STRING_NOT_EMPTY(szID);
__MPC_PARAMCHECK_STRING_NOT_EMPTY(szOwner);
__MPC_PARAMCHECK_STRING_NOT_EMPTY(szCLSID);
__MPC_PARAMCHECK_END();
//
// Make sure its loaded
//
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/true ));
//
// Look for existing wrapper
//
if(FindWrapper( ths, szID, it ) == false)
{
//
// Not found, so create a new Wrapper
//
it = m_lstWrapper.insert( m_lstWrapper.end() );
}
//
// Stuff the values into the wrapper
//
it->m_ths = ths;
it->m_bstrID = szID;
it->m_bstrOwner = szOwner;
it->m_bstrCLSID = szCLSID;
it->m_bstrData = szData;
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/false ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT SearchEngine::Config::UnRegisterWrapper( /*[in]*/ const Taxonomy::HelpSet& ths ,
/*[in]*/ LPCWSTR szID ,
/*[in]*/ LPCWSTR szOwner )
{
__HCP_FUNC_ENTRY( "SearchEngine::Config::UnRegisterWrapper" );
HRESULT hr;
WrapperIter it;
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_STRING_NOT_EMPTY(szID);
__MPC_PARAMCHECK_STRING_NOT_EMPTY(szOwner);
__MPC_PARAMCHECK_END();
//
// Make sure its loaded
//
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/true ));
//
// Look for existing wrapper
//
if(FindWrapper( ths, szID, it ))
{
//
// Check if it is the correct owner
//
if(MPC::StrICmp( it->m_bstrOwner, szOwner ) != 0)
{
__MPC_SET_ERROR_AND_EXIT( hr, ERROR_ACCESS_DENIED );
}
//
// If so, delete it
//
m_lstWrapper.erase( it );
}
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/false ));
hr = S_OK;
__MPC_FUNC_CLEANUP;
__MPC_FUNC_EXIT(hr);
}
HRESULT SearchEngine::Config::ResetSKU( /*[in]*/ const Taxonomy::HelpSet& ths )
{
__HCP_FUNC_ENTRY( "SearchEngine::Config::ResetSKU" );
HRESULT hr;
WrapperIter it;
//
// Make sure its loaded
//
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/true ));
//
// Look for existing wrappers belonging to the same SKU.
//
for(it = m_lstWrapper.begin(); it!= m_lstWrapper.end(); )
{
WrapperIter it2 = it++;
if(it2->m_ths == ths)
{
m_lstWrapper.erase( it2 );
}
}
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/false ));
hr = S_OK;
__MPC_FUNC_CLEANUP;
__MPC_FUNC_EXIT(hr);
}
////////////////////////////////////////////////////////////////////////////////
HRESULT SearchEngine::Config::GetWrappers( /*[out]*/ WrapperIter& itBegin, /*[out]*/ WrapperIter& itEnd )
{
__HCP_FUNC_ENTRY( "SearchEngine::Config::GetWrappers" );
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, SyncConfiguration( /*fLoad*/true ));
itBegin = m_lstWrapper.begin();
itEnd = m_lstWrapper.end ();
hr = S_OK;
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}