380 lines
9.9 KiB
C++
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__
|