ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/AE/Installer/trunk/source/installer.cpp
(Generate patch)

Comparing AE/Installer/trunk/source/installer.cpp (file contents):
Revision 506 by iritscen, Mon Apr 5 02:11:45 2010 UTC vs.
Revision 551 by gumby, Thu May 27 20:30:35 2010 UTC

# Line 27 | Line 27 | using namespace boost::posix_time;
27   // externs declared in installer.h
28   string strInstallCfg = "../GameDataFolder/Add.cfg";
29   string strEUFN = "Edition"; // GetUpdateStatus() may set this to "Edition-patch" later, but this is the assumed name of the new Edition folder in Updates/
30 + extern MainWindow* TheWindow;
31  
32   int globalizeData(void)
33   {
# Line 596 | Line 597 | void recompileAll(vector<string> install
597          else if(splitInstances == false){
598                  directory_iterator end_iter;
599                  
600 <                for ( directory_iterator dir_itr( vanilla_dir );
601 <                         dir_itr != end_iter;
602 <                         ++dir_itr )
603 <                {
604 <                        if ( is_directory( dir_itr->status() ) )
605 <                        {
606 <                                numberOfDats++;
600 >                
601 >                char levelnums[256] = {0};
602 >
603 >
604 >
605 >                for(int k = 0; k < 256; k++) {
606 >                        if( exists( (path)("./VanillaDats/level" + lexical_cast<std::string>(k) + "_final/") ) ) {
607 >                                        levelnums[k] = 1;
608 >                                        
609                          }
610                  }
611 <                
611 >        
612 >                for (int i = installedMods.size() - 1; i >= 0; i--) {                                                   //Iterates through the installed mods (backwards :P)
613 >                        for (unsigned int j = 0; j < globalPackages.size(); ++j) {                              //looking in the global packages
614 >                                if (globalPackages[j].modStringName == installedMods[i]) {      //for a mod that has BSL in it
615 >                                        for(int k = 0; k < 256; k++) {
616 >                                                if( globalPackages[j].hasOnis &&
617 >                                                        exists( (path)("packages/" + globalPackages[j].modStringName + "/oni/level" + lexical_cast<std::string>(k) + "_final/") ) ) {
618 >                                                        levelnums[k] = 1;
619 >                                                        
620 >                                                }
621 >                                        }
622 >                                }
623 >                        }
624 >                }
625 >                for (int levelnum = 0; levelnum < 256; levelnum++)
626 >                        if (levelnums[levelnum])
627 >                                numberOfDats++;
628 >
629                  out << numberOfDats;
630                  datString = out.str();
631 <                
632 <                for ( directory_iterator dir_itr( vanilla_dir );
613 <                         dir_itr != end_iter;
614 <                         ++dir_itr )
615 <                {
631 >
632 >                for(int levelnum = 0; levelnum < 256; levelnum++) {
633                          try
634                          {
635 <                                if ( is_directory( dir_itr->status() ) )
635 >                                if ( levelnums[levelnum] )
636                                  {
637 <                                        importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " ";
637 >                                        importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + "level" + lexical_cast<std::string>(levelnum) + "_Final ";
638                                          for (unsigned int i = 0; i < installedMods.size(); ++i) {
639 <                                                if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename()  ))
640 <                                                        importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename();
639 >                                                if (exists((path)("packages/" + installedMods[i] + "/oni/level" + lexical_cast<std::string>(levelnum) + "_final") ))
640 >                                                        importCommand += " packages/" + installedMods[i] + "/oni/level" + lexical_cast<std::string>(levelnum) + "_Final";
641                                          }
642 <                                        importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
642 >                                        importCommand += " ../GameDataFolder/level" + lexical_cast<std::string>(levelnum) + "_Final.dat >> Install.log";
643                                          
644                                          setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
645                                          setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +
646 <                                                                  dir_itr->path().filename() + " ");
646 >                                                                  "level" + lexical_cast<std::string>(levelnum) + "_Final"+ " ");
647                                          system(importCommand.c_str());
648                                          j++;
649                                  }
# Line 646 | Line 663 | void recompileAll(vector<string> install
663          vector<string> skippedfolders;
664  
665          ofstream BSLlog("BSL.log");
666 +        if(exists("../GameDataFolder/BSLBackup/")) {
667 +                remove_all("../GameDataFolder/BSLBackup/");
668 +        }
669 +        else {
670 +                create_directory("../GameDataFolder/BSLBackup/");
671 +        }
672 +        copy("../GameDataFolder/IGMD/", "../GameDataFolder/BSLBackup/");
673          for ( directory_iterator dir_itr( "../GameDataFolder/IGMD/" ), end_itr;
674                   dir_itr != end_itr;
675                   ++dir_itr ) {
# Line 658 | Line 682 | void recompileAll(vector<string> install
682          for (int i = installedMods.size() - 1; i >= 0; i--) {                                                   //Iterates through the installed mods (backwards :P)
683                  for (unsigned int j = 0; j < globalPackages.size(); ++j) {                              //looking in the global packages
684                          if (globalPackages[j].modStringName == installedMods[i]) {      //for a mod that has BSL in it
685 <                                if(!(globalPackages[j].hasAddon || globalPackages[j].hasBSL)) break; //skip non-BSL
685 >                                if(globalPackages[j].hasBSL) break; //skip non-BSL
686                                  if( exists( "packages/" + globalPackages[j].modStringName + "/BSL/" ) ) {
687                                          copyBSL("packages/" + globalPackages[j].modStringName + "/BSL", BSLfolders, globalPackages[j] );
688                                          BSLlog << "Copied " <<  globalPackages[j].modStringName << "!\n";
# Line 667 | Line 691 | void recompileAll(vector<string> install
691                  }
692          }
693          
694 +
695 +
696          ModPackage emptyPackage;
697          emptyPackage.modStringName = "VanillaBSL";
698          emptyPackage.hasBSL = 1;
699          copyBSL("packages/VanillaBSL/IGMD", BSLfolders, emptyPackage);
700          BSLlog.close();
701 <        
701 >
702 >        for (int i = installedMods.size() - 1; i >= 0; i--) {                                                   //Iterates through the installed mods (backwards :P)
703 >                for (unsigned int j = 0; j < globalPackages.size(); ++j) {                              //looking in the global packages
704 >                        if (globalPackages[j].modStringName == installedMods[i]) {      //for a mod that has BSL in it
705 >                                if(!globalPackages[j].hasAddon) break; //skip non-BSL
706 >                                if( exists( "packages/" + globalPackages[j].modStringName + "/BSL/" ) ) {
707 >                                        copyBSL("packages/" + globalPackages[j].modStringName + "/BSL", BSLfolders, globalPackages[j] );
708 >                                        BSLlog << "Copied " <<  globalPackages[j].modStringName << "!\n";
709 >                                }
710 >                        }
711 >                }
712 >        }
713 >
714          logfile << "Writing config file";
715          writeInstalledMods(installedMods);
716          setProgressBar(1000);
# Line 713 | Line 751 | void copyBSL(string copypath, vector<str
751                          if ( is_directory( dir_itr->path() ) && dir_itr->path().string() != ".svn" ) {  
752                                  BSLlog << "Testing " << dir_itr->path().string() << " HasBSL: " << pkg.hasBSL << " HasAddon: " << pkg.hasAddon << "\n";
753                                  int skip_folder = 0;
754 <                                
755 <                                for(unsigned int k = 0; k < BSLfolders.size(); k++)             {//iterate through already found BSL folders    
756 <                                        BSLlog << "testing " << dir_itr->path().filename() << " vs " << BSLfolders[k] << "\n";
757 <                                        if(dir_itr->path().filename() == BSLfolders[k]) {
758 <                                                skip_folder = 1;
759 <                                                BSLlog << "skipping " << BSLfolders[k] << " in " << pkg.modStringName << "\n";
760 <                                                break;
754 >                                if(!pkg.hasAddon) {
755 >                                        for(unsigned int k = 0; k < BSLfolders.size(); k++)             {//iterate through already found BSL folders    
756 >                                                BSLlog << "testing " << dir_itr->path().filename() << " vs " << BSLfolders[k] << "\n";
757 >                                                if(dir_itr->path().filename() == BSLfolders[k]) {
758 >                                                        skip_folder = 1;
759 >                                                        BSLlog << "skipping " << BSLfolders[k] << " in " << pkg.modStringName << "\n";
760 >                                                        break;
761 >                                                }
762                                          }
763                                  }
764                                  if (!skip_folder && !exists("../GameDataFolder/IGMD/" + dir_itr->path().filename() + "/ignore.txt")) {
# Line 734 | Line 773 | void copyBSL(string copypath, vector<str
773                                                          copy_file(bsl_itr->path(),  "../GameDataFolder/IGMD/" + dir_itr->path().filename() + "/" + bsl_itr->path().filename());
774                                                  }
775                                          }
776 <                                        BSLfolders.push_back( dir_itr->path().filename() ); //add back check for addon
777 <                                        BSLlog << "Pushing " << dir_itr->path().filename() << "\n" ;
776 >                                        if( !pkg.hasAddon ) {
777 >                                                BSLfolders.push_back( dir_itr->path().filename() ); //add back check for addon
778 >                                                BSLlog << "Pushing " << dir_itr->path().filename() << "\n" ;
779 >                                        }
780                                  }
781                          }
782                  }
# Line 841 | Line 882 | int GetUpdateStatus(Install_info_cfg *cu
882                          return UPDATE_LOG_READ_ERR;
883          }
884  
885 <        // Is there an update folder, and is it a monthly release or a patch?
885 >        // Is there an update in the updates/ folder, and is it a monthly release or a patch?
886          bool firstParty = 0;
887 +        // First create the folder if it's missing, so users are never left wondering where updates are supposed to be put
888 +        if (!exists("../updates"))
889 +                create_directory("../updates");
890          if (exists("../updates/Edition"))
891          {
892                  firstParty = 1;
# Line 978 | Line 1022 | int GetUpdateStatus(Install_info_cfg *cu
1022                                          fstream file;
1023                                          file.open((install_iter->path().string() + "/Mod_Info.cfg").c_str());
1024                                          if (!file.fail())
1025 <                                                ModPackage updatePackage = fileToModPackage(file, install_iter->path().filename());
1025 >                                                updatePackage = fileToModPackage(file, install_iter->path().filename());
1026                                          else
1027                                          {
1028                                                  file.close();
1029                                                  continue;
1030                                          }
1031 <                                        if (exists("packages" + install_iter->path().filename() + "/Mod_Info.cfg"))
1031 >                                        if (exists("packages/" + install_iter->path().filename() + "/Mod_Info.cfg"))
1032                                          {
1033                                                  file.close();
1034 <                                                file.open(("packages" + install_iter->path().filename() + "/Mod_Info.cfg").c_str());
1034 >                                                file.clear();
1035 >                                                file.open(("packages/" + install_iter->path().filename() + "/Mod_Info.cfg").c_str());
1036                                                  if (!file.fail())
1037 <                                                        ModPackage installedPackage = fileToModPackage(file, install_iter->path().filename());
1037 >                                                        installedPackage = fileToModPackage(file, install_iter->path().filename());
1038                                                  file.close();
1039                                                  if (updatePackage.modStringVersion > installedPackage.modStringVersion)
1040                                                  {
# Line 1023 | Line 1068 | bool ReadInstallInfoCfg(fstream *fileHan
1068          string strDaodanVersion = "Daodan_Version";
1069          string strOniSplitVersion = "OniSplit_Version";
1070          string strGUIWinVersion = "GUI_Win_Version";
1071 <        string strGUIMacVersion = "GUI_Mac_Version";
1071 >        string strGUIMacVersion = "GUI_Mac_Version";
1072          string strReglobalize = "Reglobalize";
1073          string strDeleteList = "Delete_List";
1074          string strArrow = "->";
# Line 1267 | Line 1312 | bool ProcessInstallerUpdate(Install_info
1312  
1313   bool ProcessAEUpdate(Install_info_cfg *currentAE, Install_info_cfg *updateAE, bool *installerJustUpdated)
1314   {
1315 +        try {
1316          fstream file;
1317          string line;
1318          vector<string> tokens, updateStarted;
# Line 1286 | Line 1332 | bool ProcessAEUpdate(Install_info_cfg *c
1332          string strOniApp = "Oni.exe";
1333   #else
1334          string strOniApp = "Oni.app";
1289 #endif
1335          bool needNewTrashDir = false;
1336 + #endif
1337 +        
1338          bool readingVerAndDate = false;
1339          
1340   #ifdef WIN32
1341 <        string strTrashDir = "Trash\\"; // string unused in Windows because files are simply deleted
1341 >        //string strTrashDir = "Trash\\"; // string unused in Windows because files are simply deleted
1342   #else
1343          FILE *fUserName = NULL;
1344          char chrUserName[32];
# Line 1326 | Line 1373 | bool ProcessAEUpdate(Install_info_cfg *c
1373                          if (readingVerAndDate && tokens.capacity() >= 3)
1374                                  tokenize(tokens[2], updateStarted, "-");
1375                  }
1376 + #ifndef WIN32
1377                  if (updateStarted.capacity() < 3)
1378                          needNewTrashDir = true;
1379                  else
# Line 1335 | Line 1383 | bool ProcessAEUpdate(Install_info_cfg *c
1383                          if (!exists(strTrashDir))
1384                                  needNewTrashDir = true;
1385                  }
1386 + #endif
1387          }
1388   #ifndef WIN32
1389          if (!*installerJustUpdated || needNewTrashDir) // prepare a new directory for deleted files to go to
# Line 1351 | Line 1400 | bool ProcessAEUpdate(Install_info_cfg *c
1400          // Special code to replace our special files -- the Oni app, OniSplit, the Daodan DLL, and the GUI for OniSplit
1401          if (exists(strPathToEUFN + strOniApp))
1402          {
1403 <                if (exists(strOniApp))
1404 <                        rename((path)strOniApp, (path)(strTrashDir + strOniApp));
1405 <                rename((path)(strPathToEUFN + strOniApp), (path)strOniApp);
1403 >                if (exists("../" + strOniApp))
1404 > #ifdef WIN32
1405 >                        remove((path)("../" + strOniApp));
1406 > #else
1407 >                        rename((path)("../" + strOniApp), (path)(strTrashDir + strOniApp));
1408 > #endif
1409 >                rename((path)(strPathToEUFN + strOniApp), (path)("../" + strOniApp));
1410          }
1411          if (updateAE->OniSplitVersion.compare(currentAE->OniSplitVersion) >= 1)
1412          {
1413                  if (exists(strPathToEUFNInstall + strOniSplit))
1414                  {
1415                          if (exists(strOniSplit))
1416 + #ifdef WIN32
1417 +                                remove((path)strOniSplit);
1418 + #else
1419                                  rename((path)strOniSplit, (path)(strTrashDir + strOniSplit));
1420 + #endif
1421                          rename((path)(strPathToEUFNInstall + strOniSplit), (path)strOniSplit);
1422                  }
1423          }
# Line 1370 | Line 1427 | bool ProcessAEUpdate(Install_info_cfg *c
1427                  if (exists(strPathToEUFN + strDaodan))
1428                  {
1429                          if (exists(("../" + strDaodan)))
1430 <                                rename((path)("../" + strDaodan), (path)(strTrashDir + strDaodan));
1430 >                                remove((path)("../" + strDaodan));
1431                          rename((path)(strPathToEUFN + strDaodan), (path)("../" + strDaodan));
1432                  }
1433          }
# Line 1379 | Line 1436 | bool ProcessAEUpdate(Install_info_cfg *c
1436                  if (exists(strPathToEUFNInstall + strWinGUI))
1437                  {
1438                          if (exists((path)strWinGUI))
1439 <                                rename((path)strWinGUI, (path)(strTrashDir + strWinGUI));
1439 >                                remove((path)strWinGUI);
1440                          if (exists(strWinGUILang))
1441 <                                rename((path)strWinGUILang, (path)(strTrashDir + strWinGUILang));
1441 >                                remove((path)strWinGUILang);
1442                          rename((path)(strPathToEUFNInstall + strWinGUI), (path)strWinGUI);
1443                          rename((path)(strPathToEUFNInstall + strWinGUILang), (path)strWinGUILang);
1444                  }
# Line 1414 | Line 1471 | bool ProcessAEUpdate(Install_info_cfg *c
1471                          while (curPos != string::npos && curPos < thePath.size())
1472                          {
1473                                  aParentPath = aParentPath + thePath.substr(lastPos, curPos - lastPos);
1474 + #ifndef WIN32
1475                                  if (!exists(strTrashDir + aParentPath))
1476                                          create_directory(strTrashDir + aParentPath);
1477 + #endif
1478                                  lastPos = curPos + 1;
1479                                  curPos = thePath.find("/", lastPos);
1480                                  aParentPath = aParentPath + "/";
# Line 1460 | Line 1519 | bool ProcessAEUpdate(Install_info_cfg *c
1519          for (vector<string>::iterator iter = filesToMove.begin(); iter != filesToMove.end(); iter++)
1520          {
1521                  if (exists(strPathToPackages + strGlobalize + *iter))
1522 + #ifdef WIN32
1523 +                        remove((path)(strPathToPackages + strGlobalize + *iter));
1524 + #else
1525                          rename((path)(strPathToPackages + strGlobalize + *iter), (path)(strTrashDir + *iter));
1526 + #endif
1527                  rename((path)(strPathToEUFNPackages + strGlobalize + *iter), (path)(strPathToPackages + strGlobalize + *iter));
1528          }
1529          
1530          // Clean up after ourselves, trashing any packages or programs in the update package that are not newer than the current AE
1531 + #ifdef WIN32
1532 +        remove_all((path)strPathToEUFN);
1533 + #else
1534          create_directory(strTrashDir + "Unneeded update files");
1535          rename((path)strPathToEUFN, (path)(strTrashDir + "Unneeded update files/" + strEUFN));
1536 <        
1536 > #endif
1537          // Write to log that we are finished with update
1538          ptime end_time(second_clock::local_time());
1539          string progressMsg2 = "Edition was updated to:\n" +
# Line 1485 | Line 1551 | bool ProcessAEUpdate(Install_info_cfg *c
1551                  CheckForGlobalization(true); // the 'true' value forces re-globalization
1552          
1553          globalPackages = getPackages(); // refresh the list in memory
1554 <        // TODO: Refresh the packages list in the window
1555 <
1554 >        wxCommandEvent e;
1555 >        TheWindow->OnRefreshButtonClick( e );
1556          return true;
1557 +        }
1558 +        catch (exception & ex)
1559 +        {
1560 +                setStatusArea("Warning, handled exception: " + (string)ex.what());
1561 +                return false;
1562 +        }
1563 +        
1564   }
1565  
1566   void ProcessPackageUpdates(string pathToUpdate, string strPathToPackages)
# Line 1540 | Line 1613 | void ProcessPackageUpdates(string pathTo
1613                                          if (!file.fail())
1614                                          {
1615                                                  installedPackage = fileToModPackage(file, updtFolder);
1616 <                                                file.close();
1617 <                                                if (updatePackage.modStringVersion > installedPackage.modStringVersion)
1618 <                                                {
1619 <                                                        if (updatePackage.installerVersion <= INSTALLER_VERSION)
1620 <                                                        {
1616 >                                        }
1617 >                                        file.close();
1618 >                                }
1619 >                                file.close();
1620 >                                if (updatePackage.modStringVersion > installedPackage.modStringVersion)
1621 >                                {
1622 >                                        if (updatePackage.installerVersion <= INSTALLER_VERSION)
1623 >                                        {
1624 >                                                if(exists(strPathToPackages +  "/" + updatePackage.modStringName)) {
1625   #ifdef WIN32
1626 <                                                                remove_all((path)(strPathToPackages +  "/" + installedPackage.modStringName));
1626 >                                                        remove_all((path)(strPathToPackages +  "/" + updatePackage.modStringName));
1627   #else
1628 <                                                                if (needNewTrashDir)
1629 <                                                                {
1630 <                                                                        strTrashDir = strTrashDir + "Old_packages_" + boost::lexical_cast<string>(tmStartTime.tm_hour) + "-" +
1631 <                                                                                                  boost::lexical_cast<string>(tmStartTime.tm_min) + "-" + boost::lexical_cast<string>(tmStartTime.tm_sec) + "/";
1632 <                                                                        create_directory(strTrashDir);
1633 <                                                                        needNewTrashDir = false;
1557 <                                                                }
1558 <                                                                rename((path)(strPathToPackages +  "/" + installedPackage.modStringName), (path)(strTrashDir + installedPackage.modStringName));
1559 < #endif
1560 <                                                                rename((path)(pathToUpdate + "/" + updatePackage.modStringName), (path)(strPathToPackages + "/" + updatePackage.modStringName));
1628 >                                                        if (needNewTrashDir)
1629 >                                                        {
1630 >                                                                strTrashDir = strTrashDir + "Old_packages_" + boost::lexical_cast<string>(tmStartTime.tm_hour) + "-" +
1631 >                                                                        boost::lexical_cast<string>(tmStartTime.tm_min) + "-" + boost::lexical_cast<string>(tmStartTime.tm_sec) + "/";
1632 >                                                                create_directory(strTrashDir);
1633 >                                                                needNewTrashDir = false;
1634                                                          }
1635 +                                                        rename((path)(strPathToPackages +  "/" + updatePackage.modStringName), (path)(strTrashDir + updatePackage.modStringName));
1636 + #endif
1637                                                  }
1638 +                                                rename((path)(pathToUpdate + "/" + updatePackage.modStringName), (path)(strPathToPackages + "/" + updatePackage.modStringName));
1639                                          }
1564                                        else
1565                                                file.close();
1640                                  }
1567                                file.close();
1568                                file.clear();
1641                          }
1642                  }
1643          }
# Line 1573 | Line 1645 | void ProcessPackageUpdates(string pathTo
1645          {
1646                  setStatusArea("Warning, handled exception: " + (string)ex.what());
1647          }
1648 +        wxCommandEvent e;
1649 +        TheWindow->OnRefreshButtonClick( e );
1650   }
1651  
1652   /* MakePathLocalToGlobalize is a function used once by ProcessAEUpdate() that takes a file in an        \

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)