905 lines
25 KiB
C
905 lines
25 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Windows NT Directory Service Administration SnapIn
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
||
|
//
|
||
|
// File: dssnap.h
|
||
|
//
|
||
|
// Contents: DS App
|
||
|
//
|
||
|
// History: 02-Oct-96 WayneSc Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#ifndef __DSSNAP_H__
|
||
|
#define __DSSNAP_H__
|
||
|
|
||
|
#ifndef __DSCOOKIE_H__
|
||
|
#include "dscookie.h"
|
||
|
#endif
|
||
|
#ifndef __DSCACHE_H__
|
||
|
#include "dscache.h" // CDSCache
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define OPCODE_MOVE 0x00000001L
|
||
|
#define OPCODE_DELETE 0x00000002L
|
||
|
|
||
|
// this isn't really a context menu op code, its a flag we use to know
|
||
|
// which icon to return for this object if the enumberation failed
|
||
|
// see dssnap.cpp->ChangeScopeItemIcon()
|
||
|
#define OPCODE_ENUM_FAILED 0x00000004L
|
||
|
// another pseudo opcode, to track whether we're enumerating or
|
||
|
// expanding
|
||
|
#define OPCODE_EXPAND_IN_PROGRESS 0x00000008L
|
||
|
|
||
|
|
||
|
|
||
|
#define DS_DELETE_OCCURRED 900
|
||
|
#define DS_RENAME_OCCURRED 901
|
||
|
#define DS_MOVE_OCCURRED 902
|
||
|
#define DS_CREATE_OCCURRED 903
|
||
|
#define DS_REFRESH_REQUESTED 904
|
||
|
#define DS_VERB_UPDATE 905
|
||
|
#define DS_ICON_STRIP_UPDATE 907
|
||
|
#define DS_HAVE_DATA 908
|
||
|
#define DS_UPDATE_OCCURRED 909
|
||
|
#define DS_MULTIPLE_DELETE_OCCURRED 910
|
||
|
#define DS_MULTIPLE_MOVE_OCCURRED 911
|
||
|
#define DS_CHECK_COLUMN_WIDTHS 912
|
||
|
#define DS_IS_COOKIE_SELECTION 913
|
||
|
#define DS_CREATE_OCCURRED_RESULT_PANE 914
|
||
|
#define DS_DELAYED_EXPAND 915
|
||
|
#define DS_SORT_RESULT_PANE 916
|
||
|
#define DS_UPDATE_VISIBLE_COLUMNS 917
|
||
|
#define DS_UPDATE_OBJECT_COUNT 918
|
||
|
#define DS_UNSELECT_OBJECT 919
|
||
|
|
||
|
#define DS_DEFAULT_COLUMN_COUNT 3
|
||
|
|
||
|
#define DEFAULT_NAME_COL_WIDTH 125
|
||
|
#define DEFAULT_TYPE_COL_WIDTH 175
|
||
|
#define DEFAULT_DESC_COL_WIDTH 400
|
||
|
#define NARROW_DESC_COL_WIDTH 200
|
||
|
|
||
|
|
||
|
// forward declarations
|
||
|
|
||
|
class CDSCookie;
|
||
|
class CDSQueryFilter;
|
||
|
class CHiddenWnd;
|
||
|
class CDSQueryResult;
|
||
|
class CWorkerThread;
|
||
|
struct CBackgroundThreadInfo;
|
||
|
class CFavoritesNodesHolder;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTargetingInfo
|
||
|
|
||
|
class CTargetingInfo
|
||
|
{
|
||
|
public:
|
||
|
CTargetingInfo()
|
||
|
{
|
||
|
m_dwFlags = 0x0;
|
||
|
_InitFromCommandLine();
|
||
|
}
|
||
|
|
||
|
HRESULT Load(IStream* pStm);
|
||
|
HRESULT Save(IStream* pStm, LPCWSTR lpszCurrentTargetName);
|
||
|
|
||
|
BOOL GetSaveCurrent()
|
||
|
{
|
||
|
return (m_dwFlags & m_dwSaveDomainFlag) != 0;
|
||
|
}
|
||
|
void SetSaveCurrent(BOOL bSave)
|
||
|
{
|
||
|
if (bSave)
|
||
|
m_dwFlags |= m_dwSaveDomainFlag;
|
||
|
else
|
||
|
m_dwFlags &= ~m_dwSaveDomainFlag;
|
||
|
}
|
||
|
|
||
|
LPCWSTR GetTargetString() { return m_szStoredTargetName; }
|
||
|
LPCWSTR GetRootRDN() { return m_szRootRDN;}
|
||
|
|
||
|
#ifdef _MMC_ISNAPIN_PROPERTY
|
||
|
HRESULT InitFromSnapinProperties(long cProps, //property count
|
||
|
MMC_SNAPIN_PROPERTY* pProps //properties array
|
||
|
);
|
||
|
#endif // _MMC_ISNAPIN_PROPERTY
|
||
|
|
||
|
private:
|
||
|
void _InitFromCommandLine();
|
||
|
|
||
|
DWORD m_dwFlags;
|
||
|
CString m_szStoredTargetName;
|
||
|
CString m_szRootRDN;
|
||
|
|
||
|
static const DWORD m_dwSaveDomainFlag;
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CIconManager
|
||
|
|
||
|
class CIconManager
|
||
|
{
|
||
|
public:
|
||
|
CIconManager()
|
||
|
{
|
||
|
m_pScpImageList = NULL;
|
||
|
|
||
|
// set the special indexes to invalid values
|
||
|
m_iRootIconIndex = m_iRootIconErrIndex =
|
||
|
m_iWaitIconIndex = m_iWarnIconIndex =
|
||
|
m_iFavoritesIconIndex = m_iQueryIconIndex =
|
||
|
m_iQueryInvalidIconIndex = 0;
|
||
|
}
|
||
|
~CIconManager()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
HRESULT Init(IImageList* pScpImageList, SnapinType snapintype);
|
||
|
|
||
|
HRESULT FillInIconStrip(IImageList* pImageList);
|
||
|
HRESULT AddClassIcon(IN LPCWSTR lpszClass,
|
||
|
IN MyBasePathsInfo* pPathInfo,
|
||
|
IN DWORD dwFlags,
|
||
|
INOUT int* pnIndex);
|
||
|
HRESULT AddIcon(IN HICON hiClass16, IN HICON hiClass32, INOUT int* pnIndex);
|
||
|
|
||
|
int GetRootIndex() { return m_iRootIconIndex;}
|
||
|
int GetRootErrIndex() { return m_iRootIconErrIndex;}
|
||
|
|
||
|
int GetWaitIndex() { return m_iWaitIconIndex;}
|
||
|
int GetWarnIndex() { return m_iWarnIconIndex;}
|
||
|
|
||
|
int GetFavoritesIndex() { return m_iFavoritesIconIndex;}
|
||
|
int GetQueryIndex() { return m_iQueryIconIndex;}
|
||
|
int GetQueryInvalidIndex() { return m_iQueryInvalidIconIndex; }
|
||
|
|
||
|
private:
|
||
|
IImageList* m_pScpImageList; // no addref, lifetime of IComponentData
|
||
|
|
||
|
class CIconInfo
|
||
|
{
|
||
|
public:
|
||
|
CIconInfo() { m_hiClass16 = m_hiClass32 = NULL;}
|
||
|
HICON m_hiClass16;
|
||
|
HICON m_hiClass32;
|
||
|
};
|
||
|
class CIconInfoList : public CList <CIconInfo*, CIconInfo*>
|
||
|
{
|
||
|
public:
|
||
|
~CIconInfoList()
|
||
|
{
|
||
|
while (!IsEmpty())
|
||
|
delete RemoveHead();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
CIconInfoList m_IconInfoList; // list of icon handles
|
||
|
|
||
|
// special icon indexes we need to know about
|
||
|
int m_iRootIconIndex;
|
||
|
int m_iRootIconErrIndex;
|
||
|
int m_iWaitIconIndex;
|
||
|
int m_iWarnIconIndex;
|
||
|
int m_iFavoritesIconIndex;
|
||
|
int m_iQueryIconIndex;
|
||
|
int m_iQueryInvalidIconIndex;
|
||
|
|
||
|
HRESULT _LoadIconFromResource(IN UINT nIconResID, INOUT int* pnIndex);
|
||
|
int _GetBaseIndex() { return 1;}
|
||
|
int _GetNextFreeIndex()
|
||
|
{ return (int)(m_IconInfoList.GetCount() + _GetBaseIndex());}
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CInternalFormatCracker
|
||
|
|
||
|
class CInternalFormatCracker
|
||
|
{
|
||
|
public:
|
||
|
CInternalFormatCracker()
|
||
|
{
|
||
|
m_pInternalFormat = NULL;
|
||
|
}
|
||
|
~CInternalFormatCracker()
|
||
|
{
|
||
|
_Free();
|
||
|
}
|
||
|
|
||
|
BOOL HasData() { return m_pInternalFormat != NULL;}
|
||
|
|
||
|
HRESULT Extract(LPDATAOBJECT lpDataObject);
|
||
|
LPDATAOBJECT ExtractMultiSelect(LPDATAOBJECT lpDataObject);
|
||
|
CUINode* GetCookie(UINT nIndex = 0)
|
||
|
{
|
||
|
ASSERT(m_pInternalFormat != NULL);
|
||
|
if (nIndex == 0)
|
||
|
{
|
||
|
return m_pInternalFormat->m_cookie;
|
||
|
}
|
||
|
else if ( (m_pInternalFormat->m_p_cookies != NULL) &&
|
||
|
(nIndex < m_pInternalFormat->m_cookie_count))
|
||
|
{
|
||
|
return m_pInternalFormat->m_p_cookies[nIndex-1];
|
||
|
}
|
||
|
ASSERT(FALSE);
|
||
|
return NULL;
|
||
|
}
|
||
|
UINT GetCookieCount()
|
||
|
{
|
||
|
ASSERT(m_pInternalFormat != NULL);
|
||
|
return m_pInternalFormat->m_cookie_count;
|
||
|
}
|
||
|
DATA_OBJECT_TYPES GetType()
|
||
|
{
|
||
|
ASSERT(m_pInternalFormat != NULL);
|
||
|
return m_pInternalFormat->m_type;
|
||
|
}
|
||
|
SnapinType GetSnapinType()
|
||
|
{
|
||
|
ASSERT(m_pInternalFormat != NULL);
|
||
|
return m_pInternalFormat->m_snapintype;
|
||
|
}
|
||
|
private:
|
||
|
INTERNAL* m_pInternalFormat;
|
||
|
|
||
|
void _Free()
|
||
|
{
|
||
|
if (m_pInternalFormat != NULL)
|
||
|
{
|
||
|
::GlobalFree(m_pInternalFormat);
|
||
|
m_pInternalFormat = NULL;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// this is just a function to make sure we have
|
||
|
// consistent node types in the object cracker
|
||
|
//
|
||
|
template <class T>
|
||
|
BOOL AreAllNodesOfType(CInternalFormatCracker* pInternalObjectCracker)
|
||
|
{
|
||
|
UINT nCount = pInternalObjectCracker->GetCookieCount();
|
||
|
for (UINT k=0; k<nCount; k++)
|
||
|
{
|
||
|
if (!IS_CLASS(*(pInternalObjectCracker->GetCookie(k)), T))
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CObjectNamesFormatCracker
|
||
|
|
||
|
class CObjectNamesFormatCracker
|
||
|
{
|
||
|
public:
|
||
|
CObjectNamesFormatCracker()
|
||
|
{
|
||
|
m_pDsObjectNames = NULL;
|
||
|
}
|
||
|
~CObjectNamesFormatCracker()
|
||
|
{
|
||
|
_Free();
|
||
|
}
|
||
|
|
||
|
BOOL HasData() { return m_pDsObjectNames != NULL;}
|
||
|
|
||
|
HRESULT Extract(LPDATAOBJECT lpDataObject);
|
||
|
|
||
|
UINT GetCount()
|
||
|
{
|
||
|
ASSERT(m_pDsObjectNames != NULL);
|
||
|
return m_pDsObjectNames->cItems;
|
||
|
}
|
||
|
|
||
|
LPCWSTR GetName(UINT nIndex)
|
||
|
{
|
||
|
ASSERT(nIndex < GetCount());
|
||
|
return (LPCWSTR)ByteOffset(m_pDsObjectNames, m_pDsObjectNames->aObjects[nIndex].offsetName);
|
||
|
}
|
||
|
|
||
|
LPCWSTR GetClass(UINT nIndex)
|
||
|
{
|
||
|
ASSERT(nIndex < GetCount());
|
||
|
return (LPCWSTR)ByteOffset(m_pDsObjectNames, m_pDsObjectNames->aObjects[nIndex].offsetClass);
|
||
|
}
|
||
|
|
||
|
DWORD GetProviderFlags(UINT nIndex)
|
||
|
{
|
||
|
ASSERT(nIndex < GetCount());
|
||
|
return m_pDsObjectNames->aObjects[nIndex].dwProviderFlags;
|
||
|
}
|
||
|
|
||
|
DWORD GetFlags(UINT nIndex)
|
||
|
{
|
||
|
ASSERT(nIndex < GetCount());
|
||
|
return m_pDsObjectNames->aObjects[nIndex].dwFlags;
|
||
|
}
|
||
|
|
||
|
BOOL IsContainer(UINT nIndex)
|
||
|
{
|
||
|
ASSERT(nIndex < GetCount());
|
||
|
return (GetFlags((nIndex) & DSOBJECT_ISCONTAINER) != 0);
|
||
|
}
|
||
|
|
||
|
void Reset() { _Free();}
|
||
|
|
||
|
// Property Page Clipboard formats
|
||
|
static CLIPFORMAT m_cfDsObjectNames;
|
||
|
|
||
|
private:
|
||
|
LPDSOBJECTNAMES m_pDsObjectNames;
|
||
|
|
||
|
void _Free()
|
||
|
{
|
||
|
if (m_pDsObjectNames != NULL)
|
||
|
{
|
||
|
::GlobalFree(m_pDsObjectNames);
|
||
|
m_pDsObjectNames = NULL;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CTopLevelCNInfo
|
||
|
|
||
|
|
||
|
class CTopLevelCNInfo
|
||
|
{
|
||
|
public:
|
||
|
CTopLevelCNInfo()
|
||
|
{
|
||
|
m_nCount = 0;
|
||
|
m_pStringArr = NULL;
|
||
|
m_pdwFlags = NULL;
|
||
|
}
|
||
|
~CTopLevelCNInfo()
|
||
|
{
|
||
|
Free();
|
||
|
}
|
||
|
BOOL Alloc(UINT nCount)
|
||
|
{
|
||
|
CString* pstr = new CString[nCount];
|
||
|
if (pstr == NULL)
|
||
|
return FALSE;
|
||
|
DWORD* pdw = new DWORD[nCount];
|
||
|
if (pdw == NULL)
|
||
|
{
|
||
|
delete[] pstr;
|
||
|
return FALSE;
|
||
|
}
|
||
|
ZeroMemory( pdw, nCount*sizeof(DWORD) );
|
||
|
m_pStringArr = pstr;
|
||
|
m_pdwFlags = pdw;
|
||
|
m_nCount = nCount;
|
||
|
return TRUE;
|
||
|
}
|
||
|
void Free()
|
||
|
{
|
||
|
m_nCount = 0;
|
||
|
if (m_pStringArr != NULL)
|
||
|
{
|
||
|
delete[] m_pStringArr;
|
||
|
m_pStringArr = NULL;
|
||
|
}
|
||
|
if (m_pdwFlags != NULL)
|
||
|
{
|
||
|
delete[] m_pdwFlags;
|
||
|
m_pdwFlags = NULL;
|
||
|
}
|
||
|
}
|
||
|
UINT m_nCount;
|
||
|
CString* m_pStringArr;
|
||
|
DWORD* m_pdwFlags;
|
||
|
};
|
||
|
|
||
|
#define TOPLEVEL_FLAG_SERVICES_NODE 0x1
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CDSNotifyHandlerManager
|
||
|
|
||
|
class CDSNotifyHandlerManager
|
||
|
{
|
||
|
private:
|
||
|
class CDSNotifyHandlerInfo
|
||
|
{
|
||
|
public:
|
||
|
CDSNotifyHandlerInfo()
|
||
|
{
|
||
|
m_nRegisteredEvents = 0;
|
||
|
m_nFlags = 0;
|
||
|
m_bTransactionPending = FALSE;
|
||
|
m_bNeedsNotify = FALSE;
|
||
|
}
|
||
|
|
||
|
CComPtr<IDsAdminNotifyHandler> m_spIDsAdminNotifyHandler;
|
||
|
ULONG m_nRegisteredEvents;
|
||
|
ULONG m_nFlags;
|
||
|
CString m_szDisplayString;
|
||
|
BOOL m_bTransactionPending;
|
||
|
BOOL m_bNeedsNotify;
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
|
||
|
CDSNotifyHandlerManager()
|
||
|
{
|
||
|
m_nArrSize = 0;
|
||
|
m_pInfoArr = NULL;
|
||
|
m_state = uninitialized;
|
||
|
}
|
||
|
|
||
|
~CDSNotifyHandlerManager()
|
||
|
{
|
||
|
_Free();
|
||
|
}
|
||
|
|
||
|
BOOL HasHandlers() { return m_state == hasHandlers;}
|
||
|
|
||
|
HRESULT Init();
|
||
|
HRESULT Load(MyBasePathsInfo* pBasePathInfo); // do the actual extension loading and initialization
|
||
|
|
||
|
// mapping to COM notification interfaces
|
||
|
void Begin(ULONG uEvent, IDataObject* pArg1, IDataObject* pArg2);
|
||
|
void Notify(ULONG nItem, ULONG uEvent);
|
||
|
void End(ULONG uEvent);
|
||
|
|
||
|
// state veriables check
|
||
|
UINT NeedNotifyCount(ULONG uEvent);
|
||
|
|
||
|
// handlers for visualization in confirnation dialog
|
||
|
void SetCheckListBox(CCheckListBox* pCheckListBox, ULONG uEvent);
|
||
|
void ReadFromCheckListBox(CCheckListBox* pCheckListBox, ULONG uEvent);
|
||
|
|
||
|
private:
|
||
|
CDSNotifyHandlerInfo* m_pInfoArr;
|
||
|
UINT m_nArrSize;
|
||
|
|
||
|
enum HandlerState { uninitialized, hasHandlers, noHandlers};
|
||
|
HandlerState m_state;
|
||
|
|
||
|
void _Free()
|
||
|
{
|
||
|
if (m_pInfoArr != NULL)
|
||
|
{
|
||
|
ASSERT(m_nArrSize >0);
|
||
|
delete[] m_pInfoArr;
|
||
|
}
|
||
|
m_nArrSize = 0;
|
||
|
m_pInfoArr = NULL;
|
||
|
m_state = uninitialized;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CDSComponentData
|
||
|
|
||
|
typedef struct _UINODESELECTIONP {
|
||
|
CUINode* pUINode;
|
||
|
BOOL IsSelection;
|
||
|
} UINODESELECTION, * PUINODESELECTION;
|
||
|
|
||
|
|
||
|
class CDSComponentData:
|
||
|
public IComponentData,
|
||
|
public IExtendPropertySheet,
|
||
|
public IExtendContextMenu,
|
||
|
public IPersistStream,
|
||
|
#ifdef _MMC_ISNAPIN_PROPERTY
|
||
|
public ISnapinProperties,
|
||
|
#endif
|
||
|
public ISnapinHelp2,
|
||
|
public CComObjectRoot
|
||
|
{
|
||
|
BEGIN_COM_MAP(CDSComponentData)
|
||
|
COM_INTERFACE_ENTRY(IComponentData)
|
||
|
COM_INTERFACE_ENTRY(IExtendPropertySheet)
|
||
|
COM_INTERFACE_ENTRY(IExtendContextMenu)
|
||
|
COM_INTERFACE_ENTRY(IPersistStream)
|
||
|
#ifdef _MMC_ISNAPIN_PROPERTY
|
||
|
COM_INTERFACE_ENTRY(ISnapinProperties)
|
||
|
#endif
|
||
|
COM_INTERFACE_ENTRY(ISnapinHelp)
|
||
|
COM_INTERFACE_ENTRY(ISnapinHelp2)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
friend class CDSClassCacheItemBase;
|
||
|
friend class CDSEvent;
|
||
|
friend class CDSDataObject;
|
||
|
friend class CDSDirect;
|
||
|
friend class CDSContextMenu;
|
||
|
|
||
|
CDSComponentData();
|
||
|
HRESULT FinalConstruct();
|
||
|
void FinalRelease();
|
||
|
~CDSComponentData();
|
||
|
|
||
|
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)(LPSCOPEDATAITEM scopeInfo);
|
||
|
STDMETHOD(CompareObjects) (IDataObject * pDataObject, IDataObject * pDataObject2);
|
||
|
// 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);
|
||
|
|
||
|
public:
|
||
|
// IPersistStream interface members
|
||
|
STDMETHOD(GetClassID)(CLSID *pClassID);
|
||
|
STDMETHOD(IsDirty)();
|
||
|
STDMETHOD(Load)(IStream *pStm);
|
||
|
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
|
||
|
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize);
|
||
|
|
||
|
// ISnapinHelp2 interface members
|
||
|
STDMETHOD(GetHelpTopic)(LPOLESTR* lpCompiledHelpFile);
|
||
|
STDMETHOD(GetLinkedTopics)(LPOLESTR* lpCompiledHelpFile);
|
||
|
|
||
|
#ifdef _MMC_ISNAPIN_PROPERTY
|
||
|
// ISnapinProperties
|
||
|
STDMETHOD(Initialize) (Properties* pProperties);
|
||
|
STDMETHOD(QueryPropertyNames) (ISnapinPropertiesCallback* pCallback);
|
||
|
STDMETHOD(PropertiesChanged) (long cProperties, MMC_SNAPIN_PROPERTY* pProperties);
|
||
|
|
||
|
#endif //_MMC_ISNAPIN_PROPERTY
|
||
|
|
||
|
|
||
|
public:
|
||
|
|
||
|
virtual SnapinType QuerySnapinType() = 0;
|
||
|
LPCWSTR GetRootPath(void) { return m_RootNode.GetPath(); }
|
||
|
|
||
|
PDSDISPLAYSPECOPTIONS GetDsDisplaySpecOptions()
|
||
|
{
|
||
|
return m_DsDisplaySpecOptionsCFHolder.Get();
|
||
|
}
|
||
|
|
||
|
HRESULT AddClassIcon(IN LPCWSTR lpszClass, IN DWORD dwFlags, INOUT int* pnIndex);
|
||
|
HRESULT FillInIconStrip(IImageList* pImageList);
|
||
|
|
||
|
HWND GetHWnd() { return m_hwnd;}
|
||
|
|
||
|
CRootNode* GetRootNode() { return &m_RootNode;}
|
||
|
CDSDirect* GetActiveDS() { return m_ActiveDS;}
|
||
|
|
||
|
BOOL ExpandComputers();
|
||
|
BOOL IsAdvancedView();
|
||
|
BOOL ViewServicesNode();
|
||
|
|
||
|
|
||
|
HRESULT ToggleDisabled(CDSUINode* pDSUINode, BOOL bDisable);
|
||
|
|
||
|
void AddScopeItemToUI(CUINode* pUINode, BOOL bSetSelected = FALSE);
|
||
|
void AddListOfNodesToUI(CUINode* pUINode, CUINodeList* pNodeList);
|
||
|
HRESULT ReadUINodeFromLdapPath(IN CDSUINode* pContainerDSUINode,
|
||
|
IN LPCWSTR lpszLdapPath,
|
||
|
OUT CDSUINode** ppSUINodeNew);
|
||
|
HRESULT UpdateItem(CUINode* pNode);
|
||
|
|
||
|
private:
|
||
|
HRESULT _OnExpand(CUINode* pNode, HSCOPEITEM hParent, MMC_NOTIFY_TYPE event);
|
||
|
HRESULT _OnPreload(HSCOPEITEM hRoot);
|
||
|
|
||
|
HRESULT BuildDsDisplaySpecOptionsStruct()
|
||
|
{
|
||
|
return m_DsDisplaySpecOptionsCFHolder.Init(GetBasePathsInfo());
|
||
|
}
|
||
|
|
||
|
HRESULT _AddScopeItem(CUINode* pUINode, HSCOPEITEM hParent, BOOL bSetSelected = FALSE);
|
||
|
HRESULT _ChangeRootItemIcon(int nImage);
|
||
|
HRESULT _ChangeResultItemIcon(CUINode* pUINode);
|
||
|
HRESULT _UpdateScopeItem(CUINode* pNode);
|
||
|
|
||
|
// command helpers (called from Command())
|
||
|
HRESULT _CommandNewDSObject(long nCommandID, LPDATAOBJECT pDataObject);
|
||
|
HRESULT _CommandShellExtension(long nCommandID, LPDATAOBJECT pDataObject);
|
||
|
|
||
|
// create object handler
|
||
|
HRESULT _CreateDSObject(IN CDSUINode* pContainerDSUINode,
|
||
|
IN LPCWSTR lpszObjectClass,
|
||
|
IN CDSUINode* pCopyFromSUINode,
|
||
|
OUT CDSUINode** ppSUINodeNew);
|
||
|
|
||
|
// copy object handler
|
||
|
HRESULT _CanCopyDSObject(IDataObject* pCopyFromDsObject);
|
||
|
HRESULT _CopyDSObject(IDataObject* pCopyFromDsObject);
|
||
|
|
||
|
// deletion helpers
|
||
|
HRESULT _DeleteFromBackendAndUI(IDataObject* pDataObject, CDSUINode* pDSUINode);
|
||
|
HRESULT _DeleteFromBackEnd(IDataObject* pDataObject, CDSCookie* pCookie);
|
||
|
|
||
|
public: // expose to other objects
|
||
|
HRESULT ChangeScopeItemIcon(CUINode* pUINode);
|
||
|
HRESULT _DeleteSubtreeFromBackEnd(CDSCookie* pCookie);
|
||
|
HRESULT RemoveContainerFromUI(CUINode* pUINode);
|
||
|
|
||
|
HRESULT SetRenameMode(CUINode* pUINode);
|
||
|
BOOL CanAddCookieToGroup(CDSCookie* pCookie, INT iGroupType, BOOL bMixedMode);
|
||
|
|
||
|
HRESULT SelectScopeNode(CUINode* pUINode);
|
||
|
void SortResultPane(CUINode* pUINode);
|
||
|
CDSColumnSet* FindColumnSet(LPCWSTR lpszColumnID)
|
||
|
{
|
||
|
return (CDSColumnSet*)m_pClassCache->FindColumnSet(lpszColumnID);
|
||
|
}
|
||
|
|
||
|
HRESULT ColumnsChanged(CDSEvent* pDSEvent,
|
||
|
CUINode* pUINode,
|
||
|
MMC_VISIBLE_COLUMNS* pVisibleColumns,
|
||
|
BOOL bRefresh);
|
||
|
void ForceRefreshAll();
|
||
|
|
||
|
HRESULT Refresh(CUINode* pNode, BOOL bFlushCache = FALSE, BOOL bFlushColumns = FALSE);
|
||
|
HRESULT UpdateFromDS(CUINode* pUINode);
|
||
|
BOOL IsSelectionAnywhere(CUINode* pUINode);
|
||
|
// JonN 7/23/99
|
||
|
// 373806: Site&Svcs: Renaming an auto-generated connection should make it admin owned
|
||
|
BOOL RenameConnectionFixup(CDSCookie* pCookie);
|
||
|
|
||
|
void ClearSubtreeHelperForRename(CUINode* pUINode);
|
||
|
CDSCache* GetClassCache() { return m_pClassCache; }
|
||
|
|
||
|
HRESULT FillInChildList(CDSCookie * pCookie);
|
||
|
CDSQueryFilter* GetQueryFilter() { return m_pQueryFilter; }
|
||
|
BOOL IsPrimarySnapin() { return m_bRunAsPrimarySnapin; }
|
||
|
|
||
|
void GetDomain();
|
||
|
void GetDC();
|
||
|
BOOL CanRefreshAll();
|
||
|
void RefreshAll();
|
||
|
|
||
|
void EditFSMO();
|
||
|
void RaiseVersion(void);
|
||
|
|
||
|
CUINode* MoveObjectInUI(CDSUINode* pDSUINode);
|
||
|
HRESULT FindParentCookie(LPCWSTR lpszCookieDN, CUINode** ppParentUINode);
|
||
|
BOOL FindUINodeByDN(CUINode* pContainerNode,
|
||
|
PCWSTR pszDN,
|
||
|
CUINode** ppFoundNode);
|
||
|
void InvalidateSavedQueriesContainingObjects(const CUINodeList& refUINodeList);
|
||
|
void InvalidateSavedQueriesContainingObjects(const CStringList& refPathList);
|
||
|
|
||
|
private:
|
||
|
|
||
|
HRESULT _Rename(CUINode* pNode, LPWSTR NewName);
|
||
|
|
||
|
HRESULT CommitRenameToDS(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
HRESULT RenameUser(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
HRESULT RenameGroup(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
HRESULT RenameNTDSConnection(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
HRESULT RenameSubnet(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
HRESULT RenameSite(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
HRESULT RenameContact(CUINode* pUINode, CDSCookie* pCookie, LPCWSTR NewName);
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT _MoveObject(CDSUINode* pDSUINode);
|
||
|
|
||
|
void ClearClassCacheAndRefreshRoot();
|
||
|
|
||
|
STDMETHOD(_OnPropertyChange)(LPDATAOBJECT pDataObject, BOOL bScope);
|
||
|
BOOL SortChildList (LPWSTR *ppszChildList, UINT cChildCount);
|
||
|
|
||
|
int InsertAtTopContextMenu(LPCWSTR pwszParentClass, LPCWSTR pwszChildClass);
|
||
|
BOOL IsNotHiddenClass (LPWSTR pwszClass, CDSCookie* pParentCookie);
|
||
|
#ifdef FIXUPDC
|
||
|
HRESULT _FixupDC(LPCWSTR pwszPath);
|
||
|
#endif // FIXUPDC
|
||
|
HRESULT _RunKCC(LPCWSTR pwszPath);
|
||
|
|
||
|
// Memory reclamation routines
|
||
|
void ReclaimCookies();
|
||
|
void AddToLRUList (CUINode* pUINode);
|
||
|
|
||
|
|
||
|
// namespace extension API's
|
||
|
HRESULT _OnNamespaceExtensionExpand(LPDATAOBJECT lpDataObject, HSCOPEITEM pParent);
|
||
|
|
||
|
// thread API's
|
||
|
BOOL _StartBackgroundThread();
|
||
|
void _WaitForBackGroundThreadStartAck();
|
||
|
void _ShutDownBackgroundThread();
|
||
|
BOOL _PostQueryToBackgroundThread(CUINode* pUINode);
|
||
|
BOOL _PostMessageToBackgroundThread(UINT Msg, WPARAM wParam, LPARAM lParam);
|
||
|
void _OnTooMuchData(CUINode* pUINode);
|
||
|
void _OnHaveData(CUINode* pUINode, CThreadQueryResult* pResult);
|
||
|
void _OnDone(CUINode* pUINode, HRESULT hr);
|
||
|
void _OnSheetClose(CUINode* pUINode);
|
||
|
void _OnSheetCreate(PDSA_SEC_PAGE_INFO pDsaSecondaryPageInfo);
|
||
|
|
||
|
// sheet API's
|
||
|
void _SheetLockCookie(CUINode* pNode);
|
||
|
void _SheetUnlockCookie(CUINode* pNode);
|
||
|
BOOL _WarningOnSheetsUp(CUINode* pNode, BOOL bShowMessage = TRUE, BOOL bActivate = TRUE);
|
||
|
BOOL _WarningOnSheetsUp(CInternalFormatCracker* pInternalFormatCracker);
|
||
|
|
||
|
public:
|
||
|
STDMETHOD(QueryFromWorkerThread)(CThreadQueryInfo* pQueryInfo,
|
||
|
CWorkerThread* pWorkerThread);
|
||
|
BOOL CanEnableVerb(CUINode* pUINode);
|
||
|
int GetImage(CUINode* pNode, BOOL bOpen);
|
||
|
UINT GetSerialNumber() {return m_SerialNumber++;}
|
||
|
void Lock() { ::EnterCriticalSection(&m_cs);}
|
||
|
void Unlock() { ::LeaveCriticalSection(&m_cs);}
|
||
|
HWND GetHiddenWindow();
|
||
|
|
||
|
MyBasePathsInfo* GetBasePathsInfo() { return &m_basePathsInfo;}
|
||
|
CDSNotifyHandlerManager* GetNotifyHandlerManager() { return &m_notifyHandlerManager;}
|
||
|
CFavoritesNodesHolder* GetFavoritesNodeHolder() { return m_pFavoritesNodesHolder; }
|
||
|
CTargetingInfo* GetTargetingInfo() { return &m_targetingInfo; }
|
||
|
|
||
|
void SetDirty(BOOL bDirty = TRUE) { m_bDirty = bDirty; }
|
||
|
private:
|
||
|
// InitFunctions
|
||
|
HRESULT _InitRootFromCurrentTargetInfo();
|
||
|
HRESULT _InitRootFromBasePathsInfo(MyBasePathsInfo* pBasePathsInfo);
|
||
|
|
||
|
HRESULT _InitRootFromValidBasePathsInfo();
|
||
|
|
||
|
private:
|
||
|
CTargetingInfo m_targetingInfo; // manage serialized targeting info
|
||
|
CIconManager m_iconManager; // manage icon strip
|
||
|
MyBasePathsInfo m_basePathsInfo; // container of base path info
|
||
|
CDSNotifyHandlerManager m_notifyHandlerManager;
|
||
|
|
||
|
protected:
|
||
|
CRootNode m_RootNode; // Root node for the snapin
|
||
|
BOOL m_InitSuccess; // successfully contacted DC for naming info?
|
||
|
BOOL m_InitAttempted; // already attempted to contact DC for naming info, don't show errors
|
||
|
CDSDirect* m_ActiveDS;
|
||
|
CDSCache* m_pClassCache;
|
||
|
LPCONSOLENAMESPACE2 m_pScope; // My interface pointer to the scope pane
|
||
|
IConsole3* m_pFrame;
|
||
|
|
||
|
#ifdef _MMC_ISNAPIN_PROPERTY
|
||
|
Properties* m_pProperties; // pointer to MMC properties interface
|
||
|
#endif //_MMC_ISNAPIN_PROPERTY
|
||
|
|
||
|
HWND m_hwnd; // window handle of main window
|
||
|
IImageList* m_pScpImageList;
|
||
|
|
||
|
CStringList m_CreateInfo;
|
||
|
IShellExtInit * m_pShlInit; // Property sheet COM object pointer.
|
||
|
CDsDisplaySpecOptionsCFHolder m_DsDisplaySpecOptionsCFHolder; // cached clipbard format.
|
||
|
|
||
|
UINT m_SerialNumber; // monotonically increasing number used for tracking
|
||
|
// cookies to determine LRU
|
||
|
CUINodeList m_LRUList; // node list for LRU reclamation
|
||
|
|
||
|
BOOL m_bDirty; // dirty flag for serialization on MMC stream
|
||
|
INT m_ColumnWidths[DS_DEFAULT_COLUMN_COUNT]; //save column widths here.
|
||
|
|
||
|
BOOL m_bRunAsPrimarySnapin; // TRUE if the snapin is not an extension
|
||
|
BOOL m_bAddRootWhenExtended; // TRUE adds root node folder
|
||
|
|
||
|
CDSQueryFilter* m_pQueryFilter;
|
||
|
LPCWSTR m_lpszSnapinHelpFile;
|
||
|
|
||
|
CFavoritesNodesHolder* m_pFavoritesNodesHolder;
|
||
|
|
||
|
// thread related variables
|
||
|
private:
|
||
|
CRITICAL_SECTION m_cs;
|
||
|
|
||
|
protected:
|
||
|
void _DeleteHiddenWnd();
|
||
|
CHiddenWnd* m_pHiddenWnd;
|
||
|
|
||
|
CBackgroundThreadInfo* m_pBackgroundThreadInfo; // info about dispatcher thread state
|
||
|
|
||
|
CUINodeQueryTable m_queryNodeTable; // table of cookies having a pending query
|
||
|
|
||
|
// property sheet related variables
|
||
|
private:
|
||
|
CUINodeSheetTable m_sheetNodeTable; // table of cookies having a sheet up
|
||
|
friend class CHiddenWnd; // to access thread notification handlers
|
||
|
};
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CDSSnapin (DS standalone)
|
||
|
|
||
|
class CDSSnapin:
|
||
|
public CDSComponentData,
|
||
|
public CComCoClass<CDSSnapin, &CLSID_DSSnapin>
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_REGISTRY_CLSID()
|
||
|
//DECLARE_REGISTRY(CDSSnapin, _T("DSSnap.SnapinObj.1"), _T("DSSnap.SnapinObj"), IDS_DSSNAPINNAME, THREADFLAGS_BOTH)
|
||
|
|
||
|
CDSSnapin();
|
||
|
|
||
|
virtual SnapinType QuerySnapinType();
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CDSSnapinEx (DS namespace extension)
|
||
|
|
||
|
class CDSSnapinEx:
|
||
|
public CDSComponentData,
|
||
|
public CComCoClass<CDSSnapinEx, &CLSID_DSSnapinEx>
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_REGISTRY_CLSID()
|
||
|
//DECLARE_REGISTRY(CDSSnapin, _T("DSSnapEx.SnapinObj.1"), _T("DSSnapEx.SnapinObj"), IDS_DSSNAPINNAMEEX, THREADFLAGS_BOTH)
|
||
|
|
||
|
CDSSnapinEx();
|
||
|
|
||
|
virtual SnapinType QuerySnapinType();
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
// CSiteSnapin (Site manager standalone)
|
||
|
|
||
|
class CSiteSnapin:
|
||
|
public CDSComponentData,
|
||
|
public CComCoClass<CSiteSnapin, &CLSID_SiteSnapin>
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_REGISTRY_CLSID()
|
||
|
//DECLARE_REGISTRY(CSiteSnapin, _T("SiteSnap.SnapinObj.1"), _T("SiteSnap.SnapinObj"), IDS_SITESNAPINNAME, THREADFLAGS_BOTH)
|
||
|
|
||
|
CSiteSnapin();
|
||
|
|
||
|
virtual SnapinType QuerySnapinType();
|
||
|
};
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CDSSnapinAbout
|
||
|
|
||
|
class CDSSnapinAbout :
|
||
|
public CSnapinAbout,
|
||
|
public CComCoClass<CDSSnapinAbout, &CLSID_DSAboutSnapin>
|
||
|
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_REGISTRY_CLSID()
|
||
|
CDSSnapinAbout();
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CSitesSnapinAbout
|
||
|
|
||
|
class CSitesSnapinAbout :
|
||
|
public CSnapinAbout,
|
||
|
public CComCoClass<CSitesSnapinAbout, &CLSID_SitesAboutSnapin>
|
||
|
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_REGISTRY_CLSID()
|
||
|
CSitesSnapinAbout();
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif //__DSSNAP_H__
|