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.
 
 
 
 
 
 

603 lines
18 KiB

/** Copyright (c) 2000 Microsoft Corporation
******************************************************************************
** Module Name:
**
** UpdateHeadlines.cpp
**
** Abstract:
**
** Implementation of CUpdateHeadlines
**
** Author:
**
** Martha Arellano (t-alopez) 06-Dec-2000
**
**
**
******************************************************************************
**/
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////
// CONFIG MAP
//////////////////////////////////////////////////////////////////////
/*<?xml version="1.0" ?>
<UPDATEHEADLINES>
<LANGUAGE LCID="1033">
<SKU VERSION="Personal">
<HEADLINE ICON="" TITLE="" LINK="" EXPIRES=""/>
</SKU>
</LANGUAGE>
</UPDATEHEADLINES>
*/
CFG_BEGIN_FIELDS_MAP(News::UpdateHeadlines::Headline)
CFG_ATTRIBUTE( L"ICON" , wstring, m_strIcon ),
CFG_ATTRIBUTE( L"TITLE" , wstring, m_strTitle ),
CFG_ATTRIBUTE( L"LINK" , wstring, m_strLink ),
CFG_ATTRIBUTE( L"DESCRIPTION" , wstring, m_strDescription ),
CFG_ATTRIBUTE( L"TIMEOUT" , DATE_CIM, m_dtTimeOut ),
CFG_END_FIELDS_MAP()
CFG_BEGIN_CHILD_MAP(News::UpdateHeadlines::Headline)
CFG_END_CHILD_MAP()
DEFINE_CFG_OBJECT(News::UpdateHeadlines::Headline, L"HEADLINE")
DEFINE_CONFIG_METHODS__NOCHILD(News::UpdateHeadlines::Headline)
////////////////////
CFG_BEGIN_FIELDS_MAP(News::UpdateHeadlines::SKU)
CFG_ATTRIBUTE( L"VERSION", wstring, m_strSKU ),
CFG_END_FIELDS_MAP()
CFG_BEGIN_CHILD_MAP(News::UpdateHeadlines::SKU)
CFG_CHILD(News::UpdateHeadlines::Headline)
CFG_END_CHILD_MAP()
DEFINE_CFG_OBJECT(News::UpdateHeadlines::SKU, L"SKU")
DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(News::UpdateHeadlines::SKU,tag,defSubType)
if(tag == _cfg_table_tags[0])
{
defSubType = &(*(m_vecHeadlines.insert( m_vecHeadlines.end() )));
return S_OK;
}
DEFINE_CONFIG_METHODS_SAVENODE_SECTION(News::UpdateHeadlines::SKU,xdn)
hr = MPC::Config::SaveList( m_vecHeadlines, xdn );
DEFINE_CONFIG_METHODS_END(News::UpdateHeadlines::SKU)
////////////////////
CFG_BEGIN_FIELDS_MAP(News::UpdateHeadlines::Language)
CFG_ATTRIBUTE( L"LCID", long, m_lLCID ),
CFG_END_FIELDS_MAP()
CFG_BEGIN_CHILD_MAP(News::UpdateHeadlines::Language)
CFG_CHILD(News::UpdateHeadlines::SKU)
CFG_END_CHILD_MAP()
DEFINE_CFG_OBJECT(News::UpdateHeadlines::Language,L"LANGUAGE")
DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(News::UpdateHeadlines::Language,tag,defSubType)
if(tag == _cfg_table_tags[0])
{
defSubType = &(*(m_lstSKUs.insert( m_lstSKUs.end() )));
return S_OK;
}
DEFINE_CONFIG_METHODS_SAVENODE_SECTION(News::UpdateHeadlines::Language,xdn)
hr = MPC::Config::SaveList( m_lstSKUs, xdn );
DEFINE_CONFIG_METHODS_END(News::UpdateHeadlines::Language)
////////////////////
CFG_BEGIN_FIELDS_MAP(News::UpdateHeadlines)
CFG_END_FIELDS_MAP()
CFG_BEGIN_CHILD_MAP(News::UpdateHeadlines)
CFG_CHILD(News::UpdateHeadlines::Language)
CFG_END_CHILD_MAP()
DEFINE_CFG_OBJECT(News::UpdateHeadlines,L"UPDATEHEADLINES")
DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(News::UpdateHeadlines,tag,defSubType)
if(tag == _cfg_table_tags[0])
{
defSubType = &(*(m_lstLanguages.insert( m_lstLanguages.end() )));
return S_OK;
}
DEFINE_CONFIG_METHODS_SAVENODE_SECTION(News::UpdateHeadlines,xdn)
hr = MPC::Config::SaveList( m_lstLanguages, xdn );
DEFINE_CONFIG_METHODS_END(News::UpdateHeadlines)
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
News::UpdateHeadlines::Headline::Headline()
{
// MPC::wstring m_strIcon;
// MPC::wstring m_strTitle;
// MPC::wstring m_strLink;
m_dtTimeOut = 0; // DATE m_dtTimeOut;
}
News::UpdateHeadlines::Headline::Headline( /*[in]*/ const MPC::wstring& strIcon ,
/*[in]*/ const MPC::wstring& strTitle ,
/*[in]*/ const MPC::wstring& strLink ,
/*[in]*/ const MPC::wstring& strDescription ,
/*[in]*/ int nTimeOutDays )
{
m_strIcon = strIcon; // MPC::wstring m_strIcon;
m_strTitle = strTitle; // MPC::wstring m_strTitle;
m_strLink = strLink; // MPC::wstring m_strLink;
m_strDescription = strDescription; // MPC::wstring m_strDescription;
m_dtTimeOut = MPC::GetLocalTime() + nTimeOutDays; // DATE m_dtTimeOut;
}
////////////////////
News::UpdateHeadlines::SKU::SKU()
{
// MPC::wstring m_strSKU;
// HeadlineVector m_vecHeadlines;
}
News::UpdateHeadlines::SKU::SKU( /*[in]*/ const MPC::wstring& strSKU )
{
m_strSKU = strSKU; // MPC::wstring m_strSKU;
// HeadlineVector m_vecHeadlines;
}
////////////////////
News::UpdateHeadlines::Language::Language()
{
m_lLCID = 0; // long m_lLCID;
// SKUList m_lstSKUs;
}
News::UpdateHeadlines::Language::Language( long lLCID )
{
m_lLCID = lLCID; // long m_lLCID;
// SKUList m_lstSKUs;
}
/////////////////////////////////////////////////////////////////////////////
News::UpdateHeadlines::UpdateHeadlines()
{
// LanguageList m_lstLanguages;
m_data = NULL; // SKU* m_data;
m_fLoaded = false; // bool m_fLoaded;
m_fDirty = false; // bool m_fDirty;
}
HRESULT News::UpdateHeadlines::Locate( /*[in]*/ long lLCID ,
/*[in]*/ const MPC::wstring& strSKU ,
/*[in]*/ bool fCreate )
{
__HCP_FUNC_ENTRY( "News::UpdateHeadlines::Locate" );
HRESULT hr;
LanguageIter itLanguage;
SKUIter itSKU;
m_data = NULL;
if(m_fLoaded == false)
{
CComPtr<IStream> stream;
MPC::wstring strPath( HC_HCUPDATE_UPDATE ); MPC::SubstituteEnvVariables( strPath );
// we load the file
if(SUCCEEDED(News::LoadXMLFile( strPath.c_str(), stream )))
{
if(SUCCEEDED(MPC::Config::LoadStream( this, stream )))
{
;
}
}
m_fLoaded = true;
m_fDirty = false;
}
itLanguage = m_lstLanguages.begin();
while(1)
{
if(itLanguage == m_lstLanguages.end())
{
if(fCreate == false)
{
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_INVALID_DATA);
}
itLanguage = m_lstLanguages.insert( itLanguage, Language( lLCID ) );
m_fDirty = true;
}
if(itLanguage->m_lLCID == lLCID)
{
itSKU = itLanguage->m_lstSKUs.begin();
while(1)
{
if(itSKU == itLanguage->m_lstSKUs.end())
{
if(fCreate == false)
{
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_INVALID_DATA);
}
itSKU = itLanguage->m_lstSKUs.insert( itSKU, SKU( strSKU ) );
m_fDirty = true;
}
//
// Check if its bstrMySKUVersion
if(!MPC::StrICmp( itSKU->m_strSKU, strSKU ))
{
m_data = &(*itSKU);
__MPC_SET_ERROR_AND_EXIT(hr, S_OK);
}
itSKU++;
}
}
itLanguage++;
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
//
// Routine Description:
//
// Loads the UpdateHeadlines.xml file and looks for the specified LCID and SKUVersion
//
// if the file doesn't exist, or there isn't the LCID and SKU,
// those elements are added to the file
//
// the iterators will point to the specified LCID and SKU
//
// Arguments:
//
// nMyLCID the CLanguage to look for
//
// strMySKUVersion the CSKU to look for
//
//
HRESULT News::UpdateHeadlines::Load( /*[in]*/ long lLCID ,
/*[in]*/ const MPC::wstring& strSKU )
{
__HCP_FUNC_ENTRY( "News::UpdateHeadlines::Load" );
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, Locate( lLCID, strSKU, /*fCreate*/true ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
//
// Routine Description:
//
// This saves the UpdateHeadlines file in the path of HC_HCUPDATE_UPDATE
//
// Arguments:
//
// None
//
//
HRESULT News::UpdateHeadlines::Save()
{
__HCP_FUNC_ENTRY( "News::UpdateHeadlines::Save" );
HRESULT hr;
if(m_fDirty)
{
MPC::wstring strPath( HC_HCUPDATE_UPDATE ); MPC::SubstituteEnvVariables( strPath );
// check to see if the dirs exist
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MakeDir( 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);
}
//
// Routine Description:
//
// Will add a new Headline for the specified LCID and SKU
// If the UpdateHeadlines file doesn't exist, it will be created and saved
//
// - additional validation is made
//
// Arguments:
//
// nMyLCID the Language
// strMySKUVersion the SKU
// strMyIcon the Icon for the Headline
// strMyTitle the Title for the Headline
// strMyLink the Link for the Headline
// nTimeOutDays the number of days, to set the frequency
//
//
//
HRESULT News::UpdateHeadlines::Add ( /*[in]*/ long lLCID ,
/*[in]*/ const MPC::wstring& strSKU ,
/*[in]*/ const MPC::wstring& strIcon ,
/*[in]*/ const MPC::wstring& strTitle ,
/*[in]*/ const MPC::wstring& strLink ,
/*[in]*/ const MPC::wstring& strDescription ,
/*[in]*/ int nTimeOutDays ,
/*[in]*/ DATE dtExpiryDate)
{
__HCP_FUNC_ENTRY( "News::UpdateHeadlines::Add" );
HRESULT hr;
HeadlineIter it;
// Before doing anything make sure that the headlines hasnt expired
// Note: this is the calendar expiration date i.e. if the calendar expiry date is 1/1/01 and
// if the user tries to install this headlines on 1/1/02 then it fails
if (dtExpiryDate && (MPC::GetLocalTime() > dtExpiryDate))
{
__MPC_SET_ERROR_AND_EXIT(hr, S_OK);
}
// Set the default expiration date if it is 0
if (nTimeOutDays == 0)
{
nTimeOutDays = HCUPDATE_DEFAULT_TIMEOUT;
}
// Load UpdateHeadlines
__MPC_EXIT_IF_METHOD_FAILS(hr, Load( lLCID, strSKU ));
// check that this Headline is unique:
//
for(it = m_data->m_vecHeadlines.begin(); it != m_data->m_vecHeadlines.end(); it++)
{
// if it has the same title
if(MPC::StrICmp( it->m_strTitle, strTitle ) == 0)
{
// modify existing headline
it->m_strIcon = strIcon;
it->m_strLink = strLink;
it->m_strDescription = strDescription;
it->m_dtTimeOut = MPC::GetLocalTime() + nTimeOutDays;
m_fDirty = true;
break;
}
// if it has the same link
if(it->m_strLink == strLink)
{
// modify existing headline
it->m_strIcon = strIcon;
it->m_strTitle = strTitle;
it->m_strDescription = strDescription;
it->m_dtTimeOut = MPC::GetLocalTime() + nTimeOutDays;
m_fDirty = true;
break;
}
}
// if we didn't found and modified a headline
if(it == m_data->m_vecHeadlines.end())
{
m_data->m_vecHeadlines.insert(m_data->m_vecHeadlines.begin(), Headline( strIcon, strTitle, strLink, strDescription, nTimeOutDays ) );
m_fDirty = true;
}
// Save UpdateHeadlines.xml file
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
//
// Routine Description:
//
// Gets all the UpdateHeadlines for the specified LCID and SKU
// Deletes the expired UpdateHeadlines
// and inserts the rest in the list of Headlines
//
// Arguments:
//
// nMyLCID the Language
// strMySKUVersion the SKU
//
//
HRESULT News::UpdateHeadlines::AddHCUpdateHeadlines( /*[in]*/ long lLCID ,
/*[in]*/ const MPC::wstring& strSKU ,
/*[in]*/ News::Headlines& nhHeadlines )
{
__HCP_FUNC_ENTRY( "News::UpdateHeadlines::Get" );
HRESULT hr;
HeadlineIter itUpdateHeadlines;
Headlines::HeadlineIter itHeadlines;
Headlines::Newsblock* ptrNewsblock;
size_t nLength;
// Load UpdateHeadlines
__MPC_EXIT_IF_METHOD_FAILS( hr, Load( lLCID, strSKU ) );
// Add the first headline from the UpdateHeadlines.xml to the first Newsblock
itUpdateHeadlines = m_data->m_vecHeadlines.begin();
ptrNewsblock = nhHeadlines.get_Newsblock(0);
itHeadlines = ptrNewsblock->m_vecHeadlines.begin();
// Check to see if there are any headlines - if the vector is empty then just add this headline
if ( itHeadlines == ptrNewsblock->m_vecHeadlines.end() )
{
ptrNewsblock->m_vecHeadlines.insert( ptrNewsblock->m_vecHeadlines.end(), News::Headlines::Headline( itUpdateHeadlines->m_strIcon, itUpdateHeadlines->m_strTitle, itUpdateHeadlines->m_strLink, MPC::wstring(), itUpdateHeadlines->m_dtTimeOut, true ));
}
else
{
// There are other headlines in the file
while ( 1 )
{
if ( itHeadlines->m_fUpdateHeadlines == true )
{
// An update headline already exists - replace it
ptrNewsblock->m_vecHeadlines.erase( itHeadlines );
ptrNewsblock->m_vecHeadlines.insert( itHeadlines, News::Headlines::Headline( itUpdateHeadlines->m_strIcon, itUpdateHeadlines->m_strTitle, itUpdateHeadlines->m_strLink, MPC::wstring(), itUpdateHeadlines->m_dtTimeOut, true ));
break;
}
if ( ++itHeadlines == ptrNewsblock->m_vecHeadlines.end() )
{
// No previous update existed - add this to the end of the vector
ptrNewsblock->m_vecHeadlines.insert( ptrNewsblock->m_vecHeadlines.end(), News::Headlines::Headline( itUpdateHeadlines->m_strIcon, itUpdateHeadlines->m_strTitle, itUpdateHeadlines->m_strLink, MPC::wstring(), itUpdateHeadlines->m_dtTimeOut, true ));
break;
}
}
}
// Now add the remaining headlines to the Newsblock whose provider is called "Recent Updates".
if ( ++itUpdateHeadlines != m_data->m_vecHeadlines.end() )
{
nLength = nhHeadlines.get_NumberOfNewsblocks();
// The first headline has been added to the homepage so dont add it again
for ( ptrNewsblock = nhHeadlines.get_Newsblock(nLength - 1); ptrNewsblock; )
{
CComBSTR bstrUpdateBlockName;
// Load the localized name of the update block
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::LocalizeString( IDS_NEWS_UPDATEBLOCK_NAME, bstrUpdateBlockName ));
if(!MPC::StrICmp( ptrNewsblock->m_strProvider, bstrUpdateBlockName ))
{
// Found the "Recent Updates" newsblock - add the rest of the headlines here
// Before adding delete the current set of headlines
ptrNewsblock->m_vecHeadlines.clear();
for ( ; itUpdateHeadlines != m_data->m_vecHeadlines.end(); ++itUpdateHeadlines )
{
ptrNewsblock->m_vecHeadlines.insert(ptrNewsblock->m_vecHeadlines.end(), News::Headlines::Headline( itUpdateHeadlines->m_strIcon, itUpdateHeadlines->m_strTitle, itUpdateHeadlines->m_strLink, itUpdateHeadlines->m_strDescription, itUpdateHeadlines->m_dtTimeOut, true ));
}
break;
}
ptrNewsblock = nhHeadlines.get_Newsblock(--nLength);
}
}
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
//
// Routine Description:
//
// Checks to see if there is more than headlines item - returns true if there are
// Also, deletes expired headlines
//
// Arguments:
//
// nMyLCID the Language
// strMySKUVersion the SKU
//
//
HRESULT News::UpdateHeadlines::DoesMoreThanOneHeadlineExist( /*[in]*/ long lLCID,
/*[in]*/ const MPC::wstring& strSKU,
/*[out]*/ bool& fMoreThanOneHeadline,
/*[out]*/ bool& fExactlyOneHeadline)
{
__HCP_FUNC_ENTRY( "News::UpdateHeadlines::DoesNewsItemsExist" );
HRESULT hr;
HeadlineIter it;
DATE dNow = MPC::GetLocalTime();
fMoreThanOneHeadline = false;
fExactlyOneHeadline = false;
// Load UpdateHeadlines
__MPC_EXIT_IF_METHOD_FAILS(hr, Load( lLCID, strSKU ));
for(it = m_data->m_vecHeadlines.begin(); it != m_data->m_vecHeadlines.end(); it++)
{
// if the headline has expired
if(it->m_dtTimeOut < dNow)
{
m_data->m_vecHeadlines.erase( it );
m_fDirty = true;
}
}
if(m_data->m_vecHeadlines.size() > 1)
{
fMoreThanOneHeadline = true;
fExactlyOneHeadline = false;
}
if(m_data->m_vecHeadlines.size() == 1)
{
fMoreThanOneHeadline = false;
fExactlyOneHeadline = true;
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}