oculus1

annotate libovr/Src/Kernel/OVR_Log.cpp @ 1:e2f9e4603129

added LibOVR and started a simple vr wrapper.
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 14 Sep 2013 16:14:59 +0300
parents
children b069a5c27388
rev   line source
nuclear@1 1 /************************************************************************************
nuclear@1 2
nuclear@1 3 Filename : OVR_Log.cpp
nuclear@1 4 Content : Logging support
nuclear@1 5 Created : September 19, 2012
nuclear@1 6 Notes :
nuclear@1 7
nuclear@1 8 Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
nuclear@1 9
nuclear@1 10 Use of this software is subject to the terms of the Oculus license
nuclear@1 11 agreement provided at the time of installation or download, or which
nuclear@1 12 otherwise accompanies this software in either electronic or hard copy form.
nuclear@1 13
nuclear@1 14 ************************************************************************************/
nuclear@1 15
nuclear@1 16 #include "OVR_Log.h"
nuclear@1 17 #include "OVR_Std.h"
nuclear@1 18 #include <stdarg.h>
nuclear@1 19 #include <stdio.h>
nuclear@1 20
nuclear@1 21 #if defined(OVR_OS_WIN32)
nuclear@1 22 #include <windows.h>
nuclear@1 23 #elif defined(OVR_OS_ANDROID)
nuclear@1 24 #include <android/log.h>
nuclear@1 25 #endif
nuclear@1 26
nuclear@1 27 namespace OVR {
nuclear@1 28
nuclear@1 29 // Global Log pointer.
nuclear@1 30 Log* volatile OVR_GlobalLog = 0;
nuclear@1 31
nuclear@1 32 //-----------------------------------------------------------------------------------
nuclear@1 33 // ***** Log Implementation
nuclear@1 34
nuclear@1 35 Log::~Log()
nuclear@1 36 {
nuclear@1 37 // Clear out global log
nuclear@1 38 if (this == OVR_GlobalLog)
nuclear@1 39 {
nuclear@1 40 // TBD: perhaps we should ASSERT if this happens before system shutdown?
nuclear@1 41 OVR_GlobalLog = 0;
nuclear@1 42 }
nuclear@1 43 }
nuclear@1 44
nuclear@1 45 void Log::LogMessageVarg(LogMessageType messageType, const char* fmt, va_list argList)
nuclear@1 46 {
nuclear@1 47 if ((messageType & LoggingMask) == 0)
nuclear@1 48 return;
nuclear@1 49 #ifndef OVR_BUILD_DEBUG
nuclear@1 50 if (IsDebugMessage(messageType))
nuclear@1 51 return;
nuclear@1 52 #endif
nuclear@1 53
nuclear@1 54 char buffer[MaxLogBufferMessageSize];
nuclear@1 55 FormatLog(buffer, MaxLogBufferMessageSize, messageType, fmt, argList);
nuclear@1 56 DefaultLogOutput(buffer, IsDebugMessage(messageType));
nuclear@1 57 }
nuclear@1 58
nuclear@1 59 void OVR::Log::LogMessage(LogMessageType messageType, const char* pfmt, ...)
nuclear@1 60 {
nuclear@1 61 va_list argList;
nuclear@1 62 va_start(argList, pfmt);
nuclear@1 63 LogMessageVarg(messageType, pfmt, argList);
nuclear@1 64 va_end(argList);
nuclear@1 65 }
nuclear@1 66
nuclear@1 67
nuclear@1 68 void Log::FormatLog(char* buffer, unsigned bufferSize, LogMessageType messageType,
nuclear@1 69 const char* fmt, va_list argList)
nuclear@1 70 {
nuclear@1 71 bool addNewline = true;
nuclear@1 72
nuclear@1 73 switch(messageType)
nuclear@1 74 {
nuclear@1 75 case Log_Error: OVR_strcpy(buffer, bufferSize, "Error: "); break;
nuclear@1 76 case Log_Debug: OVR_strcpy(buffer, bufferSize, "Debug: "); break;
nuclear@1 77 case Log_Assert: OVR_strcpy(buffer, bufferSize, "Assert: "); break;
nuclear@1 78 case Log_Text: buffer[0] = 0; addNewline = false; break;
nuclear@1 79 case Log_DebugText: buffer[0] = 0; addNewline = false; break;
nuclear@1 80 default:
nuclear@1 81 buffer[0] = 0;
nuclear@1 82 addNewline = false;
nuclear@1 83 break;
nuclear@1 84 }
nuclear@1 85
nuclear@1 86 UPInt prefixLength = OVR_strlen(buffer);
nuclear@1 87 char *buffer2 = buffer + prefixLength;
nuclear@1 88 OVR_vsprintf(buffer2, bufferSize - prefixLength, fmt, argList);
nuclear@1 89
nuclear@1 90 if (addNewline)
nuclear@1 91 OVR_strcat(buffer, bufferSize, "\n");
nuclear@1 92 }
nuclear@1 93
nuclear@1 94
nuclear@1 95 void Log::DefaultLogOutput(const char* formattedText, bool debug)
nuclear@1 96 {
nuclear@1 97
nuclear@1 98 #if defined(OVR_OS_WIN32)
nuclear@1 99 // Under Win32, output regular messages to console if it exists; debug window otherwise.
nuclear@1 100 static DWORD dummyMode;
nuclear@1 101 static bool hasConsole = (GetStdHandle(STD_OUTPUT_HANDLE) != INVALID_HANDLE_VALUE) &&
nuclear@1 102 (GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &dummyMode));
nuclear@1 103
nuclear@1 104 if (!hasConsole || debug)
nuclear@1 105 {
nuclear@1 106 ::OutputDebugStringA(formattedText);
nuclear@1 107 }
nuclear@1 108 else
nuclear@1 109 {
nuclear@1 110 fputs(formattedText, stdout);
nuclear@1 111 }
nuclear@1 112
nuclear@1 113 #elif defined(OVR_OS_ANDROID)
nuclear@1 114 __android_log_write(ANDROID_LOG_INFO, "OVR", formattedText);
nuclear@1 115
nuclear@1 116 #else
nuclear@1 117 fputs(formattedText, stdout);
nuclear@1 118
nuclear@1 119 #endif
nuclear@1 120
nuclear@1 121 // Just in case.
nuclear@1 122 OVR_UNUSED2(formattedText, debug);
nuclear@1 123 }
nuclear@1 124
nuclear@1 125
nuclear@1 126 //static
nuclear@1 127 void Log::SetGlobalLog(Log *log)
nuclear@1 128 {
nuclear@1 129 OVR_GlobalLog = log;
nuclear@1 130 }
nuclear@1 131 //static
nuclear@1 132 Log* Log::GetGlobalLog()
nuclear@1 133 {
nuclear@1 134 // No global log by default?
nuclear@1 135 // if (!OVR_GlobalLog)
nuclear@1 136 // OVR_GlobalLog = GetDefaultLog();
nuclear@1 137 return OVR_GlobalLog;
nuclear@1 138 }
nuclear@1 139
nuclear@1 140 //static
nuclear@1 141 Log* Log::GetDefaultLog()
nuclear@1 142 {
nuclear@1 143 // Create default log pointer statically so that it can be used
nuclear@1 144 // even during startup.
nuclear@1 145 static Log defaultLog;
nuclear@1 146 return &defaultLog;
nuclear@1 147 }
nuclear@1 148
nuclear@1 149
nuclear@1 150 //-----------------------------------------------------------------------------------
nuclear@1 151 // ***** Global Logging functions
nuclear@1 152
nuclear@1 153 #define OVR_LOG_FUNCTION_IMPL(Name) \
nuclear@1 154 void Log##Name(const char* fmt, ...) \
nuclear@1 155 { \
nuclear@1 156 if (OVR_GlobalLog) \
nuclear@1 157 { \
nuclear@1 158 va_list argList; va_start(argList, fmt); \
nuclear@1 159 OVR_GlobalLog->LogMessageVarg(Log_##Name, fmt, argList); \
nuclear@1 160 va_end(argList); \
nuclear@1 161 } \
nuclear@1 162 }
nuclear@1 163
nuclear@1 164 OVR_LOG_FUNCTION_IMPL(Text)
nuclear@1 165 OVR_LOG_FUNCTION_IMPL(Error)
nuclear@1 166
nuclear@1 167 #ifdef OVR_BUILD_DEBUG
nuclear@1 168 OVR_LOG_FUNCTION_IMPL(DebugText)
nuclear@1 169 OVR_LOG_FUNCTION_IMPL(Debug)
nuclear@1 170 OVR_LOG_FUNCTION_IMPL(Assert)
nuclear@1 171 #endif
nuclear@1 172
nuclear@1 173 } // OVR