windows-nt/Source/XPSP1/NT/admin/snapin/dsadmin/dscookie.h
2020-09-26 16:20:57 +08:00

380 lines
9.9 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1999
//
// File: DSCookie.h
//
// Contents: DS Cookie functions
//
// History: 02-Oct-96 WayneSc Created
//
//--------------------------------------------------------------------------
#ifndef __DSCOOKIE_H__
#define __DSCOOKIE_H__
#include "dscache.h"
#include "uinode.h"
// Forward prototypes
class CContextMenuVerbs;
/////////////////////////////////////////////////////////////////////////////
// CDSCookieInfoBase : extra inof for special classes we know about
class CDSCookieInfoBase
{
public:
enum cookieClass { base, group, connection };
CDSCookieInfoBase()
{
m_class = base;
}
virtual ~CDSCookieInfoBase()
{
}
cookieClass GetClass() { return m_class;}
virtual LPCWSTR GetFriendlyClassName() { return L"";}
protected:
cookieClass m_class;
};
/////////////////////////////////////////////////////////////////////////////
// CDSCookieInfoGroup : extra info for groups
class CDSCookieInfoGroup : public CDSCookieInfoBase
{
public:
CDSCookieInfoGroup()
{
m_class = group;
m_GroupType = 0;
}
virtual LPCWSTR GetFriendlyClassName()
{
return GetGroupTypeStringHelper(m_GroupType);
}
INT m_GroupType;
};
/////////////////////////////////////////////////////////////////////////////
// CDSCookieInfoConnection : extra info for nTDSConnection objects
class CDSCookieInfoConnection : public CDSCookieInfoBase
{
public:
CDSCookieInfoConnection()
{
m_class = connection;
m_nOptions = 0;
m_fFRSConnection = FALSE;
}
CString m_strFRSComputerReference; // not always present
int m_nOptions;
BOOL m_fFRSConnection;
};
/////////////////////////////////////////////////////////////////////////////
// CDSCookie
// CODEWORK these flags come from ntdsa.h
/* Object Class independent bits */
// NOTE: These flags MAY have different behaviour in different NCs.
// For example, the FLAG_CONFIG_foo flags only have meaning inside the
// configuration NC. the FLAG_DOMAIN_foo flags have meaning only outside the
// configuration NC.
#define FLAG_DISALLOW_DELETE 0x80000000
#define FLAG_CONFIG_ALLOW_RENAME 0x40000000
#define FLAG_CONFIG_ALLOW_MOVE 0x20000000
#define FLAG_CONFIG_ALLOW_LIMITED_MOVE 0x10000000
#define FLAG_DOMAIN_DISALLOW_RENAME 0x08000000
#define FLAG_DOMAIN_DISALLOW_MOVE 0x04000000
// Bit flags for options attribute on NTDS-Connection objects.
#define NTDSCONN_OPT_IS_GENERATED ( 1 << 0 ) /* object generated by DS, not admin */
/* Object Class specific bits, by object class */
/* CrossReference objects */
#define FLAG_CR_NTDS_NC 0x00000001 // NC is in NTDS (not VC or foreign)
#define FLAG_CR_NTDS_DOMAIN 0x00000002 // NC is a domain (not non-domain NC)
// end of ntdsa.h
class CDSCookie : public CNodeData
{
public:
CDSCookie();
virtual ~CDSCookie();
//operators
public:
// values retrieved from the cache item (per class values)
int GetImage(BOOL bOpen); // base and DS
GUID* GetGUID(); // base and DS
LPCWSTR GetClass();
LPCWSTR GetLocalizedClassName();
// Value management functions
void SetName(LPCWSTR lpszName) { m_strName = lpszName;}
LPCWSTR GetName() { return m_strName; }
void SetPath(LPCWSTR lpszPath) { m_strPath = lpszPath;}
LPCWSTR GetPath(void) { return m_strPath;}
void SetSystemFlags(int iSystemFlags) { m_iSystemFlags=iSystemFlags;}
int GetSystemFlags(void) { return m_iSystemFlags; }
void SetDesc(LPCWSTR lpszDesc) { m_strDesc = lpszDesc;}
LPCWSTR GetDesc() { return m_strDesc; }
void SetCacheItem(CDSClassCacheItemBase* pCacheItem)
{
ASSERT(pCacheItem != NULL);
m_pCacheItem = pCacheItem;
}
void SetChildList(WCHAR **ppList);
WCHAR ** GetChildList(void) { return m_ppChildList; }
void SetChildCount(int cChildCount) { m_cChildCount=cChildCount;}
int GetChildCount(void) { return m_cChildCount; }
LPCWSTR GetChildListEntry(int iChildIndex)
{
ASSERT(iChildIndex >= 0 && iChildIndex < GetChildCount());
return m_ppChildList[iChildIndex];
}
BOOL IsDisabled() { return m_bDisabled; }
void SetDisabled() { m_bDisabled=TRUE; }
void ReSetDisabled() { m_bDisabled=FALSE; }
BOOL IsNonExpiringPwd() { return m_bNonExpiringPassword; }
void SetNonExpiringPwd() { m_bNonExpiringPassword = TRUE; }
void ReSetNonExpiringPwd() { m_bNonExpiringPassword = FALSE; }
BOOL IsContainerClass()
{
if (m_pCacheItem == NULL)
{
ASSERT(FALSE); // should never happen
return TRUE;
}
// ask the class cache item about it
return m_pCacheItem->IsContainer();
}
CDSCookieInfoBase* GetExtraInfo() { return m_pExtraInfo;}
void SetExtraInfo(CDSCookieInfoBase* pExtraInfo)
{
ASSERT(pExtraInfo != NULL);
if (m_pExtraInfo != NULL)
delete m_pExtraInfo;
m_pExtraInfo = pExtraInfo;
}
CStringList& GetParentClassSpecificStrings(void)
{ return m_strlistParentClassSpecificStrings; }
SYSTEMTIME* GetModifiedTime() { return m_pModifiedTime; }
void SetModifiedTime(SYSTEMTIME* pModifiedTime)
{
if (m_pModifiedTime == NULL)
{
m_pModifiedTime = (SYSTEMTIME*)malloc(sizeof(SYSTEMTIME));
}
if (m_pModifiedTime != NULL)
{
memcpy(m_pModifiedTime, pModifiedTime, sizeof(SYSTEMTIME));
}
}
//attributes
private:
CString m_strName;
CString m_strPath;
int m_iSystemFlags; // systemFlags of the node
CString m_strDesc;
WCHAR **m_ppChildList; // list of allowable child classes
int m_cChildCount; // count of items in above list
BOOL m_bDisabled; // only valid if class is sec. princ.
BOOL m_bNonExpiringPassword; // only valid if class is sec. princ.
// We enumerate additional attributes depending on the class of the parent.
CStringList m_strlistParentClassSpecificStrings;
SYSTEMTIME* m_pModifiedTime;
CDSClassCacheItemBase* m_pCacheItem;
CDSCookieInfoBase* m_pExtraInfo;
};
/////////////////////////////////////////////////////////////////////////////
// CDSUINode : UI node corresponding to a DS object (result of an ADSI query)
class CDSUINode : public CUINode
{
public:
CDSUINode(CUINode* pParentNode);
// override of pure virtual functions
virtual void SetName(LPCWSTR lpszName) { GetCookie()->SetName(lpszName);}
virtual LPCWSTR GetName() { return GetCookie()->GetName();}
virtual void SetDesc(LPCWSTR lpszDesc) { GetCookie()->SetDesc(lpszDesc);}
virtual LPCWSTR GetDesc() { return GetCookie()->GetDesc();}
int GetImage(BOOL bOpen) { return GetCookie()->GetImage(bOpen);}
virtual GUID* GetGUID() { return GetCookie()->GetGUID();}
virtual LPCWSTR GetDisplayString(int nCol, CDSColumnSet* pColumnSet);
CDSCookie* GetCookie()
{
// assume that the cast succeeds
CDSCookie* pCookie = dynamic_cast<CDSCookie*>(m_pNodeData);
ASSERT(pCookie != NULL);
return pCookie;
}
void SetCookie(CDSCookie* pCookie)
{
ASSERT(m_pNodeData == NULL);
m_pNodeData = pCookie;
}
// end port
virtual CDSColumnSet* GetColumnSet(CDSComponentData* pComponentData);
//
// These set the state of the standard context menu items
//
virtual BOOL IsDeleteAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual BOOL IsRenameAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual BOOL IsRefreshAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual BOOL ArePropertiesAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual BOOL IsCutAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual BOOL IsCopyAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual BOOL IsPasteAllowed(CDSComponentData* pComponentData, BOOL* pbHide);
virtual CContextMenuVerbs* GetContextMenuVerbsObject(CDSComponentData* pComponentData);
virtual BOOL HasPropertyPages(LPDATAOBJECT pDataObject);
};
// REVIEW_MARCOC_PORT: this is just to get going, cannot assume this ever
inline CDSCookie* GetDSCookieFromUINode(CUINode* pUINode)
{
ASSERT(pUINode != NULL);
CDSUINode* pDSUINode = dynamic_cast<CDSUINode*>(pUINode);
ASSERT(pDSUINode != NULL);
return pDSUINode->GetCookie();
}
/////////////////////////////////////////////////////////////////////////////
// CDSThreadQueryInfo
typedef enum DSQueryType { unk, rootFolder, dsFolder, queryFolder };
class CDSThreadQueryInfo : public CThreadQueryInfo
{
public:
CDSThreadQueryInfo()
{
m_bOneLevel = TRUE;
m_QueryType = unk;
}
void SetQueryDSQueryParameters(DSQueryType QueryType,
LPCWSTR lpszPath,
LPCWSTR lpszClass,
LPCWSTR lpszQueryString,
UINT nMaxItemCount,
BOOL bOneLevel,
LPCWSTR lpszColumnSetID)
{
ASSERT(m_QueryType == unk);
ASSERT(QueryType != unk);
m_QueryType = QueryType;
SetMaxItemCount(nMaxItemCount);
m_szPath = lpszPath;
m_szClass = lpszClass;
m_szQueryString = lpszQueryString;
m_bOneLevel = bOneLevel;
m_szColumnSetID = lpszColumnSetID;
}
BOOL IsOneLevel() { return m_bOneLevel;}
DSQueryType GetType() { return m_QueryType;}
LPCWSTR GetPath() { return m_szPath;}
LPCWSTR GetClass() { return m_szClass;}
LPCWSTR GetQueryString() { return m_szQueryString;}
LPCWSTR GetColumnSetID() { return m_szColumnSetID;}
private:
BOOL m_bOneLevel;
DSQueryType m_QueryType;
CString m_szPath;
CString m_szClass;
CString m_szQueryString;
CString m_szColumnSetID;
};
/////////////////////////////////////////////////////////////////////////////
// CThreadQueryResult
class CThreadQueryResult
{
public:
CThreadQueryResult()
{
m_hr = S_OK;
m_bOwnMemory = TRUE;
}
~CThreadQueryResult()
{
if (m_bOwnMemory)
{
while (!m_nodeList.IsEmpty())
delete m_nodeList.RemoveHead();
}
}
CUINodeList m_nodeList;
HRESULT m_hr;
BOOL m_bOwnMemory;
};
#endif //__DSCOOKIE_H__