//+---------------------------------------------------------------------------- // // Windows NT Directory Service Property Pages // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1999 // // File: group.h // // Contents: DS object property pages class header // // Classes: CDsPropPagesHost, CDsPropPagesHostCF, CDsTableDrivenPage // // History: 21-March-97 EricB created // //----------------------------------------------------------------------------- #ifndef _GROUP_H_ #define _GROUP_H_ #include "proppage.h" #include "pages.h" #include "objlist.h" #include #include "objselp.h" HRESULT CreateGroupMembersPage(PDSPAGE pDsPage, LPDATAOBJECT pDataObj, PWSTR pwzADsPath, PWSTR pwzClass, HWND hNotifyObj, DWORD dwFlags, const CDSSmartBasePathsInfo& basePathsInfo, HPROPSHEETPAGE * phPage); HRESULT CreateGroupGenObjPage(PDSPAGE pDsPage, LPDATAOBJECT pDataObj, PWSTR pwzADsPath, PWSTR pwzClass, HWND hNotifyObj, DWORD dwFlags, const CDSSmartBasePathsInfo& basePathsInfo, HPROPSHEETPAGE * phPage); HRESULT CreateGrpShlGenPage(PDSPAGE pDsPage, LPDATAOBJECT pDataObj, PWSTR pwzADsPath, PWSTR pwzClass, HWND hNotifyObj, DWORD dwFlags, const CDSSmartBasePathsInfo& basePathsInfo, HPROPSHEETPAGE * phPage); HRESULT GetDomainMode(CDsPropPageBase * pObj, PBOOL pfMixed); HRESULT GetDomainMode(PWSTR pwzDomain, HWND hWnd, PBOOL pfMixed); HRESULT GetGroupType(CDsPropPageBase * pObj, DWORD * pdwType); //+---------------------------------------------------------------------------- // // Class: CDsGroupGenObjPage // // Purpose: property page object class for the general page of the // group object. // //----------------------------------------------------------------------------- class CDsGroupGenObjPage : public CDsPropPageBase { public: #ifdef _DEBUG char szClass[32]; #endif CDsGroupGenObjPage(PDSPAGE pDsPage, LPDATAOBJECT pDataObj, HWND hNotifyObj, DWORD dwFlags); ~CDsGroupGenObjPage(void); // // Instance specific wind proc // INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); private: HRESULT OnInitDialog(LPARAM lParam); LRESULT OnApply(void); LRESULT OnCommand(int id, HWND hwndCtl, UINT codeNotify); LRESULT OnNotify(WPARAM wParam, LPARAM lParam); void OnQuerySiblings(WPARAM wParam, LPARAM lParam); void OnAttrChanged(WPARAM wParam); LRESULT OnDestroy(void); void SetGroupTypeButtons(); HRESULT IsSpecialAccount(bool& fIsSpecialAccount); CDsIconCtrl * m_pCIcon; BOOL m_fMixed; // Domain is in mixed mode DWORD m_dwType; BOOL m_fTypeWritable; BOOL m_fDescrWritable; BOOL m_fSamNameWritable; BOOL m_fEmailWritable; BOOL m_fCommentWritable; BOOL m_fTypeDirty; BOOL m_fDescrDirty; BOOL m_fSamNameDirty; BOOL m_fEmailDirty; BOOL m_fCommentDirty; }; HRESULT FillGroupList(CDsPropPageBase * pPage, CDsMembershipList * pList, DWORD dwGroupRID); HRESULT GetRealDN(CDsPropPageBase * pPage, CMemberListItem * pItem); HRESULT FindFPO(PSID pSid, PWSTR pwzDomain, CStrW & strFPODN); //+---------------------------------------------------------------------------- // // CMemberDomainMode helper classes // //----------------------------------------------------------------------------- class CMMMemberListItem : public CDLink { public: CMMMemberListItem(void) {}; ~CMMMemberListItem(void) {}; // CDLink method overrides: CMMMemberListItem * Next(void) {return (CMMMemberListItem *)CDLink::Next();}; CStr m_strName; }; class CMMMemberList { public: CMMMemberList(void) : m_pListHead(NULL) {}; ~CMMMemberList(void) {Clear();}; HRESULT Insert(LPCTSTR ptzName); void GetList(CStr & strList); void Clear(void); private: CMMMemberListItem * m_pListHead; }; class CDomainModeListItem : public CDLink { public: CDomainModeListItem(void) : m_fMixed(FALSE) {}; ~CDomainModeListItem(void) {}; // CDLink method overrides: CDomainModeListItem * Next(void) {return (CDomainModeListItem *)CDLink::Next();}; CStrW m_strName; BOOL m_fMixed; }; class CDomainModeList { public: CDomainModeList(void) : m_pListHead(NULL) {}; ~CDomainModeList(void); HRESULT Insert(PWSTR pwzName, BOOL fMixed); BOOL Find(LPCWSTR pwzDomain, PBOOL pfMixed); private: CDomainModeListItem * m_pListHead; }; //+---------------------------------------------------------------------------- // // Class: CMemberDomainMode // // Purpose: Maintains a list of all domains in the enterprise from which // members have been added along with those domains' mode. Keeps // a second list of members who have been added from mixed-mode // domains. // //----------------------------------------------------------------------------- class CMemberDomainMode { public: CMemberDomainMode(void) {}; ~CMemberDomainMode(void) {}; void Init(CDsPropPageBase * pPage); HRESULT CheckMember(PWSTR pwzMemberDN); HRESULT ListExternalMembers(CStr & strList); private: CDomainModeList m_DomainList; CMMMemberList m_MemberList; CDsPropPageBase * m_pPage; }; //+---------------------------------------------------------------------------- // // Class: CDsSelectionListWrapper // // Purpose: A wrapper class for the DS_SELECTION_LIST that maintains a // linked list of DS_SELECTION items and can make a DS_SELECTION_LIST // from that list // //----------------------------------------------------------------------------- class CDsSelectionListWrapper { public: CDsSelectionListWrapper() : m_pNext(NULL), m_pSelection(NULL) {} ~CDsSelectionListWrapper() {} CDsSelectionListWrapper* m_pNext; PDS_SELECTION m_pSelection; static PDS_SELECTION_LIST CreateSelectionList(CDsSelectionListWrapper* pHead); static UINT GetCount(CDsSelectionListWrapper* pHead); static void DetachItemsAndDeleteList(CDsSelectionListWrapper* pHead); }; //+---------------------------------------------------------------------------- // // Class: CDsGrpMembersPage // // Purpose: Property page object class for the group object's membership // page. // //----------------------------------------------------------------------------- class CDsGrpMembersPage : public CDsPropPageBase, public ICustomizeDsBrowser { public: #ifdef _DEBUG char szClass[32]; #endif CDsGrpMembersPage(PDSPAGE pDsPage, LPDATAOBJECT pDataObj, HWND hNotifyObj, DWORD dwFlags); ~CDsGrpMembersPage(void); // // IUknown methods // STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObject); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); // // ICustomizeDsBrowser methods // STDMETHOD(Initialize)(THIS_ HWND hwnd, PCDSOP_INIT_INFO pInitInfo, IBindHelper *pBindHelper); STDMETHOD(GetQueryInfoByScope)(THIS_ IDsObjectPickerScope *pDsScope, PDSQUERYINFO *ppdsqi); STDMETHOD(AddObjects)(THIS_ IDsObjectPickerScope *pDsScope, IDataObject **ppdo); STDMETHOD(ApproveObjects)(THIS_ IDsObjectPickerScope*, IDataObject*, PBOOL) { return S_OK; } // Approve everything STDMETHOD(PrefixSearch)(THIS_ IDsObjectPickerScope *pDsScope, PCWSTR pwzSearchFor, IDataObject **pdo); STDMETHOD_(PSID, LookupDownlevelName)(THIS_ PCWSTR) { return NULL; } // // Instance specific wind proc // INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL m_fShowIcons; protected: HRESULT OnInitDialog(LPARAM lParam); HRESULT OnInitDialog(LPARAM lParam, BOOL fShowIcons); LRESULT OnApply(void); virtual LRESULT OnCommand(int id, HWND hwndCtl, UINT codeNotify); LRESULT OnNotify(WPARAM wParam, LPARAM lParam); LRESULT OnDestroy(void); private: void InvokeUserQuery(void); void RemoveMember(void); HRESULT FillGroupList(void); HRESULT GetRealDN(CMemberListItem * pDelItem); HRESULT LoadGroupExtraClasses(BOOL bSecurity); HRESULT BuildQueryString(PWSTR* ppszFilterString); HRESULT CollectDsObjects(PWSTR pszFilter, IDsObjectPickerScope *pDsScope, CDsPropDataObj *pdo); PWSTR* m_pszSecurityGroupExtraClasses; DWORD m_dwSecurityGroupExtraClassesCount; PWSTR* m_pszNonSecurityGroupExtraClasses; DWORD m_dwNonSecurityGroupExtraClassesCount; HWND m_hwndObjPicker; PCDSOP_INIT_INFO m_pInitInfo; CComPtr m_pBinder; protected: CDsMembershipList * m_pList; CMemberLinkList m_DelList; DWORD m_dwGroupRID; BOOL m_fMixed; // Domain is in mixed mode DWORD m_dwType; BOOL m_fMemberWritable; CMemberDomainMode m_MixedModeMembers; }; //+---------------------------------------------------------------------------- // // Class: CDsGrpShlGenPage // // Purpose: Property page object class for the group object's shell general // page which includes membership manipulation which is gained by // subclassing CDsGrpMembersPage. // //----------------------------------------------------------------------------- class CDsGrpShlGenPage : public CDsGrpMembersPage { public: #ifdef _DEBUG char szClass[32]; #endif CDsGrpShlGenPage(PDSPAGE pDsPage, LPDATAOBJECT pDataObj, HWND hNotifyObj, DWORD dwFlags); ~CDsGrpShlGenPage(void); private: HRESULT OnInitDialog(LPARAM lParam); LRESULT OnCommand(int id, HWND hwndCtl, UINT codeNotify); LRESULT OnApply(void); LRESULT OnDestroy(void); #if !defined(DSADMIN) void MakeNotWritable() { m_fMemberWritable = FALSE; m_fDescrWritable = FALSE;} #endif CDsIconCtrl * m_pCIcon; BOOL m_fDescrWritable; BOOL m_fDescrDirty; }; #endif // _GROUP_H_