/****************************************************************************** Copyright (c) 2001 Microsoft Corporation Module Name: PCHSEWrap.cpp Abstract: Implementation of SearchEngine::WrapperKeyword Revision History: Davide Massarenti (dmassare) 06/01/2001 created ******************************************************************************/ #include "stdafx.h" SearchEngine::WrapperKeyword::WrapperKeyword() { m_Results = NULL; // CPCHQueryResultCollection* m_Results; // CComVariant m_vKeywords; MPC::LocalizeString( IDS_HELPSVC_SEMGR_OWNER , m_bstrOwner , /*fMUI*/true ); MPC::LocalizeString( IDS_HELPSVC_SEMGR_KW_NAME, m_bstrName , /*fMUI*/true ); MPC::LocalizeString( IDS_HELPSVC_SEMGR_KW_DESC, m_bstrDescription, /*fMUI*/true ); m_bstrHelpURL = L"hcp://system/blurbs/keywordhelp.htm"; m_bstrID = L"9488F2E9-47AF-46da-AE4A-86372DEBD56C"; } SearchEngine::WrapperKeyword::~WrapperKeyword() { Thread_Wait(); MPC::Release( m_Results ); } HRESULT SearchEngine::WrapperKeyword::GetParamDefinition( /*[out]*/ const ParamItem_Definition*& lst, /*[out]*/ int& len ) { static const ParamItem_Definition c_lst[] = { { PARAM_BSTR, VARIANT_FALSE, VARIANT_FALSE, L"SUBSITE" , 0, L"Name of subsite to search", NULL }, { PARAM_BOOL, VARIANT_FALSE, VARIANT_FALSE, L"UI_BULLET", 0, L"UI_BULLET" , L"true" }, }; lst = c_lst; len = ARRAYSIZE(c_lst); return S_OK; } //////////////////////////////////////////////////////////////////////////////// STDMETHODIMP SearchEngine::WrapperKeyword::Result( /*[in]*/ long lStart, /*[in]*/ long lEnd, /*[out,retval]*/ IPCHCollection* *ppC ) { __HCP_FUNC_ENTRY( "SearchEngine::WrapperKeyword::Result" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); CComPtr pColl; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(ppC,NULL); __MPC_PARAMCHECK_END(); // // Create the Enumerator and fill it with jobs. // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pColl )); // // If there are results // if(m_Results && m_bEnabled) { long lSize = m_Results->Size(); long lPos; // // Loop thru all results to generate Enumerator // for(lPos=0; lPos= lStart && lPos < lEnd) { CComPtr obj; if(SUCCEEDED(m_Results->GetItem( lPos, &obj )) && obj) { CComPtr pRIObj; // // Create the item to be inserted into the list // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pRIObj )); { ResultItem_Data& dataDst = pRIObj->Data(); const CPCHQueryResult::Payload& dataSrc = obj->GetData(); dataDst.m_bstrTitle = dataSrc.m_bstrTitle; dataDst.m_bstrURI = dataSrc.m_bstrTopicURL; dataDst.m_bstrDescription = dataSrc.m_bstrDescription; dataDst.m_lContentType = dataSrc.m_lType; dataDst.m_dRank = -1.0; } // // Add to enumerator // __MPC_EXIT_IF_METHOD_FAILS(hr, pColl->AddItem( pRIObj )); } } } } __MPC_EXIT_IF_METHOD_FAILS(hr, pColl.QueryInterface( ppC )); hr = S_OK; __MPC_FUNC_CLEANUP; __MPC_FUNC_EXIT(hr); } STDMETHODIMP SearchEngine::WrapperKeyword::get_SearchTerms( /*[out, retval]*/ VARIANT *pVal ) { MPC::SmartLock<_ThreadModel> lock( this ); return ::VariantCopy( pVal, &m_vKeywords ); } ///////////////////////////////////////////////////////////////////////////// // SearchEngine::WrapperKeyword : IPCHSEWrapperInternal STDMETHODIMP SearchEngine::WrapperKeyword::AbortQuery() { // // Abort any threads still running // Thread_Abort(); return S_OK; } STDMETHODIMP SearchEngine::WrapperKeyword::ExecAsyncQuery() { __HCP_FUNC_ENTRY( "SearchEngine::WrapperKeyword::ExecAsyncQuery" ); HRESULT hr; // // Create a thread to execute the query // __MPC_EXIT_IF_METHOD_FAILS(hr, Thread_Start( this, ExecQuery, NULL )); hr = S_OK; __MPC_FUNC_CLEANUP; __MPC_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT SearchEngine::WrapperKeyword::ExecQuery() { __HCP_FUNC_ENTRY( "SearchEngine::WrapperKeyword::ExecQuery" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); if(m_bEnabled) { CComBSTR bstrSubSite; MPC::WStringList lst; if(m_bstrQueryString.Length() == 0) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_INVALID_DATA); } // // If previous results exist, release it // MPC::Release( m_Results ); // // Create a new collection // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &m_Results )); // // Check if search in subsite // { VARIANT* v = GetParamInternal( L"SUBSITE" ); if(v && v->vt == VT_BSTR) bstrSubSite = v->bstrVal; } // // Execute the query // { Taxonomy::Settings ts( m_ths ); __MPC_EXIT_IF_METHOD_FAILS(hr, ts.KeywordSearch( m_bstrQueryString, bstrSubSite, m_Results, &lst )); } // // Sort, first by Priority, then by Content Type. // __MPC_EXIT_IF_METHOD_FAILS(hr, m_Results->Sort( CPCHQueryResultCollection::SORT_BYPRIORITY , m_lNumResult )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_Results->Sort( CPCHQueryResultCollection::SORT_BYCONTENTTYPE )); // // Get the list of keywords. // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::ConvertListToSafeArray( lst, m_vKeywords, VT_VARIANT )); } hr = S_OK; __MPC_FUNC_CLEANUP; Thread_Abort(); // // Call the SearchManager's OnComplete // (void)m_pSEMgr->WrapperComplete( hr, this ); __MPC_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT SearchEngine::WrapperItem__Create_Keyword( /*[out]*/ CComPtr& pVal ) { __HCP_FUNC_ENTRY( "SearchEngine::WrapperKeywordperItem__Create_Keyword" ); HRESULT hr; CComPtr pKW; __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pKW )); pVal = pKW; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); }