home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / common / init.cpp < prev    next >
C/C++ Source or Header  |  2002-12-18  |  6KB  |  235 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        common/init.cpp
  3. // Purpose:     initialisation for the library
  4. // Author:      Vadim Zeitlin
  5. // Modified by:
  6. // Created:     04.10.99
  7. // RCS-ID:      $Id: init.cpp,v 1.18.2.1 2002/12/17 19:49:48 VZ Exp $
  8. // Copyright:   (c) Vadim Zeitlin
  9. // Licence:     wxWindows licence
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. // ============================================================================
  13. // declarations
  14. // ============================================================================
  15.  
  16. // ----------------------------------------------------------------------------
  17. // headers
  18. // ----------------------------------------------------------------------------
  19.  
  20. #include "wx/wxprec.h"
  21.  
  22. #ifdef    __BORLANDC__
  23.   #pragma hdrstop
  24. #endif  //__BORLANDC__
  25.  
  26. #ifndef WX_PRECOMP
  27.     #include "wx/app.h"
  28.     #include "wx/debug.h"
  29.     #include "wx/filefn.h"
  30.     #include "wx/log.h"
  31. #endif
  32.  
  33. #include "wx/module.h"
  34.  
  35. // ----------------------------------------------------------------------------
  36. // global vars
  37. // ----------------------------------------------------------------------------
  38.  
  39. WXDLLEXPORT wxApp *wxTheApp = NULL;
  40.  
  41. wxAppInitializerFunction
  42.     wxAppBase::m_appInitFn = (wxAppInitializerFunction)NULL;
  43.  
  44. // ----------------------------------------------------------------------------
  45. // private classes
  46. // ----------------------------------------------------------------------------
  47.  
  48. class /* no WXDLLEXPORT */ wxConsoleApp : public wxApp
  49. {
  50. public:
  51.     virtual int OnRun() { wxFAIL_MSG(wxT("unreachable")); return 0; }
  52. };
  53.  
  54. // ----------------------------------------------------------------------------
  55. // private functions
  56. // ----------------------------------------------------------------------------
  57.  
  58. static bool DoInit();
  59. static void DoCleanUp();
  60.  
  61. // ----------------------------------------------------------------------------
  62. // private vars
  63. // ----------------------------------------------------------------------------
  64.  
  65. static size_t gs_nInitCount = 0;
  66.  
  67. // ============================================================================
  68. // implementation
  69. // ============================================================================
  70.  
  71. // ----------------------------------------------------------------------------
  72. // stubs for some GUI functions
  73. // ----------------------------------------------------------------------------
  74.  
  75. void WXDLLEXPORT wxExit()
  76. {
  77.     abort();
  78. }
  79.  
  80. // Yield to other apps/messages
  81. void WXDLLEXPORT wxWakeUpIdle()
  82. {
  83.     // do nothing
  84. }
  85.  
  86. // ----------------------------------------------------------------------------
  87. // wxBase-specific functions
  88. // ----------------------------------------------------------------------------
  89.  
  90. bool WXDLLEXPORT wxInitialize()
  91. {
  92.     if ( gs_nInitCount )
  93.     {
  94.         // already initialized
  95.         return TRUE;
  96.     }
  97.  
  98.     wxASSERT_MSG( !wxTheApp,
  99.                   wxT("either call wxInitialize or create app, not both!") );
  100.  
  101.     if ( !DoInit() )
  102.     {
  103.         return FALSE;
  104.     }
  105.  
  106.     wxTheApp = new wxConsoleApp;
  107.  
  108.     if ( !wxTheApp )
  109.     {
  110.         return FALSE;
  111.     }
  112.  
  113.     gs_nInitCount++;
  114.  
  115.     return TRUE;
  116. }
  117.  
  118. void WXDLLEXPORT wxUninitialize()
  119. {
  120.     if ( !--gs_nInitCount )
  121.     {
  122.         DoCleanUp();
  123.     }
  124. }
  125.  
  126. int wxEntry(int argc, char **argv)
  127. {
  128.     // library initialization
  129.     if ( !DoInit() )
  130.     {
  131.         return -1;
  132.     }
  133.  
  134.     // create the app
  135.     if ( !wxTheApp )
  136.     {
  137.         wxCHECK_MSG( wxApp::GetInitializerFunction(), -1,
  138.                 wxT("No application object: use IMPLEMENT_APP macro.") );
  139.  
  140.         wxAppInitializerFunction fnCreate = wxApp::GetInitializerFunction();
  141.  
  142.         wxTheApp = (wxApp *)fnCreate();
  143.     }
  144.  
  145.     wxCHECK_MSG( wxTheApp, -1, wxT("wxWindows error: no application object") );
  146.  
  147.     // app preinitialization
  148.     wxTheApp->argc = argc;
  149.  
  150. #if wxUSE_UNICODE
  151.     wxTheApp->argv = new wxChar*[argc+1];
  152.     int mb_argc = 0;
  153.     while (mb_argc < argc)
  154.     {
  155.         wxTheApp->argv[mb_argc] = wxStrdup(wxConvLocal.cMB2WX(argv[mb_argc]));
  156.         mb_argc++;
  157.     }
  158.     wxTheApp->argv[mb_argc] = (wxChar *)NULL;
  159. #else
  160.     wxTheApp->argv = argv;
  161. #endif
  162.  
  163.     wxString name = wxFileNameFromPath(wxTheApp->argv[0]);
  164.     wxStripExtension(name);
  165.     wxTheApp->SetAppName(name);
  166.  
  167.     int retValue = 0;
  168.  
  169.     // app initialization
  170.     if ( !wxTheApp->OnInit() )
  171.         retValue = -1;
  172.  
  173.     // app execution
  174.     if ( retValue == 0 )
  175.     {
  176.         retValue = wxTheApp->OnRun();
  177.  
  178.         // app clean up
  179.         wxTheApp->OnExit();
  180.     }
  181.  
  182.     // library clean up
  183.     DoCleanUp();
  184.  
  185.     return retValue;
  186. }
  187.  
  188. // ----------------------------------------------------------------------------
  189. // private functions
  190. // ----------------------------------------------------------------------------
  191.  
  192. static bool DoInit()
  193. {
  194.     wxClassInfo::InitializeClasses();
  195.  
  196.     wxModule::RegisterModules();
  197.     if ( !wxModule::InitializeModules() )
  198.     {
  199.         return FALSE;
  200.     }
  201.  
  202.     return TRUE;
  203. }
  204.  
  205. static void DoCleanUp()
  206. {
  207. #if wxUSE_LOG
  208.     // flush the logged messages if any
  209.     wxLog *log = wxLog::GetActiveTarget();
  210.     if (log != NULL && log->HasPendingMessages())
  211.         log->Flush();
  212.  
  213.     // continuing to use user defined log target is unsafe from now on because
  214.     // some resources may be already unavailable, so replace it by something
  215.     // more safe
  216.     wxLog::DontCreateOnDemand();
  217.     delete wxLog::SetActiveTarget(new wxLogStderr);
  218. #endif // wxUSE_LOG
  219.  
  220.     wxModule::CleanUpModules();
  221.  
  222.     wxClassInfo::CleanUpClasses();
  223.  
  224.     // delete the application object
  225.     delete wxTheApp;
  226.     wxTheApp = (wxApp *)NULL;
  227.  
  228. #if wxUSE_LOG
  229.     // and now delete the last logger as well
  230.     delete wxLog::SetActiveTarget(NULL);
  231. #endif // wxUSE_LOG
  232. }
  233.  
  234. // vi:sts=4:sw=4:et
  235.