461 lines
11 KiB
C++
461 lines
11 KiB
C++
//____________________________________________________________________________
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1999
|
|
//
|
|
// File: SnapIn.h
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 09/09/1996 RaviR Created
|
|
//
|
|
//____________________________________________________________________________
|
|
|
|
|
|
//
|
|
// A sample SnapIn registry entry
|
|
//
|
|
// SnapIns
|
|
// {d84a45bb-d390-11cf-b607-00c04fd8d565}
|
|
// = REG_SZ "Logs snap-in"
|
|
// Name = REG_SZ "logvwr.dll, 101"
|
|
// NameString = REG_SZ "Logs"
|
|
// Status = REG_SZ "logvwr.dll, 102"
|
|
// StatusString = REG_SZ "Container enumerating all logs on a machine."
|
|
// ImageOpen = REG_SZ "logvwr.dll, 103"
|
|
// ImageClosed = REG_SZ "logvwr.dll, 104"
|
|
// ResultPane = REG_SZ "{....}" / "Html path" / "url"
|
|
//
|
|
|
|
|
|
#ifndef _SNAPIN_H_
|
|
#define _SNAPIN_H_
|
|
|
|
class CExtSI;
|
|
class CSnapIn;
|
|
class CSnapInsCache;
|
|
|
|
// forward decl
|
|
class CPersistor;
|
|
|
|
#define BOOLVAL(x) ((x) ? TRUE : FALSE)
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Class: CSnapIn
|
|
//____________________________________________________________________________
|
|
//
|
|
extern const GUID IID_CSnapIn;
|
|
|
|
#if _MSC_VER < 1100
|
|
class CSnapIn : public IUnknown, public CComObjectRoot
|
|
#else
|
|
class __declspec(uuid("E6DFFF74-6FE7-11d0-B509-00C04FD9080A")) CSnapIn :
|
|
public IUnknown, public CComObjectRoot, public CXMLObject
|
|
#endif
|
|
{
|
|
private:
|
|
enum SNAPIN_FLAGS
|
|
{
|
|
SNAPIN_NAMESPACE_CHANGED = 0x0001,
|
|
SNAPIN_REQ_EXTS_LOADED = 0x0002,
|
|
SNAPIN_ENABLE_ALL_EXTS = 0x0004,
|
|
SNAPIN_SNAPIN_ENABLES_ALL = 0x0008,
|
|
};
|
|
|
|
public:
|
|
BEGIN_COM_MAP(CSnapIn)
|
|
COM_INTERFACE_ENTRY(CSnapIn)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_NOT_AGGREGATABLE(CSnapIn)
|
|
|
|
// Attributes
|
|
const CLSID& GetSnapInCLSID() const
|
|
{
|
|
return m_clsidSnapIn;
|
|
}
|
|
|
|
void SetSnapInCLSID(const CLSID& id)
|
|
{
|
|
m_clsidSnapIn = id;
|
|
}
|
|
|
|
CExtSI* GetExtensionSnapIn() const
|
|
{
|
|
return m_pExtSI;
|
|
}
|
|
|
|
BOOL RequiredExtensionsLoaded() const
|
|
{
|
|
return (m_dwFlags & SNAPIN_REQ_EXTS_LOADED) != 0;
|
|
}
|
|
|
|
BOOL AreAllExtensionsEnabled() const
|
|
{
|
|
return (m_dwFlags & SNAPIN_ENABLE_ALL_EXTS) != 0;
|
|
}
|
|
|
|
BOOL DoesSnapInEnableAll() const
|
|
{
|
|
return (m_dwFlags & SNAPIN_SNAPIN_ENABLES_ALL) != 0;
|
|
}
|
|
|
|
void SetAllExtensionsEnabled(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= SNAPIN_ENABLE_ALL_EXTS;
|
|
else
|
|
m_dwFlags &= ~SNAPIN_ENABLE_ALL_EXTS;
|
|
}
|
|
|
|
void SetRequiredExtensionsLoaded(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= SNAPIN_REQ_EXTS_LOADED;
|
|
else
|
|
m_dwFlags &= ~SNAPIN_REQ_EXTS_LOADED;
|
|
}
|
|
|
|
void SetSnapInEnablesAll(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= SNAPIN_SNAPIN_ENABLES_ALL;
|
|
else
|
|
m_dwFlags &= ~SNAPIN_SNAPIN_ENABLES_ALL;
|
|
}
|
|
|
|
|
|
BOOL HasNameSpaceChanged() const
|
|
{
|
|
return (m_dwFlags & SNAPIN_NAMESPACE_CHANGED) != 0;
|
|
}
|
|
|
|
void SetNameSpaceChanged(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= SNAPIN_NAMESPACE_CHANGED;
|
|
else
|
|
m_dwFlags &= ~SNAPIN_NAMESPACE_CHANGED;
|
|
}
|
|
|
|
DWORD GetSnapInModule(TCHAR *pBuf, DWORD dwCnt) const;
|
|
bool IsStandAlone() const;
|
|
HRESULT Dump (LPCTSTR pszDumpFile, CSnapInsCache* pCache);
|
|
|
|
SC ScGetSnapInName(WTL::CString& strSnapinName) const;
|
|
|
|
CExtSI* AddExtension(CSnapIn* pSI);
|
|
CExtSI* FindExtension(const CLSID& id);
|
|
void MarkExtensionDeleted(CSnapIn* pSI);
|
|
void PurgeExtensions();
|
|
|
|
// destroys list of extensions. extension list needs to be destroyed
|
|
// this will break snapin's circular references if such exist.
|
|
// (it happens when snapins extends itself or own extension)
|
|
SC ScDestroyExtensionList();
|
|
|
|
// Operations
|
|
BOOL ExtendsNameSpace(GUID guidNodeType);
|
|
|
|
// Loads/Saves this node and its extensions to the provided stream
|
|
HRESULT Load(CSnapInsCache* pCache, IStream* pStream);
|
|
HRESULT Load(CSnapInsCache* pCache, IStream* pStream, CExtSI*& pExtSI);
|
|
HRESULT Save(IStream* pStream, BOOL bClearDirty);
|
|
|
|
virtual void Persist(CPersistor &persistor);
|
|
void PersistLoad(CPersistor& persistor,CSnapInsCache* pCache);
|
|
DEFINE_XML_TYPE(XML_TAG_SNAPIN);
|
|
|
|
public:
|
|
#ifdef DBG
|
|
int dbg_cRef;
|
|
ULONG InternalAddRef()
|
|
{
|
|
++dbg_cRef;
|
|
return CComObjectRoot::InternalAddRef();
|
|
}
|
|
ULONG InternalRelease()
|
|
{
|
|
--dbg_cRef;
|
|
return CComObjectRoot::InternalRelease();
|
|
}
|
|
int dbg_InstID;
|
|
#endif // DBG
|
|
|
|
// Implementation
|
|
protected:
|
|
// Constructor & Destructor
|
|
CSnapIn();
|
|
|
|
virtual ~CSnapIn(); // Called only by Release
|
|
|
|
HKEY OpenKey (REGSAM samDesired = KEY_ALL_ACCESS) const;
|
|
|
|
// Following methods/member variables manage/contains temporary state
|
|
// used for finding used/unused snapins.
|
|
// despite it is not really a property of the snapin and is not valid all the time,
|
|
// having the state on the snapin is very convenient for the operation.
|
|
// Else it would require temporary storage and frequent lookup for information.
|
|
|
|
// begin temporary state
|
|
public:
|
|
SC ScTempState_ResetReferenceCalculationData( );
|
|
SC ScTempState_UpdateInternalReferenceCounts( );
|
|
SC ScTempState_MarkIfExternallyReferenced( );
|
|
SC ScTempState_IsExternallyReferenced( bool& bReferenced ) const;
|
|
private:
|
|
SC ScTempState_SetHasStrongReference( );
|
|
|
|
DWORD m_dwTempState_InternalRef;
|
|
bool m_bTempState_HasStrongRef;
|
|
// end temporary state
|
|
|
|
private:
|
|
DWORD m_dwFlags;
|
|
CLSID m_clsidSnapIn;
|
|
CExtSI* m_pExtSI; // Extensions
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Class: CExtPersistor
|
|
//
|
|
// Purpose: implements persisting the collection - snapin extensions
|
|
//____________________________________________________________________________
|
|
//
|
|
class CExtPersistor : public XMLListCollectionBase
|
|
{
|
|
public:
|
|
CExtPersistor(CSnapIn& Parent) : m_Parent(Parent),m_pCache(NULL) {}
|
|
virtual void OnNewElement(CPersistor& persistor);
|
|
virtual void Persist(CPersistor& persistor);
|
|
void SetCache(CSnapInsCache* pCache) { m_pCache = pCache; }
|
|
DEFINE_XML_TYPE(XML_TAG_SNAPIN_EXTENSIONS);
|
|
private:
|
|
CSnapIn& GetParent() { return m_Parent; }
|
|
CSnapIn& m_Parent;
|
|
CSnapInsCache* m_pCache;
|
|
};
|
|
friend class CExtPersistor;
|
|
|
|
CExtPersistor m_ExtPersistor;
|
|
|
|
// Not implemented.
|
|
CSnapIn(const CSnapIn &rhs);
|
|
CSnapIn& operator=(const CSnapIn &rhs);
|
|
}; // class CSnapIn
|
|
|
|
DEFINE_COM_SMARTPTR(CSnapIn); // CSnapInPtr
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Class: CExtSI
|
|
//____________________________________________________________________________
|
|
//
|
|
class CExtSI
|
|
{
|
|
public:
|
|
enum EXTSI_FLAGS
|
|
{
|
|
EXT_TYPES_MASK = 0x000FFFFF,
|
|
EXT_TYPE_NAMESPACE = 0x00000001,
|
|
EXT_TYPE_CONTEXTMENU = 0x00000002,
|
|
EXT_TYPE_TOOLBAR = 0x00000004,
|
|
EXT_TYPE_PROPERTYSHEET = 0x00000008,
|
|
EXT_TYPE_TASK = 0x00000010,
|
|
EXT_TYPE_VIEW = 0x00000020,
|
|
EXT_TYPE_STATIC = 0x00010000,
|
|
EXT_TYPE_DYNAMIC = 0x00020000,
|
|
EXT_TYPE_REQUIRED = 0x00040000,
|
|
EXT_NEW = 0x80000000,
|
|
EXT_DELETED = 0x40000000,
|
|
|
|
};
|
|
|
|
public:
|
|
// Constructor & Destructor
|
|
CExtSI(CSnapIn* pSnapIn);
|
|
~CExtSI(void);
|
|
|
|
// Attributes
|
|
const CLSID& GetCLSID();
|
|
|
|
CExtSI*& Next()
|
|
{
|
|
return m_pNext;
|
|
}
|
|
|
|
CSnapIn* GetSnapIn(void) const
|
|
{
|
|
return m_pSnapIn;
|
|
}
|
|
|
|
void SetNext(CExtSI* pNext)
|
|
{
|
|
m_pNext = pNext;
|
|
}
|
|
|
|
void SetNew(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= EXT_NEW;
|
|
else
|
|
m_dwFlags &= ~EXT_NEW;
|
|
}
|
|
|
|
void SetRequired(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= EXT_TYPE_REQUIRED;
|
|
else
|
|
m_dwFlags &= ~EXT_TYPE_REQUIRED;
|
|
}
|
|
|
|
void MarkDeleted(BOOL bState = TRUE)
|
|
{
|
|
if (bState)
|
|
m_dwFlags |= EXT_DELETED;
|
|
else
|
|
m_dwFlags &= ~EXT_DELETED;
|
|
}
|
|
|
|
BOOL IsNew()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_NEW);
|
|
}
|
|
|
|
BOOL IsRequired()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_REQUIRED);
|
|
}
|
|
|
|
BOOL IsMarkedForDeletion()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_DELETED);
|
|
}
|
|
|
|
BOOL ExtendsNameSpace()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_NAMESPACE);
|
|
}
|
|
|
|
BOOL ExtendsContextMenu()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_CONTEXTMENU);
|
|
}
|
|
|
|
BOOL ExtendsToolBar()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_TOOLBAR);
|
|
}
|
|
|
|
BOOL ExtendsPropertySheet()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_PROPERTYSHEET);
|
|
}
|
|
|
|
BOOL ExtendsView()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_VIEW);
|
|
}
|
|
|
|
BOOL ExtendsTask()
|
|
{
|
|
return BOOLVAL(m_dwFlags & EXT_TYPE_TASK);
|
|
}
|
|
|
|
UINT GetExtensionTypes()
|
|
{
|
|
return (m_dwFlags & EXT_TYPES_MASK);
|
|
}
|
|
|
|
void SetExtensionTypes(UINT uiExtTypes)
|
|
{
|
|
ASSERT((uiExtTypes & ~EXT_TYPES_MASK) == 0);
|
|
m_dwFlags = (m_dwFlags & ~EXT_TYPES_MASK) | uiExtTypes;
|
|
}
|
|
|
|
// Operations
|
|
// Saves this extension, and all of the nexts.
|
|
HRESULT Save(IStream* pStream, BOOL bClearDirty);
|
|
void Persist(CPersistor &persistor);
|
|
static void PersistNew(CPersistor &persistor, CSnapIn& snapParent, CSnapInsCache& snapCache);
|
|
|
|
// Implementation
|
|
private:
|
|
DWORD m_dwFlags;
|
|
CSnapIn* m_pSnapIn;
|
|
CExtSI* m_pNext;
|
|
|
|
}; // class CExtSI
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Class: CSnapInsCache
|
|
//____________________________________________________________________________
|
|
//
|
|
class CSnapInsCache : public XMLListCollectionBase
|
|
{
|
|
typedef std::map<CLSID, CSnapInPtr> map_t;
|
|
|
|
public:
|
|
CSnapInsCache();
|
|
~CSnapInsCache();
|
|
|
|
// Operations
|
|
SC ScGetSnapIn(const REFCLSID riid, CSnapIn* * ppSnapIn);
|
|
SC ScFindSnapIn(const REFCLSID riid, CSnapIn** ppSnapIn);
|
|
// iteration
|
|
typedef map_t::iterator iterator;
|
|
iterator begin() { return m_snapins.begin(); }
|
|
iterator end() { return m_snapins.end(); }
|
|
|
|
// CXMLObject methods
|
|
DEFINE_XML_TYPE(XML_TAG_SNAPIN_CACHE);
|
|
virtual void Persist(CPersistor &persistor);
|
|
virtual void OnNewElement(CPersistor& persistor);
|
|
|
|
// Load Save the snapins cache
|
|
SC ScSave(IStream* pStream, BOOL bClearDirty);
|
|
SC ScLoad(IStream* pStream);
|
|
SC ScIsDirty() ;
|
|
void SetDirty(BOOL bIsDirty = TRUE);
|
|
void Purge(BOOL bExtensionsOnly = FALSE);
|
|
|
|
void SetHelpCollectionDirty (bool bState = true) { m_bUpdateHelpColl = bState;}
|
|
bool IsHelpCollectionDirty (void) { return m_bUpdateHelpColl; }
|
|
|
|
HRESULT Dump (LPCTSTR pszDumpFile);
|
|
|
|
SC ScCheckSnapinAvailability (CAvailableSnapinInfo& asi);
|
|
|
|
SC ScMarkExternallyReferencedSnapins();
|
|
|
|
#ifdef DBG
|
|
void DebugDump();
|
|
#endif
|
|
|
|
private:
|
|
// Implementation
|
|
BOOL m_bIsDirty;
|
|
map_t m_snapins;
|
|
|
|
bool m_bUpdateHelpColl : 1;
|
|
|
|
#ifdef TEMP_SNAPIN_MGRS_WORK
|
|
void GetAllExtensions(CSnapIn* pSI);
|
|
#endif // TEMP_SNAPIN_MGRS_WORK
|
|
|
|
}; // class CSnapInsCache
|
|
|
|
|
|
#endif // _SNAPIN_H_
|
|
|
|
|
|
|