You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
4.4 KiB

/*
* Copyright (C) 2016 Edward d'Auvergne
*
* This file is part of the program FlightGear.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <iomanip>
#include "logging.hxx"
#include <simgear/debug/logstream.hxx>
#include <simgear/debug/OsgIoCapture.hxx>
// The global stream capture data structure.
static capturedIO *_iostreams = NULL;
// capturedIO constructor.
capturedIO::capturedIO(sgDebugClass c, sgDebugPriority p)
{
callback_interleaved = new StreamLogCallback(sg_interleaved, c, p, false);
callback_bulk_only = new StreamLogCallback(sg_bulk_only, c, SG_BULK, true);
callback_debug_only = new StreamLogCallback(sg_debug_only, c, SG_DEBUG, true);
callback_info_only = new StreamLogCallback(sg_info_only, c, SG_INFO, true);
callback_warn_only = new StreamLogCallback(sg_warn_only, c, SG_WARN, true);
callback_alert_only = new StreamLogCallback(sg_alert_only, c, SG_ALERT, true);
// Store the class as a string.
if (c == SG_ALL)
log_class = "SG_ALL";
else {
std::stringstream stream;
stream << "0x" << std::right << std::setfill('0') << std::setw(8) << std::hex << c;
log_class = stream.str();
}
// Store the priority as a string.
if (p == SG_BULK)
log_priority = "SG_BULK";
else if (p == SG_DEBUG)
log_priority = "SG_DEBUG";
else if (p == SG_INFO)
log_priority = "SG_INFO";
else if (p == SG_WARN)
log_priority = "SG_WARN";
else if (p == SG_ALERT)
log_priority = "SG_ALERT";
else if (p == SG_POPUP)
log_priority = "SG_POPUP";
else if (p == SG_DEV_WARN)
log_priority = "SG_DEV_WARN";
else if (p == SG_DEV_ALERT)
log_priority = "SG_DEV_ALERT";
}
// capturedIO destructor.
capturedIO::~capturedIO()
{
// Destroy the callback objects.
delete callback_interleaved;
delete callback_bulk_only;
delete callback_debug_only;
delete callback_info_only;
delete callback_warn_only;
delete callback_alert_only;
}
// Return the global stream capture data structure, creating it if needed.
capturedIO & getIOstreams(sgDebugClass c, sgDebugPriority p)
{
// Initialise the global stream capture data structure, if needed.
if (!_iostreams)
_iostreams = new capturedIO(c, p);
// Return a pointer to the global object.
return *_iostreams;
}
// Set up to capture all the simgear logging priorities as separate streams.
void setupLogging(sgDebugClass c, sgDebugPriority p, bool split)
{
// Get the single logstream instance.
logstream &log = sglog();
// Set up the logstream testing mode.
log.setTestingMode(true);
// OSG IO capture.
osg::setNotifyHandler(new NotifyLogger);
// IO capture.
capturedIO &obj = getIOstreams(c, p);
if (!split)
log.addCallback(obj.callback_interleaved);
else {
if (p <= SG_BULK)
log.addCallback(obj.callback_bulk_only);
if (p <= SG_DEBUG)
log.addCallback(obj.callback_debug_only);
if (p <= SG_INFO)
log.addCallback(obj.callback_info_only);
if (p <= SG_WARN)
log.addCallback(obj.callback_warn_only);
if (p <= SG_ALERT)
log.addCallback(obj.callback_alert_only);
}
}
// Deactivate all the simgear logging priority IO captures.
void stopLogging()
{
// Get the single logstream instance.
logstream &log = sglog();
// IO decapture.
capturedIO &obj = getIOstreams();
log.removeCallback(obj.callback_interleaved);
log.removeCallback(obj.callback_bulk_only);
log.removeCallback(obj.callback_debug_only);
log.removeCallback(obj.callback_info_only);
log.removeCallback(obj.callback_warn_only);
log.removeCallback(obj.callback_alert_only);
// Clean up the IO stream object.
delete _iostreams;
_iostreams = NULL;
// Stop the simgear logstream.
simgear::shutdownLogging();
}