diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 82574fb..441f132 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -53,6 +53,9 @@ Source Files + + Source Files + Source Files @@ -259,6 +262,9 @@ Header Files + + Header Files + Header Files diff --git a/Common/ConsoleLogger.cpp b/Common/ConsoleLogger.cpp new file mode 100644 index 0000000..acd4269 --- /dev/null +++ b/Common/ConsoleLogger.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2002,2003,2009,2011,2012,2019 by Jonathan Naylor G4KLX + * Copyright (C) 2020 by Adam Kolakowski SQ7LRX + * + * 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "ConsoleLogger.h" + +const char CConsoleLogger::S_LEVELS[] = "FEWMMIDTPU"; + +CConsoleLogger::CConsoleLogger() : +wxLog(), +m_stdout(new wxMessageOutputStderr(stdout)), +m_stderr(new wxMessageOutputStderr(stderr)) +{ +} + +CConsoleLogger::~CConsoleLogger() +{ +} + +void CConsoleLogger::DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info) +{ + if (level > 9) + level = 9; + + if (level <= wxLOG_Error) { + m_stderr->Printf(wxT("%c: %s\n"), CConsoleLogger::S_LEVELS[level], msg.c_str()); + } else { + m_stdout->Printf(wxT("%c: %s\n"), CConsoleLogger::S_LEVELS[level], msg.c_str()); + } + + if (level == wxLOG_FatalError) + ::abort(); +} diff --git a/Common/ConsoleLogger.h b/Common/ConsoleLogger.h new file mode 100644 index 0000000..b040bf9 --- /dev/null +++ b/Common/ConsoleLogger.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2002,2003,2009,2011,2012,2019 by Jonathan Naylor G4KLX + * Copyright (C) 2020 by Adam Kolakowski SQ7LRX + * + * 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef ConsoleLogger_H +#define ConsoleLogger_H + +#include + + +class CConsoleLogger : public wxLog { +public: + CConsoleLogger(); + virtual ~CConsoleLogger(); + + virtual void DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info); + +private: + const static char S_LEVELS[]; + + wxMessageOutput *m_stdout; + wxMessageOutput *m_stderr; +}; + +#endif + diff --git a/Common/Makefile b/Common/Makefile index e215ea2..e403ae5 100644 --- a/Common/Makefile +++ b/Common/Makefile @@ -1,5 +1,5 @@ OBJECTS = AMBEData.o AnnouncementUnit.o APRSCollector.o APRSWriter.o APRSWriterThread.o AudioUnit.o CacheManager.o CallsignList.o \ - CallsignServer.o CCITTChecksum.o CCSData.o CCSHandler.o CCSProtocolHandler.o ConnectData.o DCSHandler.o DCSProtocolHandler.o \ + CallsignServer.o CCITTChecksum.o CCSData.o CCSHandler.o CCSProtocolHandler.o ConnectData.o ConsoleLogger.o DCSHandler.o DCSProtocolHandler.o \ DCSProtocolHandlerPool.o DDData.o DDHandler.o DExtraHandler.o DExtraProtocolHandler.o DExtraProtocolHandlerPool.o \ DPlusAuthenticator.o DPlusHandler.o DPlusProtocolHandler.o DPlusProtocolHandlerPool.o DRATSServer.o DTMF.o \ DummyRepeaterProtocolHandler.o DVTOOLFileReader.o EchoUnit.o G2Handler.o G2ProtocolHandler.o GatewayCache.o \ diff --git a/ircDDBGateway/IRCDDBGatewayAppD.cpp b/ircDDBGateway/IRCDDBGatewayAppD.cpp index 4ea6d25..ce6ed87 100644 --- a/ircDDBGateway/IRCDDBGatewayAppD.cpp +++ b/ircDDBGateway/IRCDDBGatewayAppD.cpp @@ -26,6 +26,7 @@ #include "APRSWriter.h" #include "Version.h" #include "Logger.h" +#include "ConsoleLogger.h" #include "IRCDDB.h" #include "IRCDDBClient.h" #include "IRCDDBMultiClient.h" @@ -48,6 +49,7 @@ const wxChar* DEBUG_SWITCH = wxT("debug"); const wxChar* LOGDIR_OPTION = wxT("logdir"); const wxChar* CONFDIR_OPTION = wxT("confdir"); const wxChar* DAEMON_SWITCH = wxT("daemon"); +const wxChar* FGROUND_SWITCH = wxT("foreground"); const wxString LOG_BASE_NAME = wxT("ircDDBGateway"); @@ -70,6 +72,7 @@ int main(int argc, char** argv) parser.AddSwitch(NOLOGGING_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(DEBUG_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch(FGROUND_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(LOGDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(CONFDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddParam(NAME_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); @@ -80,9 +83,10 @@ int main(int argc, char** argv) return 0; } - bool nolog = parser.Found(NOLOGGING_SWITCH); - bool debug = parser.Found(DEBUG_SWITCH); - bool daemon = parser.Found(DAEMON_SWITCH); + bool nolog = parser.Found(NOLOGGING_SWITCH); + bool debug = parser.Found(DEBUG_SWITCH); + bool daemon = parser.Found(DAEMON_SWITCH); + bool foreground = parser.Found(FGROUND_SWITCH); wxString logDir; bool found = parser.Found(LOGDIR_OPTION, &logDir); @@ -98,6 +102,12 @@ int main(int argc, char** argv) if (parser.GetParamCount() > 0U) name = parser.GetParam(0U); + if (daemon && foreground) { + ::fprintf(stderr, "ircddbgatewayd: -daemon and -foreground are mutually exclusive, exiting\n"); + ::wxUninitialize(); + return 1; + } + if (daemon) { pid_t pid = ::fork(); @@ -138,7 +148,7 @@ int main(int argc, char** argv) ::fclose(fp); } - m_gateway = new CIRCDDBGatewayAppD(nolog, debug, logDir, confDir, name); + m_gateway = new CIRCDDBGatewayAppD(nolog, debug, foreground, logDir, confDir, name); if (!m_gateway->init()) { ::wxUninitialize(); return 1; @@ -157,10 +167,11 @@ int main(int argc, char** argv) return 0; } -CIRCDDBGatewayAppD::CIRCDDBGatewayAppD(bool nolog, bool debug, const wxString& logDir, const wxString& confDir, const wxString& name) : +CIRCDDBGatewayAppD::CIRCDDBGatewayAppD(bool nolog, bool debug, bool foreground, const wxString& logDir, const wxString& confDir, const wxString& name) : m_name(name), m_nolog(nolog), m_debug(debug), +m_foreground(foreground), m_logDir(logDir), m_confDir(confDir), m_thread(NULL), @@ -174,7 +185,9 @@ CIRCDDBGatewayAppD::~CIRCDDBGatewayAppD() bool CIRCDDBGatewayAppD::init() { - if (!m_nolog) { + if (m_foreground) { + initLogging(new CConsoleLogger()); + } else if (!m_nolog) { wxString logBaseName = LOG_BASE_NAME; if (!m_name.IsEmpty()) { logBaseName.Append(wxT("_")); @@ -184,16 +197,7 @@ bool CIRCDDBGatewayAppD::init() if (m_logDir.IsEmpty()) m_logDir = wxT(LOG_DIR); - wxLog* log = new CLogger(m_logDir, logBaseName); - wxLog::SetActiveTarget(log); - - if (m_debug) { - wxLog::SetVerbose(true); - wxLog::SetLogLevel(wxLOG_Debug); - } else { - wxLog::SetVerbose(false); - wxLog::SetLogLevel(wxLOG_Message); - } + initLogging(new CLogger(m_logDir, logBaseName)); } else { new wxLogNull; } @@ -212,14 +216,31 @@ bool CIRCDDBGatewayAppD::init() return false; } - wxLogInfo(wxT("Starting ") + APPLICATION_NAME + wxT(" daemon - ") + VERSION); + wxLogMessage(wxT("Starting ") + APPLICATION_NAME + wxT(" daemon - ") + VERSION); // Log the version of wxWidgets and the Operating System wxLogInfo(wxT("Using wxWidgets %d.%d.%d on %s"), wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER, ::wxGetOsDescription().c_str()); + if (!m_nolog && m_foreground) { + wxLogWarning(wxT("Running in foreground, logging to file disabled. Use -nolog when running this application in foreground to suppress this ")); + } + return createThread(); } +void CIRCDDBGatewayAppD::initLogging(wxLog *logger) +{ + wxLog::SetActiveTarget(logger); + + if (m_debug) { + wxLog::SetVerbose(true); + wxLog::SetLogLevel(wxLOG_Debug); + } else { + wxLog::SetVerbose(false); + wxLog::SetLogLevel(wxLOG_Message); + } +} + void CIRCDDBGatewayAppD::run() { m_thread->run(); @@ -878,7 +899,7 @@ bool CIRCDDBGatewayAppD::createThread() bool xlxEnabled; wxString xlxHostsFileUrl; config.getXLX(xlxEnabled, xlxHostsFileUrl); - wxLogInfo(wxT("XLX enabled: %d, Override Local %d, Hosts file url: %s"), int(xlxEnabled), xlxHostsFileUrl.c_str()); + wxLogInfo(wxT("XLX enabled: %d, Hosts file url: %s"), int(xlxEnabled), xlxHostsFileUrl.c_str()); if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U || repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) { diff --git a/ircDDBGateway/IRCDDBGatewayAppD.h b/ircDDBGateway/IRCDDBGatewayAppD.h index 5fd1d40..359d975 100644 --- a/ircDDBGateway/IRCDDBGatewayAppD.h +++ b/ircDDBGateway/IRCDDBGatewayAppD.h @@ -28,7 +28,7 @@ class CIRCDDBGatewayAppD { public: - CIRCDDBGatewayAppD(bool nolog, bool debug, const wxString& logDir, const wxString& confDir, const wxString& name); + CIRCDDBGatewayAppD(bool nolog, bool debug, bool foreground, const wxString& logDir, const wxString& confDir, const wxString& name); ~CIRCDDBGatewayAppD(); bool init(); @@ -41,12 +41,14 @@ private: wxString m_name; bool m_nolog; bool m_debug; + bool m_foreground; wxString m_logDir; wxString m_confDir; CIRCDDBGatewayThread* m_thread; wxSingleInstanceChecker* m_checker; bool createThread(); + void initLogging(wxLog *logger); }; #endif