/*++

Copyright (c) 1998, Microsoft Corporation

Module Name:

    debug.c

Abstract:

    This module contains declarations for debugging-support.

Author:

    Abolade Gbadegesin (aboladeg)   2-Mar-1998

Revision History:

--*/

#include "precomp.h"
#pragma hdrstop

HANDLE NhEventLogHandle = NULL;
ULONG NhpTraceId = INVALID_TRACEID;

//
// FORWARD DECLARATIONS
//

BOOLEAN
NhpIsAllowedLog(
    ULONG MessageId,
    ULONG Level
    );

//
// TRACING ROUTINES (alphabetically)
//

VOID
NhDump(
    ULONG Flags,
    PUCHAR Buffer,
    ULONG BufferLength,
    ULONG Width
    )
{
    TraceDumpEx(
        NhpTraceId,
        Flags,
        Buffer,
        BufferLength,
        Width,
        FALSE,
        NULL
        );
}

VOID
NhInitializeTraceManagement(
    VOID
    )
{
    NhpTraceId = TraceRegisterA("IPNATHLP");
}

VOID
NhShutdownTraceManagement(
    VOID
    )
{
    TraceDeregister(NhpTraceId);
    NhpTraceId = INVALID_TRACEID;
}

VOID
NhTrace(
    ULONG Flags,
    PCHAR Format,
    ...
    )
{
    va_list VaList;

    va_start(VaList, Format);
    TraceVprintfExA(NhpTraceId, Flags, Format, VaList);
    va_end(VaList);
}


//
// EVENTLOGGING ROUTINES (alphabetically)
//

VOID
NhErrorLog(
    ULONG MessageId,
    ULONG ErrorCode,
    PCHAR Format,
    ...
    )
{
    va_list arglist;
    if (!NhpIsAllowedLog(MessageId, IPNATHLP_LOGGING_ERROR)) { return; }
    va_start(arglist, Format);
    RouterLogEventValistExA(
        NhEventLogHandle,
        EVENTLOG_ERROR_TYPE,
        ErrorCode,
        MessageId,
        Format,
        arglist
        );
    va_end(arglist);
}

VOID
NhInformationLog(
    ULONG MessageId,
    ULONG ErrorCode,
    PCHAR Format,
    ...
    )
{
    va_list arglist;
    if (!NhpIsAllowedLog(MessageId, IPNATHLP_LOGGING_INFO)) { return; }
    va_start(arglist, Format);
    RouterLogEventValistExA(
        NhEventLogHandle,
        EVENTLOG_INFORMATION_TYPE,
        ErrorCode,
        MessageId,
        Format,
        arglist
        );
    va_end(arglist);
}

VOID
NhInitializeEventLogManagement(
    VOID
    )
{
    NhEventLogHandle = RouterLogRegisterA(TARGETNAME);
}

BOOLEAN
NhpIsAllowedLog(
    ULONG MessageId,
    ULONG Level
    )
{
    if (MessageId > IP_AUTO_DHCP_LOG_BASE && MessageId < IP_AUTO_DHCP_LOG_END) {
        EnterCriticalSection(&DhcpGlobalInfoLock);
        if (!DhcpGlobalInfo) {
            LeaveCriticalSection(&DhcpGlobalInfoLock);
            return (Level == IPNATHLP_LOGGING_ERROR) ? TRUE : FALSE;
        } else if (DhcpGlobalInfo->LoggingLevel < Level) {
            LeaveCriticalSection(&DhcpGlobalInfoLock);
            return FALSE;
        }
        LeaveCriticalSection(&DhcpGlobalInfoLock);
        return TRUE;
    } else if (MessageId > IP_DNS_PROXY_LOG_BASE &&
                MessageId < IP_DNS_PROXY_LOG_END) {
        EnterCriticalSection(&DnsGlobalInfoLock);
        if (!DnsGlobalInfo) {
            LeaveCriticalSection(&DnsGlobalInfoLock);
            return (Level == IPNATHLP_LOGGING_ERROR) ? TRUE : FALSE;
        } else if (DnsGlobalInfo->LoggingLevel < Level) {
            LeaveCriticalSection(&DnsGlobalInfoLock);
            return FALSE;
        }
        LeaveCriticalSection(&DnsGlobalInfoLock);
        return TRUE;
    } 

#ifndef NO_FTP_PROXY
    else if (MessageId > IP_FTP_LOG_BASE && MessageId < IP_FTP_LOG_END) {
        EnterCriticalSection(&FtpGlobalInfoLock);
        if (!FtpGlobalInfo) {
            LeaveCriticalSection(&FtpGlobalInfoLock);
            return (Level == IPNATHLP_LOGGING_ERROR) ? TRUE : FALSE;
        } else if (FtpGlobalInfo->LoggingLevel < Level) {
            LeaveCriticalSection(&FtpGlobalInfoLock);
            return FALSE;
        }
        LeaveCriticalSection(&FtpGlobalInfoLock);
        return TRUE;
    }
#endif
    else if (MessageId > IP_H323_LOG_BASE && MessageId < IP_H323_LOG_END) {
        EnterCriticalSection(&H323GlobalInfoLock);
        if (!H323GlobalInfo) {
            LeaveCriticalSection(&H323GlobalInfoLock);
            return (Level == IPNATHLP_LOGGING_ERROR) ? TRUE : FALSE;
        } else if (H323GlobalInfo->LoggingLevel < Level) {
            LeaveCriticalSection(&H323GlobalInfoLock);
            return FALSE;
        }
        LeaveCriticalSection(&H323GlobalInfoLock);
        return TRUE;
    } else if (MessageId > IP_NAT_LOG_BASE && MessageId < IP_NAT_LOG_END) {
        EnterCriticalSection(&NatGlobalInfoLock);
        if (!NatGlobalInfo) {
            LeaveCriticalSection(&NatGlobalInfoLock);
            return (Level == IPNATHLP_LOGGING_ERROR) ? TRUE : FALSE;
        } else if (NatGlobalInfo->LoggingLevel < Level) {
            LeaveCriticalSection(&NatGlobalInfoLock);
            return FALSE;
        }
        LeaveCriticalSection(&NatGlobalInfoLock);
        return TRUE;
    }
    return TRUE;
}

VOID
NhWarningLog(
    ULONG MessageId,
    ULONG ErrorCode,
    PCHAR Format,
    ...
    )
{
    va_list arglist;
    if (!NhpIsAllowedLog(MessageId, IPNATHLP_LOGGING_WARN)) { return; }
    va_start(arglist, Format);
    RouterLogEventValistExA(
        NhEventLogHandle,
        EVENTLOG_WARNING_TYPE,
        ErrorCode,
        MessageId,
        Format,
        arglist
        );
    va_end(arglist);
}

VOID
NhShutdownEventLogManagement(
    VOID
    )
{
    RouterLogDeregister(NhEventLogHandle);
}