/** Copyright (c) 2000 Microsoft Corporation ****************************************************************************** ** Module Name: ** ** Newslib.cpp ** ** Abstract: ** ** Implementation of CNewslib ( get_News ) ** ** Author: ** ** Martha Arellano (t-alopez) 03-Oct-2000 ** ** ** Revision History: ** ** Martha Arellano (t-alopez) 05-Oct-2000 Changed goto statements ** Load creates newsset.xml if missing ** Added Time_To_Update() ** ** 06-Oct-2000 Added Update_NewsBlocks() ** ** 13-Oct-2000 Added Update_Newsver() ** ** 25-Oct-2000 Added get_Headlines_Enabled() to interface ** ****************************************************************************** **/ #include "stdafx.h" ///////////////////////////////////////////////////////////////////////////// // CNews ///////////////////////////////////////////////////////////////////////////// /* */ ////////////////////////////////////////////////////////////// CFG_BEGIN_FIELDS_MAP(News::Main) CFG_ATTRIBUTE( L"URL", wstring , m_strURL ), CFG_ATTRIBUTE( L"FREQUENCY", int , m_nFrequency ), CFG_ATTRIBUTE( L"TIMESTAMP", DATE_CIM, m_dtTimestamp ), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(News::Main) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(News::Main,L"NEWSSETTINGS") DEFINE_CONFIG_METHODS__NOCHILD(News::Main) /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// News::Main::Main() { // MPC::wstring m_strURL; m_nFrequency = -1; // int m_nFrequency; m_dtTimestamp = 0; // DATE m_dtTimestamp; m_fLoaded = false; // bool m_fLoaded; m_fDirty = false; // bool m_fDirty; // // long m_lLCID; // MPC::wstring m_strSKU; // MPC::wstring m_strLangSKU; // MPC::wstring m_strNewsHeadlinesPath; m_fOnline = VARIANT_FALSE; // VARIANT_BOOL m_fOnline; m_fConnectionStatusChecked = VARIANT_FALSE; // VARIANT_BOOL m_fConnectionStatusChecked; } ///////////////////////////////////////////////////////////////////////////// // // Routine Description: // // The cached news settings file is loaded and validated from the path in HC_HCUPDATE_NEWSSETTINGS // // If the file is valid, the flag m_fLoaded will be set to true // // Arguments: // // HRESULT News::Main::Load() { __HCP_FUNC_ENTRY( "News::Main::Load" ); HRESULT hr; if(m_fLoaded == false) { MPC::wstring strPath( HC_HCUPDATE_NEWSSETTINGS ); MPC::SubstituteEnvVariables( strPath ); CComPtr stream; __MPC_EXIT_IF_METHOD_FAILS(hr, News::LoadXMLFile( strPath.c_str(), stream )); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::LoadStream( this, stream )); // // validate the news settings // if(m_strURL.empty() || m_nFrequency < 0 || m_dtTimestamp == 0 ) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_INVALID_DATA); } m_fLoaded = true; m_fDirty = false; } hr = S_OK; __HCP_FUNC_CLEANUP; if(FAILED(hr)) { hr = Restore( m_lLCID ); } __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Restores the default values to the News Settings class and saves it // the flag m_fReady will be set to TRUE // // Arguments: // // HRESULT News::Main::Restore( /*[in]*/ long lLCID ) { __HCP_FUNC_ENTRY( "News::Main::Restore" ); HRESULT hr; WCHAR rgLCID[64]; // set the default values m_strURL = NEWSSETTINGS_DEFAULT_URL; //redir.dll //m_strURL += _itow( lLCID, rgLCID, 10 ); // add LCID parameter to the URL m_nFrequency = NEWSSETTINGS_DEFAULT_FREQUENCY; m_dtTimestamp = MPC::GetLocalTime() - NEWSSETTINGS_DEFAULT_FREQUENCY; // we set the timestamp, so that it will try to update news headlines file m_fLoaded = true; m_fDirty = true; // we save NewsSet.xml __MPC_EXIT_IF_METHOD_FAILS(hr, Save()); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // This saves the cached NewsSettings file in the local user disk in the path of HC_HCUPDATE_NEWSSETTINGS // // Arguments: // // None // // HRESULT News::Main::Save() { __HCP_FUNC_ENTRY( "News::Main::Save" ); HRESULT hr; if(m_fDirty) { MPC::wstring strPath( HC_HCUPDATE_NEWSSETTINGS ); MPC::SubstituteEnvVariables( strPath ); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::SaveFile( this, strPath.c_str() )); m_fDirty = false; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////// HRESULT News::Main::get_URL( /*[out]*/ BSTR *pVal ) { __HCP_FUNC_ENTRY( "News::Main::get_URL" ); HRESULT hr; (void)Load(); //check to see if it has been loaded __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_strURL.c_str(), pVal )); hr = S_OK; __MPC_FUNC_CLEANUP; __MPC_FUNC_EXIT(hr); } HRESULT News::Main::put_URL( /*[in]*/ BSTR newVal ) { __HCP_FUNC_ENTRY( "News::Main::put_URL" ); HRESULT hr; (void)Load(); m_strURL = SAFEBSTR( newVal ); hr = S_OK; __MPC_FUNC_EXIT(hr); } HRESULT News::Main::get_Frequency( /*[out]*/ int *pVal ) { __HCP_FUNC_ENTRY( "News::Main::get_Frequency" ); HRESULT hr; (void)Load(); //check to see if it has been loaded if(pVal) *pVal = m_nFrequency; hr = S_OK; __MPC_FUNC_EXIT(hr); } HRESULT News::Main::put_Frequency( /*[in]*/ int newVal ) { __HCP_FUNC_ENTRY( "News::Main::put_Frequency" ); HRESULT hr; (void)Load(); //check to see if it has been loaded m_nFrequency = newVal; m_dtTimestamp = MPC::GetLocalTime() - m_nFrequency; // also set timestamp, so that it will try to update news headlines file hr = S_OK; __MPC_FUNC_EXIT(hr); } //////////////////////////////////////// // // Routine Description: // // Determines if its time to update newsver or not // // we assume the newsset has been loaded (m_fReady = TRUE) // // Arguments: // // None // // Return Value: // // fGet - returns TRUE if its time to update the news // // bool News::Main::IsTimeToUpdateNewsver() { __HCP_FUNC_ENTRY( "News::Main::IsTimeToUpdateNewsver" ); DATE dtNow; (void)Load(); dtNow = MPC::GetLocalTime() - m_nFrequency; // then we check if its time to download newsver.xml return ((dtNow >= m_dtTimestamp) && m_nFrequency >= 0); } //////////////////// // // Routine Description: // // This routine will go to the process of Updating the Newsver file // - download newsver.xml from m_strURL // - save it // - update the News Settings cached file // // Arguments: // // None // // HRESULT News::Main::Update_Newsver( /*[in]*/ Newsver& nwNewsver ) { __HCP_FUNC_ENTRY( "News::Main::Update_Newsver" ); HRESULT hr; // If the connection status has already been checked then dont do it again else check the connection status if( !m_fConnectionStatusChecked ) { m_fOnline = CheckConnectionStatus( ); } if ( !m_fOnline ) { // If not connected to the network then return ERROR_INTERNET_DISCONNECTED __MPC_SET_WIN32_ERROR_AND_EXIT ( hr, ERROR_INTERNET_DISCONNECTED ); } (void)Load(); // download newsver and save it __MPC_EXIT_IF_METHOD_FAILS( hr, nwNewsver.Download( m_strURL )); // check if URL from Newsver has changed and is valid { const MPC::wstring* pstr = nwNewsver.get_URL(); if(pstr && pstr->size()) { m_strURL = *pstr; } } // check if frequency from Newsver has changed and is valid { int nFrequency = nwNewsver.get_Frequency(); if(nFrequency >= 0) { m_nFrequency = nFrequency; } } // change timestamp of newsset.xml m_dtTimestamp = MPC::GetLocalTime(); m_fDirty = true; // save News Settings cached file __MPC_EXIT_IF_METHOD_FAILS( hr, Save()); __MPC_FUNC_CLEANUP; __MPC_FUNC_EXIT(hr); } // // Routine Description: // // This routine will go to the process of Update the NewsHeadlines in the local user disk: // - download the newsblocks // - integrate the newsblocks and save them as newsheadlines.xml // // Arguments: // // None // // HRESULT News::Main::Update_NewsHeadlines( /*[in]*/ Newsver& nwNewsver , /*[in]*/ Headlines& nhHeadlines ) { __HCP_FUNC_ENTRY( "News::Main::Update_NewsHeadlines" ); HRESULT hr; bool fOEMBlockAdded = false; size_t nNumBlocks = nwNewsver.get_NumberOfNewsblocks(); // If the connection status has already been checked then dont do it again else check the connection status if( !m_fConnectionStatusChecked ) { m_fOnline = CheckConnectionStatus( ); } if ( !m_fOnline ) { // If not connected to the network then return ERROR_INTERNET_DISCONNECTED __MPC_SET_WIN32_ERROR_AND_EXIT ( hr, ERROR_INTERNET_DISCONNECTED ); } // clear the News Headlines cached file __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.Clear()); // for each newsblock for(size_t i=0; iTimeToUpdate()) { Headlines nh; // load the newsblock if(SUCCEEDED(nh.Load( *pstrURL ))) { Headlines::Newsblock* nbNew = nh.get_Newsblock( 0 ); // we are modifying another newsblock if(nbNew && SUCCEEDED(nb->Copy( *nbNew, m_strLangSKU, i ))) { ; } } } } // save the new newsheadlines cached file in the user's local disk __MPC_EXIT_IF_METHOD_FAILS( hr, nhHeadlines.Save( m_strNewsHeadlinesPath )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT News::Main::Init( /*[in]*/ long lLCID, /*[in]*/ BSTR bstrSKU ) { __HCP_FUNC_ENTRY( "News::Main::Init" ); HRESULT hr; WCHAR rgLangSKU[256]; LPCWSTR szEnd; size_t len; SANITIZEWSTR( bstrSKU ); szEnd = wcschr( bstrSKU, '_' ); len = szEnd ? szEnd - bstrSKU : wcslen( bstrSKU ); m_lLCID = lLCID; m_strSKU.assign( bstrSKU, len ); _snwprintf( rgLangSKU, MAXSTRLEN(rgLangSKU), L"%d_%s", lLCID, m_strSKU.c_str() ); m_strLangSKU = rgLangSKU; m_strNewsHeadlinesPath = HC_HCUPDATE_NEWSHEADLINES; m_strNewsHeadlinesPath += m_strLangSKU; m_strNewsHeadlinesPath += L".xml"; MPC::SubstituteEnvVariables( m_strNewsHeadlinesPath ); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MakeDir( m_strNewsHeadlinesPath )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Function that determines and downloads the latest news headlines if needed, // or returns the cached news headlines from the user's local disk // // Arguments: // // lLCIDreq the Language ID of the News to get // // bstrSKU the SKU of the News to get // // Return Value: // // pVal IStream loaded with the newsheadlines to display // // HRESULT News::Main::get_News( /*[in]*/ long lLCID, /*[in]*/ BSTR bstrSKU, /*[out]*/ IUnknown* *pVal ) { __HCP_FUNC_ENTRY( "News::Main::get_News" ); HRESULT hr; Newsver nwNewsver; Headlines nhHeadlines; __MPC_EXIT_IF_METHOD_FAILS(hr, Init( lLCID, bstrSKU )); // 1.0 Load cached News Settings file __MPC_EXIT_IF_METHOD_FAILS(hr, Load()); // Is time to update newsver? if(IsTimeToUpdateNewsver() || FAILED(nwNewsver.Load( m_lLCID, m_strSKU ))) { // try to update newsver if(SUCCEEDED(Update_Newsver( nwNewsver ))) { // try load cached newsver if(SUCCEEDED(nwNewsver.Load( m_lLCID, m_strSKU ))) { // 2.0 try to update the News Headlines file Update_NewsHeadlines( nwNewsver, nhHeadlines ); } } } else // not time to update NewsHeadlines { size_t nNumBlocksNewsver = nwNewsver.get_NumberOfNewsblocks(); // we try to load cached NewsHeadlines file and we check the number of newsblocks if(SUCCEEDED(nhHeadlines.Load( m_strNewsHeadlinesPath )) && nhHeadlines.get_NumberOfNewsblocks() == nNumBlocksNewsver) { DATE dtHeadlines = nhHeadlines.get_Timestamp(); // check if the cached NewsHeadlines is Outdated if(dtHeadlines && (dtHeadlines < m_dtTimestamp)) { // 2.0 try to update the News Headlines file Update_NewsHeadlines( nwNewsver, nhHeadlines ); } else { size_t nNumBlocks = nhHeadlines.get_NumberOfNewsblocks(); // check to see if its time to update at least 1 newsblock for(size_t i=0; iTimeToUpdate()) { // 3.0 update newsblocks Update_NewsBlocks( nwNewsver, nhHeadlines ); break; } } } } else // cached News Headlines not valid { // 2.0 try to update the News Headlines file __MPC_EXIT_IF_METHOD_FAILS(hr, Update_NewsHeadlines( nwNewsver, nhHeadlines )); } } // Add news items from HCUpdate __MPC_EXIT_IF_METHOD_FAILS(hr, AddHCUpdateNews(m_strNewsHeadlinesPath)); // 4.0 Return cached NewsHeadlines file __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.get_Stream( m_lLCID, m_strSKU, m_strNewsHeadlinesPath, pVal )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Function that adds news items from HCUpdate // // Arguments: // // // Return Value: // // HRESULT News::Main::AddHCUpdateNews(/*[in ]*/ const MPC::wstring& strNewsHeadlinesPath ) { Headlines nhHeadlines; HRESULT hr; UpdateHeadlines uhUpdate; bool fMoreThanOneHeadline = false; bool fExactlyOneHeadline = false; bool fCreateRecentUpdatesBlock = false; CComPtr stream; CComBSTR bstrUpdateBlockName; __HCP_FUNC_ENTRY( "News::Main::AddHCUpdateNews" ); // Load the localized name of the update block __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::LocalizeString( IDS_NEWS_UPDATEBLOCK_NAME, bstrUpdateBlockName )); // Check to see if more than one news headlines exist ffrom HCUpdate - if it does then // we need to create the "Recent Updates" newsblock if it doesnt already exist __MPC_EXIT_IF_METHOD_FAILS(hr, uhUpdate.DoesMoreThanOneHeadlineExist( m_lLCID, m_strSKU, fMoreThanOneHeadline, fExactlyOneHeadline )); if (fMoreThanOneHeadline | fExactlyOneHeadline) { if (FAILED(hr = LoadXMLFile( strNewsHeadlinesPath.c_str(), stream ))) { Headlines::Newsblock block; // News headlines file does not exist - create one to add news items from HCUpdate // Add the first news block for headlines nhHeadlines.AddNewsblock( block, m_strLangSKU ); // Also create the Recent Updates newblock for update headlines if (fMoreThanOneHeadline) { fCreateRecentUpdatesBlock = true; } else { // change the timestamp of the NewsHeadlines nhHeadlines.set_Timestamp(); // save the new newsheadlines cached file in the user's local disk __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.Save( strNewsHeadlinesPath )); } } else { if (fMoreThanOneHeadline) { // News Headlines file does exist - check to see if the "Recent Updates" newsblock exists Headlines::Newsblock* ptrNewsblock; size_t nLength; __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.Load( strNewsHeadlinesPath )); nLength = nhHeadlines.get_NumberOfNewsblocks(); for (ptrNewsblock = nhHeadlines.get_Newsblock( nLength - 1 ); ptrNewsblock;) { if (!MPC::StrICmp( ptrNewsblock->m_strProvider, bstrUpdateBlockName )) { // Found it - just get out break; } if (nLength == 0) { // Did not find it - so create it fCreateRecentUpdatesBlock = true; break; } ptrNewsblock = nhHeadlines.get_Newsblock( --nLength ); } } else { __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.Load( strNewsHeadlinesPath )); } } if (fCreateRecentUpdatesBlock) { Headlines::Newsblock block; // Add the "Recent Updates" news block for news to be displayed on the More... page block.m_strProvider = SAFEBSTR(bstrUpdateBlockName); block.m_strIcon = HC_HCUPDATE_UPDATEBLOCK_ICONURL; nhHeadlines.AddNewsblock( block, m_strLangSKU ); // change the timestamp of the NewsHeadlines nhHeadlines.set_Timestamp(); // save the new newsheadlines cached file in the user's local disk __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.Save( strNewsHeadlinesPath )); } // So we now have the newsblock "Recent Updates" added to the news headlines file // Now add headlines items from Updates headlines file __MPC_EXIT_IF_METHOD_FAILS(hr, uhUpdate.AddHCUpdateHeadlines( m_lLCID, m_strSKU, nhHeadlines )); // save the new newsheadlines cached file in the user's local disk __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.Save( strNewsHeadlinesPath )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Function that returns the cached news headlines from the user's local disk // // Arguments: // // nLCIDreq the Language ID of the News to get // // bstrSKUreq the SKU of the News to get // // Return Value: // // pVal IStream loaded with the newsheadlines to display // // HRESULT News::Main::get_News_Cached( /*[in]*/ long lLCID, /*[in]*/ BSTR bstrSKU, /*[out]*/ IUnknown* *pVal ) { __HCP_FUNC_ENTRY( "News::Main::get_Cached_News" ); HRESULT hr; Headlines nhHeadlines; __MPC_EXIT_IF_METHOD_FAILS(hr, Init( lLCID, bstrSKU )); // Return cached NewsHeadlines file __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.get_Stream( m_lLCID, m_strSKU, m_strNewsHeadlinesPath, pVal )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Function that downloads the newsver.xml file and then // downloads the news headlines and returns them // // Arguments: // // nLCIDreq the Language ID of the News to get // // bstrSKUreq the SKU of the News to get // // Return Value: // // pVal IStream loaded with the newsheadlines to display // // HRESULT News::Main::get_News_Download( /*[in]*/ long lLCID, /*[in]*/ BSTR bstrSKU, /*[out]*/ IUnknown* *pVal ) { __HCP_FUNC_ENTRY( "News::Main::get_Download_News" ); HRESULT hr; Newsver nwNewsver; Headlines nhHeadlines; __MPC_EXIT_IF_METHOD_FAILS(hr, Init( lLCID, bstrSKU )); __MPC_EXIT_IF_METHOD_FAILS(hr, Load()); // update newsver __MPC_EXIT_IF_METHOD_FAILS(hr, Update_Newsver( nwNewsver )); // load cached newsver __MPC_EXIT_IF_METHOD_FAILS(hr, nwNewsver.Load( m_lLCID, m_strSKU )); // update the News Headlines file __MPC_EXIT_IF_METHOD_FAILS(hr, Update_NewsHeadlines( nwNewsver, nhHeadlines )); // return the NewsHeadlines __MPC_EXIT_IF_METHOD_FAILS(hr, nhHeadlines.get_Stream( m_lLCID, m_strSKU, m_strNewsHeadlinesPath, pVal )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Function that checks the registry to see if the headlines area is enabled or not // // registry key in: // // HKEY_LOCAL_MACHINE HC_REGISTRY_HELPSVC Headlines // // Arguments: // // None // // Return Value: // // pVal VARIANT_TRUE or VARIANT_FALSE // // HRESULT News::Main::get_Headlines_Enabled( /*[out]*/ VARIANT_BOOL *pVal) { __HCP_FUNC_ENTRY( "News::Main::get_Headlines_Enabled" ); HRESULT hr; DWORD dwValue; bool fFound; // Get the RegKey Value __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::RegKey_Value_Read( dwValue, fFound, HC_REGISTRY_HELPSVC, HEADLINES_REGKEY )); // If the Key was found and is disabled if(fFound && !dwValue) { *pVal = VARIANT_FALSE; // the Headlines are not enabled } else { *pVal = VARIANT_TRUE; // the Headlines are enabled } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT News::LoadXMLFile( /*[in]*/ LPCWSTR szURL, /*[out]*/ CComPtr& stream ) { __HCP_FUNC_ENTRY( "News::LoadXMLFile" ); HRESULT hr; CComPtr xml; VARIANT_BOOL fSuccess; if(wcsstr( szURL, L"://" )) // Remote file { CPCHUserProcess::UserEntry ue; CComPtr sp; CComPtr unk; __MPC_EXIT_IF_METHOD_FAILS(hr, ue.InitializeForImpersonation()); __MPC_EXIT_IF_METHOD_FAILS(hr, CPCHUserProcess::s_GLOBAL->Connect( ue, &sp )); __MPC_EXIT_IF_METHOD_FAILS(hr, sp->CreateInstance( CLSID_DOMDocument, NULL, &unk )); __MPC_EXIT_IF_METHOD_FAILS(hr, unk.QueryInterface( &xml )); } else { __MPC_EXIT_IF_METHOD_FAILS(hr, xml.CoCreateInstance( CLSID_DOMDocument )); } // // Set synchronous operation. // __MPC_EXIT_IF_METHOD_FAILS(hr, xml->put_async( VARIANT_FALSE )); __MPC_EXIT_IF_METHOD_FAILS(hr, xml->load( CComVariant( szURL ), &fSuccess )); if(fSuccess == VARIANT_FALSE) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_INVALID_DATA); } __MPC_EXIT_IF_METHOD_FAILS(hr, xml->QueryInterface( &stream )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT News::LoadFileFromServer( /*[in]*/ LPCWSTR szURL, /*[out]*/ CComPtr& stream ) { __HCP_FUNC_ENTRY( "News::LoadFileFromServer" ); HRESULT hr; CPCHUserProcess::UserEntry ue; CComPtr sp; CComPtr unk; __MPC_EXIT_IF_METHOD_FAILS(hr, ue.InitializeForImpersonation()); __MPC_EXIT_IF_METHOD_FAILS(hr, CPCHUserProcess::s_GLOBAL->Connect( ue, &sp )); __MPC_EXIT_IF_METHOD_FAILS(hr, sp->OpenBlockingStream( CComBSTR( szURL ), &unk )); __MPC_EXIT_IF_METHOD_FAILS(hr, unk.QueryInterface( &stream )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } bool News::Main::CheckConnectionStatus( ) { __HCP_FUNC_ENTRY("News::SetConnectionStatus"); HRESULT hr; CPCHUserProcess::UserEntry ue; CComPtr sp; CComPtr unk; VARIANT_BOOL varResult; if (!m_fConnectionStatusChecked) { __MPC_EXIT_IF_METHOD_FAILS(hr, ue.InitializeForImpersonation()); __MPC_EXIT_IF_METHOD_FAILS(hr, CPCHUserProcess::s_GLOBAL->Connect( ue, &sp )); __MPC_EXIT_IF_METHOD_FAILS(hr, sp->IsNetworkAlive( &varResult )); varResult == VARIANT_TRUE?m_fOnline = true:m_fOnline = false; m_fConnectionStatusChecked = true; } hr = S_OK; __HCP_FUNC_CLEANUP; if (FAILED (hr)) { m_fOnline = false; } return m_fOnline; }