windows-nt/Source/XPSP1/NT/admin/display/proppage/objlist.h
2020-09-26 16:20:57 +08:00

237 lines
8 KiB
C++

//+----------------------------------------------------------------------------
//
// Windows NT Directory Service Property Pages
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1999
//
// File: objlist.h
//
// Contents: DS object list object header
//
// Classes:
//
// History: 20-Nov-97 EricB created
//
//-----------------------------------------------------------------------------
#ifndef _OBJLIST_H_
#define _OBJLIST_H_
//#include <cdlink.hxx>
//+----------------------------------------------------------------------------
//
// Class: CMemberListItem
//
// Purpose: membership list data item.
//
//-----------------------------------------------------------------------------
class CMemberListItem : public CDLink
{
public:
CMemberListItem(void) : m_pwzDN(NULL), m_ptzName(NULL), m_pSid(NULL),
m_fSidSet(FALSE), m_fCanBePrimarySet(FALSE),
m_fCanBePrimary(FALSE), m_fIsPrimary(FALSE),
m_fIsAlreadyMember(FALSE), m_fIsExternal(FALSE),
m_ulScopeType(0) {};
~CMemberListItem(void) {DO_DEL(m_pwzDN);
DO_DEL(m_ptzName);
DO_DEL(m_pSid);};
// CDLink method overrides:
CMemberListItem * Next(void) {return (CMemberListItem *)CDLink::Next();};
CMemberListItem * Copy(void);
BOOL IsSidSet(void) {return m_fSidSet;};
BOOL IsCanBePrimarySet(void) {return m_fCanBePrimarySet;};
BOOL CanBePrimary(void) {return m_fCanBePrimary;};
void SetCanBePrimary(BOOL fCanBePrimary)
{
m_fCanBePrimary = fCanBePrimary;
m_fCanBePrimarySet = TRUE;
};
BOOL SetSid(PSID pSid);
PSID GetSid(void) {return m_pSid;};
BOOL IsPrimary(void) {return m_fIsPrimary;};
PWSTR m_pwzDN;
PTSTR m_ptzName;
PSID m_pSid;
ULONG m_ulScopeType;
BOOL m_fSidSet;
BOOL m_fCanBePrimarySet;
BOOL m_fCanBePrimary;
BOOL m_fIsPrimary;
BOOL m_fIsAlreadyMember;
BOOL m_fIsExternal; // member is from an external domain and is
// identified using the SID.
};
//+----------------------------------------------------------------------------
//
// Class: CMemberLinkList
//
// Purpose: Linked list of membership class objects.
//
//-----------------------------------------------------------------------------
class CMemberLinkList
{
public:
CMemberLinkList(void) : m_pListHead(NULL) {};
~CMemberLinkList(void);
CMemberListItem * FindItemRemove(PWSTR pwzDN);
CMemberListItem * FindItemRemove(PSID pSid);
CMemberListItem * RemoveFirstItem(void);
BOOL AddItem(CMemberListItem * pItem, BOOL fMember = TRUE);
int GetItemCount(void);
private:
CMemberListItem * m_pListHead;
};
const int IDX_NAME_COL = 0;
const int IDX_FOLDER_COL = 1;
const int IDX_ERROR_COL = 1;
const int OBJ_LIST_NAME_COL_WIDTH = 100;
const int OBJ_LIST_PAGE_COL_WIDTH = 72;
//+----------------------------------------------------------------------------
//
// Class: CDsObjList
//
// Purpose: Base class for DS object lists that employ a two column
// list view to show object Name and Folder.
//
//-----------------------------------------------------------------------------
class CDsObjList
{
public:
CDsObjList(HWND hPage, int idList);
~CDsObjList(void);
HRESULT Init(BOOL fShowIcons = FALSE);
HRESULT InsertIntoList(PTSTR ptzDisplayName, PVOID pData, int iIcon = -1);
HRESULT GetItem(int index, PTSTR * pptzName, PVOID * ppData);
BOOL GetCurListItem(int * pIndex, PTSTR * pptzName, PVOID * ppData);
BOOL GetCurListItems(int ** ppIndex, PTSTR ** ppptzName, PVOID ** pppData, int* pNumSelected);
virtual BOOL RemoveListItem(int Index);
int GetCount(void) {return ListView_GetItemCount(m_hList);};
UINT GetSelectedCount(void) { return ListView_GetSelectedCount(m_hList);}
virtual void ClearList(void) = 0;
protected:
HWND m_hPage;
HWND m_hList;
int m_idList;
int m_nCurItem;
BOOL m_fShowIcons;
BOOL m_fLimitExceeded;
};
void GetNameParts(const CStr& cstrCanonicalNameEx, CStr& cstrFolder, CStr & cstrName);
//+----------------------------------------------------------------------------
//
// Class: CDsMembershipList
//
// Purpose: Membership list class for the list-view control.
//
//-----------------------------------------------------------------------------
class CDsMembershipList : public CDsObjList
{
public:
CDsMembershipList(HWND hPage, int idList) : CDsObjList(hPage, idList) {};
~CDsMembershipList(void) {};
HRESULT InsertIntoList(PTSTR ptzDisplayName, PVOID pData, int iIcon = -1)
{return CDsObjList::InsertIntoList(ptzDisplayName, pData, iIcon);};
HRESULT InsertIntoList(PWSTR pwzPath, int iIcon = -1)
{return CDsMembershipList::InsertIntoList(pwzPath, iIcon, FALSE, FALSE,
FALSE, FALSE, 0);};
HRESULT InsertIntoNewList(PWSTR pwzPath, BOOL fPrimary = FALSE)
{return CDsMembershipList::InsertIntoList(pwzPath, -1, TRUE,
fPrimary, FALSE, TRUE, 0);};
HRESULT InsertIntoList(PWSTR pwzPath, int iIcon, BOOL fAlreadyMember, BOOL fPrimary,
BOOL fIgnoreDups, BOOL fDontChkDups, ULONG flScopeType);
HRESULT InsertIntoList(PSID pSid, PWSTR pwzPath);
HRESULT InsertIntoList(CMemberListItem * pItem);
HRESULT InsertExternalIntoList(PWSTR pwzPath, ULONG ulScopeType)
{return CDsMembershipList::InsertIntoList(pwzPath, -1, FALSE,
FALSE, FALSE,
FALSE, ulScopeType);};
HRESULT MergeIntoList(PWSTR pwzPath)
{return CDsMembershipList::InsertIntoList(pwzPath, -1, TRUE, FALSE, TRUE, FALSE, 0);};
HRESULT GetItem(int index, CMemberListItem ** ppData)
{return CDsObjList::GetItem(index, NULL, (PVOID *)ppData);};
BOOL GetCurListItem(int * pIndex, PTSTR * pptzName, CMemberListItem ** ppData)
{return CDsObjList::GetCurListItem(pIndex, pptzName, (PVOID *)ppData);};
BOOL GetCurListItems(int ** ppIndex, PTSTR ** ppptzName, CMemberListItem *** pppData, int* pNumSelected)
{return CDsObjList::GetCurListItems(ppIndex, ppptzName, (PVOID **)pppData, pNumSelected);};
int GetIndex(LPCWSTR pwzDN, ULONG ulStart, ULONG ulEnd);
BOOL RemoveListItem(int Index);
void ClearList(void);
HRESULT SetMemberIcons(CDsPropPageBase * pPage);
};
struct CLASS_CACHE_ENTRY
{
WCHAR wzClass[MAX_PATH];
int iIcon;
int iDisabledIcon;
};
#define ICON_CACHE_NUM_CLASSES 6
//+--------------------------------------------------------------------------
//
// Class: CClassIconCache
//
// Purpose: Build an image list for well known DS classes and map the
// image indices to the class names.
//
// Notes: CAUTION: the imagelist is destroyed in the dtor, therefore
// it should only be used with listview controls that have
// the LVS_SHAREIMAGELISTS style set.
//
//---------------------------------------------------------------------------
class CClassIconCache
{
public:
CClassIconCache(void);
~CClassIconCache(void);
int GetClassIconIndex(PCWSTR pwzClass, BOOL fDisabled = FALSE);
int AddClassIcon(PCWSTR pwzClass, BOOL fDisabled = FALSE);
HIMAGELIST GetImageList(void);
void ClearAll();
private:
HRESULT Initialize(void);
BOOL m_fInitialized;
CLASS_CACHE_ENTRY* m_prgcce;
UINT m_nImageCount;
HIMAGELIST m_hImageList;
};
extern CClassIconCache g_ClassIconCache;
#endif // _OBJLIST_H_