/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: OfflineCache.h Abstract: To speed up the start time of the Help Center, we cache in the registry the most common queries. Revision History: Davide Massarenti (Dmassare) 07/16/2000 created ******************************************************************************/ #if !defined(__INCLUDED___HCP___OFFLINECACHE_H___) #define __INCLUDED___HCP___OFFLINECACHE_H___ #include #include #include namespace OfflineCache { typedef enum { ET_INVALID = 0, ET_NODE , ET_SUBNODES , ET_SUBNODES_VISIBLE , ET_NODESANDTOPICS , ET_NODESANDTOPICS_VISIBLE , ET_TOPICS , ET_TOPICS_VISIBLE , // // Not cached... // ET_LOCATECONTEXT , ET_SEARCH , ET_NODES_RECURSIVE , ET_TOPICS_RECURSIVE , } Entry_Type; class Query; class SetOfHelpTopics; class Handle; class Root; class Query { friend class SetOfHelpTopics; friend class Root; //////////////////////////////////////// MPC::wstring m_strID; int m_iType; int m_iSequence; bool m_fNull; //////////////////////////////////////// friend HRESULT operator>>( /*[in]*/ MPC::Serializer& stream, /*[out]*/ Query& val ); friend HRESULT operator<<( /*[in]*/ MPC::Serializer& stream, /*[in] */ const Query& val ); HRESULT InitFile( /*[in]*/ const MPC::wstring& strDir, /*[out]*/ MPC::wstring& strFile ); HRESULT Store ( /*[in]*/ const MPC::wstring& strDir, /*[in]*/ const CPCHQueryResultCollection* pColl ); HRESULT Retrieve( /*[in]*/ const MPC::wstring& strDir, /*[in]*/ CPCHQueryResultCollection* *pColl ); HRESULT Remove ( /*[in]*/ const MPC::wstring& strDir ); public: //////////////////////////////////////// Query(); }; class SetOfHelpTopics { friend class Root; typedef std::list QueryList; typedef QueryList::iterator QueryIter; typedef QueryList::const_iterator QueryIterConst; //////////////////////////////////////// Root* m_parent; Taxonomy::Instance m_inst; QueryList m_lstQueries; int m_iLastSeq; //////////////////////////////////////// friend HRESULT operator>>( /*[in]*/ MPC::Serializer& stream, /*[out]*/ SetOfHelpTopics& val ); friend HRESULT operator<<( /*[in]*/ MPC::Serializer& stream, /*[in] */ const SetOfHelpTopics& val ); HRESULT InitDir( /*[in]*/ MPC::wstring& strDir ); HRESULT Find( /*[in/out]*/ LPCWSTR& szID, /*[in]*/ int iType, /*[out]*/ QueryIter& it ); void ConnectToParent( /*[in]*/ Root* parent ); public: SetOfHelpTopics(); const Taxonomy::Instance& Instance() { return m_inst; } //////////////////// bool AreYouInterested( /*[in]*/ LPCWSTR szID, /*[in]*/ int iType ); HRESULT Retrieve ( /*[in]*/ LPCWSTR szID, /*[in]*/ int iType, /*[in]*/ CPCHQueryResultCollection* *pColl ); HRESULT Store ( /*[in]*/ LPCWSTR szID, /*[in]*/ int iType, /*[in]*/ const CPCHQueryResultCollection* pColl ); HRESULT RemoveQueries ( ); }; class Handle { friend class Root; Root* m_main; // We have a lock on it. SetOfHelpTopics* m_sht; void Attach ( /*[in]*/ Root* main, /*[in]*/ SetOfHelpTopics* sht ); void Release( ); public: Handle(); ~Handle(); operator SetOfHelpTopics*() { return m_sht; } SetOfHelpTopics* operator->() { return m_sht; } }; class Root : public CComObjectRootEx // Just to have locking... { typedef CComObjectRootEx super; friend class SetOfHelpTopics; typedef std::list SKUList; typedef SKUList::iterator SKUIter; typedef SKUList::const_iterator SKUIterConst; static const DWORD s_dwVersion = 0x02324351; // QC2 02 //////////////////////////////////////// MPC::NamedMutex m_nmSharedLock; bool m_fReady; // PERSISTED Taxonomy::Instance m_instMachine; // PERSISTED SKUList m_lstSKUs; // PERSISTED bool m_fMaster; // VOLATILE bool m_fLoaded; // VOLATILE bool m_fDirty; // VOLATILE DWORD m_dwDisableSave; // VOLATILE HANDLE m_hChangeNotification; // VOLATILE //////////////////////////////////////// friend HRESULT operator>>( /*[in]*/ MPC::Serializer& stream, /*[out]*/ Root& val ); friend HRESULT operator<<( /*[in]*/ MPC::Serializer& stream, /*[in] */ const Root& val ); HRESULT GetIndexFile( /*[out]*/ MPC::wstring& strIndex ); HRESULT Load ( ); HRESULT Save ( ); HRESULT Clean ( ); HRESULT SetDirty ( ); HRESULT Find( /*[in]*/ const Taxonomy::HelpSet& ths, /*[out]*/ SKUIter& it ); public: Root( /*[in]*/ bool fMaster = false ); ~Root(); //////////////////////////////////////////////////////////////////////////////// static Root* s_GLOBAL; static HRESULT InitializeSystem( /*[in]*/ bool fMaster ); static void FinalizeSystem ( ); //////////////////////////////////////////////////////////////////////////////// void Lock (); void Unlock(); //////////////////// bool IsReady (); const Taxonomy::Instance& MachineInstance() { return m_instMachine; } //////////////////// HRESULT SetReady ( /*[in]*/ bool fReady ); HRESULT SetMachineInfo( /*[in]*/ const Taxonomy::Instance& inst ); //////////////////// HRESULT DisableSave(); HRESULT EnableSave (); HRESULT Import( /*[in]*/ const Taxonomy::Instance& inst ); HRESULT Locate( /*[in]*/ const Taxonomy::HelpSet & ths, /*[out]*/ Handle& handle ); HRESULT Remove( /*[in]*/ const Taxonomy::HelpSet & ths ); HRESULT Flush( /*[in]*/ bool fForce = false ); //////////////////// HRESULT FindMatch( /*[in]*/ LPCWSTR szSKU , /*[in]*/ LPCWSTR szLanguage , /*[out]*/ Taxonomy::HelpSet& ths ); }; }; #endif // !defined(__INCLUDED___HCP___OFFLINECACHE_H___)