/** Copyright (c) 2000 Microsoft Corporation ****************************************************************************** ** Module Name: ** ** Newsver.cpp ** ** Abstract: ** ** Implementation of Newsver class ** ** Author: ** ** Martha Arellano (t-alopez) 03-Oct-2000 ** ** ** Revision History: ** ** Martha Arellano (t-alopez) 05-Oct-2000 Changed Newsver.xml format ** ** 11-Oct-2000 Added URL and get_URL property ** ** 12-Oct-2000 Added Download method ** ** ****************************************************************************** **/ #include "stdafx.h" ////////////////////////////////////////////////////////////////////// // CONFIG MAP ////////////////////////////////////////////////////////////////////// /* */ CFG_BEGIN_FIELDS_MAP(News::Newsver::Newsblock) CFG_ATTRIBUTE( L"URL", wstring, m_strURL ), CFG_ATTRIBUTE( L"OEM", bool, m_fNewsblockHasHeadlines ), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(News::Newsver::Newsblock) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(News::Newsver::Newsblock, L"NEWSBLOCK") DEFINE_CONFIG_METHODS__NOCHILD(News::Newsver::Newsblock) //////////////////// CFG_BEGIN_FIELDS_MAP(News::Newsver::SKU) CFG_ATTRIBUTE( L"VERSION", wstring, m_strSKU), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(News::Newsver::SKU) CFG_CHILD(News::Newsver::Newsblock) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(News::Newsver::SKU, L"SKU") DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(News::Newsver::SKU,tag,defSubType) if(tag == _cfg_table_tags[0]) { defSubType = &(*(m_vecNewsblocks.insert( m_vecNewsblocks.end() ))); return S_OK; } DEFINE_CONFIG_METHODS_SAVENODE_SECTION(News::Newsver::SKU,xdn) hr = MPC::Config::SaveList( m_vecNewsblocks, xdn ); DEFINE_CONFIG_METHODS_END(News::Newsver::SKU) //////////////////// CFG_BEGIN_FIELDS_MAP(News::Newsver::Language) CFG_ATTRIBUTE( L"LCID", long, m_lLCID ), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(News::Newsver::Language) CFG_CHILD(News::Newsver::SKU) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(News::Newsver::Language,L"LANGUAGE") DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(News::Newsver::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::Newsver::Language,xdn) hr = MPC::Config::SaveList( m_lstSKUs, xdn ); DEFINE_CONFIG_METHODS_END(News::Newsver::Language) //////////////////// CFG_BEGIN_FIELDS_MAP(News::Newsver) CFG_ATTRIBUTE( L"URL", wstring, m_strURL ), CFG_ATTRIBUTE( L"FREQUENCY", int , m_nFrequency ), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(News::Newsver) CFG_CHILD(News::Newsver::Language) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(News::Newsver,L"NEWSVER") DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(News::Newsver,tag,defSubType) if(tag == _cfg_table_tags[0]) { defSubType = &(*(m_lstLanguages.insert( m_lstLanguages.end() ))); return S_OK; } DEFINE_CONFIG_METHODS_SAVENODE_SECTION(News::Newsver,xdn) hr = MPC::Config::SaveList( m_lstLanguages, xdn ); DEFINE_CONFIG_METHODS_END(News::Newsver) ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// News::Newsver::Newsblock::Newsblock() { // MPC::wstring m_strURL; } News::Newsver::SKU::SKU() { // MPC::wstring m_strSKU; // NewsblockVector m_vecNewsblocks; } News::Newsver::Language::Language() { m_lLCID = 0; // long m_lLCID; // SKUList m_lstSKUs; } News::Newsver::Newsver() { // MPC::wstring m_strURL; m_nFrequency = 0; // int m_nFrequency; m_fLoaded = false; // bool m_fLoaded; m_fDirty = false; // bool m_fDirty; // // LanguageList m_lstLanguages; } ///////////////////////////////////////////////////////////////////////////// // // Routine Description: // // Downloads the newsver.xml file and saves it in HC_HCUPDATE_NEWSVER // // Arguments: // // strNewsverURL the URL for newsver.xml // HRESULT News::Newsver::Download( /*[in]*/ const MPC::wstring& strNewsverURL ) { __HCP_FUNC_ENTRY( "News::Newsver::Download" ); HRESULT hr; CComPtr stream; MPC::wstring strPath; __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::SubstituteEnvVariables( strPath = HC_HCUPDATE_NEWSVER )); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MakeDir ( strPath )); __MPC_EXIT_IF_METHOD_FAILS(hr, News::LoadXMLFile( strNewsverURL.c_str(), stream )); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::LoadStream( this, stream )); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::SaveFile( this, strPath.c_str() )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Loads the cached newsver.xml file and looks for the newsblocks for the specified LCID and SKUVersion // // if the newsblocks are found, m_fReady is TRUE // // Arguments: // // lLCID the Language to look for // // strSKU the SKU to look for // // HRESULT News::Newsver::Load( /*[in]*/ long lLCID, /*[in]*/ const MPC::wstring& strSKU ) { __HCP_FUNC_ENTRY( "News::Newsver::Load" ); HRESULT hr; MPC::wstring strPath = HC_HCUPDATE_NEWSVER; MPC::SubstituteEnvVariables( strPath ); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::LoadFile( this, strPath.c_str() )); /////////////// looks for LCID and SKU m_data = NULL; for(LanguageIter it = m_lstLanguages.begin(); it != m_lstLanguages.end(); it++) { if(it->m_lLCID == lLCID) { for(SKUIter it2 = it->m_lstSKUs.begin(); it2 != it->m_lstSKUs.end(); it2++) { if(!MPC::StrICmp( it2->m_strSKU, strSKU )) { m_data = &(*it2); break; } } break; } } if(m_data == NULL) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_INVALID_DATA); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } // // Routine Description: // // Returns true if the newsblock has the HEADLINES attribute set to true else returns false // bool News::Newsver::OEMNewsblock( /*[in]*/ size_t nIndex ) { if(m_data == NULL || nIndex >= m_data->m_vecNewsblocks.size() ) { return false; } return (m_data->m_vecNewsblocks[nIndex].m_fNewsblockHasHeadlines); } //////////////////////////////////////////////////////////////////////////////// size_t News::Newsver::get_NumberOfNewsblocks() { return m_data ? m_data->m_vecNewsblocks.size() : 0; } const MPC::wstring* News::Newsver::get_NewsblockURL( /*[in]*/ size_t nIndex ) { if(m_data == NULL || nIndex >= m_data->m_vecNewsblocks.size() ) { return NULL; } return &(m_data->m_vecNewsblocks[nIndex].m_strURL); } const MPC::wstring* News::Newsver::get_URL() { return m_strURL.size() ? &m_strURL : NULL; } int News::Newsver::get_Frequency() { return m_nFrequency; }