summaryrefslogtreecommitdiff
path: root/AudioManagerUtilities/src/CAmLoggerStdOut.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'AudioManagerUtilities/src/CAmLoggerStdOut.cpp')
-rwxr-xr-xAudioManagerUtilities/src/CAmLoggerStdOut.cpp264
1 files changed, 264 insertions, 0 deletions
diff --git a/AudioManagerUtilities/src/CAmLoggerStdOut.cpp b/AudioManagerUtilities/src/CAmLoggerStdOut.cpp
new file mode 100755
index 0000000..0e3e4dd
--- /dev/null
+++ b/AudioManagerUtilities/src/CAmLoggerStdOut.cpp
@@ -0,0 +1,264 @@
+/**
+ * SPDX license identifier: MPL-2.0
+ *
+ * Copyright (C) 2017, ADIT GmbH
+ *
+ * This file is part of GENIVI Project AudioManager.
+ *
+ * Contributions are licensed to the GENIVI Alliance under one or more
+ * Contribution License Agreements.
+ *
+ * \copyright
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+ * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * \author Jens Lorenz, jlorenz@de.adit-jv.com ADIT 2017
+ * \author Mattia Guerra, mguerra@de.adit-jv.com ADIT 2017
+ * \author Martin Koch, mkoch@de.adit-jv.com ADIT 2020
+ *
+ * \file CAmLoggerStdOut.cpp
+ * For further information see http://www.genivi.org/.
+ *
+ */
+
+#include <algorithm>
+#include <iostream>
+#include <sstream>
+#include <mutex>
+#include <iomanip>
+#include "CAmLogWrapper.h"
+#include "CAmLoggerStdOut.h"
+#include "CAmTimeUtility.h"
+
+using namespace std;
+
+namespace am
+{
+
+#define PADDING_WIDTH 4
+
+pthread_mutex_t gStdOutMtx = PTHREAD_MUTEX_INITIALIZER;
+
+ostream &operator <<(ostream &out, const class CStdOutHeader &h)
+{
+ out << CAmTimeUtility::now() << h.mCc << "[" << setw(PADDING_WIDTH) << left << string(h.mCtx, 0, PADDING_WIDTH) << "] " << CC_RESET;
+ return out;
+}
+
+CAmLogContextStdOut::CAmLogContextStdOut(const char *id, const am_LogLevel_e level, const am_LogStatus_e status)
+ : mHeader(id, CC_GREEN)
+ , mLogLevel(level)
+ , mLogStatus(status)
+{
+}
+
+void CAmLogContextStdOut::changeLogLS(const am_LogLevel_e level, const am_LogStatus_e status)
+{
+ mLogLevel = level;
+ mLogStatus = status;
+}
+
+void CAmLogContextStdOut::append(const int8_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const uint8_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const int16_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const uint16_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const int32_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const uint32_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const uint64_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const int64_t value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const bool value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const char *value)
+{
+ appendStdOut(value);
+}
+
+void CAmLogContextStdOut::append(const vector<uint8_t> &data)
+{
+ cout << data.data() << " ";
+}
+
+template<class T>
+void CAmLogContextStdOut::appendStdOut(T value)
+{
+ cout << value << " ";
+}
+
+bool CAmLogContextStdOut::configure(const am_LogLevel_e loglevel)
+{
+ if ((mLogStatus == LS_OFF) || (loglevel > mLogLevel))
+ {
+ return false;
+ }
+
+ pthread_mutex_lock(&gStdOutMtx);
+
+ switch (loglevel)
+ {
+ case LL_ERROR:
+ cout << mHeader << CC_RED;
+ break;
+ case LL_WARN:
+ cout << mHeader << CC_YELLOW;
+ break;
+ default:
+ cout << mHeader << CC_RESET;
+ break;
+ }
+
+ return true;
+}
+
+bool CAmLogContextStdOut::checkLogLevel(const am_LogLevel_e logLevel)
+{
+ return ((mLogStatus == LS_ON) && (logLevel <= mLogLevel));
+}
+
+void CAmLogContextStdOut::send()
+{
+ // NOTE: The color is set in the configure function
+ cout << CC_RESET << endl;
+ pthread_mutex_unlock(&gStdOutMtx);
+}
+
+CAmLoggerStdOut::CAmLoggerStdOut(const am_LogStatus_e status, const bool onlyError)
+ : mLogStatus(status)
+ , mStandardLogLevel(onlyError ? LL_ERROR : LL_INFO)
+{
+ if (mLogStatus == LS_OFF)
+ {
+ cout << mHeader << "Running without Logging support" << endl;
+ }
+}
+
+CAmLoggerStdOut::~CAmLoggerStdOut()
+{
+ unregisterApp();
+}
+
+void CAmLoggerStdOut::unregisterApp()
+{
+ for (auto &&context : mCtxTable)
+ {
+ unregisterContext(context.first);
+ }
+}
+
+void CAmLoggerStdOut::registerApp(const char *appid, const char *description)
+{
+ if (mLogStatus == LS_ON)
+ {
+ cout << mHeader << "Register Application " << string(appid, PADDING_WIDTH) << ", " << description << endl;
+ }
+
+ registerContext(DEFAULT_CONTEXT, DEFAULT_DESCRIPTION);
+}
+
+IAmLogContext &CAmLoggerStdOut::registerContext(const char *contextid, const char *description)
+{
+ return registerContext(contextid, description, mStandardLogLevel, mLogStatus);
+}
+
+IAmLogContext &CAmLoggerStdOut::registerContext(const char *contextid, const char *description,
+ const am_LogLevel_e level, const am_LogStatus_e status)
+{
+ // check, if we already have this context
+ for (auto &ctx : mCtxTable)
+ {
+ if (contextid && strncmp(contextid, ctx.first, PADDING_WIDTH) == 0)
+ {
+ ctx.second->changeLogLS(level, status);
+ return *ctx.second;
+ }
+ }
+
+ // Not in list. Create new
+ if (mLogStatus == LS_ON)
+ {
+ cout << mHeader << "Registering Context " << string(contextid, PADDING_WIDTH) << ", " << description << endl;
+ }
+ size_t len = (contextid ? strlen(contextid) : 0);
+ char *pKey = new char[1 + len];
+ strncpy(pKey, contextid, len);
+ pKey[len] = '\0';
+ auto *pContext = new CAmLogContextStdOut(contextid, level, status);
+ pContext->changeLogLS(level, status);
+ mCtxTable[pKey] = pContext;
+
+ return *pContext;
+}
+
+IAmLogContext &CAmLoggerStdOut::importContext(const char *contextid)
+{
+ // check, if we have this context
+ contextid = (contextid ? contextid : DEFAULT_CONTEXT);
+ for (auto &ctx : mCtxTable)
+ {
+ if (contextid && strncmp(ctx.first, contextid, PADDING_WIDTH) == 0)
+ {
+ return *ctx.second;
+ }
+ }
+
+ // no match. Fall back to default context
+ return importContext(DEFAULT_CONTEXT);
+}
+
+void CAmLoggerStdOut::unregisterContext(const char *contextid)
+{
+ for (auto it = mCtxTable.begin(); it != mCtxTable.end(); ++it)
+ {
+ if (contextid && strncmp(contextid, it->first, PADDING_WIDTH) == 0)
+ {
+ delete it->second;
+ const char *key = it->first;
+ mCtxTable.erase(it);
+ delete key;
+
+ if (mLogStatus == LS_ON)
+ {
+ cout << mHeader << string(contextid, PADDING_WIDTH) << " unregistered" << endl;
+ }
+
+ return;
+ }
+ }
+}
+
+}