|  | /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
|  | file LICENSE.rst or https://cmake.org/licensing for details.  */ | 
|  | #include "cmCPackLog.h" | 
|  |  | 
|  | #include <iostream> | 
|  |  | 
|  | #include <cm/memory> | 
|  |  | 
|  | #include "cmGeneratedFileStream.h" | 
|  | #include "cmSystemTools.h" | 
|  |  | 
|  | cmCPackLog::cmCPackLog() | 
|  | { | 
|  | this->DefaultOutput = &std::cout; | 
|  | this->DefaultError = &std::cerr; | 
|  | } | 
|  |  | 
|  | cmCPackLog::~cmCPackLog() = default; | 
|  |  | 
|  | void cmCPackLog::SetLogOutputStream(std::ostream* os) | 
|  | { | 
|  | this->LogOutputStream.reset(); | 
|  | this->LogOutput = os; | 
|  | } | 
|  |  | 
|  | bool cmCPackLog::SetLogOutputFile(char const* fname) | 
|  | { | 
|  | this->LogOutputStream.reset(); | 
|  | if (fname) { | 
|  | this->LogOutputStream = cm::make_unique<cmGeneratedFileStream>(fname); | 
|  | } | 
|  | if (this->LogOutputStream && !*this->LogOutputStream) { | 
|  | this->LogOutputStream.reset(); | 
|  | } | 
|  |  | 
|  | this->LogOutput = this->LogOutputStream.get(); | 
|  |  | 
|  | return this->LogOutput != nullptr; | 
|  | } | 
|  |  | 
|  | void cmCPackLog::Log(int tag, char const* file, int line, char const* msg, | 
|  | size_t length) | 
|  | { | 
|  | // By default no logging | 
|  | bool display = false; | 
|  |  | 
|  | // Display file and line number if debug | 
|  | bool useFileAndLine = this->Debug; | 
|  |  | 
|  | bool output = false; | 
|  | bool debug = false; | 
|  | bool warning = false; | 
|  | bool error = false; | 
|  | bool verbose = false; | 
|  |  | 
|  | // When writing in file, add list of tags whenever tag changes. | 
|  | std::string tagString; | 
|  | bool needTagString = false; | 
|  | if (this->LogOutput && this->LastTag != tag) { | 
|  | needTagString = true; | 
|  | } | 
|  |  | 
|  | if (tag & LOG_OUTPUT) { | 
|  | output = true; | 
|  | display = true; | 
|  | if (needTagString) { | 
|  | if (!tagString.empty()) { | 
|  | tagString += ","; | 
|  | } | 
|  | tagString += "VERBOSE"; | 
|  | } | 
|  | } | 
|  | if (tag & LOG_WARNING) { | 
|  | warning = true; | 
|  | display = true; | 
|  | if (needTagString) { | 
|  | if (!tagString.empty()) { | 
|  | tagString += ","; | 
|  | } | 
|  | tagString += "WARNING"; | 
|  | } | 
|  | } | 
|  | if (tag & LOG_ERROR) { | 
|  | error = true; | 
|  | display = true; | 
|  | if (needTagString) { | 
|  | if (!tagString.empty()) { | 
|  | tagString += ","; | 
|  | } | 
|  | tagString += "ERROR"; | 
|  | } | 
|  | } | 
|  | if (tag & LOG_DEBUG && this->Debug) { | 
|  | debug = true; | 
|  | display = true; | 
|  | if (needTagString) { | 
|  | if (!tagString.empty()) { | 
|  | tagString += ","; | 
|  | } | 
|  | tagString += "DEBUG"; | 
|  | } | 
|  | useFileAndLine = true; | 
|  | } | 
|  | if (tag & LOG_VERBOSE && this->Verbose) { | 
|  | verbose = true; | 
|  | display = true; | 
|  | if (needTagString) { | 
|  | if (!tagString.empty()) { | 
|  | tagString += ","; | 
|  | } | 
|  | tagString += "VERBOSE"; | 
|  | } | 
|  | } | 
|  | if (this->Quiet) { | 
|  | display = false; | 
|  | } | 
|  | if (this->LogOutput) { | 
|  | if (needTagString) { | 
|  | *this->LogOutput << "[" << file << ":" << line << " " << tagString | 
|  | << "] "; | 
|  | } | 
|  | this->LogOutput->write(msg, length); | 
|  | } | 
|  | this->LastTag = tag; | 
|  | if (!display) { | 
|  | return; | 
|  | } | 
|  | if (this->NewLine) { | 
|  | if (error && !this->ErrorPrefix.empty()) { | 
|  | *this->DefaultError << this->ErrorPrefix; | 
|  | } else if (warning && !this->WarningPrefix.empty()) { | 
|  | *this->DefaultError << this->WarningPrefix; | 
|  | } else if (output && !this->OutputPrefix.empty()) { | 
|  | *this->DefaultOutput << this->OutputPrefix; | 
|  | } else if (verbose && !this->VerbosePrefix.empty()) { | 
|  | *this->DefaultOutput << this->VerbosePrefix; | 
|  | } else if (debug && !this->DebugPrefix.empty()) { | 
|  | *this->DefaultOutput << this->DebugPrefix; | 
|  | } else if (!this->Prefix.empty()) { | 
|  | *this->DefaultOutput << this->Prefix; | 
|  | } | 
|  | if (useFileAndLine) { | 
|  | if (error || warning) { | 
|  | *this->DefaultError << file << ":" << line << " "; | 
|  | } else { | 
|  | *this->DefaultOutput << file << ":" << line << " "; | 
|  | } | 
|  | } | 
|  | } | 
|  | if (error || warning) { | 
|  | this->DefaultError->write(msg, length); | 
|  | this->DefaultError->flush(); | 
|  | } else { | 
|  | this->DefaultOutput->write(msg, length); | 
|  | this->DefaultOutput->flush(); | 
|  | } | 
|  | if (msg[length - 1] == '\n' || length > 2) { | 
|  | this->NewLine = true; | 
|  | } | 
|  |  | 
|  | if (error) { | 
|  | cmSystemTools::SetErrorOccurred(); | 
|  | } | 
|  | } |