/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: ServiceProxy.h Abstract: All the interaction with the Help Service is done through this class. It's responsible for kickstarting the service as late as possible. Revision History: Davide Massarenti (dmassare) 07/17/2000 created Kalyani Narlanka (KalyaniN) 03/15/01 Moved Incident and Encryption Objects from HelpService to HelpCtr to improve Perf. ******************************************************************************/ #if !defined(__INCLUDED___PCH___SERVICEPROXY_H___) #define __INCLUDED___PCH___SERVICEPROXY_H___ // // From HelpServiceTypeLib.idl // #include #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////////// class CPCHProxy_IPCHService; class CPCHProxy_IPCHUtility; class CPCHProxy_IPCHUserSettings2; class CPCHProxy_IPCHSetOfHelpTopics; class CPCHProxy_IPCHTaxonomyDatabase; class CPCHHelpCenterExternal; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // IDispatchEx (We override the default implementation to get a chance to look at the TRUSTED/UNTRUSTED settings) // #define INTERNETSECURITY__INVOKEEX() \ STDMETHOD(InvokeEx)( DISPID id , \ LCID lcid , \ WORD wFlags , \ DISPPARAMS* pdp , \ VARIANT* pvarRes , \ EXCEPINFO* pei , \ IServiceProvider* pspCaller ) \ { \ return m_SecurityHandle.ForwardInvokeEx( id, lcid, wFlags, pdp, pvarRes, pei, pspCaller ); \ } #define INTERNETSECURITY__CHECK_TRUST() __MPC_EXIT_IF_METHOD_FAILS(hr, m_SecurityHandle.IsTrusted()) #define INTERNETSECURITY__CHECK_SYSTEM() __MPC_EXIT_IF_METHOD_FAILS(hr, m_SecurityHandle.IsSystem()) class CPCHSecurityHandle { CPCHHelpCenterExternal* m_ext; IDispatch* m_object; public: CPCHSecurityHandle(); void Initialize( /*[in]*/ CPCHHelpCenterExternal* ext, /*[in] */ IDispatch* object ); void Passivate ( ); operator CPCHHelpCenterExternal*() const { return m_ext; } //////////////////// HRESULT ForwardInvokeEx( /*[in] */ DISPID id , /*[in] */ LCID lcid , /*[in] */ WORD wFlags , /*[in] */ DISPPARAMS* pdp , /*[out]*/ VARIANT* pvarRes , /*[out]*/ EXCEPINFO* pei , /*[in] */ IServiceProvider* pspCaller ); HRESULT IsTrusted(); HRESULT IsSystem (); }; ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// namespace AsynchronousTaxonomyDatabase { class Notifier; class QueryStore; class Engine; //////////////////// class NotifyHandle : public CComObjectRootEx // For locking and reference counting... { friend class Notifier; int m_iType; CComBSTR m_bstrID; bool m_fAttached; HANDLE m_hEvent; HRESULT m_hr; CPCHQueryResultCollection* m_pColl; //////////////////// HRESULT Init( ); void Bind( /*[in]*/ int iType, /*[in]*/ LPCWSTR szID ); virtual void Call( /*[in]*/ QueryStore* qs ); public: NotifyHandle(); virtual ~NotifyHandle(); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); virtual void Detach(); virtual bool IsAttached(); HRESULT GetData( /*[out]*/ CPCHQueryResultCollection* *pColl ); HRESULT Wait ( /*[in]*/ DWORD dwTimeout = INFINITE ); }; template class NotifyHandle_Method : public NotifyHandle { typedef void (C::*CLASS_METHOD)( /*[in]*/ NotifyHandle* notify ); C* m_pThis; CLASS_METHOD m_pCallback; //////////////////// void Call( /*[in]*/ QueryStore* qs ) { MPC::SmartLock<_ThreadModel> lock( this ); NotifyHandle::Call( qs ); if(m_pThis) { (m_pThis->*m_pCallback)( this ); } } public: NotifyHandle_Method( /*[in]*/ C* pThis, /*[in]*/ CLASS_METHOD pCallback ) { m_pThis = pThis; m_pCallback = pCallback; } void Detach() { MPC::SmartLock<_ThreadModel> lock( this ); NotifyHandle::Detach( qs ); m_pThis = NULL; } }; class Notifier : public CComObjectRootEx // For locking... { typedef std::list< NotifyHandle* > List; typedef List::iterator Iter; typedef List::const_iterator IterConst; List m_lstCallback; //////////////////// private: // Disable copy constructors... Notifier ( /*[in]*/ const Notifier& ); Notifier& operator=( /*[in]*/ const Notifier& ); public: Notifier(); ~Notifier(); //////////////////// void Notify( /*[in]*/ QueryStore* qs ); //////////////////// HRESULT AddNotification( /*[in]*/ QueryStore* qs, /*[in]*/ NotifyHandle* nb ); }; //////////////////// class QueryStore { friend class Notifier; friend class Engine; int m_iType; CComBSTR m_bstrID; CComVariant m_vOption; bool m_fDone; HRESULT m_hr; MPC::CComHGLOBAL m_hgData; FILETIME m_dLastUsed; private: // Disable copy constructors... QueryStore ( /*[in]*/ const QueryStore& ); QueryStore& operator=( /*[in]*/ const QueryStore& ); public: QueryStore( /*[in]*/ int iType, /*[in]*/ LPCWSTR szID, /*[in]*/ VARIANT* option ); ~QueryStore(); bool LessThen ( /*[in]*/ QueryStore const &qs ) const; bool NewerThen( /*[in]*/ QueryStore const &qs ) const; //////////////////// HRESULT Execute( /*[in]*/ OfflineCache::Handle* handle, /*[in]*/ CPCHProxy_IPCHTaxonomyDatabase* parent, /*[in]*/ bool fForce = false ); HRESULT GetData( /*[out]*/ CPCHQueryResultCollection* *pColl ); void Invalidate(); }; //////////////////// class Engine : public MPC::Thread, public CComObjectRootEx { class CompareQueryStores { public: bool operator()( /*[in]*/ const QueryStore *, /*[in]*/ const QueryStore * ) const; }; typedef std::set Set; typedef Set::iterator Iter; typedef Set::const_iterator IterConst; CPCHProxy_IPCHTaxonomyDatabase* m_parent; Set m_setQueries; Notifier m_notifier; //////////////////// bool LookupCache( /*[out]*/ OfflineCache::Handle& handle ); HRESULT Run(); void InvalidateQueries(); public: Engine( /*[in]*/ CPCHProxy_IPCHTaxonomyDatabase* parent ); virtual ~Engine(); void Passivate (); void RefreshConnection(); //////////////////// HRESULT ExecuteQuery( /*[in]*/ int iType, /*[in]*/ LPCWSTR szID, /*[in]*/ VARIANT* option, /*[in]*/ NotifyHandle* nb ); HRESULT ExecuteQuery( /*[in]*/ int iType, /*[in]*/ LPCWSTR szID, /*[in]*/ VARIANT* option, /*[out, retval]*/ CPCHQueryResultCollection* *ppC ); }; }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// typedef MPC::SmartLockGeneric ProxySmartLock; class ATL_NO_VTABLE CPCHProxy_IPCHService : public CComObjectRootEx, public MPC::IDispatchExImpl< IPCHService, &IID_IPCHService, &LIBID_HelpServiceTypeLib> { CPCHSecurityHandle m_SecurityHandle; CPCHHelpCenterExternal* m_parent; MPC::CComSafeAutoCriticalSection m_DirectLock; MPC::CComPtrThreadNeutral m_Direct_Service; bool m_fContentStoreTested; CPCHProxy_IPCHUtility* m_Utility; public: BEGIN_COM_MAP(CPCHProxy_IPCHService) COM_INTERFACE_ENTRY2(IDispatch, IDispatchEx) COM_INTERFACE_ENTRY(IDispatchEx) COM_INTERFACE_ENTRY(IPCHService) END_COM_MAP() CPCHProxy_IPCHService(); virtual ~CPCHProxy_IPCHService(); INTERNETSECURITY__INVOKEEX(); //////////////////// CPCHHelpCenterExternal* Parent () { return m_parent; } bool IsConnected() { return !!m_Direct_Service; } //////////////////// HRESULT ConnectToParent ( /*[in]*/ CPCHHelpCenterExternal* parent ); void Passivate ( ); HRESULT EnsureDirectConnection( /*[out]*/ CComPtr& svc, /*[in]*/ bool fRefresh = false ); HRESULT EnsureContentStore ( ); HRESULT GetUtility( /*[out]*/ CPCHProxy_IPCHUtility* *pVal = NULL ); //////////////////// public: // IPCHService STDMETHOD(get_RemoteSKUs)( /*[out, retval]*/ IPCHCollection* *pVal ) { return E_NOTIMPL; } STDMETHOD(IsTrusted)( /*[in]*/ BSTR bstrURL, /*[out, retval]*/ VARIANT_BOOL *pfTrusted ) { return E_NOTIMPL; } STDMETHOD(Utility )( /*[in]*/ BSTR bstrSKU, /*[in]*/ long lLCID, /*[out]*/ IPCHUtility* *pVal ) { return E_NOTIMPL; } STDMETHOD(RemoteHelpContents)( /*[in]*/ BSTR bstrSKU, /*[in]*/ long lLCID, /*[out]*/ IPCHRemoteHelpContents* *pVal ) { return E_NOTIMPL; } STDMETHOD(RegisterHost )( /*[in]*/ BSTR bstrID , /*[in ]*/ IUnknown* pObj ) { return E_NOTIMPL; } STDMETHOD(CreateScriptWrapper)( /*[in]*/ REFCLSID rclsid, /*[in]*/ BSTR bstrCode, /*[in]*/ BSTR bstrURL, /*[out]*/ IUnknown* *ppObj ); STDMETHOD(TriggerScheduledDataCollection)( /*[in]*/ VARIANT_BOOL fStart ) { return E_NOTIMPL; } STDMETHOD(PrepareForShutdown )( ) { return E_NOTIMPL; } STDMETHOD(ForceSystemRestore)( ) { return E_NOTIMPL; } STDMETHOD(UpgradeDetected )( ) { return E_NOTIMPL; } STDMETHOD(MUI_Install )( /*[in]*/ long LCID, /*[in]*/ BSTR bstrFile ) { return E_NOTIMPL; } STDMETHOD(MUI_Uninstall )( /*[in]*/ long LCID ) { return E_NOTIMPL; } STDMETHOD(RemoteConnectionParms)( /*[in ]*/ BSTR bstrUserName , /*[in ]*/ BSTR bstrDomainName , /*[in ]*/ long lSessionID , /*[in ]*/ BSTR bstrUserHelpBlob , /*[out]*/ BSTR *pbstrConnectionString ) { return E_NOTIMPL; } STDMETHOD(RemoteUserSessionInfo)( /*[out]*/ IPCHCollection* *pVal ) { return E_NOTIMPL; } }; //////////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CPCHProxy_IPCHUtility : public CComObjectRootEx, public MPC::IDispatchExImpl< IPCHUtility, &IID_IPCHUtility, &LIBID_HelpServiceTypeLib> { CPCHSecurityHandle m_SecurityHandle; CPCHProxy_IPCHService* m_parent; MPC::CComSafeAutoCriticalSection m_DirectLock; MPC::CComPtrThreadNeutral m_Direct_Utility; CPCHProxy_IPCHUserSettings2* m_UserSettings2; CPCHProxy_IPCHTaxonomyDatabase* m_TaxonomyDatabase; public: BEGIN_COM_MAP(CPCHProxy_IPCHUtility) COM_INTERFACE_ENTRY2(IDispatch, IDispatchEx) COM_INTERFACE_ENTRY(IDispatchEx) COM_INTERFACE_ENTRY(IPCHUtility) END_COM_MAP() CPCHProxy_IPCHUtility(); virtual ~CPCHProxy_IPCHUtility(); INTERNETSECURITY__INVOKEEX(); //////////////////// CPCHProxy_IPCHService* Parent () { return m_parent; } bool IsConnected() { return !!m_Direct_Utility; } //////////////////// HRESULT ConnectToParent ( /*[in]*/ CPCHProxy_IPCHService* parent, /*[in]*/ CPCHHelpCenterExternal* ext ); void Passivate ( ); HRESULT EnsureDirectConnection( /*[out]*/ CComPtr& util, /*[in]*/ bool fRefresh = false ); HRESULT GetUserSettings2( /*[out]*/ CPCHProxy_IPCHUserSettings2* *pVal = NULL ); HRESULT GetDatabase ( /*[out]*/ CPCHProxy_IPCHTaxonomyDatabase* *pVal = NULL ); //////////////////// public: // IPCHUtility STDMETHOD(get_UserSettings)( /*[out, retval]*/ IPCHUserSettings* *pVal ); STDMETHOD(get_Channels )( /*[out, retval]*/ ISAFReg* *pVal ); STDMETHOD(get_Security )( /*[out, retval]*/ IPCHSecurity* *pVal ); STDMETHOD(get_Database )( /*[out, retval]*/ IPCHTaxonomyDatabase* *pVal ); STDMETHOD(FormatError)( /*[in]*/ VARIANT vError, /*[out, retval]*/ BSTR *pVal ); STDMETHOD(CreateObject_SearchEngineMgr)( /*[out, retval]*/ IPCHSEManager* *ppSE ); STDMETHOD(CreateObject_DataCollection )( /*[out, retval]*/ ISAFDataCollection* *ppDC ); STDMETHOD(CreateObject_Cabinet )( /*[out, retval]*/ ISAFCabinet* *ppCB ); STDMETHOD(CreateObject_Encryption )( /*[out, retval]*/ ISAFEncrypt* *ppEn ); STDMETHOD(CreateObject_Channel )( /*[in]*/ BSTR bstrVendorID, /*[in]*/ BSTR bstrProductID, /*[out, retval]*/ ISAFChannel* *ppCh ); STDMETHOD(CreateObject_RemoteDesktopConnection)( /*[out, retval]*/ ISAFRemoteDesktopConnection* *ppRDC ); STDMETHOD(CreateObject_RemoteDesktopSession )( /*[in] */ REMOTE_DESKTOP_SHARING_CLASS sharingClass , /*[in] */ long lTimeout , /*[in] */ BSTR bstrConnectionParms , /*[in] */ BSTR bstrUserHelpBlob , /*[out, retval]*/ ISAFRemoteDesktopSession* *ppRCS ); STDMETHOD(ConnectToExpert)( /*[in]*/ BSTR bstrExpertConnectParm, /*[in]*/ LONG lTimeout, /*[out, retval]*/ LONG *lSafErrorCode ); STDMETHOD(SwitchDesktopMode)( /*[in]*/ int nMode, /* [in]*/ int nRAType ); }; //////////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CPCHProxy_IPCHUserSettings2 : public MPC::Thread, public CComObjectRootEx, public MPC::IDispatchExImpl { CPCHSecurityHandle m_SecurityHandle; CPCHProxy_IPCHUtility* m_parent; MPC::CComSafeAutoCriticalSection m_DirectLock; MPC::CComPtrThreadNeutral m_Direct_UserSettings; CPCHProxy_IPCHSetOfHelpTopics* m_MachineSKU; CPCHProxy_IPCHSetOfHelpTopics* m_CurrentSKU; Taxonomy::HelpSet m_ths; CComBSTR m_bstrScope; bool m_fReady; Taxonomy::Instance m_instMachine; Taxonomy::Instance m_instCurrent; bool m_News_fDone; bool m_News_fEnabled; MPC::CComPtrThreadNeutral m_News_xmlData; //////////////////// HRESULT PollNews (); HRESULT PrepareNews(); HRESULT GetInstanceValue( /*[in]*/ const MPC::wstring* str, /*[out, retval]*/ BSTR *pVal ); public: BEGIN_COM_MAP(CPCHProxy_IPCHUserSettings2) COM_INTERFACE_ENTRY2(IDispatch, IDispatchEx) COM_INTERFACE_ENTRY(IDispatchEx) COM_INTERFACE_ENTRY(IPCHUserSettings) COM_INTERFACE_ENTRY(IPCHUserSettings2) END_COM_MAP() CPCHProxy_IPCHUserSettings2(); virtual ~CPCHProxy_IPCHUserSettings2(); INTERNETSECURITY__INVOKEEX(); //////////////////// CPCHProxy_IPCHUtility* Parent () { return m_parent; } bool IsConnected () { return !!m_Direct_UserSettings; } bool IsDesktopSKU () { (void)EnsureInSync(); return m_instCurrent.m_fDesktop; } Taxonomy::Instance& MachineInstance() { return m_instMachine; } Taxonomy::Instance& CurrentInstance() { return m_instCurrent; } Taxonomy::HelpSet& THS () { return m_ths; } HRESULT EnsureInSync(); //////////////////// HRESULT ConnectToParent ( /*[in]*/ CPCHProxy_IPCHUtility* parent, /*[in]*/ CPCHHelpCenterExternal* ext ); void Passivate ( ); HRESULT EnsureDirectConnection( /*[out]*/ CComPtr& us, /*[in]*/ bool fRefresh = false ); HRESULT Initialize ( ); HRESULT GetCurrentSKU( /*[out]*/ CPCHProxy_IPCHSetOfHelpTopics* *pVal = NULL ); HRESULT GetMachineSKU( /*[out]*/ CPCHProxy_IPCHSetOfHelpTopics* *pVal = NULL ); //////////////////// bool CanUseUserSettings(); HRESULT LoadUserSettings (); HRESULT SaveUserSettings (); public: // IPCHUserSettings STDMETHOD(get_CurrentSKU)( /*[out, retval]*/ IPCHSetOfHelpTopics* *pVal ); STDMETHOD(get_MachineSKU)( /*[out, retval]*/ IPCHSetOfHelpTopics* *pVal ); STDMETHOD(get_HelpLocation )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_DatabaseDir )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_DatabaseFile )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_IndexFile )( /*[in,optional]*/ VARIANT vScope, /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_IndexDisplayName)( /*[in,optional]*/ VARIANT vScope, /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_LastUpdated )( /*[out, retval]*/ DATE *pVal ); STDMETHOD(get_AreHeadlinesEnabled)( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_News )( /*[out, retval]*/ IUnknown* *pVal ); STDMETHOD(Select)( /*[in]*/ BSTR bstrSKU, /*[in]*/ long lLCID ); // IPCHUserSettings2 STDMETHOD(get_Favorites)( /*[out, retval]*/ IPCHFavorites* *pVal ); STDMETHOD(get_Options )( /*[out, retval]*/ IPCHOptions* *pVal ); STDMETHOD(get_Scope )( /*[out, retval]*/ BSTR *pVal ); HRESULT put_Scope ( /*[in ]*/ BSTR newVal ); // INTERNAL METHOD. STDMETHOD(get_IsRemoteSession )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsTerminalServer )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsDesktopVersion )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsAdmin )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsPowerUser )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsStartPanelOn )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsWebViewBarricadeOn)( /*[out, retval]*/ VARIANT_BOOL *pVal ); }; //////////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CPCHProxy_IPCHSetOfHelpTopics : public CComObjectRootEx, public IDispatchImpl { CPCHProxy_IPCHUserSettings2* m_parent; MPC::CComSafeAutoCriticalSection m_DirectLock; MPC::CComPtrThreadNeutral m_Direct_SKU; bool m_fMachine; //////////////////// public: BEGIN_COM_MAP(CPCHProxy_IPCHSetOfHelpTopics) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IPCHSetOfHelpTopics) END_COM_MAP() CPCHProxy_IPCHSetOfHelpTopics(); virtual ~CPCHProxy_IPCHSetOfHelpTopics(); //////////////////// CPCHProxy_IPCHUserSettings2* Parent () { return m_parent; } bool IsConnected() { return !!m_Direct_SKU; } //////////////////// HRESULT ConnectToParent ( /*[in]*/ CPCHProxy_IPCHUserSettings2* parent, /*[in]*/ bool fMachine ); void Passivate ( ); HRESULT EnsureDirectConnection( /*[out]*/ CComPtr& sht, /*[in]*/ bool fRefresh = false ); //////////////////// public: // // IPCHSetOfHelpTopics STDMETHOD(get_SKU )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_Language )( /*[out, retval]*/ long *pVal ); STDMETHOD(get_DisplayName )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_ProductID )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_Version )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_Location )( /*[out, retval]*/ BSTR *pVal ); STDMETHOD(get_Exported )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(put_Exported )( /*[in ]*/ VARIANT_BOOL newVal ); STDMETHOD(put_onStatusChange)( /*[in ]*/ IDispatch* function ); STDMETHOD(get_Status )( /*[out, retval]*/ SHT_STATUS *pVal ); STDMETHOD(get_ErrorCode )( /*[out, retval]*/ long *pVal ); STDMETHOD(get_IsMachineHelp )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_IsInstalled )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_CanInstall )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(get_CanUninstall )( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(Install )(); STDMETHOD(Uninstall)(); STDMETHOD(Abort )(); }; //////////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE CPCHProxy_IPCHTaxonomyDatabase : public CComObjectRootEx, public MPC::IDispatchExImpl< IPCHTaxonomyDatabase, &IID_IPCHTaxonomyDatabase, &LIBID_HelpServiceTypeLib> { CPCHSecurityHandle m_SecurityHandle; CPCHProxy_IPCHUtility* m_parent; MPC::CComSafeAutoCriticalSection m_DirectLock; MPC::CComPtrThreadNeutral m_Direct_TaxonomyDatabase; AsynchronousTaxonomyDatabase::Engine m_AsyncCachingEngine; public: BEGIN_COM_MAP(CPCHProxy_IPCHTaxonomyDatabase) COM_INTERFACE_ENTRY2(IDispatch, IDispatchEx) COM_INTERFACE_ENTRY(IDispatchEx) COM_INTERFACE_ENTRY(IPCHTaxonomyDatabase) END_COM_MAP() CPCHProxy_IPCHTaxonomyDatabase(); virtual ~CPCHProxy_IPCHTaxonomyDatabase(); INTERNETSECURITY__INVOKEEX(); //////////////////// CPCHProxy_IPCHUtility* Parent () { return m_parent; }; bool IsConnected() { return !!m_Direct_TaxonomyDatabase; }; //////////////////// HRESULT ConnectToParent ( /*[in]*/ CPCHProxy_IPCHUtility* parent, /*[in]*/ CPCHHelpCenterExternal* ext ); void Passivate ( ); HRESULT EnsureDirectConnection( /*[out]*/ CComPtr& db, /*[in]*/ bool fRefresh = false ); //////////////////// HRESULT ExecuteQuery( /*[in]*/ int iType, /*[in]*/ LPCWSTR szID, /*[out, retval]*/ CPCHQueryResultCollection* *ppC, /*[in]*/ VARIANT* option = NULL ); HRESULT ExecuteQuery( /*[in]*/ int iType, /*[in]*/ LPCWSTR szID, /*[out, retval]*/ IPCHCollection* *ppC, /*[in]*/ VARIANT* option = NULL ); public: // IPCHTaxonomyDatabase STDMETHOD(get_InstalledSKUs )( /*[out, retval]*/ IPCHCollection* *pVal ); STDMETHOD(get_HasWritePermissions)( /*[out, retval]*/ VARIANT_BOOL *pVal ); STDMETHOD(LookupNode )( /*[in]*/ BSTR bstrNode , /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(LookupSubNodes )( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(LookupNodesAndTopics)( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(LookupTopics )( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(LocateContext )( /*[in]*/ BSTR bstrURL , /*[in,optional]*/ VARIANT vSubSite, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(KeywordSearch )( /*[in]*/ BSTR bstrQuery, /*[in,optional]*/ VARIANT vSubSite, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(GatherNodes )( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(GatherTopics )( /*[in]*/ BSTR bstrNode , /*[in]*/ VARIANT_BOOL fVisibleOnly, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(ConnectToDisk )( /*[in]*/ BSTR bstrDirectory , /*[in]*/ IDispatch* notify, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(ConnectToServer)( /*[in]*/ BSTR bstrServerName, /*[in]*/ IDispatch* notify, /*[out, retval]*/ IPCHCollection* *ppC ); STDMETHOD(Abort )( ); }; //////////////////////////////////////////////////////////////////////////////// #endif // !defined(__INCLUDED___PCH___SERVICEPROXY_H___)