/*******************************************************************************
;*******************************************************************************
;**                                                                           **
;**                  COPYRIGHT 2001-2012 NUANCE COMMUNICATIONS                **
;**                                                                           **
;**               NUANCE COMMUNICATIONS PROPRIETARY INFORMATION               **
;**                                                                           **
;**     This software is supplied under the terms of a license agreement      **
;**     or non-disclosure agreement with Nuance Communications and may not    **
;**     be copied or disclosed except in accordance with the terms of that    **
;**     agreement.                                                            **
;**                                                                           **
;*******************************************************************************
;**                                                                           **
;**     FileName: et9alogutils.h                                              **
;**                                                                           **
;**  Description: Logging utilities                                           **
;**                                                                           **
;*******************************************************************************
;******************************************************************************/


#ifndef _LOGGER_MACROS_3_30_PM_2008
#define _LOGGER_MACROS_3_30_PM_2008

/*//////////////////////////////////////// */
/* Turn various logging on/off */
/*//////////////////////////////////////// */
#ifndef LOGGING_HWCL_PT
#define LOGGING_HWCL_PT         0      /* Set this to 1 to turn on logging for HWCL and PT */
#endif

#define LOGGING_FILTER         0      /* Set this to 1 to turn on logging for mouse filtering */

#define TRACK_KEY_PERFORMANCE   0     /* Set this to 1 to track performance of state machine. */


#include "et9abuildconfig.h"
#include "et9aswapicore.h"
#include "et9api.h"

typedef enum SWLogger_LoggingLevel_e {
    #undef ERROR          /* defined in WinGDI.h ??? */
    /*#undef TRACE */
    /*#undef WARNING */
    /*#undef DEBUG */
    /*#undef ALERT */
    /*#undef STATS */
    SWLogger_MSGLEVEL_INVALID,
    SWLogger_STATS,
    SWLogger_FATAL,
    SWLogger_CRITICAL,
    SWLogger_ERROR,
    SWLogger_DUMP,
    SWLogger_WARNING,
    SWLogger_ALERT,
    SWLogger_DEBUG,
    SWLogger_STATS_DEBUG,
    SWLogger_TRACE,
    SWLogger_INFO,
    SWLogger_INFO1
}
SWLogger_LoggingLevel;


/*This turns on logging */
/*#ifndef     LOGGING */
/*   #define LOGGING 1 */
/*#endif */

#if defined(_SW_JNI_LOGGING_)
    /* This routes all the logs to Android's console logger */
    #ifdef LOG_TAG
    #   undef    LOG_TAG
    #endif
    #define LOG_TAG "SwypeCore"
    #include "android/log.h"

    #ifndef LOGD
    #   define LOGD(...) ((void) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
    #endif
#else
    /* So that we can compile under Linux and windows */
    #if defined(LOGD)
    #undef LOGD
    #endif
    #if defined(_MSC_VER) && (_MSC_VER <= 1200)
        #define LOGD(x)
    #else
        #define LOGD(...)
    #endif
#endif

#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)

#define STR(a) #a
/* XXXLCM Format as "path/to/file.cpp(332)" */
#define JOIN(x, y) x TEXT("(") TEXT(STR(y)) TEXT(")")

/* This retail message logger is just for the OmniaII builds on the Windows Mobile. */
#if defined(OMNIA_II_BUILD) && defined(RETAILMSG)
    #define LogRetail(format,...) {RETAILMSG(TRUE, (format, ## __VA_ARGS__));}
#else
    #if defined(_MSC_VER) && (_MSC_VER <= 1200)
        #define LogRetail(x) {}
    #else
        #define LogRetail(format,...) {}
    #endif
#endif

/* This routes logs to the Swype logger. */
/* However this causes issues when logging starts too early. */
#if LOGGING
    #define LogSTATS(lev,...)
    #define Log(lev,format,...) { __ET9AWSP_log(lev, format, ## __VA_ARGS__); }
    #define LogV(lev, format)
    #define LogBrief(lev,...)
#else
    #if defined(_MSC_VER) && (_MSC_VER <= 1200)
        #define LogSTATS(x)
        #define Log(x)        {}
        #define LogV(x)
        #define LogBrief(x)
    #else
        #define LogSTATS(lev,...)
        #define Log(lev,format,...)        {}
        #define LogV(lev, format)
        #define LogBrief(lev,...)
    #endif
#endif



/*#define Trace(traceTag,subTag,format,...) {SWTracer::DebugTrace(traceTag, subTag,format);} */
/*#define Trace(traceTag,subTag,format,...) {} */
#if defined(_MSC_VER) && (_MSC_VER <= 1200)
    #define _ET9ASW_Trace(x) {}
#else
    #define _ET9ASW_Trace(traceTag,subTag,format,...) {}
#endif



/**
 * Put any implementation specific logging calls here.
 */


#if (LOGGING && LOGGING_HWCL_PT)
#   define HWCL_PT_TAG "Swype_HWCL_PT"
#if ANDROID
#   define LOG_HWCL_PT(...) ((void) __android_log_print(ANDROID_LOG_DEBUG, HWCL_PT_TAG, __VA_ARGS__))
#else
#   define LOG_HWCL_PT(...) {char buff[1024]; snprintf(buff, 1024, __VA_ARGS__); OutputDebugStringA(buff);}
#endif
#else
    #if defined(_MSC_VER) && (_MSC_VER <= 1200)
        #define LOG_HWCL_PT(x) do {} while (0)
    #else
        #define LOG_HWCL_PT(...) do {} while (0)
    #endif
#endif


#if (LOGGING && LOGGING_FILTER && ANDROID_BUILD && defined(_SW_JNI_LOGGING_))
#   define FILTER_TAG "Swype_FILTER"
#   define LOG_FILTER(...) ((void) __android_log_print(ANDROID_LOG_DEBUG, FILTER_TAG, __VA_ARGS__))
#else
    #if defined(_MSC_VER) && (_MSC_VER <= 1200)
        #define LOG_FILTER(x)
    #else
        #define LOG_FILTER(...)
    #endif
#endif


#if (LOGGING && TRACK_KEY_PERFORMANCE)
#   define TRACK_KEY_PERF_TAG "Swype_TRACK_KEY_PERF"
#if ANDROID
#   define LOG_TRACK_KEY_PERF(...) ((void) __android_log_print(ANDROID_LOG_DEBUG, TRACK_KEY_PERF_TAG, __VA_ARGS__))
#else
#   define LOG_TRACK_KEY_PERF(...) {char buff[1024]; snprintf(buff, 1024, __VA_ARGS__); OutputDebugStringA(buff);}
#endif
#else
    #if defined(_MSC_VER) && (_MSC_VER <= 1200)
        #define LOG_TRACK_KEY_PERF(x) do {} while (0)
    #else
        #define LOG_TRACK_KEY_PERF(...) do {} while (0)
    #endif
#endif


#if defined(_MSC_VER) && (_MSC_VER <= 1200)
#pragma warning( disable : 4002 )  /* too many actual parameters for macro */
#endif


#endif
/* eof */
