summaryrefslogtreecommitdiff
path: root/Source/CPack/cmCPackLog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/CPack/cmCPackLog.cxx')
-rw-r--r--Source/CPack/cmCPackLog.cxx225
1 files changed, 225 insertions, 0 deletions
diff --git a/Source/CPack/cmCPackLog.cxx b/Source/CPack/cmCPackLog.cxx
new file mode 100644
index 000000000..4e8bf0f4e
--- /dev/null
+++ b/Source/CPack/cmCPackLog.cxx
@@ -0,0 +1,225 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License for more information.
+============================================================================*/
+
+#include "cmCPackLog.h"
+
+#include "cmGeneratedFileStream.h"
+#include "cmSystemTools.h"
+
+//----------------------------------------------------------------------
+cmCPackLog::cmCPackLog()
+{
+ this->Verbose = false;
+ this->Debug = false;
+ this->Quiet = false;
+ this->NewLine = true;
+
+ this->LastTag = cmCPackLog::NOTAG;
+#undef cerr
+#undef cout
+ this->DefaultOutput = &std::cout;
+ this->DefaultError = &std::cerr;
+
+ this->LogOutput = 0;
+ this->LogOutputCleanup = false;
+}
+
+//----------------------------------------------------------------------
+cmCPackLog::~cmCPackLog()
+{
+ this->SetLogOutputStream(0);
+}
+
+//----------------------------------------------------------------------
+void cmCPackLog::SetLogOutputStream(std::ostream* os)
+{
+ if ( this->LogOutputCleanup && this->LogOutput )
+ {
+ delete this->LogOutput;
+ }
+ this->LogOutputCleanup = false;
+ this->LogOutput = os;
+}
+
+//----------------------------------------------------------------------
+bool cmCPackLog::SetLogOutputFile(const char* fname)
+{
+ cmGeneratedFileStream *cg = 0;
+ if ( fname )
+ {
+ cg = new cmGeneratedFileStream(fname);
+ }
+ if ( cg && !*cg )
+ {
+ delete cg;
+ cg = 0;
+ }
+ this->SetLogOutputStream(cg);
+ if ( !cg )
+ {
+ return false;
+ }
+ this->LogOutputCleanup = true;
+ return true;
+}
+
+//----------------------------------------------------------------------
+void cmCPackLog::Log(int tag, const char* file, int line,
+ const char* 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.size() > 0 ) { tagString += ","; }
+ tagString = "VERBOSE";
+ }
+ }
+ if ( tag & LOG_WARNING )
+ {
+ warning = true;
+ display = true;
+ if ( needTagString )
+ {
+ if ( tagString.size() > 0 ) { tagString += ","; }
+ tagString = "WARNING";
+ }
+ }
+ if ( tag & LOG_ERROR )
+ {
+ error = true;
+ display = true;
+ if ( needTagString )
+ {
+ if ( tagString.size() > 0 ) { tagString += ","; }
+ tagString = "ERROR";
+ }
+ }
+ if ( tag & LOG_DEBUG && this->Debug )
+ {
+ debug = true;
+ display = true;
+ if ( needTagString )
+ {
+ if ( tagString.size() > 0 ) { tagString += ","; }
+ tagString = "DEBUG";
+ }
+ useFileAndLine = true;
+ }
+ if ( tag & LOG_VERBOSE && this->Verbose )
+ {
+ verbose = true;
+ display = true;
+ if ( needTagString )
+ {
+ if ( tagString.size() > 0 ) { 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.c_str();
+ }
+ else if ( warning && !this->WarningPrefix.empty() )
+ {
+ *this->DefaultError << this->WarningPrefix.c_str();
+ }
+ else if ( output && !this->OutputPrefix.empty() )
+ {
+ *this->DefaultOutput << this->OutputPrefix.c_str();
+ }
+ else if ( verbose && !this->VerbosePrefix.empty() )
+ {
+ *this->DefaultOutput << this->VerbosePrefix.c_str();
+ }
+ else if ( debug && !this->DebugPrefix.empty() )
+ {
+ *this->DefaultOutput << this->DebugPrefix.c_str();
+ }
+ else if ( !this->Prefix.empty() )
+ {
+ *this->DefaultOutput << this->Prefix.c_str();
+ }
+ 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::SetErrorOccured();
+ }
+}