/*++

   Copyright    (c)    1995-1996    Microsoft Corporation

   Module  Name:

      Logging.hxx

   Abstract:

      This module provides definitions of the server side logging object

   Author:

       Terence Kwan    ( terryk )    18-June-1996

   Environment:

       User-Mode - Win32

   Project:

       Internet Server DLL

   Revision History:

--*/

# ifndef _LOGGING_HXX_
# define _LOGGING_HXX_

typedef
HANDLE
(*P_ComLogInitializeLog)(
        LPCSTR pszInstanceName,
        LPCSTR lpszMetabasePath,
        LPVOID pvIMDCOM
        );

typedef
DWORD
(*P_ComLogTerminateLog)(
        IN HANDLE hHandle
        );

typedef
DWORD
(*P_ComLogLogInformation)(
    IN HANDLE hHandle,
    IN const INETLOG_INFORMATION *pInetLogInfo
    );

typedef
DWORD
(*P_ComLogGetConfig)(
    IN HANDLE hHandle,
    IN INETLOG_CONFIGURATIONA *pConfig
    );

typedef
DWORD
(*P_ComLogSetConfig)(
    IN HANDLE hHandle,
    IN const INETLOG_CONFIGURATIONA *pConfig
    );

typedef
DWORD
(*P_ComLogDllStartup)(
    VOID
    );

typedef
DWORD
(*P_ComLogDllCleanUp)(
    VOID
    );

typedef
DWORD
(*P_ComLogNotifyChange)(
    IN HANDLE hHandle
    );

typedef
DWORD
(*P_ComLogQueryExtraLogFields)(
    IN HANDLE hHandle,
    IN PCHAR  lpszFields,
    IN PDWORD pcbBuf
    );

typedef
DWORD
(*P_ComLogCustomInformation)(
    IN  HANDLE              hHandle,
    IN  DWORD               cCount, 
    IN  PCUSTOM_LOG_DATA    pCustomLogData,
    IN  LPSTR               szHeaderSuffix
    );


class dllexp LOGGING {

  public:

    LOGGING( );

    ~LOGGING();

    BOOL ActivateLogging(
                       IN LPCSTR pszServerName,
                       IN DWORD  dwInstanceId,
                       IN LPCSTR pszMetabasePath,
                       IN LPVOID pvIMDCOM
                       );

    BOOL ShutdownLogging( VOID);
    BOOL NotifyChange(DWORD);

    DWORD LogInformation(IN const INETLOG_INFORMATION * pInetLogInfo);

    DWORD GetConfig( INETLOG_CONFIGURATIONA *pLogConfig );

    DWORD SetConfig( INETLOG_CONFIGURATIONA *pRpcLogConfig );

    BOOL IsRequiredExtraLoggingFields();

    CHAR *QueryExtraLoggingFields();

    DWORD LogCustomInformation(
            IN  DWORD               cCount, 
            IN  PCUSTOM_LOG_DATA    pCustomLogData,
            IN  LPSTR               szHeaderSuffix
            );

    static DWORD Initialize();
    static DWORD Terminate();

  private:
    
    static HINSTANCE                  m_hComLogDLL;
    static P_ComLogInitializeLog      m_ComLogInitializeLog;
    static P_ComLogTerminateLog       m_ComLogTerminateLog;
    static P_ComLogLogInformation     m_ComLogLogInformation;
    static P_ComLogGetConfig          m_ComLogGetConfig;
    static P_ComLogSetConfig          m_ComLogSetConfig;
    static P_ComLogNotifyChange       m_ComLogNotifyChange;
    static P_ComLogQueryExtraLogFields m_ComLogQueryExtraLogFields;

    static P_ComLogDllStartup         m_ComLogDllStartup;
    static P_ComLogDllCleanUp         m_ComLogDllCleanUp;

    static P_ComLogCustomInformation  m_ComLogCustomInformation;

    VOID ActOnChange();

    VOID LockShared()     { m_tslock.Lock(TSRES_LOCK_READ); }
    VOID LockExclusive()  { m_tslock.Lock(TSRES_LOCK_WRITE); }
    VOID Unlock()         { m_tslock.Unlock(); }
        
    TS_RESOURCE     m_tslock;
    
    HANDLE  m_Handle;
    BOOL    m_fRequiredExtraLoggingFields;
    LPVOID  m_pvIMDCOM;
    BOOL    m_fMetabaseModified;

    STR     m_strInstanceName;
    STR     m_strMetabasePath;

    CHAR    m_szExtraLoggingFields[MAX_PATH];
}; // class LOGGING

# endif // _LOGGING_HXX_