diff --git a/uppsrc/ide/Builders/AndroidBuilder.cpp b/uppsrc/ide/Builders/AndroidBuilder.cpp index 489260dc3..8fab0aa6a 100644 --- a/uppsrc/ide/Builders/AndroidBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidBuilder.cpp @@ -2,9 +2,7 @@ #include "AndroidBuilder.h" #include "BuilderUtils.h" -#define METHOD_NAME "AndroidBuilder::" + String(__func__) + "(): " -#define ERROR_METHOD_NAME "[ERROR] " METHOD_NAME -#define INFO_METHOD_NAME "[INFO] " METHOD_NAME +#define METHOD_NAME "AndroidBuilder::" << UPP_FUNCTION_NAME << "(): " const String AndroidBuilder::RES_PKG_FLAG = "ANDROID_RESOURCES_PACKAGE"; @@ -39,6 +37,8 @@ bool AndroidBuilder::BuildPackage( const Vector& all_libraries, int) { + LoggerDebug() << METHOD_NAME; + InitProject(); if(!ValidateBuilderEnviorement()) return false; @@ -152,12 +152,12 @@ bool AndroidBuilder::BuildPackage( } if(isResourcesPackage || nativeSources.IsEmpty()) { - LOG(INFO_METHOD_NAME + "There are not native files in the following package " + package + "."); + LoggerDebug() << METHOD_NAME << "There are not native files in the following package " << package << "."; return true; } if(isBlitz) { - LOG(INFO_METHOD_NAME + "Creating blitz step for package " + package + "."); + LoggerDebug() << METHOD_NAME << "Creating blitz step for package " << package << "."; BlitzBuilderComponent bc(this); bc.SetWorkingDir(project->GetJniDir() + DIR_SEPS + package); @@ -169,7 +169,7 @@ bool AndroidBuilder::BuildPackage( noBlitzNativeSourceFiles); if(!FileExists(blitz.path)) { - LOG(ERROR_METHOD_NAME + "Blitz was enable, but no blitz file generated."); + LoggerError() << METHOD_NAME << "Blitz was enable, but no blitz file generated."; } else { nativeSources.Add(package + DIR_SEPS + GetFileName(blitz.path)); @@ -431,7 +431,7 @@ bool AndroidBuilder::MovePackageFileToAndroidProject(const String& src, const St { String directory = GetFileDirectory(dst); if(!RealizeDirectory(directory)) { - LOG(ERROR_METHOD_NAME + "Cannot relize following directory: \"" + directory + "\"."); + LoggerError() << METHOD_NAME << "Cannot relize following directory: \"" << directory << "\"."; return false; } diff --git a/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp b/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp index 061beb88c..4fbe7ff9e 100644 --- a/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp +++ b/uppsrc/ide/Builders/AndroidModuleMakeFileBuilder.cpp @@ -1,8 +1,6 @@ #include "AndroidBuilder.h" -#define METHOD_NAME "AndroidModuleMakeFileCreator::" + String(__FUNCTION__) + "(): " -#define ERROR_METHOD_NAME "[ERROR] " METHOD_NAME -#define INFO_METHOD_NAME "[INFO] " METHOD_NAME +#define METHOD_NAME "AndroidModuleMakeFileCreator::" << UPP_FUNCTION_NAME << "(): " namespace Upp { @@ -71,18 +69,18 @@ bool AndroidModuleMakeFileCreator::Save(const String& path) { String directory = GetFileDirectory(path); if (!RealizeDirectory(directory)) { - LOG(ERROR_METHOD_NAME + "Creating module directory failed \"" + directory + "\"."); + LoggerError() << METHOD_NAME << "Creating module directory failed \"" << directory << "\"."; return false; } String data = Create(); if (FileExists(path) && LoadFile(path) == data) { - LOG(INFO_METHOD_NAME + "Following file \"" + path + "\" content is the same as previous one."); + LoggerInfo() << METHOD_NAME << "Following file \"" << path << "\" content is the same as previous one."; return true; } if (!SaveFile(path, Create())) { - LOG(ERROR_METHOD_NAME + "Saving module file failed \"" + path + "\"."); + LoggerError() << METHOD_NAME << "Saving module file failed \"" << path << "\"."; return false; } diff --git a/uppsrc/ide/Core/Core.h b/uppsrc/ide/Core/Core.h index 791849def..93c509837 100644 --- a/uppsrc/ide/Core/Core.h +++ b/uppsrc/ide/Core/Core.h @@ -6,6 +6,8 @@ //#include #include +#include "Logger.h" + using namespace Upp; int CharFilterCid(int c); diff --git a/uppsrc/ide/Core/Core.upp b/uppsrc/ide/Core/Core.upp index ad2c18219..aeec58de3 100644 --- a/uppsrc/ide/Core/Core.upp +++ b/uppsrc/ide/Core/Core.upp @@ -16,10 +16,13 @@ file Host readonly separator, Host.h, Host.cpp, - Documentation readonly separator, HostTools.h, HostTools.cpp, - src.tpp, + Logger readonly separator, + Logger.cpp, + Logger.h, Info readonly separator, - Copying; + Copying, + Documentation readonly separator, + src.tpp; diff --git a/uppsrc/ide/Core/Logger.cpp b/uppsrc/ide/Core/Logger.cpp new file mode 100644 index 000000000..72f52d6d8 --- /dev/null +++ b/uppsrc/ide/Core/Logger.cpp @@ -0,0 +1,72 @@ +#include "Logger.h" + +using namespace Upp; + +Logger::Logger(LoggingLevel level, const String& tag) + : level(level) + , tag(tag) +{ +} + +Logger::~Logger() +{ + Log(); +} + +void Logger::Log() +{ + StringStream ss; + + String output = outputStream.GetResult(); + if (output.IsEmpty()) + return; + + ss << GetCurrentTime(); + ss << " " << level; + if (!tag.IsEmpty()) + { + ss << "/" << tag; + } + ss << " " << output; + + LOG(ss.GetResult()); +} + +String Logger::GetCurrentTime() +{ + // TODO: Add support for ms somehow... + + time_t currentTime = time(nullptr); + tm* timeInfo = localtime(¤tTime); + + StringStream ss; + ss << AlignTime(timeInfo->tm_hour) << ":" + << AlignTime(timeInfo->tm_min) << ":" + << AlignTime(timeInfo->tm_sec); + + return ss.GetResult(); +} + +String Logger::AlignTime(int timeValue, int level) +{ + String alignedTime = IntStr(timeValue); + for (int i = 0; i < level - alignedTime.GetLength(); i++) { + alignedTime = "0" + alignedTime; + } + return alignedTime; +} + +Stream& Upp::operator<<(Stream& s, Logger::LoggingLevel level) +{ + switch(level) + { + case (Logger::LoggingLevel::DEBUG): + return s << "DEBUG"; + case (Logger::LoggingLevel::INFO): + return s << "INFO "; + case (Logger::LoggingLevel::WARN): + return s << "WARN "; + case (Logger::LoggingLevel::ERROR): + return s << "ERROR"; + } +} diff --git a/uppsrc/ide/Core/Logger.h b/uppsrc/ide/Core/Logger.h new file mode 100644 index 000000000..cd5ed97fc --- /dev/null +++ b/uppsrc/ide/Core/Logger.h @@ -0,0 +1,76 @@ +#ifndef _Logger_Logger_h +#define _Logger_Logger_h + +#include + +// Provides common way to print function name between compilers. +// TODO: Check MSVC compatibility +#define UPP_FUNCTION_NAME String(__func__) + +namespace Upp { + +// TODO: Add support for thread names ids +class Logger { +public: + enum class LoggingLevel { + DEBUG, + INFO, + WARN, + ERROR + }; + + Logger(LoggingLevel level, const String& tag = ""); + virtual ~Logger(); + + template + Logger& operator<<(T const& value) { + outputStream << value; + return *this; + } + +private: + void Log(); + + String GetCurrentTime(); + String AlignTime(int timeValue, int level = 2); + +private: + StringStream outputStream; + + LoggingLevel level; + String tag; +}; + +Stream& operator<<(Stream& s, Logger::LoggingLevel level); + +class LoggerDebug final : public Logger { +public: + LoggerDebug(const String& tag = "") + : Logger(Logger::LoggingLevel::DEBUG, tag) + {} +}; + +class LoggerInfo final : public Logger { +public: + LoggerInfo(const String& tag = "") + : Logger(Logger::LoggingLevel::INFO, tag) + {} +}; + +class LoggerWarn final : public Logger { +public: + LoggerWarn(const String& tag = "") + : Logger(Logger::LoggingLevel::WARN, tag) + {} +}; + +class LoggerError final : public Logger { +public: + LoggerError(const String& tag = "") + : Logger(Logger::LoggingLevel::ERROR, tag) + {} +}; + +} + +#endif diff --git a/uppsrc/ide/Java/Jdk.cpp b/uppsrc/ide/Java/Jdk.cpp index a8e15fd68..560646595 100644 --- a/uppsrc/ide/Java/Jdk.cpp +++ b/uppsrc/ide/Java/Jdk.cpp @@ -2,7 +2,7 @@ namespace Upp { -#define METHOD_NAME "Jdk::" + String(__FUNCTION__) + "(): " +#define METHOD_NAME "Jdk::" << UPP_FUNCTION_NAME << "(): " String Jdk::GetDownloadUrl() { @@ -27,13 +27,13 @@ bool Jdk::Validate() const void Jdk::FindVersion(Host* host) { if (!Validate()) { - LOG(METHOD_NAME + "Path to JDK is wrong or files are corrupted."); + LoggerDebug() << METHOD_NAME << "Path to JDK is wrong or files are corrupted."; return; } StringStream ss; if (host->Execute(GetJavacPath() + " -version", ss) != 0) { - LOG(METHOD_NAME + "Cannot obtain version due to command execution failure."); + LoggerDebug() << METHOD_NAME << "Cannot obtain version due to command execution failure."; return; } @@ -41,25 +41,25 @@ void Jdk::FindVersion(Host* host) output.Replace("\n", ""); Vector splitedOutput = Split(output, " "); if (splitedOutput.GetCount() != 2) { - LOG(METHOD_NAME + "Splited output is too short (" + output + ")."); + LoggerDebug() << METHOD_NAME << "Splited output is too short (" + output + ")."; return; } Vector splitedVersion = Split(splitedOutput[1], "."); if (splitedVersion.GetCount() != 3) { - LOG(METHOD_NAME + "Splited version is too short (" + output + ")."); + LoggerDebug() << METHOD_NAME << "Splited version is too short (" + output + ")."; return; } int major = StrInt(splitedVersion[0]); if (major == INT_NULL) { - LOG(METHOD_NAME + "Major version conversion to int failed (" + splitedVersion[0] + ")."); + LoggerDebug() << METHOD_NAME << "Major version conversion to int failed (" + splitedVersion[0] + ")."; return; } int minor = StrInt(splitedVersion[1]); if (minor == INT_NULL) { - LOG(METHOD_NAME + "Minor version conversion to int failed (" + splitedVersion[1] + ")."); + LoggerDebug() << METHOD_NAME << "Minor version conversion to int failed (" + splitedVersion[1] + ")."; return; }