WindowsXP-SP1/admin/snapin/domain/cdomain.h
2020-09-30 16:53:49 +02:00

412 lines
12 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: cdomain.h
//
//--------------------------------------------------------------------------
#ifndef _CDOMAIN_H
#define _CDOMAIN_H
#include "resource.h" // main symbols
extern const CLSID CLSID_DomainSnapinAbout;
extern const CLSID CLSID_DomainAdmin; // In-Proc server GUID
extern const GUID cDefaultNodeType; // Main NodeType GUID on numeric format
extern const wchar_t* cszDefaultNodeType; // Main NodeType GUID on string format
extern const wchar_t* CCF_DS_DOMAIN_TREE_SNAPIN_INTERNAL;
/////////////////////////////////////////////////////////////////////////////
// macros
#define FREE_INTERNAL(pInternal) \
ASSERT(pInternal != NULL); \
do { if (pInternal != NULL) \
GlobalFree(pInternal); } \
while(0);
/////////////////////////////////////////////////////////////////////////////
// forward declarations
class CDomainObject;
class CComponentImpl;
class CComponentDataImpl;
class CHiddenWnd;
class CDataObject;
/////////////////////////////////////////////////////////////////////////////
// constants
// Note - This is the offset in my image list that represents the folder
const DOMAIN_IMAGE_DEFAULT_IDX = 0;
const DOMAIN_IMAGE_IDX = 1;
/////////////////////////////////////////////////////////////////////////////
// global functions
void DialogContextHelp(DWORD* pTable, HELPINFO* pHelpInfo);
/////////////////////////////////////////////////////////////////////////////
// CInternalFormatCracker
class CInternalFormatCracker
{
public:
CInternalFormatCracker(CComponentDataImpl* pCD)
{
m_pCD = pCD;
m_pInternalFormat = NULL;
}
~CInternalFormatCracker()
{
if (m_pInternalFormat != NULL)
FREE_INTERNAL(m_pInternalFormat);
}
BOOL Extract(LPDATAOBJECT lpDataObject);
BOOL GetContext(LPDATAOBJECT pDataObject, // input
CFolderObject** ppFolderObject, // output
DATA_OBJECT_TYPES* pType // output
);
INTERNAL* GetInternal()
{
return m_pInternalFormat;
}
private:
INTERNAL* m_pInternalFormat;
CComponentDataImpl* m_pCD;
};
/////////////////////////////////////////////////////////////////////////////
// CComponentDataImpl (i.e. scope pane side)
class CRootFolderObject; // fwd decl
class CComponentDataImpl:
public IComponentData,
public IExtendPropertySheet,
public IExtendContextMenu,
public ISnapinHelp2,
public CComObjectRoot,
public CComCoClass<CComponentDataImpl, &CLSID_DomainAdmin>
{
friend class CComponentImpl;
BEGIN_COM_MAP(CComponentDataImpl)
COM_INTERFACE_ENTRY(IComponentData)
COM_INTERFACE_ENTRY(IExtendPropertySheet)
COM_INTERFACE_ENTRY(IExtendContextMenu)
COM_INTERFACE_ENTRY(ISnapinHelp2)
END_COM_MAP()
DECLARE_REGISTRY_CLSID()
friend class CComponentImpl;
friend class CDataObject;
CComponentDataImpl();
HRESULT FinalConstruct();
~CComponentDataImpl();
void FinalRelease();
public:
// IComponentData interface members
STDMETHOD(Initialize)(LPUNKNOWN pUnknown);
STDMETHOD(CreateComponent)(LPCOMPONENT* ppComponent);
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
STDMETHOD(Destroy)();
STDMETHOD(QueryDataObject)(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject);
STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM* pScopeDataItem);
STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
// IExtendPropertySheet interface
public:
STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle,
LPDATAOBJECT lpIDataObject);
STDMETHOD(QueryPagesFor)(LPDATAOBJECT lpDataObject);
// IExtendContextMenu
public:
STDMETHOD(AddMenuItems)(LPDATAOBJECT pDataObject,
LPCONTEXTMENUCALLBACK pCallbackUnknown,
long *pInsertionAllowed);
STDMETHOD(Command)(long nCommandID, LPDATAOBJECT pDataObject);
// ISnapinHelp2 interface members
STDMETHOD(GetHelpTopic)(LPOLESTR* lpCompiledHelpFile);
STDMETHOD(GetLinkedTopics)(LPOLESTR* lpCompiledHelpFile);
// Notify handler declarations
private:
HRESULT OnExpand(CFolderObject* pFolderObject, LPARAM arg, LPARAM param);
HRESULT OnPropertyChange(LPARAM param);
#if DBG==1
public:
ULONG InternalAddRef()
{
return CComObjectRoot::InternalAddRef();
}
ULONG InternalRelease()
{
return CComObjectRoot::InternalRelease();
}
#endif // DBG==1
public:
MyBasePathsInfo* GetBasePathsInfo() { return &m_basePathsInfo;}
CRootFolderObject* GetRootFolder() { return &m_rootFolder;}
CDsDisplaySpecOptionsCFHolder* GetDsDisplaySpecOptionsCFHolder()
{ return &m_DsDisplaySpecOptionsCFHolder;}
HRESULT AddFolder(CFolderObject* pFolderObject,
HSCOPEITEM pParentScopeItem,
BOOL bHasChildren);
HRESULT AddDomainIcon();
HRESULT AddDomainIconToResultPane(LPIMAGELIST lpImageList);
int GetDomainImageIndex();
HRESULT GetMainWindow(HWND* phWnd) { return m_pConsole->GetMainWindow(phWnd);}
// Scope item creation helpers
private:
void EnumerateScopePane(CFolderObject* pFolderObject, HSCOPEITEM pParent);
BOOL IsScopePaneNode(LPDATAOBJECT lpDataObject);
private:
LPCONSOLENAMESPACE m_pConsoleNameSpace;
LPCONSOLE m_pConsole;
void HandleStandardVerbsHelper(CComponentImpl* pComponentImpl,
LPCONSOLEVERB pConsoleVerb,
BOOL bScope, BOOL bSelect,
CFolderObject* pFolderObject,
DATA_OBJECT_TYPES type);
void OnRefreshVerbHandler(CFolderObject* pFolderObject,
CComponentImpl* pComponentImpl,
BOOL bBindAgain=FALSE);
void _OnSheetClose(CFolderObject* pCookie);
void _OnSheetCreate(PDSA_SEC_PAGE_INFO pDsaSecondaryPageInfo, PWSTR pwzDC);
// sheet API's
void _SheetLockCookie(CFolderObject* pCookie);
void _SheetUnlockCookie(CFolderObject* pCookie);
public:
HWND GetHiddenWindow();
CCookieSheetTable* GetCookieSheet() { return &m_sheetCookieTable; }
void SetInit() { m_bInitSuccess = TRUE; }
protected:
void _DeleteHiddenWnd();
CHiddenWnd* m_pHiddenWnd;
private:
friend class CHiddenWnd; // to access thread notification handlers
private:
CRootFolderObject m_rootFolder; // root folder
MyBasePathsInfo m_basePathsInfo; // container of base path info
CDsDisplaySpecOptionsCFHolder m_DsDisplaySpecOptionsCFHolder; // cached clipbard format.
HICON m_hDomainIcon;
BOOL m_bInitSuccess;
friend class CRootFolderObject;
CCookieSheetTable m_sheetCookieTable; // table of cookies having a sheet up
CSecondaryPagesManager<CDomainObject> m_secondaryPagesManager;
};
/////////////////////////////////////////////////////////////////////////////
// CComponentImpl (i.e. result pane side)
class CComponentImpl :
public IComponent,
public IExtendContextMenu,
public IResultDataCompare,
public CComObjectRoot
{
public:
CComponentImpl();
~CComponentImpl();
BEGIN_COM_MAP(CComponentImpl)
COM_INTERFACE_ENTRY(IComponent)
COM_INTERFACE_ENTRY(IExtendContextMenu)
COM_INTERFACE_ENTRY(IResultDataCompare)
END_COM_MAP()
friend class CDataObject;
// IComponent interface members
public:
STDMETHOD(Initialize)(LPCONSOLE lpConsole);
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
STDMETHOD(Destroy)(MMC_COOKIE cookie);
STDMETHOD(GetResultViewType)(MMC_COOKIE cookie, LPOLESTR* ppViewType,
long *pViewOptions);
STDMETHOD(QueryDataObject)(MMC_COOKIE cookie, DATA_OBJECT_TYPES type,
LPDATAOBJECT* ppDataObject);
STDMETHOD(GetDisplayInfo)(RESULTDATAITEM* pResultDataItem);
STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
// IResultDataCompare
STDMETHOD(Compare)(LPARAM lUserParam, MMC_COOKIE cookieA, MMC_COOKIE cookieB, int* pnResult);
// Helpers for CComponentImpl
public:
void SetIComponentData(CComponentDataImpl* pData);
void SetSelection(CFolderObject* pSelectedFolderObject, DATA_OBJECT_TYPES selectedType)
{
m_pSelectedFolderObject = pSelectedFolderObject;
m_selectedType = selectedType;
}
#if DBG==1
public:
int dbg_cRef;
ULONG InternalAddRef()
{
++dbg_cRef;
return CComObjectRoot::InternalAddRef();
}
ULONG InternalRelease()
{
--dbg_cRef;
return CComObjectRoot::InternalRelease();
}
#endif // DBG==1
// Notify event handlers
protected:
HRESULT OnShow(CFolderObject* pFolderObject, LPARAM arg, LPARAM param);
HRESULT OnAddImages(CFolderObject* pFolderObject, LPARAM arg, LPARAM param);
HRESULT OnPropertyChange(LPDATAOBJECT lpDataObject);
HRESULT OnUpdateView(LPDATAOBJECT lpDataObject);
// IExtendContextMenu
public:
STDMETHOD(AddMenuItems)(LPDATAOBJECT pDataObject,
LPCONTEXTMENUCALLBACK pCallbackUnknown,
long *pInsertionAllowed);
STDMETHOD(Command)(long nCommandID, LPDATAOBJECT pDataObject);
// Helper functions
protected:
BOOL IsEnumerating(LPDATAOBJECT lpDataObject);
void Construct();
void LoadResources();
HRESULT InitializeHeaders(CFolderObject* pFolderObject);
void Enumerate(CFolderObject* pFolderObject, HSCOPEITEM pParent);
void Refresh(CFolderObject* pFolderObject);
// Result pane helpers
HRESULT InitializeBitmaps(CFolderObject* pFolderObject);
// UI Helpers
void HandleStandardVerbs(BOOL bScope, BOOL bSelect,
CFolderObject* pFolderObject, DATA_OBJECT_TYPES type);
// Interface pointers
protected:
LPCONSOLE m_pConsole; // Console's IFrame interface
LPHEADERCTRL m_pHeader; // Result pane's header control interface
LPCOMPONENTDATA m_pComponentData;
CComponentDataImpl* m_pCD;
LPRESULTDATA m_pResult; // My interface pointer to the result pane
LPIMAGELIST m_pImageResult; // My interface pointer to the result pane image list
LPCONSOLEVERB m_pConsoleVerb; // pointer the console verb
// Header titles for each nodetype(s)
protected:
CString m_column1; // Name
CString m_column2; // Type
// state variables for this window
CFolderObject* m_pSelectedFolderObject; // item selection (MMC_SELECT)
DATA_OBJECT_TYPES m_selectedType; // matching m_pSelectedNode
};
inline void CComponentImpl::SetIComponentData(CComponentDataImpl* pData)
{
ASSERT(pData);
ASSERT(m_pCD == NULL);
ASSERT(m_pComponentData == NULL);
m_pCD = pData;
LPUNKNOWN pUnk = pData->GetUnknown();
HRESULT hr;
hr = pUnk->QueryInterface(IID_IComponentData, reinterpret_cast<void**>(&m_pComponentData));
ASSERT(hr == S_OK);
}
//////////////////////////////////////////////////////////////////////////
// CDomainSnapinAbout
class CDomainSnapinAbout :
public CSnapinAbout,
public CComCoClass<CDomainSnapinAbout, &CLSID_DomainSnapinAbout>
{
public:
DECLARE_REGISTRY_CLSID()
CDomainSnapinAbout();
};
////////////////////////////////////////////////////////////////////
// CHiddenWnd
class CHiddenWnd : public CWindowImpl<CHiddenWnd>
{
public:
DECLARE_WND_CLASS(L"DSAHiddenWindow")
static const UINT s_SheetCloseNotificationMessage;
static const UINT s_SheetCreateNotificationMessage;
CHiddenWnd(CComponentDataImpl* pCD)
{
ASSERT(pCD != NULL);
m_pCD = pCD;
}
BOOL Create();
// message handlers
LRESULT OnSheetCloseNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSheetCreateNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
BEGIN_MSG_MAP(CHiddenWnd)
MESSAGE_HANDLER( CHiddenWnd::s_SheetCloseNotificationMessage, OnSheetCloseNotification )
MESSAGE_HANDLER( CHiddenWnd::s_SheetCreateNotificationMessage, OnSheetCreateNotification )
END_MSG_MAP()
private:
CComponentDataImpl* m_pCD;
};
#endif // _CDOMAIN_H