X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb3e83b60a5eeb499bb2934ce4fa0f0cdff5fbec..80a779275ae04443c568dca919adb26cf6f5002c:/src/common/init.cpp?ds=inline diff --git a/src/common/init.cpp b/src/common/init.cpp index 774cbd2273..e699699702 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/init.cpp +// Name: src/common/init.cpp // Purpose: initialisation for the library // Author: Vadim Zeitlin // Modified by: @@ -20,21 +20,21 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif //__BORLANDC__ #ifndef WX_PRECOMP #include "wx/app.h" - #include "wx/debug.h" #include "wx/filefn.h" #include "wx/log.h" #include "wx/thread.h" + #include "wx/intl.h" + #include "wx/module.h" #endif #include "wx/init.h" #include "wx/ptr_scpd.h" -#include "wx/module.h" #include "wx/except.h" #if defined(__WXMSW__) && defined(__WXDEBUG__) @@ -69,8 +69,8 @@ public: // we need a special kind of auto pointer to wxApp which not only deletes the // pointer it holds in its dtor but also resets the global application pointer -wxDECLARE_SCOPED_PTR(wxAppConsole, wxAppPtrBase); -wxDEFINE_SCOPED_PTR(wxAppConsole, wxAppPtrBase); +wxDECLARE_SCOPED_PTR(wxAppConsole, wxAppPtrBase) +wxDEFINE_SCOPED_PTR(wxAppConsole, wxAppPtrBase) class wxAppPtr : public wxAppPtrBase { @@ -178,9 +178,11 @@ static void ConvertArgsToUnicode(int argc, char **argv) gs_initData.argv = new wchar_t *[argc + 1]; for ( int i = 0; i < argc; i++ ) { - gs_initData.argv[i] = wxStrdup(wxConvLocal.cMB2WX(argv[i])); + wxWCharBuffer buf(wxConvLocal.cMB2WX(argv[i])); + gs_initData.argv[i] = buf ? wxStrdup(buf) : NULL; } + gs_initData.argc = argc; gs_initData.argv[argc] = NULL; } @@ -195,6 +197,7 @@ static void FreeConvertedArgs() delete [] gs_initData.argv; gs_initData.argv = NULL; + gs_initData.argc = 0; } } @@ -207,6 +210,15 @@ static void FreeConvertedArgs() // initialization which is always done (not customizable) before wxApp creation static bool DoCommonPreInit() { +#if wxUSE_LOG + // install temporary log sink: we can't use wxLogGui before wxApp is + // constructed and if we use wxLogStderr, all messages during + // initialization simply disappear under Windows + // + // note that we will delete this log target below + delete wxLog::SetActiveTarget(new wxLogBuffer); +#endif // wxUSE_LOG + return true; } @@ -215,7 +227,13 @@ static bool DoCommonPostInit() { wxModule::RegisterModules(); - return wxModule::InitializeModules(); + if ( !wxModule::InitializeModules() ) + { + wxLogError(_("Initialization failed in post init, aborting.")); + return false; + } + + return true; } bool wxEntryStart(int& argc, wxChar **argv) @@ -284,6 +302,14 @@ bool wxEntryStart(int& argc, wxChar **argv) // and the cleanup object from doing cleanup callAppCleanup.Dismiss(); +#if wxUSE_LOG + // now that we have a valid wxApp (wxLogGui would have crashed if we used + // it before now), we can delete the temporary sink we had created for the + // initialization messages -- the next time logging function is called, the + // sink will be recreated but this time wxAppTraits will be used + delete wxLog::SetActiveTarget(NULL); +#endif // wxUSE_LOG + return true; } @@ -310,27 +336,25 @@ bool wxEntryStart(int& argc, char **argv) // clean up // ---------------------------------------------------------------------------- -// cleanup done before destroying wxTheApp +// cleanup done before destroying wxTheApp static void DoCommonPreCleanup() { #if wxUSE_LOG // flush the logged messages if any and install a 'safer' log target: the // default one (wxLogGui) can't be used after the resources are freed just // below and the user supplied one might be even more unsafe (using any - // wxWindows GUI function is unsafe starting from now) + // wxWidgets GUI function is unsafe starting from now) wxLog::DontCreateOnDemand(); // this will flush the old messages if any delete wxLog::SetActiveTarget(new wxLogStderr); #endif // wxUSE_LOG - - wxModule::CleanUpModules(); } // cleanup done after destroying wxTheApp static void DoCommonPostCleanup() { - wxClassInfo::CleanUp(); + wxModule::CleanUpModules(); // we can't do this in wxApp itself because it doesn't know if argv had // been allocated @@ -338,15 +362,9 @@ static void DoCommonPostCleanup() FreeConvertedArgs(); #endif // wxUSE_UNICODE - // check for memory leaks -#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT - if (wxDebugContext::CountObjectsLeft(TRUE) > 0) - { - wxLogDebug(wxT("There were memory leaks.\n")); - wxDebugContext::Dump(); - wxDebugContext::PrintStatistics(); - } -#endif // Debug + // use Set(NULL) and not Get() to avoid creating a message output object on + // demand when we just want to delete it + delete wxMessageOutput::Set(NULL); #if wxUSE_LOG // and now delete the last logger as well @@ -376,15 +394,20 @@ void wxEntryCleanup() // wxEntry // ---------------------------------------------------------------------------- -#if !defined(__WXMSW__) || !wxUSE_ON_FATAL_EXCEPTION +// for MSW the real wxEntry is defined in msw/main.cpp +#ifndef __WXMSW__ #define wxEntryReal wxEntry -#endif // !(__WXMSW__ && wxUSE_ON_FATAL_EXCEPTION) +#endif // !__WXMSW__ int wxEntryReal(int& argc, wxChar **argv) { // library initialization if ( !wxEntryStart(argc, argv) ) { +#if wxUSE_LOG + // flush any log messages explaining why we failed + delete wxLog::SetActiveTarget(NULL); +#endif return -1; } @@ -396,6 +419,7 @@ int wxEntryReal(int& argc, wxChar **argv) wxTRY { + // app initialization if ( !wxTheApp->CallOnInit() ) { @@ -403,52 +427,21 @@ int wxEntryReal(int& argc, wxChar **argv) return -1; } - // app execution - int retValue = wxTheApp->OnRun(); + // ensure that OnExit() is called if OnInit() had succeeded + class CallOnExit + { + public: + ~CallOnExit() { wxTheApp->OnExit(); } + } callOnExit; - // app clean up - wxTheApp->OnExit(); + WX_SUPPRESS_UNUSED_WARN(callOnExit); - return retValue; + // app execution + return wxTheApp->OnRun(); } wxCATCH_ALL( wxTheApp->OnUnhandledException(); return -1; ) } -// wrap real wxEntry in a try-except block to be able to call -// OnFatalException() if necessary -#if defined(__WXMSW__) && wxUSE_ON_FATAL_EXCEPTION - -#ifdef __WXWINCE__ -// For ExitThread -#include "wx/msw/private.h" -#endif - -extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs); - -int wxEntry(int& argc, wxChar **argv) -{ - __try - { - return wxEntryReal(argc, argv); - } - __except ( wxGlobalSEHandler(GetExceptionInformation()) ) - { -#ifdef __WXWINCE__ - ::ExitThread(3); // the same exit code as abort() -#else - ::ExitProcess(3); // the same exit code as abort() -#endif - -#if !defined(_MSC_VER) || _MSC_VER < 1300 - // this code is unreachable but put it here to suppress warnings - // from some compilers - return -1; -#endif - } -} - -#endif // __WXMSW__ && wxUSE_ON_FATAL_EXCEPTION - #if wxUSE_UNICODE // as with wxEntryStart, we provide an ANSI wrapper @@ -482,9 +475,8 @@ void wxUninitialize() { wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); - if ( !--gs_initData.nInitCount ) + if ( --gs_initData.nInitCount == 0 ) { wxEntryCleanup(); } } -