Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

312 lines
11 KiB

/******************************************************************************
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<CPCHQueryResultCollection> 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<CPCHCollection> 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<CPCHCollection> pColl;
CComPtr<CPCHSetOfHelpTopics> 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<CPCHCollection> pColl;
CComPtr<CPCHSetOfHelpTopics> 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);
}