Changeset 487 for AE/Installer/trunk/source/aeinstallerapp.cpp
- Timestamp:
- Dec 30, 2009, 2:51:38 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
AE/Installer/trunk/source/aeinstallerapp.cpp
r423 r487 1 / ////////////////////////////////////////////////////////////////////////////2 // Name: aeinstallerapp.cpp 3 // Purpose: 4 // Author: 5 // Modified by: 6 // Created: 07/05/2009 17:23:39 7 // RCS-ID: 8 // Copyright: 9 // Licence: 10 ///////////////////////////////////////////////////////////////////////////// 1 /***************************************************************************\ 2 | Project: AE Installer | 3 | By: Gumby & Iritscen | 4 | File: AEInstallerApp.cpp | 5 | Function: Sets up the main application window. | 6 | Created: 07/05/2009 17:23:39 | 7 \***************************************************************************/ 8 9 #include "boost/filesystem.hpp" 10 #include "boost/lexical_cast.hpp" // int -> string 11 11 #include "boost/thread.hpp" 12 #include <boost/thread/mutex.hpp>12 #include "boost/thread/mutex.hpp" 13 13 #include <fstream> 14 #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations 15 #include "boost/lexical_cast.hpp" //int -> string 16 using namespace boost::filesystem; 17 // For compilers that support precompilation, includes "wx/wx.h". 18 #include "wx/wxprec.h" 19 20 #ifdef __BORLANDC__ 21 #pragma hdrstop 22 #endif 23 24 #ifndef WX_PRECOMP 25 #include "wx/wx.h" 26 #endif 14 #include <string> 15 #include "installer.h" 16 #include "aeinstallerapp.h" 27 17 28 18 ////@begin includes 29 19 ////@end includes 30 20 31 #include "aeinstallerapp.h" 32 #include <string> 21 Install_info_cfg currentAE, updateAE; 22 MainWindow* TheWindow; 33 23 34 24 ////@begin XPM images … … 88 78 */ 89 79 80 /* The OnInit() routine is used to check whether the Installer has the software *\ 81 | it needs to install mods, whether there is an available update, and whether | 82 \* the user has globalized yet, to allow mods to be installed. */ 90 83 bool AEInstallerApp::OnInit() 91 84 { … … 93 86 // Remove the comment markers above and below this block 94 87 // to make permanent changes to the code. 95 96 88 #if wxUSE_XPM 97 89 wxImage::AddHandler(new wxXPMHandler); … … 111 103 TheWindow = mainWindow; 112 104 105 // Anything after this is done after the window appears... 106 107 if (!CheckForRequiredSoftware()) 108 { 109 TheWindow->Close(); // CheckForRequiredSoftware() will have notified the user of what they are missing, so we just quit now 110 return true; 111 } 112 113 bool installerJustUpdated = false; 114 int updateStatus = GetUpdateStatus(¤tAE, &updateAE, &installerJustUpdated); 115 if (updateStatus) // otherwise there's no update 116 { 117 string updateMsg = "An update for the Anniversary Edition is available.\n"; // for some reason we can't set the initial value while using the '+' operator... 118 updateMsg = updateMsg + "Do you wish to update to Edition version " + updateAE.AEVersion + "?\n" + 119 "(Current version is " + currentAE.AEVersion + ")\n"; // ...so tack the rest on in a second command 120 wxMessageDialog* updateNotification; 121 122 switch (updateStatus) // for the meanings of these return values, see the comments preceding installer.cpp's GetUpdateStatus() 123 { 124 case UPDATE_LOG_READ_ERR: 125 { 126 if (exists("Update.log")) remove("Update.log"); 127 ofstream logfile("Update.log"); 128 logfile << "Error: A necessary .cfg file could not be read."; 129 } // brackets are needed due to the initialization of the ofstream; silly C! 130 break; 131 case UPDATE_MNTH_REQD_ERR: 132 updateMsg = "There is a patch in the updates/ folder, but it patches the\n"; 133 updateMsg = updateMsg + updateAE.AEVersion.substr(0, updateAE.AEVersion.length() - 1) + " release; it cannot update this version of the Edition."; 134 updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxOK | wxICON_EXCLAMATION, wxDefaultPosition); 135 updateNotification->ShowModal(); 136 break; 137 case UPDATE_SIMP_AVAIL: // there's an update with no globalization or Installer strings attached 138 updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION, wxDefaultPosition); 139 if (updateNotification->ShowModal() == wxID_YES) 140 ProcessAEUpdate(¤tAE, &updateAE, &installerJustUpdated); 141 break; 142 case UPDATE_GLOB_AVAIL: // there's an update with globalization strings attached 143 updateMsg = updateMsg + "**Note that the update requires you to reglobalize, which will take 5-20 minutes.**\n" + 144 "Before clicking Yes, MAKE SURE you have backed up any mods not installed through\n " + 145 "the Installer, such as plug-ins or direct OniSplit imports."; 146 updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION, wxDefaultPosition); 147 if (updateNotification->ShowModal() == wxID_YES) 148 ProcessAEUpdate(¤tAE, &updateAE, &installerJustUpdated); 149 break; 150 case UPDATE_INST_AVAIL: // there's an update with Installer strings attached (globalization is irrelevant while the Installer is not yet updated) 151 updateMsg = updateMsg + "**Note that the update requires the Installer to update itself.**\n" + 152 "If you click Yes, the Installer will quit and re-launch itself, then\n" + 153 "you will be prompted to begin the installation."; 154 updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION, wxDefaultPosition); 155 updateNotification->ShowModal(); 156 if (updateNotification->ShowModal() == wxID_YES) 157 { 158 if (ProcessInstallerUpdate(¤tAE, &updateAE)) // there's an intentional logic gap here: if the user clicks "Yes"... 159 { // ...and then ProcessInstallerUpdate has an error and returns false, the logic gap results... 160 TheWindow->Close(); // ...in the code continuing to execute down through case UPDATE_INST_REPL_ERR 161 return true; 162 } 163 } 164 else 165 break; 166 case UPDATE_INST_REPL_ERR: // the Installer replacement failed, user has to do it :-( 167 updateMsg = "The Installer replacement process failed for some reason.\n"; 168 updateMsg = updateMsg + "Please quit, go into the folder Edition/Updates/" + strEUFN + "/install/ and drag the Installer to Edition/install/, " + 169 "replacing the current Installer application, then launch the new version."; 170 updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxOK | wxICON_EXCLAMATION, wxDefaultPosition); 171 updateNotification->ShowModal(); 172 TheWindow->Close(); 173 return true; 174 } 175 } 176 177 CheckForGlobalization(false); // function will prompt user and initiate globalization if not done already 178 179 return true; 180 } 181 182 bool CheckForRequiredSoftware(void) 183 { 113 184 #ifdef WIN32 114 HKEY hKey; 115 if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\.NETFramework\\policy\\v2.0", 0L, KEY_READ , &hKey) == ERROR_SUCCESS) { 116 wxMessageDialog* MonoDialogOfDeath = new wxMessageDialog(TheWindow, "You don't have .NET 2.0 installed! .NET is a framework required by the Edition. You can download it from:\nhttp://gumby.oni2.net/dotnet\nPlease install .NET 2.0, then open this Installer again. \n\nWould you like to open the download webpage?", "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition); 117 if(MonoDialogOfDeath->ShowModal() == wxID_YES) { 185 // test for .NET 2.0 or higher 186 HKEY hKey; 187 if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\.NETFramework\\policy\\v2.0", 0L, KEY_READ , &hKey) == ERROR_SUCCESS) 188 { 189 string dotnetMsg = "You don't have .NET 2.0 installed! .NET is a framework required by the Edition.\n"; 190 dotnetMsg = dotnetMsg + "You can download it from:\n" + 191 "http://gumby.oni2.net/dotnet\n" + 192 "Please install .NET 2.0, then open this Installer again.\n\n" + 193 "Would you like to open the download webpage?"; 194 wxMessageDialog* DotNetDialogOfDeath = new wxMessageDialog(TheWindow, dotnetMsg.c_str(), "AE Installer Alert", 195 wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition); 196 if (DotNetDialogOfDeath->ShowModal() == wxID_YES) 118 197 system("start http://www.microsoft.com/downloads/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5"); 119 }120 198 RegCloseKey(hKey); 121 TheWindow->Close(); 122 } 123 #else 124 // test for the third-party mono framework, because without it, on Mac, we are up a creek 125 char monoCommand[300] = "which mono >> "; 126 strcat(monoCommand, escapePath(system_complete("mono_check.log").string()).c_str()); 127 system(monoCommand); 128 fstream file; 129 file.open("mono_check.log"); 130 string line; 131 int line_count = 0; 132 while (!file.eof()) 133 { 134 line_count++; 135 getline(file, line); 136 } 137 file.close(); 138 remove("mono_check.log"); 139 140 if (line_count <= 1) // this means that "which mono" returned nothing -- abort! abort! abort! 141 { 142 wxMessageDialog* MonoDialogOfDeath = new wxMessageDialog(TheWindow, "You don't have 'mono' installed! 'mono' is a command-line tool required by the Edition. You can download it from:\nhttp://www.go-mono.com/mono-downloads/download.html (OS X 10.4+) or\nhttp://edt.oni2.net/AE/MonoFramework10.3.dmg (OS X 10.3)\n\nPlease install 'mono', then open this Installer again.", "AE Installer Alert", wxOK | wxICON_EXCLAMATION , wxDefaultPosition); 199 return false; 200 } 201 #else // on Mac... 202 // test for the third-party "mono" framework, because without it, we are up a creek 203 FILE *fWhichMono = NULL; 204 char chrWhichMono[32]; 205 fWhichMono = popen("which mono", "r"); 206 fgets(chrWhichMono, sizeof(chrWhichMono), fWhichMono); 207 pclose(fWhichMono); 208 string strWhichMono = (string)chrWhichMono; 209 string::size_type loc = strWhichMono.find("mono", 0); 210 211 if (loc == string::npos) // this means that "which mono" did not return a path leading to the mono binary -- abort! abort! abort! 212 { 213 string monoMsg = "You don't have 'mono' installed! 'mono' is a command-line tool required by the Edition.\n"; 214 monoMsg = monoMsg + "You can download it from: http://www.go-mono.com/mono-downloads/download.html (OS X 10.4+)\n" + 215 "or http://edt.oni2.net/AE/MonoFramework10.3.dmg (OS X 10.3)\n\n" + 216 "Please install 'mono', then open this Installer again."; 217 wxMessageDialog* MonoDialogOfDeath = new wxMessageDialog(TheWindow, monoMsg.c_str(), "AE Installer Alert", wxOK | wxICON_EXCLAMATION, wxDefaultPosition); 143 218 MonoDialogOfDeath->ShowModal(); 144 TheWindow->Close(); 145 return true; // it's quittin' time, Joe 146 } 147 #endif 148 149 //anything after this is done after the window appears... 150 151 if ( !exists("../GameDataFolder") ) 152 { 153 wxMessageDialog* YesNoDialog = new wxMessageDialog(TheWindow, "You haven't globalized yet! \nYou must globalize to use the Anniversary Edition framework. \nWould you like to globalize now? (This could take a while...)\n(Selecting \"No\" will exit this program...)", "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition); 154 219 return false; // it's quittin' time, Joe 220 } 221 #endif 222 return true; 223 } 224 225 bool CheckForGlobalization(bool justDoIt) 226 { 227 if (!exists("../GameDataFolder")) 228 { 229 string globMsg = "You haven't globalized yet!\n"; 230 globMsg = globMsg + "You must globalize to use the Anniversary Edition framework.\n" + 231 "Would you like to globalize now? (This could take a while...)\n" + 232 "(Selecting \"No\" will exit this program...)"; 233 wxMessageDialog* YesNoDialog = new wxMessageDialog(TheWindow, globMsg.c_str(), "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION, wxDefaultPosition); 234 155 235 if (YesNoDialog->ShowModal() == wxID_NO) // if the user said no... 236 { 156 237 TheWindow->Close(); 157 else 158 { 159 160 238 return true; 239 } 240 } 241 else if (!justDoIt) 242 return false; 243 // Code below this point runs if user clicks "Yes" or if they are never asked but justDoIt is true 161 244 #ifdef WIN32 162 boost::thread thrd3(globalize2); 163 //globalizeData(); 164 //boost::thread::create_thread(&globalizeData); 165 // boost::thread_group Tg; 166 // Tg.create_thread( &globalizeData(), this ); 167 #else 168 TheWindow->InstallButton->Disable(); 169 TheWindow->ReglobalizeButton->Disable(); 170 globalizeData(); 171 TheWindow->InstallButton->Enable(); 172 TheWindow->ReglobalizeButton->Enable(); 173 #endif 174 175 176 } 177 } 178 245 boost::thread thrd3(globalize2); 246 #else // cannot use multi-threading in Mac build 247 TheWindow->InstallButton->Disable(); 248 TheWindow->ReglobalizeButton->Disable(); 249 globalizeData(); 250 TheWindow->InstallButton->Enable(); 251 TheWindow->ReglobalizeButton->Enable(); 252 #endif 253 179 254 return true; 180 255 } 181 256 182 183 void setStatusArea( string s ){257 void setStatusArea(string s) 258 { 184 259 wxString wxs(s.c_str(), wxConvUTF8); 185 260 186 TheWindow->StatusArea->SetStatusText( wxs ); 187 //TheWindow->StatusArea->SetStatusText(s.c_str()); 188 //StatusArea->SetStatusText(_(s.c_str())); 189 //(*TheStatusBar)->SetStatusText(_(s.c_str())); 190 //AEInstallerApp:: 191 // TheWindow->StatusArea->SetStatusText("hi"); 192 //mainWindow 193 //itemFrame1->StatusArea->SetStatusText(_"lol"); 194 //MainWindow.StatusArea->SetStatusText("hi"); 195 // class AbstractStatusNotifier { public: virtual void NotifyStatus(const wxString &statusString) = 0; }; 196 //class StatusBarStatusNotifier : public AbstractStatusNotifier { wxStatusBar *statusbar; StatusBarStatusNotifier(wxStatusBar *bar) : statusbar(bar) { } ; 197 //void NotifyStatus(const wxString &status) { statusbar->SetStatus(status); } } 198 199 200 //MainWindow::StatusArea-> 201 //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1); 202 203 //MainWindow::StatusBar->SetLabel("Importing Files..."); 204 //StatusBar->SetLabel(s); 205 //->SetLabel(s); 206 261 TheWindow->StatusArea->SetStatusText(wxs); 207 262 } 208 263 … … 218 273 ////@end AEInstallerApp cleanup 219 274 } 220 void doglobalizeData() {221 //TheWindow->Disable(); 275 void doglobalizeData() 276 { 222 277 globalizeData(); 223 278 #ifdef WIN32 224 279 while(1) Sleep(-1); 225 280 #endif 226 //TheWindow->Enable(); 227 //setStatusArea((string)"Test1"); 228 } 281 }
Note:
See TracChangeset
for help on using the changeset viewer.