/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "trace_win.h"

#include <cassert>
#include <stdarg.h>

#include "Mmsystem.h"

#if defined(_DEBUG)
    #define BUILDMODE "d"
#elif defined(DEBUG)
    #define BUILDMODE "d"
#elif defined(NDEBUG)
    #define BUILDMODE "r"
#else
    #define BUILDMODE "?"
#endif
#define BUILDTIME __TIME__
#define BUILDDATE __DATE__
// Example: "Oct 10 2002 12:05:30 r"
#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE

namespace webrtc {
TraceWindows::TraceWindows()
    : _prevAPITickCount(0),
      _prevTickCount(0)
{
}

TraceWindows::~TraceWindows()
{
    StopThread();
}

WebRtc_Word32 TraceWindows::AddTime(char* traceMessage,
                                    const TraceLevel level) const
{
    WebRtc_UWord32 dwCurrentTime = timeGetTime();
    SYSTEMTIME systemTime;
    GetSystemTime(&systemTime);

    if(level == kTraceApiCall)
    {
        WebRtc_UWord32 dwDeltaTime = dwCurrentTime- _prevTickCount;
        _prevTickCount = dwCurrentTime;

        if(_prevTickCount == 0)
        {
            dwDeltaTime = 0;
        }
        if(dwDeltaTime > 0x0fffffff)
        {
            // Either wraparound or data race.
            dwDeltaTime = 0;
        }
        if(dwDeltaTime > 99999)
        {
            dwDeltaTime = 99999;
        }

        sprintf (traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.wHour,
                 systemTime.wMinute, systemTime.wSecond,
                 systemTime.wMilliseconds, dwDeltaTime);
    } else {
        WebRtc_UWord32 dwDeltaTime = dwCurrentTime - _prevAPITickCount;
        _prevAPITickCount = dwCurrentTime;

        if(_prevAPITickCount == 0)
        {
            dwDeltaTime = 0;
        }
        if(dwDeltaTime > 0x0fffffff)
        {
            // Either wraparound or data race.
            dwDeltaTime = 0;
        }
        if(dwDeltaTime > 99999)
        {
            dwDeltaTime = 99999;
        }
        sprintf (traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.wHour,
                 systemTime.wMinute, systemTime.wSecond,
                 systemTime.wMilliseconds, dwDeltaTime);
    }
    // Messages is 12 characters.
    return 22;
}

WebRtc_Word32 TraceWindows::AddBuildInfo(char* traceMessage) const
{
    // write data and time to text file
    sprintf(traceMessage, "Build info: %s", BUILDINFO);
    // Include NULL termination (hence + 1).
    return static_cast<WebRtc_Word32>(strlen(traceMessage)+1);
}

WebRtc_Word32 TraceWindows::AddDateTimeInfo(char* traceMessage) const
{
    _prevAPITickCount = timeGetTime();
    _prevTickCount = _prevAPITickCount;

    SYSTEMTIME sysTime;
    GetLocalTime (&sysTime);

    TCHAR szDateStr[20];
    TCHAR szTimeStr[20];
    TCHAR *pSzDateStr = szDateStr;
    TCHAR *pSzTimeStr = szTimeStr;

    // Create date string (e.g. Apr 04 2002)
    GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, TEXT("MMM dd yyyy"),
                  szDateStr, 20);

    // Create time string (e.g. 15:32:08)
    GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, TEXT("HH':'mm':'ss"),
                  szTimeStr, 20);

    sprintf(traceMessage, "Local Date: %s Local Time: %s", szDateStr,
            szTimeStr);

    // Include NULL termination (hence + 1).
    return static_cast<WebRtc_Word32>(strlen(traceMessage)+ 1);
}
} // namespace webrtc
