|
|
#ifndef _INC_DSKQUOTA_USER_H
#define _INC_DSKQUOTA_USER_H
///////////////////////////////////////////////////////////////////////////////
/* File: user.h
Description: Contains declarations for class DiskQuotaUser. The DiskQuotaUser object represents a user's quota information on a particular volume. Per-user quota information is managed through the IDiskQuotaUser interface.
Revision History:
Date Description Programmer -------- --------------------------------------------------- ---------- 05/22/96 Initial creation. BrianAu 08/20/96 Added m_dwID member to DiskQuotaUser. BrianAu 09/05/96 Added domain name string and cache. BrianAu 08/25/97 Added OLE automation support. BrianAu 03/18/98 Replaced "domain", "name" and "full name" with BrianAu "container", "logon name" and "display name" to better match the actual contents. This was in reponse to making the quota UI DS-aware. The "logon name" is now a unique key as it contains both account name and domain-like information. i.e. "REDMOND\brianau" or "[email protected]". */ ///////////////////////////////////////////////////////////////////////////////
#ifndef _INC_DSKQUOTA_H
# include "dskquota.h"
#endif
#ifndef _INC_DSKQUOTA_FSOBJECT_H
# include "fsobject.h"
#endif
#ifndef _INC_DSKQUOTA_DISPATCH_H
# include "dispatch.h" // MIDL-generated header (automation).
#endif
#ifndef _INC_DSKQUOTA_OADISP_H
# include "oadisp.h" // OleAutoDispatch class (automation).
#endif
class DiskQuotaUser : public IDiskQuotaUser { private: LONGLONG m_llQuotaUsed; LONGLONG m_llQuotaThreshold; LONGLONG m_llQuotaLimit; LONG m_cRef; // Ref counter.
ULONG m_ulUniqueId; // Unique object ID.
PSID m_pSid; // Ptr to user's SID structure.
LPTSTR m_pszLogonName; // "[email protected]"
LPTSTR m_pszDisplayName; // "Brian Aust"
FSObject *m_pFSObject; // Ptr to file sys object.
BOOL m_bNeedCacheUpdate; // T = Cached data is invalid.
INT m_iContainerName; // Index into acct container name cache.
DWORD m_dwAccountStatus; // Status of user account.
static HANDLE m_hMutex; // For serializing access to users.
static DWORD m_dwMutexWaitTimeout; // How long to wait for mutex.
static LONG m_cUsersAlive; // Count of users currently alive.
static ULONG m_ulNextUniqueId; // Unique ID generator.
static CArray<CString> m_ContainerNameCache; // Cache container names as they
// are found. Don't need to dup
// names in each user object.
VOID Destroy(VOID); VOID DestroyContainerNameCache(VOID);
BOOL Lock(VOID); VOID ReleaseLock(VOID);
//
// Prevent copy construction.
//
DiskQuotaUser(const DiskQuotaUser& user); void operator = (const DiskQuotaUser& user);
HRESULT GetLargeIntegerQuotaItem( PLONGLONG pllItem, PLONGLONG pllValueOut);
HRESULT SetLargeIntegerQuotaItem( PLONGLONG pllItem, LONGLONG llValue, BOOL bWriteThrough = TRUE);
HRESULT RefreshCachedInfo( VOID); HRESULT WriteCachedInfo( VOID);
HRESULT GetCachedContainerName( INT iCacheIndex, LPTSTR pszContainer, UINT cchContainer);
HRESULT CacheContainerName( LPCTSTR pszContainer, INT *pCacheIndex);
public: DiskQuotaUser(FSObject *pFSObject); ~DiskQuotaUser(VOID);
HRESULT Initialize( PFILE_QUOTA_INFORMATION pfqi = NULL);
VOID SetAccountStatus( DWORD dwStatus);
STDMETHODIMP SetName( LPCWSTR pszContainer, LPCWSTR pszLogonName, LPCWSTR pszDisplayName);
//
// IUnknown interface.
//
STDMETHODIMP QueryInterface( REFIID, LPVOID *);
STDMETHODIMP_(ULONG) AddRef( VOID);
STDMETHODIMP_(ULONG) Release( VOID);
//
// IDiskQuotaUser methods.
//
STDMETHODIMP GetID( ULONG *pulID);
STDMETHODIMP GetName( LPWSTR pszContainerBuffer, DWORD cchContainerBuffer, LPWSTR pszLogonNameBuffer, DWORD cchLogonNameBuffer, LPWSTR pszDisplayNameBuffer, DWORD cchDisplayNameBuffer);
STDMETHODIMP GetSidLength( LPDWORD pcbSid);
STDMETHODIMP GetSid( PBYTE pSid, DWORD cbSidBuf);
STDMETHODIMP GetQuotaThreshold( PLONGLONG pllThreshold) { return GetLargeIntegerQuotaItem(&m_llQuotaThreshold, pllThreshold); }
STDMETHODIMP GetQuotaThresholdText( LPWSTR pszText, DWORD cchText);
STDMETHODIMP GetQuotaLimit( PLONGLONG pllLimit) { return GetLargeIntegerQuotaItem(&m_llQuotaLimit, pllLimit); }
STDMETHODIMP GetQuotaLimitText( LPWSTR pszText, DWORD cchText);
STDMETHODIMP GetQuotaUsed( PLONGLONG pllUsed) { return GetLargeIntegerQuotaItem(&m_llQuotaUsed, pllUsed); }
STDMETHODIMP GetQuotaUsedText( LPWSTR pszText, DWORD cchText);
STDMETHODIMP GetQuotaInformation( LPVOID pbInfo, DWORD cbInfo);
STDMETHODIMP SetQuotaThreshold( LONGLONG llThreshold, BOOL bWriteThrough = TRUE);
STDMETHODIMP SetQuotaLimit( LONGLONG llLimit, BOOL bWriteThrough = TRUE);
STDMETHODIMP Invalidate( VOID) { m_bNeedCacheUpdate = TRUE; return NO_ERROR; }
STDMETHODIMP GetAccountStatus( LPDWORD pdwAccountStatus);
};
//
// Proxy class to handle all automation interface duties.
// It implements IDispatch and DIDiskQuotaUser passing any actions
// for real disk quota activity onto a referenced DiskQuotaUser object.
// Instances are created in DiskQuotaUser::QueryInterface in response
// to requests for IDispatch and DIDiskQuotaUser.
//
class DiskQuotaUserDisp : public DIDiskQuotaUser { public:
explicit DiskQuotaUserDisp(PDISKQUOTA_USER pUser); ~DiskQuotaUserDisp(VOID);
//
// IUnknown interface.
//
STDMETHODIMP QueryInterface( REFIID, LPVOID *);
STDMETHODIMP_(ULONG) AddRef( VOID);
STDMETHODIMP_(ULONG) Release( VOID);
//
// IDispatch methods.
//
STDMETHODIMP GetIDsOfNames( REFIID riid, OLECHAR ** rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
STDMETHODIMP GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
STDMETHODIMP GetTypeInfoCount( UINT *pctinfo);
STDMETHODIMP Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
STDMETHODIMP get_ID( long *pID);
STDMETHODIMP get_AccountContainerName( BSTR *pContainerName);
STDMETHODIMP get_DisplayName( BSTR *pDisplayName);
STDMETHODIMP get_LogonName( BSTR *pLogonName);
STDMETHODIMP get_QuotaThreshold( double *pThreshold);
STDMETHODIMP put_QuotaThreshold( double Threshold);
STDMETHODIMP get_QuotaThresholdText( BSTR *pThresholdText);
STDMETHODIMP get_QuotaLimit( double *pLimit);
STDMETHODIMP put_QuotaLimit( double Limit);
STDMETHODIMP get_QuotaLimitText( BSTR *pLimitText);
STDMETHODIMP get_QuotaUsed( double *pUsed);
STDMETHODIMP get_AccountStatus( AccountStatusConstants *pStatus);
STDMETHODIMP get_QuotaUsedText( BSTR *pUsedText);
//
// Methods.
//
STDMETHODIMP Invalidate(void);
private: LONG m_cRef; PDISKQUOTA_USER m_pUser; // For delegation
OleAutoDispatch m_Dispatch; // Automation dispatch object.
//
// Prevent copy.
//
DiskQuotaUserDisp(const DiskQuotaUserDisp& rhs); DiskQuotaUserDisp& operator = (const DiskQuotaUserDisp& rhs); };
#endif // _INC_DISKQUOTA_USER_H
|