//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000 - 2001. // // File: util.h // // Contents: // // History: 07-26-2001 Hiteshr Created // //---------------------------------------------------------------------------- // //Action items are used to for list controls which manage membership of //core properties. For ex: membership of group. Items can be //deleted and added from listbox at any time, but they are added to core //object only when apply button is pressed. Action item keeps track of action //to do on each item on Apply. // enum ACTION { ACTION_NONE, ACTION_ADD, ACTION_REMOVE, ACTION_REMOVED, }; struct ActionItem { ActionItem(CBaseAz* pBaseAz): m_pMemberAz(pBaseAz), action(ACTION_NONE) {} ~ActionItem() { if(m_pMemberAz) delete m_pMemberAz; } CBaseAz* m_pMemberAz; ACTION action; }; typedef multimap ActionMap; VOID RemoveItemsFromActionMap(ActionMap& map); //+---------------------------------------------------------------------------- // Function: IsValidStoreType // Synopsis: Validates Store Type //----------------------------------------------------------------------------- BOOL IsValidStoreType(ULONG lStoreType); //+---------------------------------------------------------------------------- // Function: ValidateStoreTypeAndName // Synopsis: Validates the user entered AD Store Name // Arguments: strName: User entered store name to verify // Returns: TRUE if name is valid else false //----------------------------------------------------------------------------- BOOL ValidateStoreTypeAndName(IN HWND hWnd, IN LONG ulStoreType, IN const CString& strName); //+---------------------------------------------------------------------------- // Function: NameToFormatStoreName // Synopsis: Converts user entered name to format which core understands // Arguments: ulStoreType: Type of store // strName: User entered store name // bUseLDAP:use LDAP string to format AD name instead msldap // strFormalName: gets the output ldap name //----------------------------------------------------------------------------- void NameToStoreName(IN LONG ulStoreType, IN const CString& strName, IN BOOL bUseLDAP, OUT CString& strFormalName); //+---------------------------------------------------------------------------- // Function: AddColumnToListView // Synopsis: Add Columns to Listview and set column width according to // percentage specified in the COL_FOR_LV // Arguments:IN pListCtrl: ListCtrl pointer // IN pColForLV: Column Infomration Array // // Returns: //----------------------------------------------------------------------------- VOID AddColumnToListView(IN CListCtrl* pListCtrl, IN COL_FOR_LV* pColForLV); //+---------------------------------------------------------------------------- // Function: BaseAzInListCtrl // Synopsis: Checks if Object of type eObjectTypeAz named strName is // in the Listview. If its present, returns // its index else returns -1. // Arguments:IN pListCtrl: ListCtrl pointer // IN strName: string to search for // IN eObjectTypeAz Compare the object of this type only // // Returns: If its present, returns its index else returns -1 //----------------------------------------------------------------------------- int BaseAzInListCtrl(IN CListCtrl* pListCtrl, IN const CString& strName, IN OBJECT_TYPE_AZ eObjectTypeAz); //+---------------------------------------------------------------------------- // Function: AddBaseAzFromListToListCtrl // Synopsis: Take the items from List and Add them to ListCtrl. Doesn't // add the items which are already in ListCtrl // Arguments:listBaseAz: List of items // pListCtrl: ListControl Pointer // uiFlags : Column Info // bCheckDuplicate: Check for duplicate items // Returns: The index of the new item if it is successful; otherwise, -1 // NOTE: Function assume the Order of column is Name, Type and Description //----------------------------------------------------------------------------- void AddBaseAzFromListToListCtrl(IN CList& listBaseAz, IN CListCtrl* pListCtrl, IN UINT uiFlags, IN BOOL bCheckDuplicate); //+---------------------------------------------------------------------------- // Function: AddActionItemFromListToListCtrl // Synopsis: Take the Actions items from List and Add them to ListCtrl. // Arguments:listBaseAz: List of items // pListCtrl: ListControl Pointer // uiFlags : Column Info // bCheckDuplicate: Check for duplicate items // Returns: The index of the new item if it is successful; otherwise, -1 // NOTE: Function assume the Order of column is Name, Type and Description //----------------------------------------------------------------------------- void AddActionItemFromListToListCtrl(IN CList& listActionItem, IN CListCtrl* pListCtrl, IN UINT uiFlags, IN BOOL bCheckDuplicate); //+---------------------------------------------------------------------------- // Function: AddActionItemFromMapToListCtrl // Synopsis: Take the Actions items from Map and Add them to ListCtrl. // Arguments:listBaseAz: List of items // pListCtrl: ListControl Pointer // uiFlags : Column Info // bCheckDuplicate: Check for duplicate items // Returns: The index of the new item if it is successful; otherwise, -1 // NOTE: Function assume the Order of column is Name, Type and Description //----------------------------------------------------------------------------- void AddActionItemFromMapToListCtrl(IN ActionMap& mapActionItem, IN CListCtrl* pListCtrl, IN UINT uiFlags, IN BOOL bCheckDuplicate); //+---------------------------------------------------------------------------- // Function: AddActionItemToListCtrl // Synopsis: Adds a new item to ListCtrl. // Arguments:pListCtrl: ListControl Pointer // iIndex: Index at which to Add // pActionItem: Item to add // uiFlags: column info // Returns: The index of the new item if it is successful; otherwise, -1 //----------------------------------------------------------------------------- int AddActionItemToListCtrl(IN CListCtrl* pListCtrl, IN int iIndex, IN ActionItem* pActionItem, IN UINT uiFlags); //+---------------------------------------------------------------------------- // Function: AddBaseAzToListCtrl // Synopsis: Adds a new item to ListCtrl. // Arguments:pListCtrl: ListControl Pointer // iIndex: Index at which to Add // pBaseAz: Item to add // uiFlags: column info // Returns: The index of the new item if it is successful; otherwise, -1 //----------------------------------------------------------------------------- int AddBaseAzToListCtrl(IN CListCtrl* pListCtrl, IN int iIndex, IN CBaseAz* pBaseAz, IN UINT uiFlags); //+---------------------------------------------------------------------------- // Function: EnableButtonIfSelectedInListCtrl // Synopsis: Enables the button if something is selected in Listctrl // Arguments: // Returns: TRUE if Enabled the button, FALSE if didn't. //----------------------------------------------------------------------------- BOOL EnableButtonIfSelectedInListCtrl(IN CListCtrl * pListCtrl, IN CButton* pButton); //+---------------------------------------------------------------------------- // Function: DeleteSelectedRows // Synopsis: Deletes the selected rows //----------------------------------------------------------------------------- void DeleteSelectedRows(IN CListCtrl* pListCtrl); //+---------------------------------------------------------------------------- // Function: SelectListCtrlItem // Synopsis: Select the item in List Ctrl and mark it visible // Arguments: // Returns: //----------------------------------------------------------------------------- void SelectListCtrlItem(IN CListCtrl* pListCtrl, IN int iSelected); //+---------------------------------------------------------------------------- // Synopsis: Empties the list and calls delete on items in list //----------------------------------------------------------------------------- template VOID RemoveItemsFromList(IN CList& list, BOOL bLocalFree = FALSE) { while(!list.IsEmpty()) { if(bLocalFree) LocalFree(list.RemoveTail()); else delete list.RemoveTail(); } } template VOID EmptyList(IN CList& list) { while(!list.IsEmpty()) list.RemoveTail(); } //+---------------------------------------------------------------------------- // Synopsis: Gets long value from Edit box // Returns: FALSE if edit box is empty. Assumes only numeric can be entered // in edit box //----------------------------------------------------------------------------- BOOL GetLongValue(CEdit& refEdit, LONG& reflValue, HWND hWnd = NULL); //+---------------------------------------------------------------------------- // Synopsis: Sets long value in Edit box // Returns: //----------------------------------------------------------------------------- VOID SetLongValue(CEdit* pEdit, LONG lValue); //+---------------------------------------------------------------------------- // Synopsis: Converts a sid in binary format to a sid in string format //----------------------------------------------------------------------------- BOOL ConvertSidToStringSid(IN PSID Sid, OUT CString* pstrSid); //+---------------------------------------------------------------------------- // Synopsis: Converts a sid in string format to sid in binary format //----------------------------------------------------------------------------- BOOL ConvertStringSidToSid(IN const CString& strSid, OUT PSID *ppSid); //+---------------------------------------------------------------------------- // Function:GetStringSidFromSidCachecAz // Synopsis:Gets the string sid from CSidCacheAz object //----------------------------------------------------------------------------- BOOL GetStringSidFromSidCachecAz(CBaseAz* pBaseAz, CString* pstrStringSid); //+---------------------------------------------------------------------------- // Function: AddBaseAzItemsFromListCtrlToList // Synopsis: Add items from ListCtrl to List //----------------------------------------------------------------------------- VOID AddBaseAzItemsFromListCtrlToList(IN CListCtrl* pListCtrl, OUT CList& listBaseAz); //+---------------------------------------------------------------------------- // Function:GetFileName // Synopsis:Displays FileOpen dialog box and return file selected by user // Arguments:hwndOwner : owner window // bOpen: File must exist // nIDTitle : title of open dialog box // pszFilter : filter // strFileName : gets selected file name // //----------------------------------------------------------------------------- BOOL GetFileName(IN HWND hwndOwner, IN BOOL bOpen, IN int nIDTitle, IN const CString& strInitFolderPath, IN LPCTSTR pszFilter, CString& strFileName); template class AddChildNodes { public: static HRESULT DoEnum(IN CList& listAzChildObject, IN CBaseContainerNode* pContainerNode) { HRESULT hr = S_OK; POSITION pos = listAzChildObject.GetHeadPosition(); for (int i=0;i < listAzChildObject.GetCount();i++) { CObjectAz* pObjectAz= dynamic_cast(listAzChildObject.GetNext(pos)); if(pObjectAz) { //Create Container/Leaf Node corresponding to CObjectAz CObjectAzNode* pObjectAzNode = new CObjectAzNode(pContainerNode->GetComponentDataObject(), pContainerNode->GetAdminManagerNode(), pObjectAz); if(!pObjectAzNode) { hr = E_OUTOFMEMORY; DBG_OUT_HRESULT(hr); break; } VERIFY(pContainerNode->AddChildToList(pObjectAzNode)); } else { ASSERT(FALSE); hr = E_UNEXPECTED; break; } } return hr; } }; typedef AddChildNodes ADD_APPLICATION_FUNCTION; typedef AddChildNodes ADD_SCOPE_FUNCTION; typedef AddChildNodes ADD_ROLE_FUNCTION; typedef AddChildNodes ADD_OPERATION_FUNCTION; typedef AddChildNodes ADD_TASK_FUNCTION; typedef AddChildNodes ADD_GROUP_FUNCTION; //+---------------------------------------------------------------------------- // Function: AddAzObjectNodesToList // Synopsis: Adds the nodes for object of type eObjectType to the Container // node. // Arguments:IN eObjectType: Type of object // IN listAzChildObject: List of objects to be added // IN pContainerNode: Container in snapin to which new nodes will // be added. // Returns: //----------------------------------------------------------------------------- HRESULT AddAzObjectNodesToList(IN OBJECT_TYPE_AZ eObjectType, IN CList& listAzChildObject, IN CBaseContainerNode* pContainerNode); //////////////////////////////////////////////////////////////////////////////////// // Theme support class CThemeContextActivator { public: CThemeContextActivator() : m_ulActivationCookie(0) { SHActivateContext (&m_ulActivationCookie); } ~CThemeContextActivator() { SHDeactivateContext (m_ulActivationCookie); } private: ULONG_PTR m_ulActivationCookie; }; // //Error Handling // VOID vFormatString(CString &strOutput, UINT nIDPrompt, va_list *pargs); VOID FormatString(CString &strOutput, UINT nIDPrompt, ...); int DisplayMessageBox(HWND hWnd, const CString& strMessage, UINT uStyle); VOID GetSystemError(CString &strOutput, DWORD dwErr); void DisplayError(HWND hWnd, UINT nIDPrompt, ...); void DisplayInformation(HWND hWnd, UINT nIDPrompt, ...); int DisplayConfirmation(HWND hwnd, UINT nIDPrompt, ...); void DisplayWarning(HWND hWnd, UINT nIDPrompt, ...); BOOL IsDeleteConfirmed(HWND hwndOwner, CBaseAz& refBaseAz); // //This struct maps the common error messages for each object type // struct ErrorMap { OBJECT_TYPE_AZ eObjectType; UINT idObjectType; UINT idNameAlreadyExist; UINT idInvalidName; LPWSTR pszInvalidChars; }; ErrorMap *GetErrorMap(OBJECT_TYPE_AZ eObjectType); //+---------------------------------------------------------------------------- // Function: GetLSAConnection // Synopsis: Wrapper for LsaOpenPolicy //----------------------------------------------------------------------------- LSA_HANDLE GetLSAConnection(IN const CString& strServer, IN DWORD dwAccessDesired); //+---------------------------------------------------------------------------- // Function:CompareBaseAzObjects // Synopsis:Compares two baseaz objects for equivalance. If two pAzA and pAzB // are two different instances of same coreaz object, they are equal //----------------------------------------------------------------------------- BOOL CompareBaseAzObjects(CBaseAz* pAzA, CBaseAz* pAzB); //+---------------------------------------------------------------------------- // Function: OpenCreateAdminManager // Synopsis: Open an existing an existing Authorization Store or // creates a new Authorization Store and adds corresponding // AdminManager object to snapin // Arguments:IN hWnd: Handle of window for dialog box // IN bNew: If True create a new Authz store else open existing // one // IN bOpenFromSavedConsole: This is valid when bNew is False. // True if open is in resopnse to a console file. // IN lStoreType: XML or AD // IN strName: Name of store // IN strDesc: Description. Only valid in case of new // IN strScriptDir : Script directory // IN pRootData: Snapin Rootdata // IN pComponentData: ComponentData // Returns: //----------------------------------------------------------------------------- HRESULT OpenCreateAdminManager(IN BOOL bNew, IN BOOL bOpenFromSavedConsole, IN ULONG lStoreType, IN const CString& strStoreName, IN const CString& strDesc, IN const CString& strScriptDir, IN CRootData* pRootData, IN CComponentDataObject* pComponentData); //+---------------------------------------------------------------------------- // Function: OpenAdminManager // Synopsis: Open an existing an existing Authorization Store adds // corresponding adminManager object to snapin // Arguments:IN hWnd: Handle of window for dialog box // IN bOpenFromSavedConsole: True if open is in resopnse to a console // file. // IN lStoreType: XML or AD // IN strName: Name of store // IN strScriptDir : Script directory // IN pRootData: Snapin Rootdata // IN pComponentData: ComponentData // Returns: //----------------------------------------------------------------------------- HRESULT OpenAdminManager(IN HWND hWnd, IN BOOL bOpenFromSavedConsole, IN ULONG lStoreType, IN const CString& strStoreName, IN const CString& strStoreDir, IN CRootData* pRootData, IN CComponentDataObject* pComponentData); //+---------------------------------------------------------------------------- // Function:GetADContainerPath // Synopsis:Displays a dialog box to allow for selecting a AD container //----------------------------------------------------------------------------- BOOL GetADContainerPath(HWND hWndOwner, ULONG nIDCaption, ULONG nIDTitle, CString& strPath, CADInfo& refAdInfo); BOOL FindDialogContextTopic(/*IN*/UINT nDialogID, /*IN*/DWORD_PTR* pMap); //+---------------------------------------------------------------------------- // Function:CanReadOneProperty // Synopsis:Function tries to read IsWriteable property. If that fails displays // an error message. This is used before adding property pages. // if we cannot read IsWritable property,thereisn't much hope. //----------------------------------------------------------------------------- BOOL CanReadOneProperty(LPCWSTR pszName, CBaseAz* pBaseAz); struct CompareInfo { BOOL bActionItem; UINT uiFlags; int iColumn; int iSortDirection; }; //+---------------------------------------------------------------------------- // Function: ListCompareProc // Synopsis: Comparison function used by list control //----------------------------------------------------------------------------- int CALLBACK ListCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); //+---------------------------------------------------------------------------- // Function:SortListControl // Synopsis:Sorts a list control // Arguments:pListCtrl: List control to sort // iColumnClicked: column clicked // iSortDirection: direction in which to sort // uiFlags: column info // bActionItem: if item in list is actionitem //----------------------------------------------------------------------------- void SortListControl(CListCtrl* pListCtrl, int ColumnClicked, int SortDirection, UINT uiFlags, BOOL bActionItem); //+---------------------------------------------------------------------------- // Synopsis: Ensures that selection in listview control is visible //----------------------------------------------------------------------------- void EnsureListViewSelectionIsVisible(CListCtrl *pListCtrl); //+---------------------------------------------------------------------------- // Synopsis:Convert input number in string format to long. if number is out // of range displays a message. //----------------------------------------------------------------------------- BOOL ConvertStringToLong(LPCWSTR pszInput, long &reflongOutput, HWND hWnd = NULL); VOID SetSel(CEdit& refEdit); void TrimWhiteSpace(CString& str); //+---------------------------------------------------------------------------- // Function:LoadIcons // Synopsis:Adds icons to imagelist //----------------------------------------------------------------------------- HRESULT LoadIcons(LPIMAGELIST pImageList); //+---------------------------------------------------------------------------- // Function: LoadImageList // Synopsis: Loads image list //----------------------------------------------------------------------------- HIMAGELIST LoadImageList(HINSTANCE hInstance, LPCTSTR pszBitmapID); //+---------------------------------------------------------------------------- // Function:BrowseAdStores // Synopsis:Displays a dialog box with list of AD stores available. // Arguments:strDN: Gets the selected ad store name //----------------------------------------------------------------------------- void BrowseAdStores(IN HWND hwndOwner, OUT CString& strDN, IN CADInfo& refAdInfo); //+---------------------------------------------------------------------------- // Function:GetFolderName // Synopsis:Displays Folder selection dialog box and return folder selected // by user // Arguments:hwndOwner : owner window // nIDTitle : title of dialog box // strInitBrowseRoot : location of the root folder from which to // start browsing // strFolderName : gets selected file name //----------------------------------------------------------------------------- BOOL GetFolderName(IN HWND hwndOwner, IN INT nIDTitle, IN const CString& strInitBrowseRoot, IN OUT CString& strFolderName); //+---------------------------------------------------------------------------- // Function: AddExtensionToFileName // Synopsis: Functions adds .xml extension to name of file if no extension // is present. // Arguments: // Returns: //----------------------------------------------------------------------------- VOID AddExtensionToFileName(IN OUT CString& strFileName); //+---------------------------------------------------------------------------- // Function:GetCurrentWorkingDirectory // Synopsis:Gets the current working directory //----------------------------------------------------------------------------- BOOL GetCurrentWorkingDirectory(IN OUT CString& strCWD); //+---------------------------------------------------------------------------- // Function: GetFileExtension // Synopsis: Get the extension of the file. //----------------------------------------------------------------------------- BOOL GetFileExtension(IN const CString& strFileName, OUT CString& strExtension); //+-------------------------------------------------------------------------- // Function: AzRoleAdsOpenObject // Synopsis: A wrapper around ADsOpenObject //+-------------------------------------------------------------------------- HRESULT AzRoleAdsOpenObject(LPWSTR lpszPathName, LPWSTR lpszUserName, LPWSTR lpszPassword, REFIID riid, VOID** ppObject, BOOL bBindToServer = FALSE); VOID GetDefaultADContainerPath(IN CADInfo& refAdInfo, IN BOOL bAddServer, IN BOOL bAddLdap, OUT CString& strPath); //+-------------------------------------------------------------------------- // Function: IsBizRuleWritable // Synopsis: Checks if bizrules are writable for this object //+-------------------------------------------------------------------------- BOOL IsBizRuleWritable(HWND hWnd, CContainerAz& refBaseAz); /****************************************************************************** Class: CCommandLineOptions Purpose:class for reading the command line options for console file ******************************************************************************/ class CCommandLineOptions { public: CCommandLineOptions():m_bInit(FALSE), m_bCommandLineSpecified(FALSE), m_lStoreType(AZ_ADMIN_STORE_INVALID) { } void Initialize(); const CString& GetStoreName() const { return m_strStoreName;} LONG GetStoreType() const { return m_lStoreType;} BOOL CommandLineOptionSpecified() const { return m_bCommandLineSpecified;} private: BOOL m_bInit; BOOL m_bCommandLineSpecified; CString m_strStoreName; LONG m_lStoreType; }; extern CCommandLineOptions commandLineOptions; //+---------------------------------------------------------------------------- // Function: GetDisplayNameFromStoreURL // Synopsis: Get the display name for the store. // Arguments: strPolicyURL: This is store url in msxml://filepath or // msldap://dn format. // strDisplayName: This gets the display name. For xml, display // name is name of file, for AD its name of leaf element // Returns: //----------------------------------------------------------------------------- void GetDisplayNameFromStoreURL(IN const CString& strPolicyURL, OUT CString& strDisplayName); void SetXMLStoreDirectory(IN CRoleRootData& roleRootData, IN const CString& strXMLStorePath); //+---------------------------------------------------------------------------- // Function: GetDirectoryFromPath // Synopsis: Removes the file name from the input file path and return // the folder path. For Ex: Input is C:\temp\foo.xml. Return // value will be C:\temp\ //----------------------------------------------------------------------------- CString GetDirectoryFromPath(IN const CString& strPath); //+---------------------------------------------------------------------------- // Function: ConvertToExpandedAndAbsolutePath // Synopsis: Expands the environment variables in the input path and also // makes it absolute if necessary. //----------------------------------------------------------------------------- void ConvertToExpandedAndAbsolutePath(IN OUT CString& strPath); //+---------------------------------------------------------------------------- // Function: PreprocessScript // Synopsis: Script is read from XML file and displayed multi line edit control. // End of line in the XML is indicated by LF instead of CRLF sequence, // however Edit Control requires CRLF sequence to format correctly and // with only LF it displays everything in a single line with a box for // LF char. This function checks if script uses LF for line termination // and changes it with CRLF sequence. //----------------------------------------------------------------------------- void PreprocessScript(CString& strScript);