mirror of https://github.com/tongzx/nt5src
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.
189 lines
6.7 KiB
189 lines
6.7 KiB
//____________________________________________________________________________
|
|
//
|
|
// 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
|