/******************************************************************** Copyright (c) 1999 Microsoft Corporation Module Name: NetSearchConfig.cpp Abstract: Implements the class CSearchResultList that contains methods for traversing the elements of XML file that contains the results returned by a search engine. A sample results XML file if shown here - Revision History: a-prakac created 10/24/200 ********************************************************************/ #include "stdafx.h" static const WCHAR g_wszMutexName [] = L"PCH_SEARCHRESULTSCONFIG"; ///////////////////////////////////////////////////////////////////// CFG_BEGIN_FIELDS_MAP(CSearchResultList::CSearchItem) CFG_VALUE( wstring, m_strSearchItem ), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(CSearchResultList::CSearchItem) CFG_END_CHILD_MAP() //DEFINE_CFG_OBJECT(CSearchResultList::CSearchItem,L"SearchItem") DEFINE_CFG_OBJECT(CSearchResultList::CSearchItem,L"SearchTerm") DEFINE_CONFIG_METHODS__NOCHILD(CSearchResultList::CSearchItem) ///////////////////////////////////////////////////////////////////// CFG_BEGIN_FIELDS_MAP(CSearchResultList::CResultItem) CFG_ATTRIBUTE( L"Title" , BSTR , m_data.m_bstrTitle ), CFG_ATTRIBUTE( L"URI" , BSTR , m_data.m_bstrURI ), CFG_ATTRIBUTE( L"ContentType" , long , m_data.m_lContentType ), CFG_ATTRIBUTE( L"Rank" , double, m_data.m_dRank ), CFG_ATTRIBUTE( L"Description" , BSTR , m_data.m_bstrDescription ), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(CSearchResultList::CResultItem) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(CSearchResultList::CResultItem,L"ResultItem") DEFINE_CONFIG_METHODS__NOCHILD(CSearchResultList::CResultItem) ///////////////////////////////////////////////////////////////////// CFG_BEGIN_FIELDS_MAP(CSearchResultList) CFG_ELEMENT(L"PrevQuery", BSTR, m_bstrPrevQuery), CFG_END_FIELDS_MAP() CFG_BEGIN_CHILD_MAP(CSearchResultList) CFG_CHILD(CSearchResultList::CSearchItem) CFG_CHILD(CSearchResultList::CResultItem) CFG_END_CHILD_MAP() DEFINE_CFG_OBJECT(CSearchResultList, L"ResultList") DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(CSearchResultList,tag,defSubType) if(tag == _cfg_table_tags[0]) { defSubType = &(*(m_lstSearchItem.insert( m_lstSearchItem.end() ))); return S_OK; } if(tag == _cfg_table_tags[1]) { defSubType = &(*(m_lstResult.insert( m_lstResult.end() ))); return S_OK; } DEFINE_CONFIG_METHODS_SAVENODE_SECTION(CSearchResultList,xdn) hr = MPC::Config::SaveList( m_lstSearchItem, xdn ); hr = MPC::Config::SaveList( m_lstResult, xdn ); DEFINE_CONFIG_METHODS_END(CSearchResultList) ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // Commenting out MPC:: is a workaround for a compiler bug. CSearchResultList::CSearchResultList() : /*MPC::*/NamedMutex( g_wszMutexName ) { } CSearchResultList::~CSearchResultList() { } /************ Method - CSearchResultList::LoadResults(IStream* pStream) Description - This method loads the XML file (passed thro the IStream pointer) into a list and sets the iterator of the list to the first element in the list. ************/ HRESULT CSearchResultList::LoadResults( /*[in]*/IStream* pStream ) { __HCP_FUNC_ENTRY( "CSearchResultList::LoadConfiguration" ); HRESULT hr; __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::Config::LoadStream( this, pStream )); __MPC_EXIT_IF_METHOD_FAILS(hr, MoveFirst()); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT CSearchResultList::ClearResults() { __HCP_FUNC_ENTRY( "CSearchResultList::ClearResult" ); m_lstResult.clear(); return S_OK; } /************ Method - CSearchResultList::IsCursorValid(), MoveFirst(), MoveNext() Description - These methods are used to traverse the list that contains the various XML elements of the loaded file. ************/ bool CSearchResultList::IsCursorValid() { return (m_itCurrentResult != m_lstResult.end()); } HRESULT CSearchResultList::MoveFirst() { m_itCurrentResult = m_lstResult.begin(); return S_OK; } HRESULT CSearchResultList::MoveNext() { if(IsCursorValid()) { m_itCurrentResult++; } return S_OK; } /************ Method - CSearchResultList::InitializeResultObject(SearchEngine::ResultItem *pRIObj) Description - This method is called by CNetSW::Results() to initialize a result item object. Initializes with the current result item. ************/ HRESULT CSearchResultList::InitializeResultObject( /*[out]*/ SearchEngine::ResultItem* pRIObj ) { if(IsCursorValid()) pRIObj->Data() = m_itCurrentResult->m_data; return S_OK; } /************ Method - CSearchResultList::SetResultItemIterator(long lIndex) Description - This method returns sets the iterator to the index passed in. This method is called from CNetSW::Results() when retrieving results from lStart to lEnd. If index passed in is invalid then returns E_FAIL. ************/ HRESULT CSearchResultList::SetResultItemIterator( /*[in]*/long lIndex ) { if((lIndex < 0) || (lIndex > m_lstResult.size())) return E_FAIL; MoveFirst(); std::advance( m_itCurrentResult, (int)lIndex ); return S_OK; } /************ Method - CSearchResultList::GetSearchTerms(MPC::WStringList& strList) Description - This method returns a list of all the search terms ************/ HRESULT CSearchResultList::GetSearchTerms( /*[in, out]*/ MPC::WStringList& strList ) { SearchIter it; it = m_lstSearchItem.begin(); while(it != m_lstSearchItem.end()) { strList.insert( strList.end(), it->m_strSearchItem ); it++; } return S_OK; } /************ Method - CSearchResultList::get_PrevQuery() Description - This method returns the value of the attribute PREV_QUERY - currently this is used only the PSS search engine to send back the processed query. Used for "Search within results". ************/ CComBSTR& CSearchResultList::PrevQuery() { return m_bstrPrevQuery; }