/*++ BUILD Version: 0001    Increment if a change has global effects

Copyright (c) 1997-1999 Microsoft Corporation

Module Name:

    info.h

Abstract:

    Header file for the internal information interfaces (util\info.c)

Environment:

    User Mode - Win32

Notes:

--*/
#ifndef _NTFRS_INFO_INCLUDED_
#define _NTFRS_INFO_INCLUDED_
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define IPRINT0(_Info, _Format)   \
    InfoPrint(_Info, _Format)

#define IPRINT1(_Info, _Format, _p1)   \
    InfoPrint(_Info, _Format, _p1)

#define IPRINT2(_Info, _Format, _p1, _p2)   \
    InfoPrint(_Info, _Format, _p1, _p2)

#define IPRINT3(_Info, _Format, _p1, _p2, _p3)   \
    InfoPrint(_Info, _Format, _p1, _p2, _p3)

#define IPRINT4(_Info, _Format, _p1, _p2, _p3, _p4)   \
    InfoPrint(_Info, _Format, _p1, _p2, _p3, _p4)

#define IPRINT5(_Info, _Format, _p1, _p2, _p3, _p4, _p5)   \
    InfoPrint(_Info, _Format, _p1, _p2, _p3, _p4, _p5)

#define IPRINT6(_Info, _Format, _p1, _p2, _p3, _p4, _p5, _p6)   \
    InfoPrint(_Info, _Format, _p1, _p2, _p3, _p4, _p5, _p6)

#define IPRINT7(_Info, _Format, _p1, _p2, _p3, _p4, _p5, _p6, _p7)   \
    InfoPrint(_Info, _Format, _p1, _p2, _p3, _p4, _p5, _p6, _p7)

#define IDPRINT0(_Severity, _Info, _Format) \
    if (_Info) { \
        IPRINT0(_Info, _Format); \
    } else { \
        DPRINT(_Severity, _Format); \
    }

#define IDPRINT1(_Severity, _Info, _Format, _p1) \
    if (_Info) { \
        IPRINT1(_Info, _Format, _p1); \
    } else { \
        DPRINT1(_Severity, _Format, _p1); \
    }

#define IDPRINT2(_Severity, _Info, _Format, _p1, _p2) \
    if (_Info) { \
        IPRINT2(_Info, _Format, _p1, _p2); \
    } else { \
        DPRINT2(_Severity, _Format, _p1, _p2); \
    }

#define IDPRINT3(_Severity, _Info, _Format, _p1, _p2, _p3) \
    if (_Info) { \
        IPRINT3(_Info, _Format, _p1, _p2, _p3); \
    } else { \
        DPRINT3(_Severity, _Format, _p1, _p2, _p3); \
    }

#define IDPRINT4(_Severity, _Info, _Format, _p1, _p2, _p3, _p4) \
    if (_Info) { \
        IPRINT4(_Info, _Format, _p1, _p2, _p3, _p4); \
    } else { \
        DPRINT4(_Severity, _Format, _p1, _p2, _p3, _p4); \
    }

#define IDPRINT5(_Severity, _Info, _Format, _p1, _p2, _p3, _p4, _p5) \
    if (_Info) { \
        IPRINT5(_Info, _Format, _p1, _p2, _p3, _p4, _p5); \
    } else { \
        DPRINT5(_Severity, _Format, _p1, _p2, _p3, _p4, _p5); \
    }

#define IDPRINT6(_Severity, _Info, _Format, _p1, _p2, _p3, _p4, _p5, _p6) \
    if (_Info) { \
        IPRINT6(_Info, _Format, _p1, _p2, _p3, _p4, _p5, _p6); \
    } else { \
        DPRINT6(_Severity, _Format, _p1, _p2, _p3, _p4, _p5, _p6); \
    }

