/*************************************************************************** * Copyright (c) 2004 Jürgen Riegel * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include #ifdef FC_OS_WIN32 # include "io.h" # include #endif #include #include #include "GuiConsole.h" using namespace Gui; #ifdef FC_OS_WIN32 const unsigned int GUIConsole::s_nMaxLines = 1000; unsigned int GUIConsole::s_nRefCount = 0; /** Constructor * Open a Top level Window and redirect the * stdin, stdout and stderr stream to it. * Not needed in Linux! */ GUIConsole::GUIConsole(void) { if (!s_nRefCount++) { bLog = false; CONSOLE_SCREEN_BUFFER_INFO csbi; ::AllocConsole(); ::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE), &csbi); csbi.dwSize.Y = s_nMaxLines; ::SetConsoleScreenBufferSize(::GetStdHandle(STD_OUTPUT_HANDLE), csbi.dwSize); ::SetConsoleTitleA("FreeCAD Console"); *stdout = *::_fdopen( ::_open_osfhandle(reinterpret_cast(::GetStdHandle(STD_OUTPUT_HANDLE)), _O_TEXT), "w" ); ::setvbuf(stdout, 0, _IONBF, 0); *stdin = *::_fdopen( ::_open_osfhandle(reinterpret_cast(::GetStdHandle(STD_INPUT_HANDLE)), _O_TEXT), "r" ); ::setvbuf(stdin, 0, _IONBF, 0); *stderr = *::_fdopen( ::_open_osfhandle(reinterpret_cast(::GetStdHandle(STD_ERROR_HANDLE)), _O_TEXT), "w" ); ::setvbuf(stderr, 0, _IONBF, 0); } } /** Destructor * Close the window and redirect the streams back */ GUIConsole::~GUIConsole(void) { if (!--s_nRefCount) { FreeConsole(); } } void GUIConsole::sendLog( const std::string& notifiername, const std::string& msg, Base::LogStyle level, Base::IntendedRecipient recipient, Base::ContentType content ) { (void)notifiername; // Do not log translated messages, or messages intended only to the user to std log if (recipient == Base::IntendedRecipient::User || content == Base::ContentType::Translated) { return; } int color = -1; switch (level) { case Base::LogStyle::Warning: color = FOREGROUND_RED | FOREGROUND_GREEN; break; case Base::LogStyle::Message: color = FOREGROUND_GREEN; break; case Base::LogStyle::Error: color = FOREGROUND_RED; break; case Base::LogStyle::Log: color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break; case Base::LogStyle::Critical: color = FOREGROUND_RED | FOREGROUND_GREEN; break; default: break; } ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color); printf("%s", msg.c_str()); ::SetConsoleTextAttribute( ::GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE ); } #else /* FC_OS_LINUX */ // safely ignore GUIConsole::s_nMaxLines and GUIConsole::s_nRefCount GUIConsole::GUIConsole() = default; GUIConsole::~GUIConsole() = default; void GUIConsole::sendLog( const std::string& notifiername, const std::string& msg, Base::LogStyle level, Base::IntendedRecipient recipient, Base::ContentType content ) { (void)notifiername; // Do not log translated messages, or messages intended only to the user to std log if (recipient == Base::IntendedRecipient::User || content == Base::ContentType::Translated) { return; } switch (level) { case Base::LogStyle::Warning: std::cerr << "Warning: " << msg; break; case Base::LogStyle::Message: std::cout << msg; break; case Base::LogStyle::Error: std::cerr << "Error: " << msg; break; case Base::LogStyle::Log: std::clog << msg; break; case Base::LogStyle::Critical: std::cout << "Critical: " << msg; break; default: break; } } #endif /* FC_OS_LINUX */