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 542 by iritscen, Mon May 24 02:43:35 2010 UTC vs.
Revision 552 by gumby, Sat May 29 00:13:35 2010 UTC

# Line 597 | 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 );
614 <                         dir_itr != end_iter;
615 <                         ++dir_itr )
616 <                {
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 647 | 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 659 | 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 668 | 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 714 | 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 1274 | 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 1293 | Line 1332 | bool ProcessAEUpdate(Install_info_cfg *c
1332          string strOniApp = "Oni.exe";
1333   #else
1334          string strOniApp = "Oni.app";
1296 #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 >        //remove readonly attrib from files.
1342 >        setStatusArea("Removing readonly attribute...");
1343 >        system("attrib -r ./* /s");
1344 >        system("attrib -r ../Oni.exe /s");
1345 >        system("attrib -r ../binkw32.dll /s");
1346 >        
1347   #else
1348          FILE *fUserName = NULL;
1349          char chrUserName[32];
# Line 1333 | Line 1378 | bool ProcessAEUpdate(Install_info_cfg *c
1378                          if (readingVerAndDate && tokens.capacity() >= 3)
1379                                  tokenize(tokens[2], updateStarted, "-");
1380                  }
1381 + #ifndef WIN32
1382                  if (updateStarted.capacity() < 3)
1383                          needNewTrashDir = true;
1384                  else
# Line 1342 | Line 1388 | bool ProcessAEUpdate(Install_info_cfg *c
1388                          if (!exists(strTrashDir))
1389                                  needNewTrashDir = true;
1390                  }
1391 + #endif
1392          }
1393   #ifndef WIN32
1394          if (!*installerJustUpdated || needNewTrashDir) // prepare a new directory for deleted files to go to
# Line 1358 | Line 1405 | bool ProcessAEUpdate(Install_info_cfg *c
1405          // Special code to replace our special files -- the Oni app, OniSplit, the Daodan DLL, and the GUI for OniSplit
1406          if (exists(strPathToEUFN + strOniApp))
1407          {
1408 <                if (exists(strOniApp))
1409 <                        rename((path)strOniApp, (path)(strTrashDir + strOniApp));
1410 <                rename((path)(strPathToEUFN + strOniApp), (path)strOniApp);
1408 >                if (exists("../" + strOniApp))
1409 > #ifdef WIN32
1410 >                        remove((path)("../" + strOniApp));
1411 > #else
1412 >                        rename((path)("../" + strOniApp), (path)(strTrashDir + strOniApp));
1413 > #endif
1414 >                rename((path)(strPathToEUFN + strOniApp), (path)("../" + strOniApp));
1415          }
1416          if (updateAE->OniSplitVersion.compare(currentAE->OniSplitVersion) >= 1)
1417          {
1418                  if (exists(strPathToEUFNInstall + strOniSplit))
1419                  {
1420                          if (exists(strOniSplit))
1421 + #ifdef WIN32
1422 +                                remove((path)strOniSplit);
1423 + #else
1424                                  rename((path)strOniSplit, (path)(strTrashDir + strOniSplit));
1425 + #endif
1426                          rename((path)(strPathToEUFNInstall + strOniSplit), (path)strOniSplit);
1427                  }
1428          }
# Line 1377 | Line 1432 | bool ProcessAEUpdate(Install_info_cfg *c
1432                  if (exists(strPathToEUFN + strDaodan))
1433                  {
1434                          if (exists(("../" + strDaodan)))
1435 <                                rename((path)("../" + strDaodan), (path)(strTrashDir + strDaodan));
1435 >                                remove((path)("../" + strDaodan));
1436                          rename((path)(strPathToEUFN + strDaodan), (path)("../" + strDaodan));
1437                  }
1438          }
# Line 1386 | Line 1441 | bool ProcessAEUpdate(Install_info_cfg *c
1441                  if (exists(strPathToEUFNInstall + strWinGUI))
1442                  {
1443                          if (exists((path)strWinGUI))
1444 <                                rename((path)strWinGUI, (path)(strTrashDir + strWinGUI));
1444 >                                remove((path)strWinGUI);
1445                          if (exists(strWinGUILang))
1446 <                                rename((path)strWinGUILang, (path)(strTrashDir + strWinGUILang));
1446 >                                remove((path)strWinGUILang);
1447                          rename((path)(strPathToEUFNInstall + strWinGUI), (path)strWinGUI);
1448                          rename((path)(strPathToEUFNInstall + strWinGUILang), (path)strWinGUILang);
1449                  }
# Line 1421 | Line 1476 | bool ProcessAEUpdate(Install_info_cfg *c
1476                          while (curPos != string::npos && curPos < thePath.size())
1477                          {
1478                                  aParentPath = aParentPath + thePath.substr(lastPos, curPos - lastPos);
1479 + #ifndef WIN32
1480                                  if (!exists(strTrashDir + aParentPath))
1481                                          create_directory(strTrashDir + aParentPath);
1482 + #endif
1483                                  lastPos = curPos + 1;
1484                                  curPos = thePath.find("/", lastPos);
1485                                  aParentPath = aParentPath + "/";
# Line 1467 | Line 1524 | bool ProcessAEUpdate(Install_info_cfg *c
1524          for (vector<string>::iterator iter = filesToMove.begin(); iter != filesToMove.end(); iter++)
1525          {
1526                  if (exists(strPathToPackages + strGlobalize + *iter))
1527 + #ifdef WIN32
1528 +                        remove((path)(strPathToPackages + strGlobalize + *iter));
1529 + #else
1530                          rename((path)(strPathToPackages + strGlobalize + *iter), (path)(strTrashDir + *iter));
1531 + #endif
1532                  rename((path)(strPathToEUFNPackages + strGlobalize + *iter), (path)(strPathToPackages + strGlobalize + *iter));
1533          }
1534          
1535          // Clean up after ourselves, trashing any packages or programs in the update package that are not newer than the current AE
1536 + #ifdef WIN32
1537 +        remove_all((path)strPathToEUFN);
1538 + #else
1539          create_directory(strTrashDir + "Unneeded update files");
1540          rename((path)strPathToEUFN, (path)(strTrashDir + "Unneeded update files/" + strEUFN));
1541 <        
1541 > #endif
1542          // Write to log that we are finished with update
1543          ptime end_time(second_clock::local_time());
1544          string progressMsg2 = "Edition was updated to:\n" +
# Line 1495 | Line 1559 | bool ProcessAEUpdate(Install_info_cfg *c
1559          wxCommandEvent e;
1560          TheWindow->OnRefreshButtonClick( e );
1561          return true;
1562 +        }
1563 +        catch (exception & ex)
1564 +        {
1565 +                setStatusArea("Warning, handled exception: " + (string)ex.what());
1566 +                return false;
1567 +        }
1568 +        
1569   }
1570  
1571   void ProcessPackageUpdates(string pathToUpdate, string strPathToPackages)

Diff Legend

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