1/*
2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "trace_win.h"
12
13#include <cassert>
14#include <stdarg.h>
15
16#include "Mmsystem.h"
17
18#if defined(_DEBUG)
19    #define BUILDMODE "d"
20#elif defined(DEBUG)
21    #define BUILDMODE "d"
22#elif defined(NDEBUG)
23    #define BUILDMODE "r"
24#else
25    #define BUILDMODE "?"
26#endif
27#define BUILDTIME __TIME__
28#define BUILDDATE __DATE__
29// Example: "Oct 10 2002 12:05:30 r"
30#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
31
32namespace webrtc {
33TraceWindows::TraceWindows()
34    : _prevAPITickCount(0),
35      _prevTickCount(0)
36{
37}
38
39TraceWindows::~TraceWindows()
40{
41    StopThread();
42}
43
44WebRtc_Word32 TraceWindows::AddTime(char* traceMessage,
45                                    const TraceLevel level) const
46{
47    WebRtc_UWord32 dwCurrentTime = timeGetTime();
48    SYSTEMTIME systemTime;
49    GetSystemTime(&systemTime);
50
51    if(level == kTraceApiCall)
52    {
53        WebRtc_UWord32 dwDeltaTime = dwCurrentTime- _prevTickCount;
54        _prevTickCount = dwCurrentTime;
55
56        if(_prevTickCount == 0)
57        {
58            dwDeltaTime = 0;
59        }
60        if(dwDeltaTime > 0x0fffffff)
61        {
62            // Either wraparound or data race.
63            dwDeltaTime = 0;
64        }
65        if(dwDeltaTime > 99999)
66        {
67            dwDeltaTime = 99999;
68        }
69
70        sprintf (traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.wHour,
71                 systemTime.wMinute, systemTime.wSecond,
72                 systemTime.wMilliseconds, dwDeltaTime);
73    } else {
74        WebRtc_UWord32 dwDeltaTime = dwCurrentTime - _prevAPITickCount;
75        _prevAPITickCount = dwCurrentTime;
76
77        if(_prevAPITickCount == 0)
78        {
79            dwDeltaTime = 0;
80        }
81        if(dwDeltaTime > 0x0fffffff)
82        {
83            // Either wraparound or data race.
84            dwDeltaTime = 0;
85        }
86        if(dwDeltaTime > 99999)
87        {
88            dwDeltaTime = 99999;
89        }
90        sprintf (traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.wHour,
91                 systemTime.wMinute, systemTime.wSecond,
92                 systemTime.wMilliseconds, dwDeltaTime);
93    }
94    // Messages is 12 characters.
95    return 22;
96}
97
98WebRtc_Word32 TraceWindows::AddBuildInfo(char* traceMessage) const
99{
100    // write data and time to text file
101    sprintf(traceMessage, "Build info: %s", BUILDINFO);
102    // Include NULL termination (hence + 1).
103    return static_cast<WebRtc_Word32>(strlen(traceMessage)+1);
104}
105
106WebRtc_Word32 TraceWindows::AddDateTimeInfo(char* traceMessage) const
107{
108    _prevAPITickCount = timeGetTime();
109    _prevTickCount = _prevAPITickCount;
110
111    SYSTEMTIME sysTime;
112    GetLocalTime (&sysTime);
113
114    TCHAR szDateStr[20];
115    TCHAR szTimeStr[20];
116
117    // Create date string (e.g. Apr 04 2002)
118    GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, TEXT("MMM dd yyyy"),
119                  szDateStr, 20);
120
121    // Create time string (e.g. 15:32:08)
122    GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, TEXT("HH':'mm':'ss"),
123                  szTimeStr, 20);
124
125    sprintf(traceMessage, "Local Date: %s Local Time: %s", szDateStr,
126            szTimeStr);
127
128    // Include NULL termination (hence + 1).
129    return static_cast<WebRtc_Word32>(strlen(traceMessage)+ 1);
130}
131} // namespace webrtc
132