|
|
/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name: ProtocolShell.cpp
Abstract: This file contains the implementation of the CHCPProcotolShell class, just a thin wrapper around CHCPProcotolRoot and CHCPProcotolInfo.
Revision History: Davide Massarenti (Dmassare) 02/15/2000 created
******************************************************************************/
#include "stdafx.h"
/////////////////////////////////////////////////////////////////////////////
CHCPProtocolEnvironment::CHCPProtocolEnvironment() { m_fHighContrast = false; // bool m_fHighContrast;
m_f16Colors = false; // bool m_f16Colors;
// Taxonomy::Instance m_inst;
//
// MPC::string m_strCSS;
UpdateState(); }
CHCPProtocolEnvironment::~CHCPProtocolEnvironment() { }
////////////////////
CHCPProtocolEnvironment* CHCPProtocolEnvironment::s_GLOBAL( NULL );
HRESULT CHCPProtocolEnvironment::InitializeSystem() { if(s_GLOBAL == NULL) { s_GLOBAL = new CHCPProtocolEnvironment; }
return s_GLOBAL ? S_OK : E_OUTOFMEMORY; }
void CHCPProtocolEnvironment::FinalizeSystem() { if(s_GLOBAL) { delete s_GLOBAL; s_GLOBAL = NULL; } }
/////////////////////////////////////////////////////////////////////////////
bool CHCPProtocolEnvironment::UpdateState() { DEVMODE dm; HIGHCONTRAST hc; hc.cbSize = sizeof( hc ); bool fHighContrast = false; bool f16Colors = false; bool fRes;
if(::EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm )) { if(dm.dmBitsPerPel < 8) { f16Colors = true; } }
if(::SystemParametersInfo( SPI_GETHIGHCONTRAST, sizeof(hc), &hc, 0 )) { if(hc.dwFlags & HCF_HIGHCONTRASTON) { fHighContrast = true; } }
fRes = (m_fHighContrast != fHighContrast) || (m_f16Colors != f16Colors ) || (m_strCSS.size() != 0 ) ;
m_fHighContrast = fHighContrast; m_f16Colors = f16Colors;
m_strCSS = "";
return fRes; }
void CHCPProtocolEnvironment::ReformatURL( CComBSTR& bstrURL ) { if(bstrURL != NULL) { WCHAR szTmp[MAX_PATH]; LPCWSTR szExtSrc; LPWSTR szExtDst;
StringCchCopyW( szTmp, ARRAYSIZE(szTmp), bstrURL );
szExtSrc = wcsrchr( bstrURL, '.' ); szExtDst = wcsrchr( szTmp , '.' );
if(szExtDst) { szExtDst[0] = 0;
if(m_inst.m_fDesktop) { StringCchCatW( szTmp, ARRAYSIZE(szTmp), L"__DESKTOP" ); StringCchCatW( szTmp, ARRAYSIZE(szTmp), szExtSrc );
if(MPC::FileSystemObject::IsFile( szTmp )) { bstrURL = szTmp; return; } }
if(m_inst.m_fServer) { StringCchCatW( szTmp, ARRAYSIZE(szTmp), L"__SERVER" ); StringCchCatW( szTmp, ARRAYSIZE(szTmp), szExtSrc );
if(MPC::FileSystemObject::IsFile( szTmp )) { bstrURL = szTmp; return; } } } } }
void CHCPProtocolEnvironment::SetHelpLocation( /*[in]*/ const Taxonomy::Instance& inst ) { m_inst = inst; }
LPCWSTR CHCPProtocolEnvironment::HelpLocation() { return m_inst.m_strHelpFiles.size() ? m_inst.m_strHelpFiles.c_str() : HC_HELPSVC_HELPFILES_DEFAULT; }
LPCWSTR CHCPProtocolEnvironment::System() // Only MUI-based SKUs get relocated
{ return (m_inst.m_fMUI && m_inst.m_strSystem.size()) ? m_inst.m_strSystem.c_str() : HC_HELPSET_ROOT; }
const Taxonomy::Instance& CHCPProtocolEnvironment::Instance() { return m_inst; }
HRESULT CHCPProtocolEnvironment::GetCSS( /*[out]*/ CComPtr<IStream>& stream ) { __HCP_FUNC_ENTRY( "CHCPProtocolEnvironment::GetCSS" );
HRESULT hr; DWORD dwWritten; LARGE_INTEGER liFilePos = { 0, 0 };
__MPC_EXIT_IF_METHOD_FAILS(hr, ProcessCSS());
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CreateStreamOnHGlobal( NULL, TRUE, &stream ));
__MPC_EXIT_IF_METHOD_FAILS(hr, stream->Write( m_strCSS.c_str(), m_strCSS.size(), &dwWritten ));
// Rewind the Stream.
__MPC_EXIT_IF_METHOD_FAILS(hr, stream->Seek( liFilePos, STREAM_SEEK_SET, NULL ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr); }
|