/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: Options.cpp Abstract: This file contains the implementation of the CPCHOptions class, which is used to store the list of favorite contents. Revision History: Davide Massarenti (Dmassare) 05/10/2000 created ******************************************************************************/ #include "stdafx.h" ///////////////////////////////////////////////////////////////////////////// #define OFFSET1(field) offsetof(CPCHOptions, field), -1 #define OFFSET2(field,flag) offsetof(CPCHOptions, field), offsetof(CPCHOptions, flag) static const WCHAR c_HSS_private[] = HC_REGISTRY_HELPCTR_USER; static const WCHAR c_HSS_ie [] = HC_REGISTRY_HELPCTR_IE; static const WCHAR c_HSS_ie_main[] = HC_REGISTRY_HELPCTR_IE L"\\Main"; const CPCHOptions::OptionsDef CPCHOptions::c_tbl[] = { { c_HSS_private, L"SKU" , OFFSET1(m_ths.m_strSKU ), CPCHOptions::c_Type_STRING , false }, { c_HSS_private, L"Language" , OFFSET1(m_ths.m_lLCID ), CPCHOptions::c_Type_long , false }, { c_HSS_private, L"ShowFavorites" , OFFSET2(m_ShowFavorites , m_flag_ShowFavorites ), CPCHOptions::c_Type_VARIANT_BOOL, true }, { c_HSS_private, L"ShowHistory" , OFFSET2(m_ShowHistory , m_flag_ShowHistory ), CPCHOptions::c_Type_VARIANT_BOOL, true }, { c_HSS_private, L"FontSize" , OFFSET2(m_FontSize , m_flag_FontSize ), CPCHOptions::c_Type_FONTSIZE , true }, { c_HSS_private, L"TextLabels" , OFFSET2(m_TextLabels , m_flag_TextLabels ), CPCHOptions::c_Type_TEXTLABELS , true }, { c_HSS_ie_main, L"Disable Script Debugger", OFFSET2(m_DisableScriptDebugger, m_flag_DisableScriptDebugger), CPCHOptions::c_Type_DWORD , true }, }; const CPCHOptions::OptionsDef CPCHOptions::c_tbl_TS[] = { { HC_REGISTRY_HELPCTR, L"DefaultTerminalServerSKU" , OFFSET1(m_ths_TS.m_strSKU), CPCHOptions::c_Type_STRING, false }, { HC_REGISTRY_HELPCTR, L"DefaultTerminalServerLanguage", OFFSET1(m_ths_TS.m_lLCID ), CPCHOptions::c_Type_long , false }, }; ///////////////////////////////////////////////////////////////////////////// CPCHOptions::CPCHOptions() { m_fLoaded = false; // bool m_fLoaded; m_fDirty = false; // bool m_fDirty; m_fNoSave = false; // bool m_fNoSave; // // Taxonomy::HelpSet m_ths; // Taxonomy::HelpSet m_ths_TS; m_ShowFavorites = VARIANT_TRUE; m_flag_ShowFavorites = false; // VARIANT_BOOL m_ShowFavorites; bool m_flag_ShowFavorites; m_ShowHistory = VARIANT_TRUE; m_flag_ShowHistory = false; // VARIANT_BOOL m_ShowHistory; bool m_flag_ShowHistory; m_FontSize = OPT_MEDIUM; m_flag_FontSize = false; // OPT_FONTSIZE m_FontSize; bool m_flag_FontSize; m_TextLabels = TB_ALL; m_flag_TextLabels = false; // TB_MODE m_TextLabels; bool m_flag_TextLabels; // m_DisableScriptDebugger = 1; m_flag_DisableScriptDebugger = false; // DWORD m_DisableScriptDebugger; bool m_flag_DisableScriptDebugger; } //////////////////// CPCHOptions* CPCHOptions::s_GLOBAL( NULL ); HRESULT CPCHOptions::InitializeSystem() { HRESULT hr; if(s_GLOBAL) return S_OK; if(SUCCEEDED(hr = MPC::CreateInstance( &CPCHOptions::s_GLOBAL ))) { hr = CPCHOptions::s_GLOBAL->Load( /*fForce*/true ); } return hr; } void CPCHOptions::FinalizeSystem() { if(s_GLOBAL) { s_GLOBAL->Release(); s_GLOBAL = NULL; } } //////////////////////////////////////////////////////////////////////////////// void CPCHOptions::ReadTable( /*[in]*/ const OptionsDef* tbl , /*[in]*/ int len , /*[in]*/ MPC::RegKey& rk ) { HRESULT hr; const OptionsDef* ptr = tbl; const OptionsDef* ptrLast = NULL; CComVariant v; bool fFound; for(int i=0; iiOffsetFlag == -1) { switch(ptr->iType) { case c_Type_bool : *( (bool *)((BYTE*)this + ptr->iOffset) ) = false; break; case c_Type_long : *( (long *)((BYTE*)this + ptr->iOffset) ) = 0; break; case c_Type_DWORD : *( (DWORD *)((BYTE*)this + ptr->iOffset) ) = 0; break; case c_Type_VARIANT_BOOL: *( (VARIANT_BOOL*)((BYTE*)this + ptr->iOffset) ) = VARIANT_FALSE; break; case c_Type_STRING : *( (MPC::wstring*)((BYTE*)this + ptr->iOffset) ) = L""; break; case c_Type_FONTSIZE : *( (OPT_FONTSIZE*)((BYTE*)this + ptr->iOffset) ) = OPT_MEDIUM; break; case c_Type_TEXTLABELS : *( (TB_MODE *)((BYTE*)this + ptr->iOffset) ) = TB_SELECTED; break; } } else { *( (bool*)((BYTE*)this + ptr->iOffsetFlag) ) = false; } if(!ptrLast || wcscmp( ptr->szKey, ptrLast->szKey )) { ptrLast = NULL; if(FAILED(rk.Attach( ptr->szKey ))) continue; ptrLast = ptr; } if(FAILED(rk.get_Value( v, fFound, ptr->szValue )) || !fFound) continue; switch(ptr->iType) { case c_Type_bool : hr = v.ChangeType( VT_BOOL ); break; case c_Type_long : hr = v.ChangeType( VT_I4 ); break; case c_Type_DWORD : hr = v.ChangeType( VT_I4 ); break; case c_Type_VARIANT_BOOL: hr = v.ChangeType( VT_BOOL ); break; case c_Type_STRING : hr = v.ChangeType( VT_BSTR ); break; case c_Type_FONTSIZE : hr = v.ChangeType( VT_I4 ); break; case c_Type_TEXTLABELS : hr = v.ChangeType( VT_I4 ); break; } if(FAILED(hr)) continue; if(ptr->iOffsetFlag != -1) { *( (bool*)((BYTE*)this + ptr->iOffsetFlag) ) = true; } switch(ptr->iType) { case c_Type_bool : *( (bool *)((BYTE*)this + ptr->iOffset) ) = v.boolVal == VARIANT_TRUE; break; case c_Type_long : *( (long *)((BYTE*)this + ptr->iOffset) ) = v.lVal ; break; case c_Type_DWORD : *( (DWORD *)((BYTE*)this + ptr->iOffset) ) = v.lVal ; break; case c_Type_VARIANT_BOOL: *( (VARIANT_BOOL*)((BYTE*)this + ptr->iOffset) ) = v.boolVal ; break; case c_Type_STRING : *( (MPC::wstring*)((BYTE*)this + ptr->iOffset) ) = SAFEBSTR( v.bstrVal) ; break; case c_Type_FONTSIZE : *( (OPT_FONTSIZE*)((BYTE*)this + ptr->iOffset) ) = (OPT_FONTSIZE)v.lVal ; break; case c_Type_TEXTLABELS : *( (TB_MODE *)((BYTE*)this + ptr->iOffset) ) = (TB_MODE )v.lVal ; break; } } } void CPCHOptions::WriteTable( /*[in]*/ const OptionsDef* tbl , /*[in]*/ int len , /*[in]*/ MPC::RegKey& rk ) { HRESULT hr; const OptionsDef* ptr = c_tbl; const OptionsDef* ptrLast = NULL; CComVariant v; bool fFound; for(int i=0; ifSaveAlways && m_fNoSave) continue; if(ptr->iOffsetFlag != -1) { if(*( (bool*)((BYTE*)this + ptr->iOffsetFlag) ) == false) continue; } if(!ptrLast || wcscmp( ptr->szKey, ptrLast->szKey )) { ptrLast = NULL; if(FAILED(rk.Attach( ptr->szKey ))) continue; if(FAILED(rk.Create( ))) continue; ptrLast = ptr; } switch(ptr->iType) { case c_Type_bool : v.Clear(); v.vt = VT_BOOL; v.boolVal = *( (bool *)((BYTE*)this + ptr->iOffset) ) ? VARIANT_TRUE : VARIANT_FALSE; break; case c_Type_long : v = *( (long *)((BYTE*)this + ptr->iOffset) ) ; break; case c_Type_DWORD : v = (long)*( (DWORD *)((BYTE*)this + ptr->iOffset) ) ; break; case c_Type_VARIANT_BOOL: v.Clear(); v.vt = VT_BOOL; v.boolVal = *( (VARIANT_BOOL*)((BYTE*)this + ptr->iOffset) ) ; break; case c_Type_STRING : v = ( (MPC::wstring*)((BYTE*)this + ptr->iOffset) )->c_str() ; break; case c_Type_FONTSIZE : v = (long)*( (OPT_FONTSIZE*)((BYTE*)this + ptr->iOffset) ) ; break; case c_Type_TEXTLABELS : v = (long)*( (TB_MODE *)((BYTE*)this + ptr->iOffset) ) ; break; } (void)rk.put_Value( v, ptr->szValue, /*fExpand*/false ); } } ///////////////////////////////////////////////////////////////////////////// HRESULT CPCHOptions::Load( /*[in]*/ bool fForce ) { __HCP_FUNC_ENTRY( "CPCHOptions::Load" ); HRESULT hr; if(!m_fLoaded || fForce) { MPC::RegKey rk; __MPC_EXIT_IF_METHOD_FAILS(hr, rk.SetRoot( HKEY_CURRENT_USER, KEY_READ )); ReadTable( c_tbl, ARRAYSIZE(c_tbl), rk ); if(::GetSystemMetrics( SM_REMOTESESSION )) { __MPC_EXIT_IF_METHOD_FAILS(hr, rk.SetRoot( HKEY_LOCAL_MACHINE, KEY_READ )); ReadTable( c_tbl_TS, ARRAYSIZE(c_tbl_TS), rk ); } m_fLoaded = true; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT CPCHOptions::Save( /*[in]*/ bool fForce ) { __HCP_FUNC_ENTRY( "CPCHOptions::Save" ); HRESULT hr; if(m_fDirty) { MPC::RegKey rk; __MPC_EXIT_IF_METHOD_FAILS(hr, rk.SetRoot( HKEY_CURRENT_USER, KEY_ALL_ACCESS )); WriteTable( c_tbl, ARRAYSIZE(c_tbl), rk ); m_fDirty = false; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } ///////////////////////////////////////////////////////////////////////////// #define GET_BEGIN(hr,pVal) \ HRESULT hr; \ \ if(!pVal) return E_POINTER; \ \ if(FAILED(hr = Load( /*fForce*/false ))) return hr #define GET_END(hr) \ return hr #define PUT_BEGIN(hr) \ HRESULT hr; \ \ if(FAILED(hr = Load( /*fForce*/false ))) return hr #define PUT_END(hr) \ m_fDirty = true; \ return S_OK STDMETHODIMP CPCHOptions::get_ShowFavorites( /*[out, retval]*/ VARIANT_BOOL *pVal ) { GET_BEGIN(hr,pVal); *pVal = m_ShowFavorites; GET_END(hr); } STDMETHODIMP CPCHOptions::put_ShowFavorites( /*[in]*/ VARIANT_BOOL newVal ) { PUT_BEGIN(hr); m_ShowFavorites = newVal; m_flag_ShowFavorites = true; PUT_END(hr); } STDMETHODIMP CPCHOptions::get_ShowHistory( /*[out, retval]*/ VARIANT_BOOL *pVal ) { GET_BEGIN(hr,pVal); *pVal = m_ShowHistory; GET_END(hr); } STDMETHODIMP CPCHOptions::put_ShowHistory( /*[in]*/ VARIANT_BOOL newVal ) { PUT_BEGIN(hr); m_ShowHistory = newVal; m_flag_ShowHistory = true; PUT_END(hr); } STDMETHODIMP CPCHOptions::get_FontSize( /*[out, retval]*/ OPT_FONTSIZE *pVal ) { GET_BEGIN(hr,pVal); *pVal = m_FontSize; GET_END(hr); } STDMETHODIMP CPCHOptions::put_FontSize( /*[in]*/ OPT_FONTSIZE newVal ) { PUT_BEGIN(hr); m_FontSize = newVal; m_flag_FontSize = true; PUT_END(hr); } STDMETHODIMP CPCHOptions::get_TextLabels( /*[out, retval]*/ TB_MODE *pVal ) { GET_BEGIN(hr,pVal); *pVal = m_TextLabels; GET_END(hr); } STDMETHODIMP CPCHOptions::put_TextLabels( /*[in]*/ TB_MODE newVal ) { PUT_BEGIN(hr); m_TextLabels = newVal; m_flag_TextLabels = true; PUT_END(hr); } STDMETHODIMP CPCHOptions::get_DisableScriptDebugger( /*[out, retval]*/ VARIANT_BOOL *pVal ) { GET_BEGIN(hr,pVal); *pVal = m_DisableScriptDebugger ? VARIANT_TRUE : VARIANT_FALSE; GET_END(hr); } STDMETHODIMP CPCHOptions::put_DisableScriptDebugger( /*[in]*/ VARIANT_BOOL newVal ) { PUT_BEGIN(hr); m_DisableScriptDebugger = (newVal == VARIANT_TRUE) ? 1 : 0; m_flag_DisableScriptDebugger = true; PUT_END(hr); } STDMETHODIMP CPCHOptions::Apply() { __HCP_FUNC_ENTRY( "CPCHOptions::Apply" ); HRESULT hr; CPCHHelpCenterExternal* ext = CPCHHelpCenterExternal::s_GLOBAL; if(!ext) { __MPC_SET_ERROR_AND_EXIT(hr, E_POINTER); } (void)Save(); __MPC_EXIT_IF_METHOD_FAILS(hr, ext->Events().FireEvent_OptionsChanged()); { for(int i = HSCPANEL_NAVBAR; i<= HSCPANEL_HHWINDOW; i++) { IMarsPanel* pPanel = ext->Panel( (HscPanel)i ); if(pPanel) { CComPtr disp; if(i == HSCPANEL_HHWINDOW) { CComPtr wb2; wb2.Attach( ext->HHWindow() ); disp = wb2; } else { (void)pPanel->get_content( &disp ); } __MPC_EXIT_IF_METHOD_FAILS(hr, ApplySettings( ext, disp )); } } } { IMarsWindowOM* shell = ext->Shell(); if(shell) { __MPC_EXIT_IF_METHOD_FAILS(hr, shell->refreshLayout()); } } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT CPCHOptions::put_CurrentHelpSet( /*[in]*/ Taxonomy::HelpSet& ths ) { PUT_BEGIN(hr); m_ths = ths; PUT_END(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT CPCHOptions::ApplySettings( /*[in]*/ CPCHHelpCenterExternal* ext, /*[in]*/ IUnknown* unk ) { __HCP_FUNC_ENTRY( "CPCHOptions::ApplySettings" ); HRESULT hr; CComQIPtr oct( unk ); if(oct) { CComVariant vIn; CComVariant vOut; if(SUCCEEDED(oct->Exec( 0, OLECMDID_GETZOOMRANGE, OLECMDEXECOPT_DONTPROMPTUSER, NULL, &vOut )) && vOut.vt == VT_I4) { int iZoomMin = (SHORT)LOWORD(vOut.lVal); int iZoomMax = (SHORT)HIWORD(vOut.lVal); int iZoom; switch(m_FontSize) { case OPT_SMALL : iZoom = iZoomMin + 1 ; break; case OPT_MEDIUM: iZoom = (iZoomMin + iZoomMax + 1)/2; break; case OPT_LARGE : iZoom = iZoomMax - 1 ; break; } vIn = (long)iZoom; (void)oct->Exec( 0, OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &vIn, &vOut ); } } hr = S_OK; __HCP_FUNC_EXIT(hr); }