//=======================================================================
//
//  Copyright (c) 1998-1999 Microsoft Corporation.  All Rights Reserved.
//
//  File:   log.h
//
//  Owner:  Yan Leshinsly
//
//  Description:
//
//      Logging support
//
//=======================================================================
#pragma once

#ifndef LOGGING_LEVEL
    #define LOGGING_LEVEL 0
#endif

const char cszLoggingFile[] = "%WinDir%\\wsdu.log";

class CLogger
{
public:
    CLogger(const char* szBlockName = 0, int nLoggingLevel = 0, const char* szFileName = 0, int nLine = 0);
    ~CLogger();
    void __cdecl out(const char *szFormat, ...);
    void __cdecl error(const char *szFormat, ...);
    static void __cdecl out1(const char *szFormat, ...);
    static void __cdecl close(void);

private:
    void v_out( const char* szFormat, va_list va);

    bool m_fOut;
    char m_szBlockName[64];
    DWORD m_dwStartTick;
    
    static FILE* c_pfile;
    static int c_cnIndent;
    static int c_cnLevels;
};

#define THIS_FILE               __FILE__
#define LOG_block(name)         CLogger logger(name, LOGGING_LEVEL, THIS_FILE, __LINE__)
#define LOG_out                 logger.out
#define LOG_out1                CLogger::out1
#define LOG_error               logger.error
#define LOG_close				CLogger::close

#define report_error_if_false(f)    if (f) {/*OK*/} else { LOG_error("%s LastError = %d", #f, GetLastError()); } 
#define return_error_if_false(f)    if (f) {/*OK*/} else { DWORD dwErr = GetLastError(); LOG_error("%s LastError = %d", #f, dwErr); return dwErr;}
#define return_if_error(f)          { DWORD dwErr = f; if (dwErr) { LOG_error("%s LastError = %d", #f, dwErr); return dwErr;} }
#define return_if_false(f)      if (f) {/*OK*/} else { LOG_error("%s LastError = %d", #f, GetLastError()); return FALSE;}