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.
 
 
 
 
 
 

307 lines
8.3 KiB

/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
UserSettings.cpp
Abstract:
This file contains the implementation of the CPCHUserSettings class,
that contains the user's settings on the service side.
Revision History:
Davide Massarenti (Dmassare) 04/15/2000
created
******************************************************************************/
#include "stdafx.h"
////////////////////////////////////////////////////////////////////////////////
CPCHUserSettings::CPCHUserSettings()
{
m_fAttached = false; // bool m_fAttached;
// Taxonomy::Settings m_ts;
}
CPCHUserSettings::~CPCHUserSettings()
{
Passivate();
}
void CPCHUserSettings::Passivate()
{
if(m_fAttached)
{
(void)Taxonomy::InstalledInstanceStore::s_GLOBAL->InUse_Unlock( m_ts );
m_fAttached = false;
}
}
HRESULT CPCHUserSettings::InitUserSettings( /*[out]*/ Taxonomy::HelpSet& ths )
{
MPC::SmartLock<_ThreadModel> lock( this );
ths = m_ts;
return S_OK;
}
////////////////////////////////////////
HRESULT CPCHUserSettings::get_SKU( /*[in]*/ bool fMachine, /*[out, retval]*/ IPCHSetOfHelpTopics* *pVal )
{
__HCP_FUNC_ENTRY( "CPCHUserSettings::get_SKU" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
Taxonomy::LockingHandle handle;
Taxonomy::InstalledInstanceIter it;
bool fFound;
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
__MPC_PARAMCHECK_END();
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->GrabControl( handle ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->SKU_Find ( fMachine ? Taxonomy::HelpSet() : m_ts, fFound, it ));
if(fFound)
{
CComPtr<CPCHSetOfHelpTopics> pObj;
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj ));
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->Init( it->m_inst ));
*pVal = pObj.Detach();
}
else
{
if(fMachine)
{
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_FILE_NOT_FOUND);
}
__MPC_EXIT_IF_METHOD_FAILS(hr, get_SKU( true, pVal ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
STDMETHODIMP CPCHUserSettings::get_CurrentSKU( /*[out, retval]*/ IPCHSetOfHelpTopics* *pVal )
{
return get_SKU( false, pVal );
}
STDMETHODIMP CPCHUserSettings::get_MachineSKU( /*[out, retval]*/ IPCHSetOfHelpTopics* *pVal )
{
return get_SKU( true, pVal );
}
////////////////////
STDMETHODIMP CPCHUserSettings::get_HelpLocation( /*[out, retval]*/ BSTR *pVal )
{
__HCP_BEGIN_PROPERTY_GET("CPCHUserSettings::get_HelpLocation",hr,pVal);
Taxonomy::LockingHandle handle;
Taxonomy::InstalledInstanceIter it;
bool fFound;
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->GrabControl( handle ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->SKU_Find ( m_ts, fFound, it ));
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( fFound ? it->m_inst.m_strHelpFiles.c_str() : HC_HELPSVC_HELPFILES_DEFAULT, pVal ));
__HCP_END_PROPERTY(hr);
}
STDMETHODIMP CPCHUserSettings::get_DatabaseDir( /*[out, retval]*/ BSTR *pVal )
{
__HCP_BEGIN_PROPERTY_GET("CPCHUserSettings::get_IndexFile",hr,pVal);
MPC::wstring strRES;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.DatabaseDir( strRES ));
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( strRES.c_str(), pVal ));
__HCP_END_PROPERTY(hr);
}
STDMETHODIMP CPCHUserSettings::get_DatabaseFile( /*[out, retval]*/ BSTR *pVal )
{
__HCP_BEGIN_PROPERTY_GET("CPCHUserSettings::get_IndexFile",hr,pVal);
MPC::wstring strRES;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.DatabaseFile( strRES ));
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( strRES.c_str(), pVal ));
__HCP_END_PROPERTY(hr);
}
STDMETHODIMP CPCHUserSettings::get_IndexFile( /*[in,optional]*/ VARIANT vScope, /*[out, retval]*/ BSTR *pVal )
{
__HCP_BEGIN_PROPERTY_GET("CPCHUserSettings::get_IndexFile",hr,pVal);
MPC::wstring strLocation;
MPC::wstring strDisplayName;
if(vScope.vt == VT_BSTR)
{
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.GetDatabase( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( m_ts, db ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.GetIndexInfo( strLocation, strDisplayName, vScope.bstrVal ));
}
else
{
__MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.IndexFile( strLocation ));
}
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( strLocation.c_str(), pVal ));
__HCP_END_PROPERTY(hr);
}
STDMETHODIMP CPCHUserSettings::get_IndexDisplayName( /*[in,optional]*/ VARIANT vScope, /*[out, retval]*/ BSTR *pVal )
{
__HCP_BEGIN_PROPERTY_GET("CPCHUserSettings::get_IndexDisplayName",hr,pVal);
MPC::wstring strLocation;
MPC::wstring strDisplayName;
if(vScope.vt == VT_BSTR)
{
JetBlue::SessionHandle handle;
JetBlue::Database* db;
Taxonomy::Updater updater;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.GetDatabase( handle, db, /*fReadOnly*/true ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.Init( m_ts, db ));
__MPC_EXIT_IF_METHOD_FAILS(hr, updater.GetIndexInfo( strLocation, strDisplayName, vScope.bstrVal ));
}
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( strDisplayName.c_str(), pVal ));
__HCP_END_PROPERTY(hr);
}
STDMETHODIMP CPCHUserSettings::get_LastUpdated( /*[out, retval]*/ DATE *pVal )
{
__HCP_BEGIN_PROPERTY_GET("CPCHUserSettings::get_LastUpdated",hr,pVal);
Taxonomy::LockingHandle handle;
Taxonomy::InstalledInstanceIter it;
bool fFound;
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->GrabControl( handle ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->SKU_Find ( m_ts, fFound, it ));
if(fFound) *pVal = it->m_inst.m_dLastUpdated;
__HCP_END_PROPERTY(hr);
}
////////////////////////////////////////
STDMETHODIMP CPCHUserSettings::get_AreHeadlinesEnabled( /*[out, retval]*/ VARIANT_BOOL *pVal )
{
__HCP_BEGIN_PROPERTY_GET2__NOLOCK("CPCHUserSettings::get_AreHeadlinesEnabled",hr,pVal,VARIANT_FALSE);
News::Main m;
__MPC_EXIT_IF_METHOD_FAILS(hr, m.get_Headlines_Enabled( pVal ));
__HCP_END_PROPERTY(hr);
}
//
// Don't lock during this method, it takes a long time to execute.
//
STDMETHODIMP CPCHUserSettings::get_News( /*[out, retval]*/ IUnknown* *pVal )
{
__HCP_BEGIN_PROPERTY_GET__NOLOCK("CPCHUserSettings::get_News",hr,pVal);
News::Main m;
__MPC_EXIT_IF_METHOD_FAILS(hr, m.get_News( m_ts.GetLanguage(), CComBSTR( m_ts.GetSKU() ), pVal ));
__HCP_END_PROPERTY(hr);
}
////////////////////////////////////////
STDMETHODIMP CPCHUserSettings::Select( /*[in]*/ BSTR bstrSKU, /*[in]*/ long lLCID )
{
__HCP_FUNC_ENTRY( "CPCHUserSettings::Select" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
Passivate();
{
Taxonomy::HelpSet ths;
Taxonomy::LockingHandle handle;
Taxonomy::InstalledInstanceIter it;
bool fFound;
__MPC_EXIT_IF_METHOD_FAILS(hr, ths.Initialize( bstrSKU, lLCID ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->GrabControl( handle ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->SKU_Find ( ths, fFound, it ));
if(fFound == false)
{
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_FILE_NOT_FOUND);
}
m_ts = it->m_inst.m_ths;
}
//
// Mark the SKU as in-use and signal the SystemMonitor to load the cache.
//
m_fAttached = true;
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->InUse_Lock ( m_ts ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::Cache ::s_GLOBAL->PrepareToLoad( m_ts ));
__MPC_EXIT_IF_METHOD_FAILS(hr, CPCHSystemMonitor ::s_GLOBAL->LoadCache ( ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}