--- /dev/null
+// local includes
+#include "includes/log.h"
+
+namespace linuxdeploy {
+ namespace core {
+ namespace log {
+ LD_LOGLEVEL ldLog::verbosity = LD_INFO;
+
+ void ldLog::setVerbosity(LD_LOGLEVEL verbosity) {
+ ldLog::verbosity = verbosity;
+ }
+
+ ldLog::ldLog() {
+ prependSpace = false;
+ currentLogLevel = LD_INFO;
+ logLevelSet = false;
+ };
+
+ ldLog::ldLog(bool prependSpace, bool logLevelSet, LD_LOGLEVEL logLevel) {
+ this->prependSpace = prependSpace;
+ this->currentLogLevel = logLevel;
+ this->logLevelSet = logLevelSet;
+ }
+
+ void ldLog::checkPrependSpace() {
+ if (prependSpace) {
+ stream << " ";
+ prependSpace = false;
+ }
+ }
+
+ bool ldLog::checkVerbosity() {
+// std::cerr << "current: " << currentLogLevel << " verbosity: " << verbosity << std::endl;
+ return (currentLogLevel >= verbosity);
+ }
+
+ ldLog ldLog::operator<<(const std::string& message) {
+ if (checkVerbosity()) {
+ checkPrependSpace();
+ stream << message;
+ }
+
+ return ldLog(true, logLevelSet, currentLogLevel);
+ }
+ ldLog ldLog::operator<<(const char* message) {
+ if (checkVerbosity()) {
+ checkPrependSpace();
+ stream << message;
+ }
+
+ return ldLog(true, logLevelSet, currentLogLevel);
+ }
+
+ ldLog ldLog::operator<<(const boost::filesystem::path& path) {
+ if (checkVerbosity()) {
+ checkPrependSpace();
+ stream << path.string();
+ }
+
+ return ldLog(true, logLevelSet, currentLogLevel);
+ }
+
+ ldLog ldLog::operator<<(const int val) {
+ return ldLog::operator<<(std::to_string(val));
+ }
+
+ ldLog ldLog::operator<<(const size_t val) {
+ return ldLog::operator<<(std::to_string(val));
+ }
+
+ ldLog ldLog::operator<<(const double val) {
+ return ldLog::operator<<(std::to_string(val));
+ }
+
+ ldLog ldLog::operator<<(stdEndlType strm) {
+ if (checkVerbosity()) {
+ checkPrependSpace();
+ stream << strm;
+ }
+
+ return ldLog(false, logLevelSet, currentLogLevel);
+ }
+
+ ldLog ldLog::operator<<(const LD_LOGLEVEL logLevel) {
+ if (logLevelSet) {
+ throw std::runtime_error(
+ "log level must be first element passed via the stream insertion operator");
+ }
+
+ logLevelSet = true;
+ currentLogLevel = logLevel;
+
+ if (checkVerbosity()) {
+ switch (logLevel) {
+ case LD_DEBUG:
+ stream << "DEBUG: ";
+ break;
+ case LD_WARNING:
+ stream << "WARNING: ";
+ break;
+ case LD_ERROR:
+ stream << "ERROR: ";
+ break;
+ default:
+ break;
+ }
+ }
+
+ return ldLog(false, logLevelSet, currentLogLevel);
+ }
+
+ ldLog ldLog::operator<<(const LD_STREAM_CONTROL streamControl) {
+ bool prependSpace = true;
+
+ switch (streamControl) {
+ case LD_NO_SPACE:
+ prependSpace = false;
+ break;
+ default:
+ break;
+ }
+
+ return ldLog(prependSpace, logLevelSet, currentLogLevel);
+ }
+
+ void ldLog::write(const char* s, const size_t n) {
+ stream.write(s, n);
+ }
+ }
+ }
+}