#ifdef __WINDOWS__
::MessageBox(NULL, text.wx_str(), title.wx_str(), MB_OK | MB_ICONSTOP);
#else
- wxFprintf(stderr, _T("%s: %s\n"), title.c_str(), text.c_str());
+ wxFprintf(stderr, wxS("%s: %s\n"), title.c_str(), text.c_str());
fflush(stderr);
#endif
}
// always terminate the program
void wxVLogFatalError(const wxString& format, va_list argptr)
{
- wxSafeShowMessage(_T("Fatal Error"), wxString::FormatV(format, argptr));
+ wxSafeShowMessage(wxS("Fatal Error"), wxString::FormatV(format, argptr));
#ifdef __WXWINCE__
ExitThread(3);
{
if ( wxLog::IsEnabled() && wxLog::IsAllowedTraceMask(mask) ) {
wxString msg;
- msg << _T("(") << mask << _T(") ") << wxString::FormatV(format, argptr);
+ msg << wxS("(") << mask << wxS(") ") << wxString::FormatV(format, argptr);
wxLog::OnLog(wxLOG_Trace, msg, time(NULL));
}
return wxString::Format(_(" (error %ld: %s)"), err, wxSysErrorMsg(err));
}
-void WXDLLEXPORT wxVLogSysError(const wxString& format, va_list argptr)
+void WXDLLIMPEXP_BASE wxVLogSysError(const wxString& format, va_list argptr)
{
wxVLogSysError(wxSysErrorCode(), format, argptr);
}
#if !wxUSE_UTF8_LOCALE_ONLY
-void WXDLLEXPORT wxDoLogSysErrorWchar(const wxChar *format, ...)
+void WXDLLIMPEXP_BASE wxDoLogSysErrorWchar(const wxChar *format, ...)
{
va_list argptr;
va_start(argptr, format);
#endif // !wxUSE_UTF8_LOCALE_ONLY
#if wxUSE_UNICODE_UTF8
-void WXDLLEXPORT wxDoLogSysErrorUtf8(const char *format, ...)
+void WXDLLIMPEXP_BASE wxDoLogSysErrorUtf8(const char *format, ...)
{
va_list argptr;
va_start(argptr, format);
}
#endif // wxUSE_UNICODE_UTF8
-void WXDLLEXPORT wxVLogSysError(long err, const wxString& format, va_list argptr)
+void WXDLLIMPEXP_BASE wxVLogSysError(long err, const wxString& format, va_list argptr)
{
if ( wxLog::IsEnabled() ) {
wxLog::OnLog(wxLOG_Error,
}
#if !wxUSE_UTF8_LOCALE_ONLY
-void WXDLLEXPORT wxDoLogSysErrorWchar(long lErrCode, const wxChar *format, ...)
+void WXDLLIMPEXP_BASE wxDoLogSysErrorWchar(long lErrCode, const wxChar *format, ...)
{
va_list argptr;
va_start(argptr, format);
#endif // !wxUSE_UTF8_LOCALE_ONLY
#if wxUSE_UNICODE_UTF8
-void WXDLLEXPORT wxDoLogSysErrorUtf8(long lErrCode, const char *format, ...)
+void WXDLLIMPEXP_BASE wxDoLogSysErrorUtf8(long lErrCode, const char *format, ...)
{
va_list argptr;
va_start(argptr, format);
#ifdef __WATCOMC__
// workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351
-void WXDLLEXPORT wxDoLogSysErrorWchar(unsigned long lErrCode, const wxChar *format, ...)
+void WXDLLIMPEXP_BASE wxDoLogSysErrorWchar(unsigned long lErrCode, const wxChar *format, ...)
{
va_list argptr;
va_start(argptr, format);
va_end(argptr);
}
-void WXDLLEXPORT wxVLogSysError(unsigned long err, const wxString& format, va_list argptr)
+void WXDLLIMPEXP_BASE wxVLogSysError(unsigned long err, const wxString& format, va_list argptr)
{ wxVLogSysError((long)err, format, argptr); }
#endif // __WATCOMC__
// wxLog class implementation
// ----------------------------------------------------------------------------
-unsigned wxLog::LogLastRepetitionCountIfNeeded()
+unsigned wxLog::LogLastRepeatIfNeeded()
{
wxCRIT_SECT_LOCKER(lock, ms_prevCS);
+ return LogLastRepeatIfNeededUnlocked();
+}
+
+unsigned wxLog::LogLastRepeatIfNeededUnlocked()
+{
const unsigned count = ms_prevCounter;
if ( ms_prevCounter )
ms_prevCounter),
ms_prevCounter);
#else
- msg.Printf(wxT("The previous message was repeated %lu times."),
+ msg.Printf(wxS("The previous message was repeated %lu times."),
ms_prevCounter);
#endif
ms_prevCounter = 0;
wxLog::~wxLog()
{
- LogLastRepetitionCountIfNeeded();
+ // Flush() must be called before destroying the object as otherwise some
+ // messages could be lost
+ if ( ms_prevCounter )
+ {
+ wxMessageOutputDebug().Printf
+ (
+ wxS("Last repeated message (\"%s\", %lu times) wasn't output"),
+ ms_prevString,
+ ms_prevCounter
+ );
+ }
}
/* static */
return;
}
- pLogger->LogLastRepetitionCountIfNeeded();
+ pLogger->LogLastRepeatIfNeededUnlocked();
// reset repetition counter for a new message
ms_prevString = szString;
ms_timestamp, wxLocaltime_r(&timeNow, &tm));
str->Empty();
- *str << buf << wxT(": ");
+ *str << buf << wxS(": ");
}
#endif // wxUSE_DATETIME
}
case wxLOG_Debug:
#ifdef __WXDEBUG__
{
- wxString msg = level == wxLOG_Trace ? wxT("Trace: ")
- : wxT("Debug: ");
+ wxString msg = level == wxLOG_Trace ? wxS("Trace: ")
+ : wxS("Debug: ");
msg << szString;
LogString(msg, t);
}
DoLogString((const char*)szString.mb_str(), t);
DoLogString((const wchar_t*)szString.wc_str(), t);
#else
- wxFAIL_MSG(wxT("DoLogString must be overriden if it's called."));
+ wxFAIL_MSG(wxS("DoLogString must be overriden if it's called."));
wxUnusedVar(szString);
wxUnusedVar(t);
#endif
void wxLog::Flush()
{
- // nothing to do here
+ LogLastRepeatIfNeeded();
}
/*static*/ bool wxLog::IsAllowedTraceMask(const wxString& mask)
if ( !m_str.empty() )
{
wxMessageOutputBest out;
- out.Printf(_T("%s"), m_str.c_str());
+ out.Printf(wxS("%s"), m_str.c_str());
m_str.clear();
}
}
str += szString;
wxMessageOutputDebug dbgout;
- dbgout.Printf(_T("%s\n"), str.c_str());
+ dbgout.Printf(wxS("%s\n"), str.c_str());
}
#endif // __WXDEBUG__
break;
void wxLogBuffer::DoLogString(const wxString& szString, time_t WXUNUSED(t))
{
- m_str << szString << _T("\n");
+ m_str << szString << wxS("\n");
}
// ----------------------------------------------------------------------------
str << szString;
wxFputs(str, m_fp);
- wxFputc(_T('\n'), m_fp);
+ wxFputc(wxS('\n'), m_fp);
fflush(m_fp);
// under GUI systems such as Windows or Mac, programs usually don't have
if ( traits && !traits->HasStderr() )
{
wxMessageOutputDebug dbgout;
- dbgout.Printf(_T("%s\n"), str.c_str());
+ dbgout.Printf(wxS("%s\n"), str.c_str());
}
}
}
size_t wxLog::ms_suspendCount = 0;
-wxString wxLog::ms_timestamp(wxT("%X")); // time only, no date
+wxString wxLog::ms_timestamp(wxS("%X")); // time only, no date
wxTraceMask wxLog::ms_ulTraceMask = (wxTraceMask)0;
wxArrayString wxLog::ms_aTraceMasks;
{
// if this happens, something is seriously wrong, so don't use _() here
// for safety
- wxSprintf(s_szBuf, _T("unknown error %lx"), nErrCode);
+ wxSprintf(s_szBuf, wxS("unknown error %lx"), nErrCode);
return s_szBuf;
}
if( lpMsgBuf != 0 )
{
wxStrncpy(s_szBuf, (const wxChar *)lpMsgBuf, WXSIZEOF(s_szBuf) - 1);
- s_szBuf[WXSIZEOF(s_szBuf) - 1] = wxT('\0');
+ s_szBuf[WXSIZEOF(s_szBuf) - 1] = wxS('\0');
LocalFree(lpMsgBuf);
size_t len = wxStrlen(s_szBuf);
if ( len > 0 ) {
// truncate string
- if ( s_szBuf[len - 2] == wxT('\r') )
- s_szBuf[len - 2] = wxT('\0');
+ if ( s_szBuf[len - 2] == wxS('\r') )
+ s_szBuf[len - 2] = wxS('\0');
}
}
else
#endif // !__SMARTPHONE__
{
- s_szBuf[0] = wxT('\0');
+ s_szBuf[0] = wxS('\0');
}
return s_szBuf;