/*++

Copyright (C) 2000-2001 Microsoft Corporation

Module Name:

Abstract:

History:

--*/

//***************************************************************************
//
//  WMIUSER.H
//
//  raymcc      1-May-00        Created
//
//***************************************************************************

#ifndef _WMIUSER_H_
#define _WMIUSER_H_

typedef enum
{
    WMICORE_CLIENT_STATUS_NULL      = 0,
    WMICORE_CLIENT_STATUS_CONNECTED,
    WMICORE_CLIENT_STATUS_PROCESSING,
    WMICORE_CLIENT_STATUS_INACTIVE

}   WMICORE_CLIENT_STATUS;


class CWmiUser : public _IWmiUserHandle
{
    ULONG   m_uRefCount;
    ULONG   m_uStatus;          // WMICORE_CLIENT_STATUS_ constant

    LPWSTR  m_pszUserName;
    PSID    m_pSid;
    ULONG   m_uSidLength;

    SYSTEMTIME m_stLogonTime;           // Real time
    ULONG      m_uStartTime;            // GetCurrentTime
    ULONG      m_uLastRequestTime;      // GetCurrentTime

    DWORD      m_dwQuota_MaxThreads;
    DWORD      m_dwQuota_MaxRequests;

    unsigned __int64 m_u64AccumulatedTime;     // Milliseconds

    CFlexArray  m_aConnections;                 // IWbemServices(Ex) pointers

    // Master user list.
    // =================

    // Methods.
    // ========
    void Clear();
    void Empty();
    static CFlexArray m_aUserList;

public:
    // COM Methods

    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();

    HRESULT STDMETHODCALLTYPE QueryInterface(
        IN REFIID riid,
        OUT LPVOID *ppvObj
        );

    HRESULT STDMETHODCALLTYPE GetHandleType(ULONG *puType);

public:
    // C++ methods

    CWmiUser();
   ~CWmiUser();
    CWmiUser(CWmiUser &Src);
    CWmiUser & operator = (CWmiUser &Src);

    // Intializes the user based on the calling thread.

    static HRESULT Logon();

    HRESULT AttachUserToScope();
    HRESULT DetachUserFromScope();

    static HRESULT GetCurrentUserList(
        OUT ULONG *puListSize,
        OUT _IWmiUserHandle **pUser
        );

    static  HRESULT Purge();    // Remove all users with no active connections

    static HRESULT FreeMemory(
        _IWmiUserHandle **pList
        );

    static HRESULT DumpToTextFile(LPWSTR pszFileName);

};

#endif