113 if ((
int)msg.size() <= lineWidth) {
117 size_t nextLineBreak = msg.find(
'\n');
118 size_t spaceAfterLine = msg.find(
' ', lineWidth);
119 while (spaceAfterLine != std::string::npos) {
120 if (nextLineBreak == std::string::npos || nextLineBreak > spaceAfterLine) {
121 msg = msg.replace(spaceAfterLine, 1,
"\n");
122 pos = spaceAfterLine + 1;
124 pos = nextLineBreak + 1;
126 spaceAfterLine = msg.find(
' ', pos + lineWidth);
127 nextLineBreak = msg.find(
'\n', pos);
143 msg =
build(msg, addType);
155 msg =
build(msg, addType);
158 i->inform(msg,
true);
197 inform(
toString(i.second) +
" total messages of type: " + i.first);
258 _putenv_s(
"LANGUAGE", locale.data());
260 setenv(
"LANGUAGE", locale.data(),
true);
263 if (!setlocale(LC_MESSAGES,
"")) {
266 const char* sumoPath = getenv(
"SUMO_HOME");
267 if (sumoPath ==
nullptr) {
268 if (!bindtextdomain(
"sumo",
nullptr)) {
269 WRITE_WARNING(
TL(
"Environment variable SUMO_HOME is not set, could not find localized messages."));
273 const std::string path = sumoPath + std::string(
"/data/locale/");
274 if (!bindtextdomain(
"sumo", path.data())) {
279 bind_textdomain_codeset(
"sumo",
"UTF-8");
297 if (oc.
getBool(
"no-warnings")) {
301 if (oc.
isSet(
"log",
false)) {
304 if (!oc.
getBool(
"no-warnings")) {
308 if (oc.
getBool(
"log.timestamps")) {
311 if (oc.
getBool(
"log.processid")) {
315 if (oc.
isSet(
"message-log",
false)) {
319 if (oc.
isSet(
"error-log",
false)) {
345 std::stringstream prefix;
346 const std::chrono::system_clock::time_point now_timestamp = std::chrono::system_clock::now();
347 const auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now_timestamp.time_since_epoch()) % 1000;
348 const std::time_t now_time_t = std::chrono::system_clock::to_time_t(now_timestamp);
351 std::strftime(timeString, 21,
"[%F %T", std::localtime(&now_time_t));
352 prefix << timeString <<
'.' << std::setfill(
'0') << std::setw(3) << milliseconds.count() <<
"] ";
359 std::stringstream prefix;
362 prefix << GetCurrentProcessId();
372 myType(type), myWasInformed(false), myAggregationThreshold(-1) {
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
virtual void addRetriever(OutputDevice *retriever)
Adds a further retriever to the instance responsible for a certain msg type.
std::vector< std::string > myInitialMessages
storage for initial messages
bool wasInformed() const
Returns the information whether any messages were added.
std::string buildProcessIdPrefix(void) const
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
std::string buildTimestampPrefix(void) const
static void enableDebugGLMessages(bool enable)
enable/disable gl-debug messages
static std::string insertLineBreaks(std::string msg, int lineWidth)
reformats a long string to contain newline after a certain line length in px (depending on the curren...
virtual void endProcessMsg(std::string msg)
Ends a process information.
std::string build(const std::string &msg, bool addType)
Builds the string which includes the mml-message type.
static Factory myFactory
The function to call for new MsgHandlers, nullptr means use default constructor.
bool myWasInformed
information whether an output occurred at all
static bool myWriteTimestamps
Whether to prefix every message with a time stamp.
static void setupI18n(const std::string &locale="")
set up gettext stuff
static void initOutputOptions()
init output options
static MsgHandler * myErrorInstance
The instance to handle errors.
static MsgHandler * myMessageInstance
The instance to handle normal messages.
bool isRetriever(OutputDevice *retriever) const
Returns whether the given output device retrieves messages from the handler.
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
std::map< const std::string, int > myAggregationCount
count for messages of the same type
static void enableDebugMessages(bool enable)
enable/disable debug messages
static bool myAmProcessingProcess
Information whether a process information is printed to cout.
std::vector< OutputDevice * > myRetrievers
The list of retrievers that shall be informed about new messages or errors.
MsgHandler *(* Factory)(MsgType)
virtual ~MsgHandler()
destructor
virtual void clear(bool resetInformed=true)
Clears information whether an error occurred previously and print aggregated message summary.
void setAggregationThreshold(const int thresh)
static MsgHandler * myWarningInstance
The instance to handle warnings.
virtual void endProcessMsg2(bool success, long duration=-1)
Ends a process information with predefined messages.
virtual void beginProcessMsg(std::string msg, bool addType=true)
Begins a process information.
static bool myWriteDebugMessages
Flag to enable or disable debug output.
static bool myWriteDebugGLMessages
Flag to enable or disable GL specific debug output.
static std::string myWarningPrefix
The possibly translated warning prefix (mainly for speedup)
static bool myWriteProcessId
Whether to prefix every message with the process id.
static void cleanupOnEnd()
Removes pending handler.
static std::string myErrorPrefix
The possibly translated error prefix (mainly for speedup)
static void removeRetrieverFromAllInstances(OutputDevice *out)
ensure that that given output device is no longer used as retriever by any instance
virtual void removeRetriever(OutputDevice *retriever)
Removes the retriever from the handler.
int myAggregationThreshold
do not output more messages of the same type if the count exceeds this threshold
@ MT_MESSAGE
The message is only something to show.
@ MT_ERROR
The message is an error.
@ MT_WARNING
The message is a warning.
MsgHandler(MsgType type)
standard constructor
static MsgHandler * getMessageInstance()
Returns the instance to add normal messages to.
A storage for options typed value containers)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
#define UNUSED_PARAMETER(x)