/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: TaxonomyDatabase.cpp Abstract: This file contains the implementation of the class CPCHTaxonomyDatabase. Revision History: Davide Massarenti (dmassare) 05/21/2000 created ******************************************************************************/ #include "stdafx.h" ///////////////////////////////////////////////////////////////////////////// #define LOCAL_FUNC_PROLOGUE(func,hr,coll,val) \ \ __HCP_FUNC_ENTRY( func ); \ \ HRESULT hr; \ CComPtr coll; \ \ __MPC_PARAMCHECK_BEGIN(hr) \ __MPC_PARAMCHECK_POINTER_AND_SET(val,NULL); \ __MPC_PARAMCHECK_END(); \ \ __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &coll )); #define LOCAL_FUNC_EPILOGUE(hr,coll,val) \ \ __MPC_EXIT_IF_METHOD_FAILS(hr, coll.QueryInterface( val )); \ \ hr = S_OK; \ \ __HCP_FUNC_CLEANUP; \ \ __HCP_FUNC_EXIT(hr) ///////////////////////////////////////////////////////////////////////////// HRESULT CPCHTaxonomyDatabase::SelectInstalledSKUs( /*[in]*/ bool fOnlyExported, /*[out, retval]*/ IPCHCollection* *pVal ) { __HCP_FUNC_ENTRY( "CPCHTaxonomyDatabase::get_InstalledSKUs" ); HRESULT hr; CComPtr pColl; CPCHSetOfHelpTopics_Object* pObj = NULL; Taxonomy::LockingHandle handle; Taxonomy::InstalledInstanceIterConst itBegin; Taxonomy::InstalledInstanceIterConst itEnd; Taxonomy::InstalledInstanceIterConst it; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); // // Get the list of SKU installed on the machine. // __MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->GrabControl( handle )); __MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::InstalledInstanceStore::s_GLOBAL->SKU_GetList( itBegin, itEnd )); // // Create a new collection. // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pColl )); for(it = itBegin; it != itEnd; it++) { const Taxonomy::Instance& data = it->m_inst; if(fOnlyExported && !data.m_fExported) continue; __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->CreateInstance( &pObj )); pObj->AddRef(); __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->Init( data )); __MPC_EXIT_IF_METHOD_FAILS(hr, pColl->AddItem( pObj )); pObj->Release(); pObj = NULL; } __MPC_EXIT_IF_METHOD_FAILS(hr, pColl.QueryInterface( pVal )); hr = S_OK; __HCP_FUNC_CLEANUP; MPC::Release( pObj ); __HCP_FUNC_EXIT(hr); } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHTaxonomyDatabase::get_InstalledSKUs( /*[out, retval]*/ IPCHCollection* *pVal ) { return SelectInstalledSKUs( false, pVal ); } STDMETHODIMP CPCHTaxonomyDatabase::get_HasWritePermissions( /*[out, retval]*/ VARIANT_BOOL *pVal ) { __HCP_BEGIN_PROPERTY_GET2("CPCHTaxonomyDatabase::get_HasWritePermissions",hr,pVal,VARIANT_FALSE); if(SUCCEEDED(CPCHSetOfHelpTopics::VerifyWritePermissions())) { *pVal = VARIANT_TRUE; } __HCP_END_PROPERTY(hr); } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHTaxonomyDatabase::LookupNode( /*[in]*/ BSTR bstrNode, /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::LookupNode", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.LookupNode( bstrNode, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::LookupSubNodes( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::LookupSubNodes", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.LookupSubNodes( bstrNode, fVisibleOnly == VARIANT_TRUE, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::LookupNodesAndTopics( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::LookupTopics", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.LookupNodesAndTopics( bstrNode, fVisibleOnly == VARIANT_TRUE, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::LookupTopics( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::LookupTopics", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.LookupTopics( bstrNode, fVisibleOnly == VARIANT_TRUE, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::LocateContext( /*[in]*/ BSTR bstrURL , /*[in,optional]*/ VARIANT vSubSite , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::KeywordSearch", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.LocateContext( bstrURL, vSubSite.vt == VT_BSTR ? vSubSite.bstrVal : NULL, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::KeywordSearch( /*[in]*/ BSTR bstrQuery , /*[in,optional]*/ VARIANT vSubSite , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::KeywordSearch", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.KeywordSearch( bstrQuery, vSubSite.vt == VT_BSTR ? vSubSite.bstrVal : NULL, pColl, NULL )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::GatherNodes( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::GatherNodes", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.GatherNodes( bstrNode, fVisibleOnly == VARIANT_TRUE, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } STDMETHODIMP CPCHTaxonomyDatabase::GatherTopics( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly , /*[out, retval]*/ IPCHCollection* *ppC ) { LOCAL_FUNC_PROLOGUE( "CPCHTaxonomyDatabase::GatherTopics", hr, pColl, ppC ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.GatherTopics( bstrNode, fVisibleOnly == VARIANT_TRUE, pColl )); LOCAL_FUNC_EPILOGUE( hr, pColl, ppC ); } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHTaxonomyDatabase::ConnectToDisk( /*[in]*/ BSTR bstrDirectory, /*[in]*/ IDispatch* notify , /*[out, retval]*/ IPCHCollection* *pVal ) { __HCP_FUNC_ENTRY( "CPCHTaxonomyDatabase::ConnectToDisk" ); HRESULT hr; CComPtr pColl; CComPtr pObj; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrDirectory); __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); (void)Abort(); // // Kickstart the asynchronous query to the server. // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pColl )); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj )); __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_onStatusChange( notify )); __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->InitFromDisk ( bstrDirectory, pColl )); __MPC_EXIT_IF_METHOD_FAILS(hr, pColl.QueryInterface( pVal )); m_ActiveObject = pObj; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHTaxonomyDatabase::ConnectToServer( /*[in]*/ BSTR bstrServerName, /*[in]*/ IDispatch* notify , /*[out, retval]*/ IPCHCollection* *pVal ) { __HCP_FUNC_ENTRY( "CPCHTaxonomyDatabase::ConnectToServer" ); HRESULT hr; CComPtr pColl; CComPtr pObj; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrServerName); __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); (void)Abort(); // // Kickstart the asynchronous query to the disk. // __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pColl )); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj )); __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_onStatusChange( notify )); __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->InitFromServer ( bstrServerName, pColl )); __MPC_EXIT_IF_METHOD_FAILS(hr, pColl.QueryInterface( pVal )); m_ActiveObject = pObj; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHTaxonomyDatabase::Abort() { __HCP_FUNC_ENTRY( "CPCHTaxonomyDatabase::Abort" ); HRESULT hr; if(m_ActiveObject) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_ActiveObject->Abort()); m_ActiveObject.Release(); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); }