#ifndef _INC_DSKQUOTA_UTILS_H #define _INC_DSKQUOTA_UTILS_H /////////////////////////////////////////////////////////////////////////////// /* File: utils.h Description: Header for general utilities module. It is expected that windows.h is included before this header. Revision History: Date Description Programmer -------- --------------------------------------------------- ---------- 06/06/96 Initial creation. BrianAu */ /////////////////////////////////////////////////////////////////////////////// #ifndef _INC_DSKQUOTA_PRIVATE_H # include "private.h" #endif // // Convert a value to a "bool". // Lower-case "boolify" is intentional to enforce relationship // to type "bool". // template inline bool boolify(const T& x) { return !!x; } template const T& MAX(const T& a, const T& b) { return a > b ? a : b; } template const T& MIN(const T& a, const T& b) { return a < b ? a : b; } template void SWAP(T& a, T& b) { T temp(a); a = b; b = temp; } // // Trivial class for ensuring window redraw is restored in the case // of an exception. // class CAutoSetRedraw { public: CAutoSetRedraw(HWND hwnd) : m_hwnd(hwnd) { } CAutoSetRedraw(HWND hwnd, bool bSet) : m_hwnd(hwnd) { Set(bSet); } ~CAutoSetRedraw(void) { Set(true); } void Set(bool bSet) { SendMessage(m_hwnd, WM_SETREDRAW, (WPARAM)bSet, 0); } private: HWND m_hwnd; }; // // Trivial class for ensuring window is enabled in the case // of an exception. // class CAutoWndEnable { public: CAutoWndEnable(HWND hwnd) : m_hwnd(hwnd) { } CAutoWndEnable(HWND hwnd, bool bEnable) : m_hwnd(hwnd) { Enable(bEnable); } ~CAutoWndEnable(void) { Enable(true); } void Enable(bool bEnable) { EnableWindow(m_hwnd, bEnable); } private: HWND m_hwnd; }; // // Ensure NT handles are exception safe. // class CNtHandle { public: CNtHandle(HANDLE handle) : m_handle(handle) { } CNtHandle(void) : m_handle(NULL) { } ~CNtHandle(void) { Close(); } void Close(void) { if (m_handle) NtClose(m_handle); m_handle = NULL; } operator HANDLE() const { return m_handle; } HANDLE *HandlePtr(void) { DBGASSERT((NULL == m_handle)); return &m_handle; } private: HANDLE m_handle; // // Prevent copy. // This class is only intended for automatic handle cleanup. // CNtHandle(const CNtHandle& rhs); CNtHandle& operator = (const CNtHandle& rhs); }; // // Ensure Win32 handles are exception safe. // class CWin32Handle { public: CWin32Handle(HANDLE handle) : m_handle(handle) { } CWin32Handle(void) : m_handle(NULL) { } ~CWin32Handle(void) { Close(); } void Close(void) { if (m_handle) CloseHandle(m_handle); m_handle = NULL; } operator HANDLE() const { return m_handle; } HANDLE *HandlePtr(void) { DBGASSERT((NULL == m_handle)); return &m_handle; } private: HANDLE m_handle; // // Prevent copy. // This class is only intended for automatic handle cleanup. // CWin32Handle(const CWin32Handle& rhs); CWin32Handle& operator = (const CWin32Handle& rhs); }; // // Trivial inline class to automate the cleanup of a STGMEDIUM // structure. // class CStgMedium : public STGMEDIUM { public: CStgMedium(void) { tymed = TYMED_NULL; hGlobal = NULL; pUnkForRelease = NULL; } ~CStgMedium(void) { ReleaseStgMedium(this); } operator LPSTGMEDIUM(void) { return (LPSTGMEDIUM)this; } operator const STGMEDIUM& (void) { return (STGMEDIUM &)*this; } }; // // On mounted volumes, the parsing name and display name are different. // The parsing name contains a GUID which means nothing to the user. // This class encapsulates both strings into a single class that can // be passed as a single object to functions requiring a volume // identifier. // // Here is an example of what the strings will contain: // // Mounted volume Non-mounted volume // // Display Label (C:\FOO) C:\ // Parsing \\?\Volume\{GUID} C:\ // FSPath C:\FOO C:\ // // I've coded this using only CString object references to leverage // the reference counting of the CString class and minimize string copying. // class CVolumeID { public: CVolumeID(void) : m_bMountedVol(false) { } CVolumeID( const CString& strForParsing, const CString& strForDisplay, const CString& strFSPath ) : m_bMountedVol(false) { SetNames(strForParsing, strForDisplay, strFSPath); } ~CVolumeID(void) { }; bool IsMountedVolume(void) const { return m_bMountedVol; } void SetNames( const CString& strForParsing, const CString& strForDisplay, const CString& strFSPath) { m_strForParsing = strForParsing; m_strFSPath = strFSPath; m_strForDisplay = strForDisplay; m_bMountedVol = !!(strForParsing != strForDisplay); } const CString& ForParsing(void) const { return m_strForParsing; } void ForParsing(CString *pstr) const { *pstr = m_strForParsing; } const CString& ForDisplay(void) const { return m_strForDisplay; } void ForDisplay(CString *pstr) const { *pstr = m_strForDisplay; } const CString& FSPath(void) const { return m_strFSPath; } void FSPath(CString *pstr) const { *pstr = m_strFSPath; } private: CString m_strForParsing; CString m_strForDisplay; CString m_strFSPath; bool m_bMountedVol; }; // // Don't want to include dskquota.h for these. // Including it here places the CLSIDs and IIDs in the precompiled header // which screws up the declaration/definition of the GUIDs. // struct IDiskQuotaUser; // fwd decl. #define SIDLIST FILE_GET_QUOTA_INFORMATION #define PSIDLIST PFILE_GET_QUOTA_INFORMATION BOOL SidToString( PSID pSid, LPTSTR pszSid, LPDWORD pcchSid); BOOL SidToString( PSID pSid, LPTSTR *ppszSid); HRESULT CreateSidList( PSID *rgpSids, DWORD cpSids, PSIDLIST *ppSidList, LPDWORD pcbSidList); VOID MessageBoxNYI(VOID); inline INT DiskQuotaMsgBox(HWND hWndParent, LPCTSTR pszText, LPCTSTR pszTitle, UINT uType); INT DiskQuotaMsgBox(HWND hWndParent, UINT idMsgText, UINT idMsgTitle, UINT uType); INT DiskQuotaMsgBox(HWND hWndParent, UINT idMsgText, LPCTSTR pszTitle, UINT uType); INT DiskQuotaMsgBox(HWND hWndParent, LPCTSTR pszText, UINT idMsgTitle, UINT uType); LPTSTR StringDup(LPCTSTR pszSource); PSID SidDup(PSID pSid); BOOL UserIsAdministrator(IDiskQuotaUser *pUser); VOID CenterPopupWindow(HWND hwnd, HWND hwndParent = NULL); HRESULT CallRegInstall(HINSTANCE hInstance, LPSTR szSection); void GetDlgItemText(HWND hwnd, UINT idCtl, CString *pstrText); #endif // _INC_DSKQUOTA_UTILS_H