Twitch SDK (Internal)
tracer.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * Twitch Broadcasting SDK
3 *
4 * This software is supplied under the terms of a license agreement with Twitch Interactive, Inc. and
5 * may not be copied or used except in accordance with the terms of that agreement
6 * Copyright (c) 2012-2016 Twitch Interactive, Inc.
7 *********************************************************************************************/
8 
9 #pragma once
10 
13 
14 #include <memory>
15 #include <vector>
16 #include <string>
17 #include <stdarg.h>
18 #include <unordered_map>
19 
20 
21 namespace ttv
22 {
23  class IMutex;
24  class ITracer;
25  class TracerBase;
26  class AutoTracer;
27 
28  void SetTracer(std::shared_ptr<ITracer> tracer);
29 
30  namespace trace
31  {
32  void Message(const char* component, const TTV_MessageLevel messageLevel, const char* format, ...);
33  void MessageVaList(const char* component, const TTV_MessageLevel messageLevel, const char* format, va_list args);
34 
35  TTV_ErrorCode SetOutputFile(const std::string& path);
36  TTV_ErrorCode SetOutputFile(const std::wstring& path);
37 
38  TTV_ErrorCode SetComponentMessageLevel(const char* component, TTV_MessageLevel level);
39  TTV_ErrorCode GetComponentMessageLevel(const char* component, TTV_MessageLevel& level);
40 
43  }
44 }
45 
46 
48 {
49 public:
50  virtual ~ITracer();
51 
52  virtual void Message(const char* component, const TTV_MessageLevel messageLevel, const char* format, ...) = 0;
53  virtual void MessageVaList(const char* component, const TTV_MessageLevel messageLevel, const char* format, va_list args) = 0;
54 
55  virtual TTV_ErrorCode SetOutputFile(const std::string& path) = 0;
56  virtual TTV_ErrorCode SetOutputFile(const std::wstring& path) = 0;
57 
58  virtual TTV_ErrorCode SetComponentMessageLevel(const char* component, TTV_MessageLevel level) = 0;
59  virtual TTV_ErrorCode GetComponentMessageLevel(const char* component, TTV_MessageLevel& level) = 0;
60 
63 };
64 
65 
66 class ttv::TracerBase : public ITracer
67 {
68 public:
69  TracerBase();
70  virtual ~TracerBase();
71 
72  virtual void Message(const char* component, const TTV_MessageLevel messageLevel, const char* format, ...) override;
73  virtual void MessageVaList(const char* component, const TTV_MessageLevel messageLevel, const char* format, va_list args) override;
74 
75  virtual TTV_ErrorCode SetOutputFile(const std::string& path) override;
76  virtual TTV_ErrorCode SetOutputFile(const std::wstring& path) override;
77 
78  virtual TTV_ErrorCode SetComponentMessageLevel(const char* component, TTV_MessageLevel level) override;
79  virtual TTV_ErrorCode GetComponentMessageLevel(const char* component, TTV_MessageLevel& level) override;
80 
82  virtual TTV_ErrorCode GetGlobalMessageLevel(TTV_MessageLevel& level) override;
83 
84 protected:
85  bool ShouldLog(const char* component, const TTV_MessageLevel messageLevel);
86  void GetLinePrefix(const char* component, const char* messageLevel, char* buffer, size_t bufferLength);
87 
88  // Performs the actual logging to the output.
89  virtual void Log(const char* component, const char* messageLevel, const char* format, va_list args) = 0;
90 
91  virtual bool OpenFile(const std::string& path);
92  virtual bool OpenFile(const std::wstring& path);
93  virtual void LogToFile(const char* message);
94  virtual bool CloseFile();
95 
96  std::vector<char> mPrintBuffer;
97  std::unordered_map<std::string, TTV_MessageLevel> mTraceLevels;
99  std::shared_ptr<IMutex> mMutex;
100  FILE* mTraceFile;
101 };
102 
103 
105 {
106 public:
107  AutoTracer (const char* component,
108  const TTV_MessageLevel messageLevel,
109  const char* message)
110  : mComponent(component)
111  , mMessageLevel(messageLevel)
112  , mMessage(message)
113  {
114  ttv::trace::Message(mComponent, mMessageLevel, "Entering %s", mMessage); //-V111 Call of function ____ with variable number of arguments. Fourth argument has memsize type.
115  }
117  {
118  ttv::trace::Message(mComponent, mMessageLevel, "Exiting %s", mMessage); //-V111 Call of function ____ with variable number of arguments. Fourth argument has memsize type.
119  }
120 
121 private:
122  const char* mComponent;
124  const char* mMessage;
125 };
126 
TTV_ErrorCode GetGlobalMessageLevel(TTV_MessageLevel &level)
TTV_MessageLevel
Definition: tracingtypes.h:14
AutoTracer(const char *component, const TTV_MessageLevel messageLevel, const char *message)
Definition: tracer.h:107
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
std::shared_ptr< IMutex > mMutex
Tries to keep logging on different threads done atomically.
Definition: tracer.h:99
Definition: tracer.h:104
void Message(const char *component, const TTV_MessageLevel messageLevel, const char *format,...)
TTV_MessageLevel mMessageLevel
Definition: tracer.h:123
Definition: tracer.h:66
uint32_t TTV_ErrorCode
Definition: errortypes.h:30
FILE * mTraceFile
Definition: tracer.h:100
TTV_ErrorCode SetComponentMessageLevel(const char *component, TTV_MessageLevel level)
void MessageVaList(const char *component, const TTV_MessageLevel messageLevel, const char *format, va_list args)
TTV_ErrorCode SetGlobalMessageLevel(TTV_MessageLevel level)
TTV_ErrorCode GetComponentMessageLevel(const char *component, TTV_MessageLevel &level)
std::vector< char > mPrintBuffer
Definition: tracer.h:96
const char * mMessage
Definition: tracer.h:124
std::unordered_map< std::string, TTV_MessageLevel > mTraceLevels
Definition: tracer.h:97
const char * mComponent
Definition: tracer.h:122
Definition: tracer.h:47
TTV_MessageLevel mGlobalTraceLevel
Definition: tracer.h:98
void SetTracer(std::shared_ptr< ITracer > tracer)
~AutoTracer()
Definition: tracer.h:116
TTV_ErrorCode SetOutputFile(const std::string &path)