windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/snapinpersistence.h
2020-09-26 16:20:57 +08:00

190 lines
6.7 KiB
C++

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000 - 2000
//
// File: snapinpersistence.h
//
// Contents:
//
// Classes: CComponentPersistor, CDPersistor
//
//____________________________________________________________________________
#pragma once
#ifndef SNAPINPERSISTENCE_H_INCLUDED
class CMTSnapInNode;
class CComponentData;
/***************************************************************************\
*
* CLASS: CMTSnapinNodeStreamsAndStorages
*
* PURPOSE: Unified base class for CComponentPersistor and CDPersistor
* Encapsulated data and functionality for maintaining the collection
* of snapin streams and storages.
*
* USAGE: Used as a base for CComponentPersistor and CDPersistor
* public methods available for clients of CComponentPersistor,
* CDPersistor uses iterfaces internally.
*
\***************************************************************************/
class CMTSnapinNodeStreamsAndStorages : public XMLListCollectionBase
{
typedef std::pair<int, CLSID> key_t;
typedef std::pair<int, std::wstring> hash_t;
public:
// CDPersistor uses the same storage (provided by the this class)
// as CComponent persistor , but it is not related to any view.
// VIEW_ID_DOCUMENT is the special value for indicating ComponentData entry
enum { VIEW_ID_DOCUMENT = -1 };
public: // methods not throwing exceptions
// Initialize the storage for a snapin by copying the contents from
// provided initialization source.
SC ScInitIStorage( int idView, LPCWSTR szHash, IStorage *pSource );
SC ScInitIStream ( int idView, LPCWSTR szHash, IStream *pSource );
// Returns the storage for snapin. Creates and caches one if does not have already
SC ScGetIStorage( int idView, const CLSID& clsid, IStorage **ppStorage );
SC ScGetIStream ( int idView, const CLSID& clsid, IStream **ppStream );
// Checks if it has a storage for a snapins
bool HasStream(int idView, const CLSID& clsid);
bool HasStorage(int idView, const CLSID& clsid);
void RemoveView(int nViewId);
// returns the pointer to CXML_IStxxxxx object. Creates the object if does not have one
SC ScGetXmlStorage(int idView, const CLSID& clsid, CXML_IStorage *& pXMLStorage);
SC ScGetXmlStream (int idView, const CLSID& clsid, CXML_IStream *& pXMLStream);
protected:
std::map<key_t, CXML_IStorage> m_XMLStorage;
std::map<key_t, CXML_IStream> m_XMLStream;
public:
// persistence support for derived classes
void Persist(CPersistor& persistor, bool bPersistViewId);
virtual void OnNewElement(CPersistor& persistor);
// implemented by the derived class
virtual LPCTSTR GetItemXMLType() = 0;
private:
SC ScFindXmlStorage(int idView, const CLSID& clsid, bool& bFound, CXML_IStorage *& pXMLStorage);
SC ScFindXmlStream (int idView, const CLSID& clsid, bool& bFound, CXML_IStream *& pXMLStream);
// looks for snapin's data by the hash value
// if any is found - moves data to 'known' snapin collection
SC ScCheckForStreamsAndStoragesByHashValue( int idView, const CLSID& clsid, bool& bFound );
// maps holding the old data comming from structured storage
// untill the real data owner (snapin's CLSID) is known
// We need this coz there is no conversion from hash to clsid
std::map<hash_t, CXML_IStorage> m_StorageByHash;
std::map<hash_t, CXML_IStream> m_StreamByHash;
};
/*+-------------------------------------------------------------------------*
* class CComponentPersistor
*
* PURPOSE: Persists IComponent collection accociated with the snapin
* holds IStream & IStorage maps for loading / storing data
*
* Also holds and maintains a collection of all the streams and storages
* used by components of the snapin node and all the extensions
* extending this node or it's subnodes
*
*+-------------------------------------------------------------------------*/
class CComponentPersistor : public CMTSnapinNodeStreamsAndStorages
{
typedef CMTSnapinNodeStreamsAndStorages BC;
public:
SC ScReset();
protected:
virtual void Persist(CPersistor& persistor);
public:
DEFINE_XML_TYPE(XML_TAG_ICOMPONENT_LIST);
static LPCTSTR _GetItemXMLType() { return XML_TAG_ICOMPONENT; }
virtual LPCTSTR GetItemXMLType() { return _GetItemXMLType(); }
};
/*+-------------------------------------------------------------------------*
* class CDPersistor
*
* PURPOSE: Persists IComponentData collection accociated with the snapin
* holds IStream & IStorage maps for loading / storing data
*
* Also holds and maintains a collection of all the streams and storages
* used by component datas of the snapin node and all the extensions
* extending this node or it's subnodes
*
*+-------------------------------------------------------------------------*/
class CDPersistor : public CMTSnapinNodeStreamsAndStorages
{
typedef CMTSnapinNodeStreamsAndStorages BC;
public: // interface to data maintained by CMTSnapinNodeStreamsAndStorages
// CDPersistor uses the same storage (provided by the base class)
// as CComponent persistor , but it is not related to any view.
// VIEW_ID_DOCUMENT is the special value for indicating ComponentData entry
// Initialize the storage for a snapin by copying the contents from
// provided initialization source.
SC ScInitIStorage( LPCWSTR szHash, IStorage *pSource )
{
return BC::ScInitIStorage( VIEW_ID_DOCUMENT, szHash, pSource );
}
SC ScInitIStream ( LPCWSTR szHash, IStream *pSource )
{
return BC::ScInitIStream ( VIEW_ID_DOCUMENT, szHash, pSource );
}
// Returns the storage for snapin. Creates and caches one if does not have already
SC ScGetIStorage( const CLSID& clsid, IStorage **ppStorage )
{
return BC::ScGetIStorage( VIEW_ID_DOCUMENT, clsid, ppStorage );
}
SC ScGetIStream ( const CLSID& clsid, IStream **ppStream )
{
return BC::ScGetIStream ( VIEW_ID_DOCUMENT, clsid, ppStream );
}
// Checks if it has a storage for a snapins
bool HasStream(const CLSID& clsid)
{
return BC::HasStream(VIEW_ID_DOCUMENT, clsid);
}
bool HasStorage(const CLSID& clsid)
{
return BC::HasStorage(VIEW_ID_DOCUMENT, clsid);
}
public:
SC ScReset();
protected:
virtual void Persist(CPersistor& persistor);
public:
DEFINE_XML_TYPE(XML_TAG_ICOMPONENT_DATA_LIST);
static LPCTSTR _GetItemXMLType() { return XML_TAG_ICOMPONENT_DATA; }
virtual LPCTSTR GetItemXMLType() { return _GetItemXMLType(); }
};
#endif SNAPINPERSISTENCE_H_INCLUDED