|
|
#ifndef _INC_DSKQUOTA_SNAPIN_H
#define _INC_DSKQUOTA_SNAPIN_H
///////////////////////////////////////////////////////////////////////////////
/* File: snapin.h
Description: Declares classes used in the disk quota policy MMC snapin. Indentation indicates inheritance.
Classes: CSnapInComp - implements IComponent. CSnapInCompData - implements IComponentData. CDataObject
CSnapInItem - abstract base class for scope/result items. CScopeItem - MMC scope pane item CResultItem - MMC result pane item
Revision History:
Date Description Programmer -------- --------------------------------------------------- ---------- 02/14/98 Initial creation. BrianAu 06/25/98 Disabled snapin code with #ifdef POLICY_MMC_SNAPIN. BrianAu Switching to ADM-file approach to entering policy data. Keeping snapin code available in case we decide to switch back at a later time. */ ///////////////////////////////////////////////////////////////////////////////
#ifdef POLICY_MMC_SNAPIN
#ifndef __mmc_h__
# include <mmc.h>
#endif
#ifndef _GPEDIT_H_
# include <gpedit.h>
#endif
#ifndef _INC_DSKQUOTA_STRCLASS_H
# include "strclass.h"
#endif
#ifndef _INC_DSKQUOTA_CARRAY_H
# include "carray.h"
#endif
//
// This CSnapInItem hierarchy represents the relationships between scope-pane
// items and result-pane items. CSnapInItem contains data common to both
// types of items. It also allows us to give the node mgr CSnapInItem ptrs
// and use virtual functions to retrieve the proper type-specific data
// when required.
//
// CSnapInItem (pure virtual)
// |
// is a
// +--------------+---------------+
// | |
// | |
// | |
// CScopeItem ----- contains ---->> CResultItem
//
//
class CSnapInCompData; // fwd decl.
class CResultItem; // fwd decl.
//
// Pure virtual base class for snap-in scope items and result items.
//
class CSnapInItem { public: CSnapInItem(LPCTSTR pszDisplayName, int iImage) : m_strDisplayName(pszDisplayName), m_iImage(iImage) { DBGTRACE((DM_SNAPIN, DL_MID, TEXT("CSnapInItem::CSnapInItem"))); }
virtual ~CSnapInItem(void) { DBGTRACE((DM_SNAPIN, DL_MID, TEXT("CSnapInItem::~CSnapInItem"))); }
int ImageIndex(void) const { return m_iImage; }
const CString& DisplayName(void) const { return m_strDisplayName; }
//
// All derived types must provide implementations for
// NodeType and RenderData.
//
virtual const GUID& NodeType(void) const = 0; virtual HRESULT RenderData(UINT cf, LPSTGMEDIUM pMedium) const = 0;
protected: //
// Helper functions for rendering data.
//
static void GUIDToString(const GUID& guid, CString *pstr); static HRESULT RenderData(LPVOID pvData, int cbData, LPSTGMEDIUM pMedium);
private: int m_iImage; // Index of image in imagelist.
CString m_strDisplayName; // Item's display name string.
//
// Prevent copy.
//
CSnapInItem(const CSnapInItem& rhs); CSnapInItem& operator = (const CSnapInItem& rhs); };
//
// An item in the MMC scope pane.
//
class CScopeItem : public CSnapInItem { public: CScopeItem(const GUID& NodeType, const CSnapInCompData& cd, CScopeItem *pParent, LPCTSTR pszDisplayName, int iImage, int iImageOpen) : CSnapInItem(pszDisplayName, iImage), m_idType(NodeType), m_pParent(pParent), m_cd(cd), m_iOpenImage(iImageOpen) { DBGTRACE((DM_SNAPIN, DL_MID, TEXT("CScopeItem::CScopeItem"))); }
virtual ~CScopeItem(void);
int OpenImageIndex(void) const { return m_iOpenImage; }
int NumChildren(void) const { return m_rgpChildren.Count(); }
void AddChild(CScopeItem *pNode) { m_rgpChildren.Append(pNode); }
CScopeItem *Child(int iChild) const { return m_rgpChildren[iChild]; }
int NumResultItems(void) const { return m_rgpResultItems.Count(); }
CResultItem *ResultItem(int iItem) const { return m_rgpResultItems[iItem]; }
void AddResultItem(CResultItem *pItem) { m_rgpResultItems.Append(pItem); }
virtual const GUID& NodeType(void) const { return m_idType; }
virtual HRESULT RenderData(UINT cf, LPSTGMEDIUM pMedium) const;
private: const GUID& m_idType; // Node type GUID.
const CSnapInCompData& m_cd; // Snapin's component data.
int m_iOpenImage; // Index of "open" image.
CScopeItem *m_pParent; // Parent scope pane item.
CArray<CScopeItem *> m_rgpChildren; // Scope pane children.
CArray<CResultItem *> m_rgpResultItems; // Result items.
//
// Standard clipboard formats required by MMC.
//
static UINT m_cfNodeType; static UINT m_cfNodeTypeString; static UINT m_cfDisplayName; static UINT m_cfCoClass;
//
// Prevent copy.
//
CScopeItem(const CScopeItem& rhs); CScopeItem& operator = (const CScopeItem& rhs); };
//
// An item in the MMC result pane.
//
class CResultItem : public CSnapInItem { public: CResultItem(LPCTSTR pszDisplayName, int iImage, CScopeItem& si) : CSnapInItem(pszDisplayName, iImage), m_scopeItem(si) { DBGTRACE((DM_SNAPIN, DL_MID, TEXT("CResultItem::CResultItem"))); }
virtual ~CResultItem(void) { DBGTRACE((DM_SNAPIN, DL_MID, TEXT("CResultItem::~CResultItem"))); }
CScopeItem& ScopeItem(void) const { return m_scopeItem; }
virtual const GUID& NodeType(void) const { return m_scopeItem.NodeType(); }
virtual HRESULT RenderData(UINT cf, LPSTGMEDIUM pMedium) const { return m_scopeItem.RenderData(cf, pMedium); }
private: CScopeItem& m_scopeItem; // Item's "owner" in scope pane.
//
// Prevent copy.
//
CResultItem(const CResultItem& rhs); CResultItem& operator = (const CResultItem& rhs); };
//
// Required implementation for IComponent.
//
class CSnapInComp : public IComponent, public IExtendContextMenu { public: CSnapInComp(HINSTANCE hInstance, CSnapInCompData& cd); ~CSnapInComp(void);
HRESULT GetScopeItem(HSCOPEITEM hItem, CScopeItem **ppsi) const;
//
// IUnknown methods.
//
STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(VOID); STDMETHODIMP_(ULONG) Release(VOID);
//
// IComponent methods.
//
STDMETHODIMP Initialize(LPCONSOLE lpConsole); STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param); STDMETHODIMP Destroy(LONG cookie); STDMETHODIMP QueryDataObject(long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT *ppDataObject); STDMETHODIMP GetResultViewType(long cookie, LPOLESTR *ppViewType, long *pViewOptions); STDMETHODIMP GetDisplayInfo(RESULTDATAITEM *pResultDataItem); STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
//
// IExtendContextMenu methods.
//
STDMETHODIMP AddMenuItems(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK piCallback, long *pInsertionAllowed); STDMETHODIMP Command(long lCommandID, LPDATAOBJECT pDataObject);
private: LONG m_cRef; // COM ref count.
HINSTANCE m_hInstance; // For getting resources.
CSnapInCompData& m_cd; // Component's ComponentData
LPCONSOLE m_pConsole; // The MMC console.
LPRESULTDATA m_pResult; // The result pane.
LPHEADERCTRL m_pHeader; // The result pane header ctrl.
LPIMAGELIST m_pImageResult; // The result pane imagelist.
CString m_strColumn; // Column header title.
int m_cxColumn; // Column header width.
long m_lViewMode; // Result pane view mode.
//
// Prevent copy.
//
CSnapInComp(const CSnapInComp& rhs); CSnapInComp& operator = (const CSnapInComp& rhs); };
//
// Custom interface for data object. Primary purpose is to distinguish
// our data object from any other data object. This is done by calling
// QI for IQuotaDataObject. If it succeeds, it's ours.
//
#undef INTERFACE
#define INTERFACE IQuotaDataObject
DECLARE_INTERFACE_(IQuotaDataObject, IUnknown) { // *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE;
// *** IQuotaDataObject methods ***
STDMETHOD(SetType) (THIS_ DATA_OBJECT_TYPES type) PURE; STDMETHOD(GetType) (THIS_ DATA_OBJECT_TYPES *type) PURE;
STDMETHOD(SetItem) (THIS_ CSnapInItem *pItem) PURE; STDMETHOD(GetItem) (THIS_ CSnapInItem **pItem) PURE; }; typedef IQuotaDataObject *LPQUOTADATAOBJECT;
//
// The snap-in's data object.
//
class CDataObject : public IDataObject, public IQuotaDataObject { public: CDataObject(CSnapInCompData& cd); ~CDataObject(void);
//
// IUnknown methods.
//
STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(VOID); STDMETHODIMP_(ULONG) Release(VOID);
//
// IDataObject. All but GetDataHere are unimplemented.
//
STDMETHODIMP GetDataHere(FORMATETC *pFormatetc, STGMEDIUM *pmedium); STDMETHODIMP GetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium) { return E_NOTIMPL; } STDMETHODIMP QueryGetData(FORMATETC *pFormatetc) { return E_NOTIMPL; } STDMETHODIMP GetCanonicalFormatEtc(FORMATETC *pFormatetcIn, FORMATETC *pFormatetcOut) { return E_NOTIMPL; } STDMETHODIMP SetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium, BOOL fRelease) { return E_NOTIMPL; } STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppenumFormatetc) { return E_NOTIMPL; } STDMETHODIMP DAdvise(FORMATETC *pFormatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD * pdwConnection) { return E_NOTIMPL; } STDMETHODIMP DUnadvise(DWORD dwConnection) { return E_NOTIMPL; } STDMETHODIMP EnumDAdvise(IEnumSTATDATA **ppenumAdvise) { return E_NOTIMPL; }
//
// IQuotaDataObject.
//
STDMETHODIMP SetType(DATA_OBJECT_TYPES type) { m_type = type; return S_OK; } STDMETHODIMP GetType(DATA_OBJECT_TYPES *type) { *type = m_type; return S_OK; } STDMETHODIMP SetItem(CSnapInItem *pItem) { m_pItem = pItem; return S_OK; } STDMETHODIMP GetItem(CSnapInItem **ppItem) { *ppItem = m_pItem; return S_OK; }
private: LONG m_cRef; // COM ref count.
CSnapInCompData& m_cd; // Related component data object.
DATA_OBJECT_TYPES m_type; // Type defined by MMC.
CSnapInItem *m_pItem; // Related snapin item.
//
// Prevent copy.
//
CDataObject(const CDataObject& rhs); CDataObject& operator = (const CDataObject& rhs); };
//
// Required implementation for IComponentData.
//
class CSnapInCompData : public IComponentData, public IPersistStreamInit, public IExtendContextMenu { public: //
// Icon indexes in scope image list.
//
enum { iICON_QUOTA = 0, iICON_QUOTA_OPEN };
CSnapInCompData(HINSTANCE hInstance, LPCTSTR pszDisplayName, const GUID& idClass); ~CSnapInCompData(void);
const CString& DisplayName(void) const { return m_strDisplayName; }
const GUID& ClassId(void) const { return m_idClass; }
HRESULT OpenVolumeQuotaProperties(void);
//
// IUnknown methods.
//
STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(VOID); STDMETHODIMP_(ULONG) Release(VOID);
//
// IComponentData methods.
//
STDMETHODIMP Initialize(LPUNKNOWN pUnknown); STDMETHODIMP CreateComponent (LPCOMPONENT *ppComponent); STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param); STDMETHODIMP Destroy(void); STDMETHODIMP GetDisplayInfo(SCOPEDATAITEM *pScopeDataItem); STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB); STDMETHODIMP QueryDataObject(long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT *ppDataObject);
//
// IPersistStreamInit methods.
//
STDMETHODIMP GetClassID(CLSID *pClassID); STDMETHODIMP IsDirty(void); STDMETHODIMP Load(IStream *pStm); STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty); STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize); STDMETHODIMP InitNew(void);
//
// IExtendContextMenu methods.
//
STDMETHODIMP AddMenuItems(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK piCallback, long *pInsertionAllowed); STDMETHODIMP Command(long lCommandID, LPDATAOBJECT pDataObject);
private: LONG m_cRef; // obj ref counter.
HINSTANCE m_hInstance; // for getting resources.
CString m_strDisplayName; // Component's display name.
const GUID& m_idClass; // Component's class ID.
LPCONSOLE m_pConsole; // SnapIn mgr's console interface.
LPCONSOLENAMESPACE m_pScope; // SnapIn mgr's scope interface.
CScopeItem *m_pRootScopeItem; // Scope pane node tree root.
HSCOPEITEM m_hRoot; // Root of extension's namespace
LPGPEINFORMATION m_pGPEInformation;
HRESULT EnumerateScopePane(HSCOPEITEM hParent); static BOOL CALLBACK AddPropSheetPage(HPROPSHEETPAGE hpage, LPARAM lParam); static DWORD PropPageThreadProc(LPVOID pvParam);
//
// Prevent copy.
//
CSnapInCompData(const CSnapInCompData& rhs); CSnapInCompData& operator = (const CSnapInCompData& rhs);
friend class CSnapInComp; };
#endif // POLICY_MMC_SNAPIN
#endif // _INC_DSKQUOTA_SNAPIN_H
|