summaryrefslogtreecommitdiffhomepage
path: root/ovr_sdk_win_23.0.0/Logging/src/Logging_OutputPlugins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ovr_sdk_win_23.0.0/Logging/src/Logging_OutputPlugins.cpp')
-rw-r--r--ovr_sdk_win_23.0.0/Logging/src/Logging_OutputPlugins.cpp289
1 files changed, 289 insertions, 0 deletions
diff --git a/ovr_sdk_win_23.0.0/Logging/src/Logging_OutputPlugins.cpp b/ovr_sdk_win_23.0.0/Logging/src/Logging_OutputPlugins.cpp
new file mode 100644
index 0000000..3b6ccc2
--- /dev/null
+++ b/ovr_sdk_win_23.0.0/Logging/src/Logging_OutputPlugins.cpp
@@ -0,0 +1,289 @@
+/************************************************************************************
+
+Filename : Logging_OutputPlugins.cpp
+Content : Logging output plugins
+Created : Oct 26, 2015
+Authors : Chris Taylor
+
+Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
+
+Licensed under the Oculus Master SDK License Version 1.0 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+https://developer.oculus.com/licenses/oculusmastersdk-1.0
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+************************************************************************************/
+
+#include "Logging/Logging_OutputPlugins.h"
+#include "Logging/Logging_Tools.h"
+
+#include <time.h>
+#include <iostream>
+
+namespace ovrlog {
+
+//-----------------------------------------------------------------------------
+// Console
+
+OutputConsole::OutputConsole(bool useStdio) : UseStdio(useStdio) {}
+
+OutputConsole::~OutputConsole() {}
+
+void OutputConsole::SetStdioUsage(bool enable) {
+ UseStdio = enable;
+}
+
+const char* OutputConsole::GetUniquePluginName() {
+ return "DefaultOutputConsole";
+}
+
+void OutputConsole::Write(
+ Level level,
+ const char* /*subsystem*/,
+ const char* header,
+ const char* utf8msg) {
+#if defined(_WIN32)
+ HANDLE hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
+
+ // Save current console attributes
+ CONSOLE_SCREEN_BUFFER_INFO bufInfo{};
+ BOOL oldAttrValid = ::GetConsoleScreenBufferInfo(hConsole, &bufInfo);
+ WORD attr = 0;
+
+ switch (level) {
+ case Level::Disabled: // Shouldn't occur, but we handle for consistency.
+ attr |= FOREGROUND_BLUE;
+ break;
+ case Level::Trace:
+ attr |= FOREGROUND_BLUE | FOREGROUND_RED;
+ break;
+ case Level::Debug:
+ attr |= FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
+ break;
+ case Level::Info:
+ attr |= FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
+ break;
+ case Level::Warning:
+ attr |= FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
+ break;
+ case Level::Error:
+ attr |= FOREGROUND_RED | FOREGROUND_INTENSITY;
+ break;
+ default:
+ break;
+ }
+ static_assert(Level::Count == static_cast<Level>(6), "Needs updating");
+
+ ::SetConsoleTextAttribute(hConsole, attr & ~FOREGROUND_INTENSITY);
+
+ if (UseStdio)
+ std::cout << header;
+ else {
+ DWORD dwCount;
+ DWORD headerLength = (DWORD)strlen(header);
+
+ WriteConsoleA(hConsole, header, headerLength, &dwCount, nullptr);
+ }
+
+ if ((attr & FOREGROUND_INTENSITY) != 0) {
+ ::SetConsoleTextAttribute(hConsole, attr);
+ }
+
+ if (UseStdio)
+ std::cout << utf8msg << std::endl;
+ else {
+ DWORD dwCount;
+ DWORD msgLength = (DWORD)strlen(utf8msg);
+
+ WriteConsoleA(hConsole, utf8msg, msgLength, &dwCount, nullptr);
+ WriteConsoleA(hConsole, "\n", 1, &dwCount, nullptr);
+ }
+
+ // Restore original attributes, if saved
+ if (TRUE == oldAttrValid) {
+ ::SetConsoleTextAttribute(hConsole, bufInfo.wAttributes);
+ }
+#else
+
+ FILE* output = stdout;
+
+ switch (level) {
+ case Level::Trace:
+ break;
+ case Level::Debug:
+ break;
+ case Level::Info:
+ break;
+ case Level::Warning:
+ output = stderr;
+ fprintf(output, "\e[38;5;255m\e[48;5;208m");
+ break;
+ case Level::Error:
+ output = stderr;
+ fprintf(output, "\e[38;5;255m\e[48;5;196m");
+ break;
+ default:
+ break;
+ }
+
+ fprintf(output, "%s", header);
+ fprintf(output, "\e[0m ");
+
+ fprintf(output, "%s\n", utf8msg);
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// System Application Event Log
+
+#ifndef OVR_SYSLOG_NAME
+#define OVR_SYSLOG_NAME L"OculusVR"
+#endif // OVR_SYSLOG_NAME
+
+OutputEventLog::OutputEventLog() : hEventSource(nullptr), MinReportEventLevel(Level::Error) {
+#if defined(_WIN32)
+ hEventSource = ::RegisterEventSourceW(
+ nullptr, // No server name
+ OVR_SYSLOG_NAME); // Syslog event source name
+#else
+ // To do.
+#endif
+
+ if (!hEventSource) {
+ // Unable to register event source
+ LOGGING_DEBUG_BREAK();
+ }
+}
+
+OutputEventLog::~OutputEventLog() {}
+
+const char* OutputEventLog::GetUniquePluginName() {
+ return "DefaultOutputEventLog";
+}
+
+void OutputEventLog::Write(
+ Level level,
+ const char* subsystem,
+ const char* header,
+ const char* utf8msg) {
+ (void)subsystem; // unused
+
+ if (level < MinReportEventLevel) {
+ return;
+ }
+
+ if (!hEventSource) {
+ return;
+ }
+
+#if defined(_WIN32)
+ WORD mType = 0;
+
+ switch (level) {
+ default:
+ case Level::Disabled:
+ case Level::Trace:
+ case Level::Debug:
+ case Level::Info:
+ mType = EVENTLOG_INFORMATION_TYPE;
+ return; // Do not log at this level.
+
+ case Level::Warning:
+ mType = EVENTLOG_WARNING_TYPE;
+ break; // Log at this level.
+
+ case Level::Error:
+ mType = EVENTLOG_ERROR_TYPE;
+ break; // Log at this level.
+ }
+ static_assert(Level::Count == static_cast<Level>(6), "Needs updating");
+
+ const size_t MAX_REPORT_EVENT_A_LEN = 31839;
+
+ std::vector<const char*> cstrVtr;
+ cstrVtr.push_back(header);
+ std::vector<std::string> splitStrings;
+ size_t longStringLen = strlen(utf8msg);
+ if (longStringLen >= MAX_REPORT_EVENT_A_LEN) {
+ std::string longStr(utf8msg);
+ for (size_t x = 0; x < longStringLen; x += MAX_REPORT_EVENT_A_LEN) {
+ size_t remaining = longStringLen - x;
+ std::string thisSubStr = longStr.substr(
+ x, (remaining > MAX_REPORT_EVENT_A_LEN) ? MAX_REPORT_EVENT_A_LEN : remaining);
+ splitStrings.push_back(thisSubStr);
+ }
+
+ for (size_t i = 0; i < splitStrings.size(); i++) {
+ cstrVtr.push_back(splitStrings[i].c_str());
+ }
+ } else {
+ cstrVtr.push_back(utf8msg);
+ }
+
+ if (!::ReportEventA(
+ hEventSource, // Event source
+ mType, // Event log level
+ 0, // Default category
+ 0, // Default event id
+ nullptr, // No security identifier
+ (WORD)cstrVtr.size(), // Number of strings
+ 0, // No bytes of event-specific binary data attached
+ &cstrVtr[0], // String array
+ nullptr)) // No binary data attached
+ {
+ // Unable to write event log
+ LOGGING_DEBUG_BREAK();
+ }
+#else
+ (void)header;
+ (void)utf8msg;
+ // To do.
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// DbgView
+
+OutputDbgView::OutputDbgView() {}
+
+OutputDbgView::~OutputDbgView() {}
+
+const char* OutputDbgView::GetUniquePluginName() {
+ return "DefaultOutputDbgView";
+}
+
+void OutputDbgView::Write(
+ Level level,
+ const char* subsystem,
+ const char* header,
+ const char* utf8msg) {
+ (void)subsystem; // unused
+ (void)level; // unused
+
+ // Build up a single string to send to OutputDebugStringA so it
+ // all appears on the same line in DbgView.
+ std::stringstream ss;
+ ss << header << utf8msg << "\n";
+
+#if defined(_WIN32)
+ ::OutputDebugStringA(ss.str().c_str());
+#else
+ fputs(ss.str().c_str(), stderr);
+#endif
+}
+
+} // namespace ovrlog
+
+#ifdef OVR_STRINGIZE
+#error "This code must remain independent of LibOVR"
+#endif