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.
399 lines
15 KiB
399 lines
15 KiB
/*
|
|
* basesnap.hxx
|
|
*
|
|
*
|
|
* Copyright (c) 1998-1999 Microsoft Corporation
|
|
*
|
|
* PURPOSE: Defines the snapin base class.
|
|
*
|
|
*
|
|
* OWNER: ptousig
|
|
*/
|
|
// ---- Pragmas ----
|
|
#pragma once
|
|
|
|
// ---- Declarations / references ----
|
|
class CBitmap;
|
|
class CComponent;
|
|
class CColumnInfoEx;
|
|
class CComponentData;
|
|
class CBaseSnapinItem;
|
|
class CSnapinContextMenuItem;
|
|
class CBaseMultiSelectSnapinItem;
|
|
struct SnapinMenuItem;
|
|
|
|
// ---- STL based classes ----
|
|
|
|
// A less operator for GUIDs (avoid comparing pointers, compare real values)
|
|
class GUIDLess
|
|
{
|
|
public:
|
|
bool operator()(const GUID &a, const GUID &b) const
|
|
{
|
|
return ::memcmp(&a, &b, sizeof(GUID)) < 0;
|
|
}
|
|
};
|
|
|
|
// A set of guids
|
|
typedef set<GUID, GUIDLess> GUIDSet;
|
|
|
|
// A list of cookies
|
|
typedef set<LONG_PTR> CCookieList;
|
|
|
|
// A list of CBaseSnapinItems
|
|
typedef list<CBaseSnapinItem *> ItemList;
|
|
|
|
// A vector of CBaseSnapinItems
|
|
typedef vector<CBaseSnapinItem *> CItemVector;
|
|
|
|
// A vector of pointers to wrapper of menu items
|
|
typedef vector<CSnapinContextMenuItem *> CSnapinContextMenuItemVector;
|
|
|
|
// ---- Wrapper classes for menu items and menu item collections ----
|
|
|
|
// A wrapper class for CONTEXTMENUITEM - so that we can keep the strings around (MMC asks for szpointers in CONTEXTMENUITEM!!!)
|
|
// Write as a struct
|
|
class CSnapinContextMenuItem
|
|
{
|
|
public:
|
|
// Member variables
|
|
CONTEXTMENUITEM cm; // cm sz members will point to the associated strings
|
|
tstring strName;
|
|
tstring strStatusBarText;
|
|
|
|
// Constructor
|
|
CSnapinContextMenuItem(void);
|
|
};
|
|
|
|
// A wrapper class for a CSnapinContextMenuItemVector - so that we can delete all the referenced items
|
|
// Write as a struct
|
|
// $REVIEW (dominicp) May want to write accessors in the future - many level of indirections to get to an element of a referenced CONTEXTMENUITEM
|
|
class CSnapinContextMenuItemVectorWrapper
|
|
{
|
|
public:
|
|
// Member variables
|
|
CSnapinContextMenuItemVector cmiv;
|
|
|
|
// Constructor
|
|
CSnapinContextMenuItemVectorWrapper(void) { ;}
|
|
virtual ~CSnapinContextMenuItemVectorWrapper(void);
|
|
};
|
|
|
|
// $REVIEW (ptousig) Move this to basestr.hxx
|
|
#define CSZ(_x) (sizeof(_x)/sizeof(SZ))
|
|
|
|
// MMC verbs bit masks, we want each verb to be given
|
|
// a unique bit.
|
|
enum VerbMask
|
|
{
|
|
vmNone = 0x00000000,
|
|
vmOpen = 0x00000001,
|
|
vmCopy = 0x00000002,
|
|
vmPaste = 0x00000004,
|
|
vmDelete = 0x00000008,
|
|
vmProperties= 0x00000010,
|
|
vmRename = 0x00000020,
|
|
vmRefresh = 0x00000040,
|
|
vmPrint = 0x00000080,
|
|
vmCut = 0x00000100
|
|
};
|
|
|
|
// A mapping between VerbMasks and MMC_CONSOLE_VERBs
|
|
struct VerbMap
|
|
{
|
|
VerbMask verbmask;
|
|
MMC_CONSOLE_VERB mmcverb;
|
|
};
|
|
|
|
// The next three constants are the default values to use for menu items definitions. If used, they cause
|
|
// the menu item to always show up, ungrayed, and unchecked.
|
|
#define dwMenuAlwaysEnable 0
|
|
#define dwMenuNeverGray 0
|
|
#define dwMenuNeverChecked 0
|
|
|
|
// The maximum stream size needed to store persistent information into a .msc file.
|
|
#define cMaxStreamSizeLow 200
|
|
#define cMaxStreamSizeHigh 0
|
|
|
|
// Similar to CONTEXTMENUITEM but uses IDS's instead of SZ's. Also implements
|
|
// an enabling/disabling mechanism
|
|
struct SnapinMenuItem
|
|
{
|
|
LONG idsName;
|
|
LONG idsStatusBarText;
|
|
LONG lCommandID;
|
|
LONG lInsertionPointID;
|
|
LONG fSpecialFlags;
|
|
|
|
// overrides for fFlags
|
|
DWORD dwFlagsDisable; // if the disable parameter has any of these flags set, item is disabled.
|
|
DWORD dwFlagsGray; // if the gray parameter has any of these flags set, item is grayed.
|
|
DWORD dwFlagsChecked; // if the checked parameter has any of these flags set, item is checked.
|
|
};
|
|
|
|
#define CMENUITEM(_a) (sizeof(_a)/sizeof(SnapinMenuItem));
|
|
|
|
|
|
// These are the "hints" passed to MMCN_VIEW_CHANGE.
|
|
enum
|
|
{
|
|
ONVIEWCHANGE_DELETEITEMS = 1,
|
|
ONVIEWCHANGE_DELETESINGLEITEM,
|
|
ONVIEWCHANGE_INSERTNEWITEM,
|
|
ONVIEWCHANGE_UPDATERESULTITEM,
|
|
ONVIEWCHANGE_REFRESHCHILDREN,
|
|
ONVIEWCHANGE_DELETERESULTITEMS,
|
|
ONVIEWCHANGE_INSERTRESULTITEMS,
|
|
ONVIEWCHANGE_UPDATEDESCRIPTIONBAR,
|
|
|
|
ONVIEWCHANGE_LAST_HINT, // last predefined hint -- snapin specific hints must be greater than this
|
|
};
|
|
|
|
|
|
inline LPWSTR CoTaskDupString (LPCWSTR pszSrc)
|
|
{
|
|
if (pszSrc == NULL)
|
|
return (NULL);
|
|
|
|
int cbAlloc = (wcslen(pszSrc) + 1) * sizeof(WCHAR);
|
|
LPWSTR pszDup = (LPWSTR) CoTaskMemAlloc (cbAlloc);
|
|
|
|
if (pszDup != NULL)
|
|
CopyMemory (pszDup, pszSrc, cbAlloc);
|
|
|
|
return (pszDup);
|
|
}
|
|
|
|
//
|
|
// Allocates & copies string.
|
|
// $REVIEW (ptousig) This should be moved to basestr.hxx
|
|
//
|
|
inline SC ScIds2OleStr(LONG ids, LPOLESTR *lp)
|
|
{
|
|
DECLARE_SC(sc, _T("ScIds2OleStr"));
|
|
sc = ScCheckPointers(lp);
|
|
if (sc)
|
|
return sc;
|
|
|
|
*lp = NULL;
|
|
|
|
tstring str;
|
|
bool b = str.LoadString(_Module.GetModuleInstance(), ids);
|
|
if (!b)
|
|
return (sc = E_FAIL);
|
|
|
|
*lp = CoTaskDupString (T2COLE(str.data()));
|
|
if (! (*lp) )
|
|
return (sc = E_OUTOFMEMORY);
|
|
|
|
return sc;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// -----------------------------------------------------------------------------
|
|
// -----------------------------------------------------------------------------
|
|
// CBaseSnapin
|
|
//
|
|
// This is the base class of all snapins.
|
|
//
|
|
// BaseMMC will use some of virtual methods to find out information about
|
|
// the snapin. Other virtuals allow snapins to modify the default behavior
|
|
// of BaseMMC.
|
|
//
|
|
// $REVIEW (ptousig) In the long term, it would be nice to have the individual
|
|
// snapins implement two classes, directly derived from CComponent and
|
|
// CComponentData. But that would be too big a change at the moment.
|
|
//
|
|
class CBaseSnapin
|
|
{
|
|
public:
|
|
CBaseSnapin(void);
|
|
virtual ~CBaseSnapin(void);
|
|
|
|
//
|
|
// Item-related stuff
|
|
//
|
|
inline CCookieList * Pcookielist(void) { return &m_cookielist;}
|
|
virtual SC ScCreateRootItem(LPDATAOBJECT lpDataObject, HSCOPEITEM item, CBaseSnapinItem **ppitem) = 0;
|
|
virtual SC ScReleaseIfRootItem(CBaseSnapinItem *pitem);
|
|
|
|
// This method allows a CComponentData to tell us it is being
|
|
// destroyed. Any item referring to this CD as its owner will
|
|
// have their owner pointer nulled.
|
|
SC ScOwnerDying(CComponentData *pComponentData);
|
|
|
|
// This is the 'full' version of Pitem(). Given certain parameters, it will
|
|
// do its best to find the approriate CBaseSnapinItem (creating a new one
|
|
// if necessary).
|
|
virtual CBaseSnapinItem * Pitem( CComponentData *pComponentData,
|
|
CComponent *pComponent,
|
|
LPDATAOBJECT lpDataObject,
|
|
HSCOPEITEM hscopeitem,
|
|
long cookie);
|
|
|
|
// This is a simpler version of Pitem(). This version cannot be used if a
|
|
// new item needs to be created.
|
|
virtual CBaseSnapinItem * Pitem( LPDATAOBJECT lpDataObject = NULL,
|
|
HSCOPEITEM hscopeitem = 0,
|
|
long cookie = 0);
|
|
|
|
//
|
|
// Information about this snapin
|
|
//
|
|
virtual const CSnapinInfo * Psnapininfo(void) = 0;
|
|
virtual BOOL FIsExtension(void) { return FALSE;}
|
|
// Does it have a standalone mode?
|
|
virtual BOOL FStandalone(void) { return FALSE;}
|
|
virtual SNR * Psnr(INT i=0) = 0;
|
|
virtual INT Csnr(void) = 0;
|
|
virtual LONG IdsDescription(void) = 0;
|
|
virtual LONG IdsName(void) = 0;
|
|
virtual LONG Idi(void) { return 0;}
|
|
|
|
// Does it support IComponent2?
|
|
virtual BOOL FSupportsIComponent2() { return FALSE;}
|
|
|
|
|
|
//
|
|
// Persistence
|
|
//
|
|
virtual SC ScLoad(IStream *pstream) { return S_OK;}
|
|
virtual SC ScSave(IStream *pstream, BOOL fClearDirty) { return S_OK;}
|
|
|
|
//
|
|
// Columns
|
|
//
|
|
// $REVIEW (ptousig) It doesn't really makes sense to have the column
|
|
// information in the snapin class. But since all the
|
|
// snapins are already built this way, I'm leaving it
|
|
// in.
|
|
//
|
|
virtual CColumnInfoEx * Pcolinfoex(INT icolinfo=0) { ASSERT("Should not happen" && FALSE); return NULL;}
|
|
virtual INT Ccolinfoex(void) { ASSERT("Should not happen" && FALSE); return 0;}
|
|
|
|
//
|
|
// Bitmaps and icons
|
|
//
|
|
virtual SC ScInitBitmaps(void);
|
|
virtual WTL::CBitmap & BmpImage16(void) { return s_bmpImage16;}
|
|
virtual WTL::CBitmap & BmpImage32(void) { return s_bmpImage32;}
|
|
virtual WTL::CBitmap * PbitmapImageListSmall(void) { return &BitmapSmall();}
|
|
virtual WTL::CBitmap * PbitmapImageListLarge(void) { return &BitmapLarge();}
|
|
virtual LONG * Piconid(void) = 0;
|
|
virtual INT CIcons(void) = 0;
|
|
virtual LONG * PiconidStatic(void) = 0;
|
|
virtual WTL::CBitmap & BitmapSmall(void) = 0;
|
|
virtual WTL::CBitmap & BitmapLarge(void) = 0;
|
|
virtual WTL::CBitmap & BitmapStaticSmall(void) = 0;
|
|
virtual WTL::CBitmap & BitmapStaticSmallOpen(void) = 0;
|
|
virtual WTL::CBitmap & BitmapStaticLarge(void) = 0;
|
|
|
|
//
|
|
// Verbs
|
|
//
|
|
static VerbMap * Pverbmap(INT i=0);
|
|
static INT Cverbmap(void);
|
|
virtual MMC_CONSOLE_VERB MmcverbDefault(LPDATAOBJECT lpDataObject);
|
|
virtual SC ScGetVerbs(LPDATAOBJECT lpDataObject, DWORD * pdwVerbs);
|
|
|
|
//
|
|
// Shortcuts. These methods only forward the calls to the CSnapinInfo.
|
|
//
|
|
virtual const tstring& StrClassName(void) { return Psnapininfo()->StrClassName();}
|
|
virtual const CLSID * PclsidSnapin(void) { return Psnapininfo()->PclsidSnapin();}
|
|
virtual const tstring& StrClsidSnapin(void) { return Psnapininfo()->StrClsidSnapin();}
|
|
virtual const tstring& StrClsidAbout(void) { return Psnapininfo()->StrClsidAbout();}
|
|
|
|
//
|
|
// Snapin registration
|
|
//
|
|
virtual SC ScRegister(BOOL fRegister = TRUE);
|
|
inline IRegistrar & Registrar(void) { return s_registrar;}
|
|
|
|
//
|
|
// ISnapinAbout interface
|
|
//
|
|
virtual SC ScGetSnapinDescription(LPOLESTR *lpDescription) { return ScIds2OleStr(IdsDescription(), lpDescription);}
|
|
virtual SC ScGetSnapinVersion(LPOLESTR *lpVersion);
|
|
virtual SC ScGetSnapinImage(HICON *phAppIcon);
|
|
virtual SC ScGetStaticFolderImage(HBITMAP *phSmallImage, HBITMAP *phSmallImageOpen, HBITMAP *phLargeImage, COLORREF *pcMask);
|
|
virtual SC ScGetProvider(LPOLESTR *lpName);
|
|
|
|
|
|
//
|
|
// Other stuff
|
|
// These functions are here because:
|
|
// - The functionality is the same for both CComponentData and CComponent
|
|
// - The functionality can be overriden by a derived class.
|
|
//
|
|
// $REVIEW (ptousig) Figure out which is which.
|
|
//
|
|
virtual SC ScAddMenuItems(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK ipContextMenuCallback, long *pInsertionAllowed);
|
|
virtual SC ScAddMenuItems(CBaseSnapinItem *pitem, long lInsertionAllowed, LPCONTEXTMENUCALLBACK ipContextMenuCallback, SnapinMenuItem *rgmenuitem, INT cmenuitem);
|
|
virtual SC ScGetMenuItem(CSnapinContextMenuItem * pMenuItemReturned, CBaseSnapinItem * pitem, SnapinMenuItem * pMenuItemSource, BOOL * pfAllowed, long lInsertionAllowed);
|
|
virtual SC ScIsPastableDataObject(CBaseSnapinItem * pitemTarget, LPDATAOBJECT lpDataObject, BOOL * pfPastable);
|
|
virtual SC ScIsOwnedDataObject(LPDATAOBJECT pdataobject, BOOL *pfIsOwned, CNodeType **ppnodetype);
|
|
virtual SC ScGetHelpTopic(tstring& strCompiledHelpFile);
|
|
virtual SC ScCompare(MMC_COOKIE cookieA, MMC_COOKIE cookieB, INT nColumn, INT * pnResult);
|
|
virtual SC ScCompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
|
|
virtual SC ScOnPropertyChange(BOOL fScope, LPARAM lParam, IConsoleNameSpace *ipConsoleNameSpace, IConsole *ipConsole);
|
|
virtual SC ScOnRename(LPDATAOBJECT lpDataObject, const tstring& szNewName, IConsole *ipConsole);
|
|
virtual SC ScOnPaste(LPDATAOBJECT lpDataObject, LPDATAOBJECT lpDataObjectList, LPDATAOBJECT *ppDataObjectPasted, IConsole *ipConsole);
|
|
virtual SC ScOnQueryPaste(LPDATAOBJECT lpDataObject, LPDATAOBJECT lpDataObjectList, LPDWORD pdwFlags);
|
|
virtual SC ScOnCanPasteOutOfProcDataObject(LPBOOL pbCanHandle);
|
|
virtual SC ScOnCutOrMove(LPDATAOBJECT lpDataObjectList, IConsoleNameSpace *ipConsoleNameSpace, IConsole *ipConsole);
|
|
inline const tstring& StrDisplayName(void) { return *m_pstrDisplayName;}
|
|
|
|
// Multiselect support (by default, snapin items are not enabled to allow multi support selection)
|
|
virtual SC ScCreateMultiSelectionDataObject(LPDATAOBJECT * ppDataObject, CComponent * pComponent);
|
|
virtual SC ScAllocateMultiSelectionDataObject(CBaseMultiSelectSnapinItem ** ppBaseMultiSelectSnapinItem);
|
|
|
|
#ifdef _DEBUG
|
|
//
|
|
// Debug menu options
|
|
//
|
|
SnapinMenuItem * PmenuitemBase(void);
|
|
INT CMenuItemBase(void);
|
|
//
|
|
// Debug methods called from debug menu options
|
|
//
|
|
#if 0
|
|
virtual SC ScOnMenuTraces(void);
|
|
virtual SC ScOnMenuSCDescription(void);
|
|
virtual SC ScOnMenuMemoryDiff(void);
|
|
virtual SC ScOnMenuValidateMemory(void);
|
|
virtual SC ScOnMenuTotalMemory(void);
|
|
#endif
|
|
#endif
|
|
|
|
protected:
|
|
//
|
|
// The display name for this snapin, this gets populated by
|
|
// derived classes, so it needs to be 'protected'.
|
|
//
|
|
// $REVIEW (ptousig) Snapins should use an accessor.
|
|
//
|
|
tstring* m_pstrDisplayName;
|
|
|
|
private:
|
|
// The list of root items
|
|
ItemList m_ilRootItems;
|
|
|
|
// The list of valid cookies
|
|
CCookieList m_cookielist;
|
|
|
|
private:
|
|
static BOOL s_fBaseSnapinInitialized; // Has the bitmaps been initialized ?
|
|
static VerbMap s_rgverbmap[];
|
|
static CRegistrar s_registrar;
|
|
static WTL::CBitmap s_bmpImage16; // Pointer to 16x16 image strip
|
|
static WTL::CBitmap s_bmpImage32; // Pointer to 32x32 image strip
|
|
|
|
#ifdef _DEBUG
|
|
//
|
|
// The debug menu options ("Traces", etc...)
|
|
//
|
|
static SnapinMenuItem s_rgmenuitemBase[];
|
|
static INT s_cMenuItemBase;
|
|
#endif // _DEBUG
|
|
};
|