Ignore:
Timestamp:
Dec 30, 2009, 2:51:38 AM (15 years ago)
Author:
iritscen
Message:

Adding update feature; moving/neatening some code; adding globals.h

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
    1111#include "boost/thread.hpp"
    12 #include <boost/thread/mutex.hpp>
     12#include "boost/thread/mutex.hpp"
    1313#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"
    2717
    2818////@begin includes
    2919////@end includes
    3020
    31 #include "aeinstallerapp.h"
    32 #include <string>
     21Install_info_cfg currentAE, updateAE;
     22MainWindow* TheWindow;
    3323
    3424////@begin XPM images
     
    8878 */
    8979
     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.                                  */
    9083bool AEInstallerApp::OnInit()
    9184{   
     
    9386        // Remove the comment markers above and below this block
    9487        // to make permanent changes to the code.
    95        
    9688#if wxUSE_XPM
    9789        wxImage::AddHandler(new wxXPMHandler);
     
    111103        TheWindow = mainWindow;
    112104       
     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(&currentAE, &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(&currentAE, &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(&currentAE, &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(&currentAE, &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
     182bool CheckForRequiredSoftware(void)
     183{
    113184#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)
    118197                        system("start http://www.microsoft.com/downloads/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5");
    119                  }
    120198                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);
    143218                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
     225bool 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               
    155235                if (YesNoDialog->ShowModal() == wxID_NO) // if the user said no...
     236                {
    156237                        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
    161244#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       
    179254        return true;
    180255}
    181256
    182 
    183 void setStatusArea( string s ) {
     257void setStatusArea(string s)
     258{
    184259        wxString wxs(s.c_str(), wxConvUTF8);
    185260       
    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);
    207262}
    208263
     
    218273        ////@end AEInstallerApp cleanup
    219274}
    220 void doglobalizeData() {
    221         //TheWindow->Disable();
     275void doglobalizeData()
     276{
    222277        globalizeData();
    223278#ifdef WIN32
    224279        while(1) Sleep(-1);
    225280#endif
    226         //TheWindow->Enable();
    227         //setStatusArea((string)"Test1");
    228 }
     281}
Note: See TracChangeset for help on using the changeset viewer.