/** * Program entry point */ bool Game_Develop_EditorApp::OnInit() { //Setting up working directory: #ifdef LINUX string tmp; //Make sure current working directory is executable directory. if ( string(argv[0]) != "/" ) { char buffer[1024]; tmp += ( getcwd( buffer, 1024 ) ); tmp += "/"; } tmp += argv[0]; tmp = tmp.substr( 0, tmp.find_last_of( "/" ) ); chdir( tmp.c_str() ); #endif #ifdef WINDOWS wxString exeDirectory = argv[0]; //Make sure current working directory is executable directory. unsigned int backslashpos = exeDirectory.find_last_of( "\\" ); if ( backslashpos > exeDirectory.length() ) backslashpos = 0; unsigned int slashpos = exeDirectory.find_last_of( "/" ); if ( slashpos > exeDirectory.length() ) slashpos = 0; exeDirectory = exeDirectory.substr( 0, slashpos > backslashpos ? slashpos : backslashpos ); chdir( exeDirectory.c_str() ); #endif //Parse command line: wxCmdLineEntryDesc cmdLineDesc[] = { {wxCMD_LINE_PARAM, NULL, NULL, ("Files to open"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL}, {wxCMD_LINE_SWITCH, "h", "help", ("Display help about launching GDevelop using command line") }, {wxCMD_LINE_SWITCH, "v", "version", ("Display GDevelop version and quit"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, {wxCMD_LINE_OPTION, NULL, ("lang"), ("Force loading a specific language ( Example : /lang=en_GB )"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, {wxCMD_LINE_SWITCH, NULL, ("allowMultipleInstances"), ("Allow to launch GDevelop even if it is already opened") }, {wxCMD_LINE_SWITCH, NULL, ("noCrashCheck"), ("Don't check if GDevelop crashed during last use.") }, {wxCMD_LINE_NONE} }; wxCmdLineParser parser (cmdLineDesc, argc, argv); parser.AddUsageText("For more information about using GDevelop, please refer to the online help."); if ( parser.Parse(false) > 0 ) ; else if ( parser.Found( wxT("version") ) ) { cout << gd::VersionWrapper::FullString() << endl; return false; } else if ( parser.Found( wxT("help") ) ) { cout << parser.GetUsageString(); return false; } cout << "GDevelop initialization started:" << endl; SetAppName("GDIDE"); SetAppDisplayName("GDevelop IDE"); std::vector<std::string> filesToOpen; for (unsigned int i = 0;i<parser.GetParamCount();++i) { filesToOpen.push_back(string(parser.GetParam(i).mb_str())); } //Load configuration #if defined(LINUX) wxString ConfigPath = wxFileName::GetHomeDir() + "/.config/GDevelop/"; #else wxString ConfigPath = wxFileName::GetHomeDir() + "/.GDevelop/"; #endif if ( !wxDirExists( ConfigPath ) ) wxMkdir( ConfigPath ); wxFileConfig *config = new wxFileConfig( _T( "GDevelop" ), _T( "Compil Games" ), ConfigPath + "options.cfg" ); wxConfigBase::Set( config ); cout << "* Config file set." << endl; //Set language { wxString wantedLanguage; if ( !parser.Found( wxT("lang") )) config->Read("/Lang", &wantedLanguage); else parser.Found( wxT("lang"), &wantedLanguage); //If SelectLanguage.cfg file exists, then read the language from it if ( wxFileExists(ConfigPath+"SelectLanguage.cfg") ) { wxTextFile languageFile; languageFile.Open(ConfigPath+"SelectLanguage.cfg"); wantedLanguage = languageFile.GetFirstLine(); languageFile.Close(); wxRemoveFile(ConfigPath+"SelectLanguage.cfg"); } //Retrieve languages files std::vector <std::string> languagesAvailables; wxDir dir(wxGetCwd()+"/locale/"); wxString filename; bool cont = dir.GetFirst(&filename, "", wxDIR_DIRS); while ( cont ) { languagesAvailables.push_back(string(filename.mb_str())); cont = dir.GetNext(&filename); } //Retrieve selected language int languageId = wxLANGUAGE_DEFAULT; for (unsigned int i = 0;i<languagesAvailables.size();++i) { if ( wxLocale::FindLanguageInfo(languagesAvailables[i])->CanonicalName == wantedLanguage ) languageId = wxLocale::FindLanguageInfo(languagesAvailables[i])->Language; } gd::LocaleManager::Get()->SetLanguage(languageId); } cout << "* Language loaded" << endl; #ifdef RELEASE { wxLogNull noLogPlease; singleInstanceChecker = new wxSingleInstanceChecker; if ( singleInstanceChecker->IsAnotherRunning() && !parser.Found( wxT("allowMultipleInstances") ) ) { //There is already another instance running: Ask it to open the requested files. cout << "* Instance already existing: Redirecting the file to open to it." << endl; STClient * client = new STClient; wxString hostName = "localhost"; //Mandatory to provide the host ( for TCP/IP based implementations ). wxConnectionBase * connection = client->MakeConnection(hostName, "GDIDE", "GDevelop IDE"); if ( connection ) { for (unsigned int i = 0; i < filesToOpen.size(); ++i) connection->Execute(filesToOpen[i]); connection->Disconnect(); delete connection; } else { if ( !filesToOpen.empty() ) wxMessageBox(_("It seems that GDevelop is busy and can't open the requested file.\nPlease close any open dialogs and retry."), _("Sorry! :/"), wxICON_INFORMATION|wxOK); } delete client; delete singleInstanceChecker; cout << "* Bye!" << endl; return false; // OnExit() won't be called if we return false } else { //No other instance running: Set this instance as the main one, creating a server that will //be called by other instance if necessary. server = new STServer; if ( !server->Create("GDIDE") ) cout << " * FAILED to create an IPC service."; } } #endif cout << "* Single instance handling done" << endl; wxInitAllImageHandlers(); cout << "* Image handlers loaded" << endl; //Check if the last session terminated not normally. bool recoveringFromBug = false; #if defined(RELEASE) if ( !parser.Found( wxT("noCrashCheck") ) && wxFileExists(wxFileName::GetTempDir()+"/GameDevelopRunning.log") && !wxFileExists(wxFileName::GetTempDir()+"/ExtensionBeingLoaded.log") ) { recoveringFromBug = true; //Get the files opened during the last crash std::vector<string> openedFiles; wxTextFile projectsLogFile(wxFileName::GetTempDir()+"/GameDevelopRunning.log"); if (projectsLogFile.Open()) { for (wxString str = projectsLogFile.GetFirstLine(); !projectsLogFile.Eof(); str = projectsLogFile.GetNextLine()) openedFiles.push_back(gd::ToString(str)); } projectsLogFile.Close(); //Show an explanation window and offer the user to load the autosaves. BugReport dialog(NULL, openedFiles); if ( dialog.ShowModal() == 1 ) { for (unsigned int i = 0; i < openedFiles.size(); ++i) { if ( wxFileExists(openedFiles[i]+".autosave") ) filesToOpen.push_back(openedFiles[i]+".autosave"); } } } #endif cout << "* Crash management ended" << endl; //Creating the console Manager /* Deactivated, as the compilation thread can output messages at any time, resulting in the wxTextCtrl of console frame to be updated at any time which is dangerous ( GUI must be only updated from main thread ) #if defined(RELEASE) && defined(WINDOWS) ConsoleManager * consoleManager; consoleManager = ConsoleManager::Get(); cout << "ConsoleManager created" << endl; #endif */ //Splash screen wxBitmap bitmap; bitmap.LoadFile( wxString("res/GD-Splashscreen.png"), wxBITMAP_TYPE_PNG ); SplashScreen * splash = new SplashScreen(bitmap, 2, 0, -1, wxNO_BORDER | wxFRAME_SHAPED); cout << "* Splash Screen created" << endl; //Create the file logging the opened projects wxFile errorDetectFile(wxFileName::GetTempDir()+"/GameDevelopRunning.log", wxFile::write); errorDetectFile.Write(" "); errorDetectFile.Close(); //Les log cout << "* Displaying GDevelop version information :" << endl; cout << "GDevelop " << gd::VersionWrapper::FullString() << ", built " << gd::VersionWrapper::Date() << "/" << gd::VersionWrapper::Month() << "/" << gd::VersionWrapper::Year() << endl; cout << "* Creating a useless SFML texture" << endl; sf::RenderWindow window; sf::Window window2; cout << "* Removing CppPlatform/Extensions/AStarAutomatism.xgdle" << endl; if ( wxFileExists("CppPlatform/Extensions/AStarAutomatism.xgdle") ) wxRemoveFile("CppPlatform/Extensions/AStarAutomatism.xgdle"); //Load platforms and extensions cout << "* Loading platforms and extensions:" << endl; bool loadExtensions = true; #if defined(RELEASE) if ( !parser.Found( wxT("noCrashCheck") ) && wxFileExists(wxFileName::GetTempDir()+"/ExtensionBeingLoaded.log") ) { int whattodo = 0; { wxTextFile extensionErrorDetectFile; extensionErrorDetectFile.Open(wxFileName::GetTempDir()+"/ExtensionBeingLoaded.log"); ExtensionBugReportDlg dialog(NULL, extensionErrorDetectFile.GetFirstLine()); whattodo = dialog.ShowModal(); } wxRemoveFile(wxFileName::GetTempDir()+"/ExtensionBeingLoaded.log"); if ( whattodo == 0 ) return false; else if ( whattodo == 1 ) loadExtensions = false; } #endif if ( loadExtensions ) gd::PlatformLoader::LoadAllPlatformsInManager("."); #if defined(RELEASE) wxSetAssertHandler(NULL); //Don't want to have annoying assert dialogs in release #endif cout << "* Platform and extensions loading ended." << endl; wxFileSystem::AddHandler( new wxZipFSHandler ); //Creating main window cout << "* Creating main window" << endl; mainEditor = new MainFrame( 0 ); SetTopWindow( mainEditor ); //Open files for (unsigned int i = 0;i<filesToOpen.size();++i) mainEditor->Open(filesToOpen[i]); cout << "* Connecting shortcuts" << endl; Connect(wxID_ANY,wxEVT_KEY_DOWN, wxKeyEventHandler(Game_Develop_EditorApp::OnKeyPressed)); //Set help provider { gd::HelpFileAccess::Get()->SetHelpProvider(::HelpProvider::Get()); ::HelpProvider::Get()->SetParentWindow(mainEditor); } cout << "* Help provider set" << endl; cout << "* Loading events editor configuration" << endl; gd::InstructionSentenceFormatter::Get()->LoadTypesFormattingFromConfig(); //Save the event to log file cout << "* Creating log file (if activated)" << endl; LogFileManager::Get()->InitalizeFromConfig(); LogFileManager::Get()->WriteToLogFile("GDevelop initialization ended"), //Fin du splash screen, affichage de la fenêtre splash->Destroy(); mainEditor->Show(); cout << "* Initializing platforms..." << endl; gd::PlatformManager::Get()->NotifyPlatformIDEInitialized(); cout << "* Initialization ended." << endl; //gd::LogWarning(_("This is a beta version of GDevelop 3.\n\nSome features may be missing and bugs present: Report any feedback on www.forum.compilgames.net.\nThanks!")); //Checking for updates { wxString result; config->Read( "Startup/CheckUpdate", &result ); if ( result != "false" ) { UpdateChecker * checker = UpdateChecker::Get(); checker->DownloadInformation(); if ( checker->newVersionAvailable ) { MAJ dialog(mainEditor, true); if ( dialog.ShowModal() == 2 ) { mainEditor->Destroy(); return true; } } } mainEditor->RefreshNews(); } //Pay what you want reminder if (!recoveringFromBug) { int result = 3; config->Read( "Startup/Reminder", &result ); //Force again the display when upgrading from a version older than 3.3.71 bool reminder3371Shown = false; config->Read( "Startup/Reminder3371Shown", &reminder3371Shown ); if (!reminder3371Shown) { result = 3; config->Write( "Startup/Reminder3371Shown", true); } //Decrement the counter and show the reminder only after 3 launch in a row. if ( result > 0 ) { result--; config->Write( "Startup/Reminder", result); } if ( result == 0 ) { ReminderDialog dialog(mainEditor); dialog.ShowModal(); } } return true; }
bool DrawApp::OnInit() { /* Read params from szarp.cfg. */ #if wxUSE_UNICODE libpar_read_cmdline_w(&argc, argv); #else libpar_read_cmdline(&argc, argv); #endif #if BOOST_FILESYSTEM_VERSION == 3 boost::filesystem::wpath::imbue(std::locale("C")); #else boost::filesystem::wpath_traits::imbue(std::locale("C")); #endif if (!DrawGLApp::OnInit()) return false; SetProgName(_T("Draw 3")); //signal(SIGINT, INThandler); if (m_just_print_version) { std::cout << SZARP_VERSION << std::endl; return false; } m_server = NULL; m_db_queue = NULL; m_executor = NULL; m_remarks_handler = NULL; #ifdef __WXGTK__ libpar_init(); char *base = NULL; if (m_base == wxEmptyString) { base = libpar_getpar("", "config_prefix", 1); m_base = SC::L2S(base); free(base); } { if (m_base_type != IKS_BASE) { char *iks_server = libpar_getpar("draw3", "iks_server", 0); if (iks_server) { m_iks_server = SC::L2S(iks_server); m_base_type = IKS_BASE; free(iks_server); } char *iks_port = libpar_getpar("draw3", "iks_server_port", 0); if (iks_port) { m_iks_port = SC::L2S(iks_port); free(iks_port); } } } m_probers_from_szarp_cfg = get_probers_addresses(); #endif #ifdef MINGW32 WORD wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); #endif /* Set logging to stderr. */ wxLog *logger = new wxLogStderr(); //wxLog *logger = new wxLogGui(); wxLog::SetActiveTarget(logger); m_instance = new szSingleInstanceChecker(_T(".szarp_m_instance_lock"), wxEmptyString, _T("draw3")); if (m_instance->IsAnotherRunning()) { if (!m_url.IsEmpty()) { if (m_url_open_in_existing) SendToRunningInstance(_T("START_URL"), m_url.c_str()); else SendToRunningInstance(_T("START_URL_EXISTING"), m_url.c_str()); } else if (!m_base.IsEmpty()) { SendToRunningInstance(_T("START_BASE"), m_base.c_str()); } else { wxLogError(_T("base not given")); return false; } return false; } InitGL(); SplashScreen *splash = NULL; wxBitmap bitmap; // this loads draw64_xpm under Linux, or draw64 icon resource under Windows szFrame::setDefaultIcon(wxICON(draw64)); wxString splashimage = GetSzarpDir(); #ifndef MINGW32 splashimage += _T("resources/wx/images/szarp-logo.png"); #else splashimage += _T("resources\\wx\\images\\szarp-logo.png"); #endif #if wxUSE_LIBPNG /* Activate PNG image handler. */ wxImage::AddHandler( new wxPNGHandler ); #endif if (bitmap.LoadFile(splashimage, wxBITMAP_TYPE_PNG)) splash = new SplashScreen(&bitmap); else splash = new SplashScreen(); splash->Show(true); splash->PushStatusText(_("Setting locale...")); /* Set locale. */ this->InitializeLocale(_T("draw3"), locale); splash->PushStatusText(_("Reading params from szarp.cfg...")); wxString _lang = wxConfig::Get()->Read(_T("LANGUAGE"), AUTO_LANGUAGE); if (_lang == AUTO_LANGUAGE) _lang = DEFAULT_LANGUAGE; splash->PushStatusText(_("Initializing IPKContainer...")); IPKContainer::Init(GetSzarpDataDir().c_str(), GetSzarpDir().c_str(), _lang.c_str()); m_cfg_mgr = new ConfigManager(GetSzarpDataDir(), IPKContainer::GetObject()); m_cfg_mgr->SetSplashScreen(splash); splash->PushStatusText(_("Initializing szbase...")); splash->PushStatusText(_("Initializing XML Resources...")); InitXmlResource(); splash->PushStatusText(_("Starting database query mechanism...")); m_db_queue = new DatabaseQueryQueue(); m_dbmgr = new DatabaseManager(m_db_queue, m_cfg_mgr); m_db_queue->SetDatabaseManager(m_dbmgr); m_dbmgr->SetProbersAddresses(GetProbersAddresses()); Draw3Base* draw_base; switch (m_base_type) { case SZBASE_BASE: draw_base = new SzbaseBase(m_dbmgr, GetSzarpDataDir().c_str(), &ConfigurationFileChangeHandler::handle, wxConfig::Get()->Read(_T("SZBUFER_IN_MEMORY_CACHE"), 0L)); break; case SZ4_BASE: draw_base = new Sz4Base(m_dbmgr, GetSzarpDataDir().c_str(), IPKContainer::GetObject()); break; case IKS_BASE: draw_base = new Sz4ApiBase(m_dbmgr, m_iks_server.c_str(), m_iks_port.c_str(), IPKContainer::GetObject()); break; } m_executor = new QueryExecutor(m_db_queue, m_dbmgr, draw_base); m_executor->Create(); m_executor->SetPriority((WXTHREAD_MAX_PRIORITY + WXTHREAD_DEFAULT_PRIORITY) / 2); m_executor->Run(); m_cfg_mgr->SetDatabaseManager(m_dbmgr); ConfigurationFileChangeHandler::database_manager = m_dbmgr; /* default config */ wxString defid; DrawsSets *config = NULL; splash->PushStatusText(_("Loading configuration...")); /* init activity logger with base name as server name. This assumes that * server has written basename to /etc/hosts on linux machines and probably * doesn't work on windows. */ UDPLogger::SetAppName( "draw3" ); UDPLogger::SetAddress( (const char*)m_base.mb_str(wxConvUTF8) ); UDPLogger::SetPort ( "7777" ); UDPLogger::LogEvent ( "drawapp:start" ); wxString prefix, window; PeriodType pt = PERIOD_T_YEAR; time_t time = -1; int selected_draw = 0; if (!m_url.IsEmpty()) { if (!decode_url(m_url, prefix, window, pt, time, selected_draw)) { wxLogError(_T("Invalid URL")); StopThreads(); return FALSE; } } else if (!m_base.IsEmpty()) { if ((config = m_cfg_mgr->LoadConfig(m_base,std::wstring(),m_show_logparams)) == NULL) { wxLogError(_("Error occurred while loading default configuration. Check your szarp.cfg file.")); StopThreads(); return FALSE; } prefix = m_base; } else { wxLogError(_("Missing starting base specification.")); StopThreads(); return FALSE; } #ifndef MINGW32 libpar_done(); #endif m_help = new szHelpController; #ifndef MINGW32 m_help->AddBook(wxGetApp().GetSzarpDir() + L"/resources/documentation/new/draw3/html/draw3.hhp"); #else m_help->AddBook(wxGetApp().GetSzarpDir() + L"\\resources\\documentation\\new\\draw3\\html\\draw3.hhp"); #endif szHelpControllerHelpProvider* provider = new szHelpControllerHelpProvider; wxHelpProvider::Set(provider); provider->SetHelpController(m_help); splash->PushStatusText(_("Initizalizing remarks...")); m_remarks_handler = new RemarksHandler(m_cfg_mgr); m_remarks_handler->Start(); splash->PushStatusText(_("Creating Frame Manager...")); VersionChecker* version_checker = new VersionChecker(argv[0]); version_checker->Start(); FrameManager *fm = new FrameManager(m_dbmgr, m_cfg_mgr, m_remarks_handler); /*@michal */ if (!fm->CreateFrame(prefix, window, pt, time, wxSize(width, height), wxPoint(x, y), selected_draw, m_url.IsEmpty(), m_full_screen)) { StopThreads(); wxLogError(_T("Unable to load base: %s"), prefix.c_str()); return FALSE; } StartInstanceServer(fm, m_cfg_mgr); wxToolTip::SetDelay(1000); SetAppName(_T("SZARPDRAW3")); splash->Destroy(); m_cfg_mgr->ResetSplashScreen(); #ifndef NO_GSTREAMER if (!gst_init_check(NULL, NULL, NULL)) return 1; #endif return TRUE; }