--- AE/Installer/trunk/source/main_window.cpp 2009/07/06 23:53:24 400 +++ AE/Installer/trunk/source/main_window.cpp 2009/10/09 03:22:08 461 @@ -33,6 +33,7 @@ ITaskbarList3 *pTaskbarList3; #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations #include "boost/lexical_cast.hpp" //int -> string +#include "boost/algorithm/string.hpp" #include "installer.h" #ifdef WIN32 @@ -42,7 +43,7 @@ ITaskbarList3 *pTaskbarList3; #include #endif -//const string strInstallerVersion = "1.0"; + const bool SPLIT = 1; const bool NOT_SPLIT = 0; bool splitInstances = SPLIT; @@ -64,6 +65,8 @@ using namespace boost::filesystem; using namespace std; +vector globalInstalledMods; +vector globalPackages; #include "boost/date_time/gregorian/gregorian.hpp" @@ -74,8 +77,8 @@ string escapePath(string input) { string output; string escape_me = "& ;()|<>\"'\\#*?$"; - for(int i = 0; i < input.size(); i++) { - for(int j = 0; j < escape_me.size(); j++) if (input[i] == escape_me[j]) output += '\\'; + for(unsigned int i = 0; i < input.size(); i++) { + for(unsigned int j = 0; j < escape_me.size(); j++) if (input[i] == escape_me[j]) output += '\\'; output += input[i]; } return output; @@ -121,7 +124,7 @@ int globalizeData(void) path TRAM = Animations / "level0_TRAM"; vector GDFPaths; - GDFPaths.push_back(Characters); + //GDFPaths.push_back(Characters); GDFPaths.push_back(Particles); GDFPaths.push_back(Textures); GDFPaths.push_back(Sounds); @@ -139,7 +142,7 @@ int globalizeData(void) vector VanillaPaths; - VanillaPaths.push_back(VanillaCharacters); + //VanillaPaths.push_back(VanillaCharacters); VanillaPaths.push_back(VanillaParticles); VanillaPaths.push_back(VanillaTextures); VanillaPaths.push_back(VanillaSounds); @@ -229,7 +232,7 @@ int globalizeData(void) else remove(dir_itr->path()); } else if (dir_itr->path().filename().substr(0,4) == "TRAC" - || dir_itr->path().filename().substr(0,4) == "ONVL") { + ) { cout <path().filename() << "\n"; if(!exists( TRAC / dir_itr->filename())) rename(dir_itr->path(), TRAC / dir_itr->filename()); else remove(dir_itr->path()); @@ -249,6 +252,7 @@ int globalizeData(void) else if (dir_itr->path().filename().substr(0,4) == "ONCC" || dir_itr->path().filename().substr(0,4) == "TRBS" || dir_itr->path().filename().substr(0,4) == "ONCV" + || dir_itr->path().filename().substr(0,4) == "ONVL" || dir_itr->path().filename().substr(0,4) == "TRMA" || dir_itr->path().filename().substr(0,4) == "TRSC" || dir_itr->path().filename().substr(0,4) == "TRAS") { @@ -289,6 +293,7 @@ int globalizeData(void) if(!exists( "VanillaDats/level0_Final/level0_Final/" + dir_itr->filename())) rename(dir_itr->path(), "VanillaDats/level0_Final/level0_Final/" + dir_itr->filename()); else remove(dir_itr->path()); } + if (exists(dir_itr->path())) { } @@ -318,24 +323,27 @@ int globalizeData(void) logfile << (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize.log").c_str() << '\n'; string sys_str = (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final VanillaDats/level" + levels[i] + "_Final/level" - + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize.log"); + + levels[i] + "_Final/level" + levels[i] + "_Final.oni"); system(sys_str.c_str() ); setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) )); parts_done++; } - create_directory( VanillaCharacters.parent_path() ); + //create_directory( VanillaCharacters.parent_path() ); create_directory( VanillaParticles.parent_path() ); create_directory( VanillaTextures.parent_path() ); create_directory( VanillaSounds.parent_path() ); create_directory( VanillaAnimations.remove_filename() ); - for(int j = 0; j < GDFPaths.size(); j++) { + for(unsigned int j = 0; j < GDFPaths.size(); j++) { logfile << "\tReimporting " << GDFPaths[j].filename() << ".oni\n"; setStatusArea("Step " + lexical_cast(parts_done + 1) + "/" + lexical_cast(total_steps) + ": reimporting " + GDFPaths[j].filename() ); system((strOniSplit + " " + strImportOption + " " + GDFPaths[j].string() + " " + VanillaPaths[j].string()).c_str()); parts_done++; setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) )); } + logfile << "\nMoving level0_Characters\n"; + setStatusArea("Step " + lexical_cast(parts_done + 1) + "/" + lexical_cast(total_steps) + ": moving level0_Characters" ); + copy((path)"../GameDataFolder/level0_Characters", (path)("VanillaDats/level0_Final")); /* printf(Step_x_x,"Step %d/%d: reimporting level0_Characters", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) )); system((strOniSplit + " " + strImportOption + " " + Characters.string() + " " + VanillaCharacters.string()).c_str()); @@ -357,8 +365,10 @@ int globalizeData(void) copy((path)"packages/VanillaBSL/IGMD", (path)"../GameDataFolder"); setProgressBar( 1000 ); - copy("../../persist.dat",".."); - copy("../../key_config.txt",".."); + if(exists("../../persist.dat")) if(!exists("../persist.dat")) + copy("../../persist.dat",".."); + if(exists("../../key_config.txt"))if(!exists("../key_config.txt")) + copy("../../key_config.txt",".."); #ifndef WIN32 /* On Mac only, set the current GDF to the AE GDF by writing to Oni's global preferences file (thankfully a standard OS X ".plist" XML file). @@ -401,8 +411,7 @@ vector getPackages(void) try { - directory_iterator end_iter; - for (directory_iterator dir_itr("./packages"); dir_itr != end_iter; ++dir_itr) + for (directory_iterator dir_itr("./packages"), end_itr; dir_itr != end_itr; ++dir_itr) { file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str()); //cout << filename << "\n"; @@ -481,11 +490,12 @@ ModPackage fileToModPackage(fstream &fil } else if (!HasOnis.compare(*iter)) { iter++; iter++; - if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasOnis = 1; //Gotta love c++'s lack of a standard case-insensitive - else if (!HasBSL.compare(*iter)) { // string comparer...I know my implementation here sucks. I need to change it to check each character one by one. At the moment, - iter++; iter++;} // using "YFR" would probably set it off. :< - - if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasBSL = 1; + if ( boost::iequals(*iter, "Yes")) package.hasOnis = 1; + } + else if (!HasBSL.compare(*iter)) { // string comparer...I know my implementation here sucks. I need to change it to check each character one by one. At the moment, + iter++; iter++; // using "YFR" would probably set it off. :< + if ( boost::iequals(*iter, "Yes")) package.hasBSL = 1; + else if ( boost::iequals(*iter, "Addon")) package.hasAddon = 1; } else if (!HasDeltas.compare(*iter)) { iter++; iter++; @@ -511,56 +521,61 @@ ModPackage fileToModPackage(fstream &fil //cout << " "; package.category += *iter + " "; } - } } - else if (!Creator.compare(*iter)) { //if it contains the name - for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment - if (ARROW.compare(*iter) && Creator.compare(*iter)) { //ignores "->" and "Category" - //cout << *iter; - //cout << " "; - package.creator += *iter + " "; - } + } + else if (!Creator.compare(*iter)) { //if it contains the name + for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment + if (ARROW.compare(*iter) && Creator.compare(*iter)) { //ignores "->" and "Category" + //cout << *iter; + //cout << " "; + package.creator += *iter + " "; } } - else if (!Readme.compare(*iter)) { //if it contains the name - for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment - if (ARROW.compare(*iter) && Readme.compare(*iter)) { //ignores "->" and "Category" - if(!(*iter).compare("\\n")) package.readme += '\n'; - else package.readme += *iter + " "; - } + } + else if (!Readme.compare(*iter)) { //if it contains the name + for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment + if (ARROW.compare(*iter) && Readme.compare(*iter)) { //ignores "->" and "Category" + if(!(*iter).compare("\\n")) package.readme += '\n'; + else package.readme += *iter + " "; } } } - } - package.doOutput(); - return package; + +} +package.doOutput(); +return package; } void recompileAll(vector installedMods) -{ +{try { busy = 1; using namespace boost::gregorian; using namespace boost::posix_time; using boost::lexical_cast; using boost::bad_lexical_cast; - - setStatusArea("Importing levels..."); - //setStatusArea("Recompiling Data..."); - path vanilla_dir = "./VanillaDats/"; + path vanilla_dir = "./VanillaDats/"; string importCommand = ""; char statusString[128]; int numberOfDats = 0; int j = 1; string datString; + + + setStatusArea("Importing levels..."); + //setStatusArea("Recompiling Data..."); + std::stringstream out; ptime start_time(second_clock::local_time()); clearOldDats(); - remove("Install.log"); + + if(exists("Install.log")) remove("Install.log"); ofstream logfile("Install.log"); logfile << "Mod Installation started " << to_simple_string(start_time) << endl; logfile.close(); + + if(splitInstances == SPLIT){ recursive_directory_iterator end_iter; @@ -574,13 +589,19 @@ void recompileAll(vector install numberOfDats++; } } - catch(exception ex) { + catch(exception & ex) { + remove("Install.log"); + ofstream logfile("Install.log"); + + logfile << "Warning, exception " << ex.what() << "!"; + setStatusArea("Warning, exception " + (string)ex.what() + "!"); + logfile.close(); } } try { //recursive_directory_iterator end_iter; - + out << numberOfDats; datString = out.str(); @@ -593,7 +614,7 @@ void recompileAll(vector install if ( is_directory( dir_itr->status() ) && dir_itr.level() == 1) { importCommand = strOniSplit + " " + strImportOption + " " + dir_itr->path().parent_path().string() + '/' + dir_itr->path().filename(); - for (int i = 0; i < installedMods.size(); ++i) { + for (unsigned int i = 0; i < installedMods.size(); ++i) { if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename() )) importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename(); @@ -666,7 +687,7 @@ void recompileAll(vector install if ( is_directory( dir_itr->status() ) ) { importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " "; - for (int i = 0; i < installedMods.size(); ++i) { + for (unsigned int i = 0; i < installedMods.size(); ++i) { if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename() )) importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename(); } @@ -693,10 +714,58 @@ void recompileAll(vector install logfile.close(); }} } + + + + + + + + + ofstream BSLlog("BSL.log"); + + vector BSLfolders; + vector skippedfolders; + + + + for ( directory_iterator dir_itr( "../GameDataFolder/IGMD/" ), end_itr; + dir_itr != end_itr; + ++dir_itr ) { + if( exists(dir_itr->path().string() + "/ignore.txt") ){ + BSLfolders.push_back(dir_itr->path().filename()); + skippedfolders.push_back(dir_itr->path().filename()); + } + } + + for (int i = installedMods.size() - 1; i >= 0; i--) { //Iterates through the installed mods (backwards :P) + for (unsigned int j = 0; j < globalPackages.size(); ++j) { //looking in the global packages + if (globalPackages[j].modStringName == installedMods[i]) { //for a mod that has BSL in it + BSLlog << "Testing " << globalPackages[j].modStringName << "\n" + << "HasBSL: " << globalPackages[j].hasBSL << "\n" + << "HasAddon: " << globalPackages[j].hasAddon << "\n"; + if(!(globalPackages[j].hasAddon || globalPackages[j].hasBSL)) break; //skip non-BSL + if( exists( "packages/" + globalPackages[j].modStringName + "/BSL" ) ) + copyBSL("packages/" + globalPackages[j].modStringName + "/BSL", BSLfolders, globalPackages[j] ); + } + + } + } + + ModPackage emptyPackage; + copyBSL("packages/VanillaBSL/IGMD", BSLfolders, emptyPackage); + BSLlog.close(); + + logfile << "Writing config file"; writeInstalledMods(installedMods); setProgressBar(1000); - setStatusArea("Done! You can now play Oni."); + + string finallyDone = "Done! You can now play Oni."; + +a + + setStatusArea(finallyDone); ptime end_time(second_clock::local_time()); time_period total_time (start_time, end_time); @@ -705,7 +774,7 @@ void recompileAll(vector install ofstream logfile2("Install.log", ios::app | ios::ate); string outstring = (string)"\n\nGlobalization ended " + to_simple_string(end_time) + "\nThe process took ";// + (string)total_time.length(); - logfile2 << "\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length(); + logfile2 << "\nInstallation ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length(); //logfile2.write(outstring.c_str(), outstring.length()); logfile2.close(); @@ -714,9 +783,60 @@ void recompileAll(vector install Sleep(1000); setProgressBar(0); + + } + catch(exception & ex) { + remove("Install.log"); //why did we do this? :| + ofstream logfile("Install.log"); + + + logfile << "Warning, exception " << ex.what() << "!"; + setStatusArea("Warning, exception " + (string)ex.what() + "!"); + logfile.close(); + } busy = 0; } +void copyBSL(string copypath, vector BSLfolders, ModPackage pkg) { + try { + for ( directory_iterator dir_itr( copypath ), end_itr; + dir_itr != end_itr; + ++dir_itr ) { + + if ( is_directory( dir_itr->path() ) && dir_itr->path().string() != ".svn" ) { + int skip_folder = 0; + for(unsigned int k = 0; k < BSLfolders.size(); k++) {//iterate through already found BSL folders + if(dir_itr->path().filename() == BSLfolders[k]) { + skip_folder = 1; + break; + } + } + if (!skip_folder && !exists("../GameDataFolder/IGMD/" + dir_itr->path().filename() + "/ignore.txt")) { + remove_all( "../GameDataFolder/IGMD/" + dir_itr->path().filename() ); + Sleep(100); + create_directory( "../GameDataFolder/IGMD/" + dir_itr->path().filename()); + + for ( directory_iterator bsl_itr( dir_itr->path() ); + bsl_itr != end_itr; + bsl_itr++ ) { + if ( bsl_itr->path().extension() == ".bsl" ) { + copy_file(bsl_itr->path(), "../GameDataFolder/IGMD/" + dir_itr->path().filename() + "/" + bsl_itr->path().filename()); + } + } + BSLfolders.push_back( dir_itr->path().filename() ); + } + } + } + } + catch ( const std::exception & ex ) + { + setStatusArea("Warning, exception " + (string)ex.what() + "!"); + while(1) Sleep(1000); + } + +} + + void writeInstalledMods(vector installedMods) { @@ -798,8 +918,6 @@ void clearOldDats(void) { } -vector globalInstalledMods; -vector globalPackages; #include "boost/thread.hpp" #include @@ -1073,7 +1191,7 @@ void MainWindow::CreateControls() StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 ); StatusArea->SetName(_T("StatusArea")); StatusArea->SetFieldsCount(1); - StatusArea->SetStatusText(_("AE Installer v1.0"), 0); + StatusArea->SetStatusText(_("AE Installer v1.0.1"), 0); itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0); wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL); @@ -1139,23 +1257,41 @@ void MainWindow::CreateControls() // Connect events and objects Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this); ////@end MainWindow content construction - +#ifdef WIN32 Handle = (HWND)GetHWND(); ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList); +#endif - if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) { + /*if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) { strImportOption = "-import:sep"; splitInstances = NOT_SPLIT; } else { strImportOption = "-import:nosep"; splitInstances = SPLIT; - } + }*/ + + +#ifndef WIN32 + strImportOption = "-import:sep"; + splitInstances = NOT_SPLIT; +#else + strImportOption = "-import:nosep"; + splitInstances = SPLIT; +#endif + +#ifndef WIN32 + strImportOption = "-import:sep"; + splitInstances = NOT_SPLIT; +#else + strImportOption = "-import:nosep"; + splitInstances = SPLIT; +#endif globalPackages = getPackages(); globalInstalledMods = getInstallString(); - for (int i = 0; i < globalPackages.size(); i++) { + for (unsigned int i = 0; i < globalPackages.size(); i++) { Mods_CheckboxList->Append(globalPackages[i].name.c_str()); if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i); } @@ -1194,15 +1330,15 @@ void MainWindow::OnSelectAllCheckboxClic { switch(SelectAll->Get3StateValue()) { case wxCHK_UNCHECKED: - for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false); + for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false); //SelectAll->Set3StateValue(wxCHK_CHECKED); break; case wxCHK_CHECKED: - for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true); + for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true); //SelectAll->Set3StateValue(wxCHK_UNCHECKED); break; case wxCHK_UNDETERMINED: - for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false); + for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false); //SelectAll->Set3StateValue(wxCHK_CHECKED); break; @@ -1366,19 +1502,29 @@ struct recompile TheInstallButton->Disable(); recompileAll(thePackages); TheInstallButton->Enable(); + } vector thePackages; }; +void globalize2(void) { + TheInstallButton->Disable(); + globalizeData(); + TheInstallButton->Enable(); +} + + + void MainWindow::OnInstallButtonClick( wxCommandEvent& event ) { vector localPackages; - localPackages.push_back("Globalize"); - for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName ); + localPackages.push_back("00000Globalize"); + for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName ); if ( !localPackages.empty() ) { - + sort(localPackages.begin(), localPackages.end()); + localPackages[0] = "Globalize"; //MainWindow::MainWindow().Hide(); // boost::thread thrd2(recompileAll(localPackages) ); //MainWindow::MainWindow().Show(); @@ -1517,7 +1663,7 @@ void MainWindow::refreshMods (vectorClear(); //globalInstalledMods = getPackages(); - for (int i = 0; i < globalPackages.size(); i++) { + for (unsigned int i = 0; i < globalPackages.size(); i++) { Mods_CheckboxList->Append(globalPackages[i].name.c_str()); if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i); //else Mods_CheckboxList->Check(i,0); @@ -1580,7 +1726,7 @@ void MainWindow::OnSaveClick( wxCommandE ofstream file(openFileDialog->GetPath().c_str()); vectorlist; - for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName ); + for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName ); vector::iterator begin_iter = list.begin(); vector::iterator end_iter = list.end();