//
// Used by FrsPrintType and its subroutines
//
//  WARNING - THESE MACROS DEPEND ON LOCAL VARIABLES!
//
#define ITPRINT0(_Format) \
{ \
    if (Info) { \
        IPRINT0(Info, _Format); \
    } else { \
        DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo); \
    } \
}
#define ITPRINT1(_Format, _p1) \
{ \
    if (Info) { \
        IPRINT1(Info, _Format, _p1); \
    } else { \
        DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, _p1); \
    } \
}
#define ITPRINT2(_Format, _p1, _p2) \
{ \
    if (Info) { \
        IPRINT2(Info, _Format, _p1, _p2); \
    } else { \
        DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, _p1, _p2); \
    } \
}
#define ITPRINT3(_Format, _p1, _p2, _p3) \
{ \
    if (Info) { \
        IPRINT3(Info, _Format, _p1, _p2, _p3); \
    } else { \
        DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, _p1, _p2, _p3); \
    } \
}
#define ITPRINT4(_Format, _p1, _p2, _p3, _p4) \
{ \
    if (Info) { \
        IPRINT4(Info, _Format, _p1, _p2, _p3, _p4); \
    } else { \
        DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, _p1, _p2, _p3, _p4); \
    } \
}
#define ITPRINT5(_Format, _p1, _p2, _p3, _p4, _p5) \
{ \
    if (Info) { \
        IPRINT3(Info, _Format, _p1, _p2, _p3, _p4, _p5); \
    } else { \
        DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, _p1, _p2, _p3, _p4, _p5); \
    } \
}

#define ITPRINTGNAME(_GName, _Format)                                          \
{                                                                              \
    if ((_GName) && (_GName)->Guid && (_GName)->Name) {                        \
        GuidToStr(_GName->Guid, Guid);                                         \
        if (Info) {                                                            \
            IPRINT3(Info, _Format, TabW, (_GName)->Name, Guid);                \
        } else {                                                               \
            DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, TabW, (_GName)->Name, Guid); \
        }                                                                      \
    }                                                                          \
}

#define ITPRINTGUID(_Guid, _Format)                                            \
{                                                                              \
    if ((_Guid)) {                                                             \
        GuidToStr((_Guid), Guid);                                              \
        if (Info) {                                                            \
            IPRINT2(Info, _Format, TabW, Guid);                                \
        } else {                                                               \
            DebPrintNoLock(Severity, TRUE, _Format, Debsub, uLineNo, TabW, Guid); \
        }                                                                      \
    }                                                                          \
}


VOID
FrsPrintAllocStats(
    IN ULONG            Severity,
    IN PNTFRSAPI_INFO   Info,        OPTIONAL
    IN DWORD            Tabs
    );
/*++
Routine Description:
    Print the memory stats into the info buffer or using DPRINT (Info == NULL).

Arguments:
    Severity    - for DPRINT
    Info        - for IPRINT (use DPRINT if NULL)
    Tabs        - indentation for prettyprint

Return Value:
    None.
--*/

//
// PrettyPrint (set tabs at 3 wchars)
//
#define MAX_TABS        (16)
#define MAX_TAB_WCHARS  (MAX_TABS * 3)
VOID
InfoTabs(
    IN DWORD    Tabs,
    IN PWCHAR   TabW
    );
/*++
Routine Description:
    Create a string of tabs for prettyprint

Arguments:
    Tabs    - number of tabs
    TabW    - preallocated string to receive tabs

Return Value:
    Win32 Status
--*/

DWORD
Info(
    IN ULONG        BlobSize,
    IN OUT PBYTE    Blob
    );
/*++
Routine Description:
    Return internal info (see private\net\inc\ntfrsapi.h).

Arguments:
    BlobSize    - total bytes of Blob
    Blob        - details desired info and provides buffer for info

Return Value:
    Win32 Status
--*/

VOID
InfoPrint(
    IN PNTFRSAPI_INFO   Info,
    IN PCHAR            Format,
    IN ... );
/*++
Routine Description:
    Format and print a line of information output into the info buffer.

Arguments:
    Info    - Info buffer
    Format  - printf format

Return Value:
    None.
--*/

DWORD
InfoVerify(
    IN ULONG        BlobSize,
    IN OUT PBYTE    Blob
    );
/*++
Routine Description:
    Verify the consistency of the blob.

Arguments:
    BlobSize    - total bytes of Blob
    Blob        - details desired info and provides buffer for info

Return Value:
    Win32 Status
--*/



//
// Context global to InfoPrintIDTable...
//
typedef struct _INFO_TABLE{
    PREPLICA            Replica;
    PTHREAD_CTX         ThreadCtx;
    PTABLE_CTX          TableCtx;
    PNTFRSAPI_INFO      Info;
    DWORD               Tabs;
} INFO_TABLE, *PINFO_TABLE;


#ifdef __cplusplus
}
#endif