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 489 by gumby, Sun Jan 24 23:58:16 2010 UTC vs.
Revision 500 by iritscen, Sun Mar 14 23:31:14 2010 UTC

# Line 302 | Line 302 | int globalizeData(void)
302                  /* 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).
303                   Tests for presence of prefs with [ -f ] before doing anything so it doesn't create a partial prefs file -- just in case user has never
304                   run Oni before :-p */
305 <                string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for edition/
305 >                string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for Edition/ (Oni wants the folder that *contains* the GDF)
306                  char prefsCommand[300] = "[ -f ~/Library/Preferences/com.godgames.oni.plist ] && defaults write com.godgames.oni RetailInstallationPath -string '";
307 <                strcat(prefsCommand, fullAEpath.c_str()); // get path of Edition/ folder (Oni wants the folder that *contains* the GDF)
307 >                strcat(prefsCommand, fullAEpath.c_str());
308                  strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
309                  system(prefsCommand);
310   #endif
# Line 326 | Line 326 | int globalizeData(void)
326   vector<ModPackage> getPackages(string packageDir)
327   {
328          vector<ModPackage> packages;
329 +        ModPackage package;
330          packages.reserve(256);
331          fstream file;
332          string filename = "\0";
# Line 337 | Line 338 | vector<ModPackage> getPackages(string pa
338                  {
339                          file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str());
340                          
341 <                        if(!file.fail())
341 >                        if (!file.fail())
342                          {
343 <                                //would prefer to push a pointer to a package, but this will do for now
344 <                                packages.push_back(fileToModPackage(file));
343 >                                package = fileToModPackage(file);
344 >                                if (package.installerVersion.compare(INSTALLER_VERSION) < 1)  // if mod requires newer version of the Installer, we won't add it to the list
345 >                                        packages.push_back(package);
346                          }      
347                          file.close();
348                          file.clear();
# Line 367 | Line 369 | ModPackage fileToModPackage(fstream &fil
369           */
370          ModPackage package;
371          string line;
372 <        static string NameOfMod = "NameOfMod";  //used for comparing to the current token...
373 <        //I could have done it in reverse (*iter).compare("ModString") or  
374 <        static string ARROW = "->";                             //did something like "ModString".compare(*iter), and it would have been
375 <        static string ModString = "ModString";  //functionably the same.
372 >        static string AEInstallVersion = "AEInstallVersion"; // used for comparing to the current token...
373 >        static string NameOfMod = "NameOfMod";
374 >        static string ARROW = "->";
375 >        static string ModString = "ModString";
376          static string HasOnis = "HasOnis";
377          static string HasDeltas = "HasDeltas";
378          static string HasBSL = "HasBSL";
# Line 380 | Line 382 | ModPackage fileToModPackage(fstream &fil
382          static string GlobalNeeded = "GlobalNeeded";
383          static string Category = "Category";
384          static string Creator = "Creator";
385 <        while (! file.eof() )
385 >        while (!file.eof())
386          {
387 <                getline (file,line);
387 >                getline(file,line);
388                  vector<string> tokens;
389                  vector<string>::iterator iter;
390 <                tokenize(line, tokens);                                 //string to vector of "words"
391 <                if (tokens.capacity() >= 3) {                   //make sure they are using enough stuff
392 <                        iter = tokens.begin();                          //what word we are on, starts at first word
393 <                        /* TODO: Get this "required Installer version" code working
394 <                         if (!AEInstallVersion.compare(*iter))
395 <                         If mod is too old, skip this mod.
396 <                         */
397 <                        /*else*/if (!NameOfMod.compare(*iter))  {       //if it contains the name
398 <                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     // iterates through the words, ends if it reaches the end of the line or a "//" comment
399 <                                        if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) {                 // ignores "->" and "NameOfMod"
390 >                tokenize(line, tokens);
391 >                if (tokens.capacity() >= 3)
392 >                {
393 >                        iter = tokens.begin();
394 >
395 >                        if (!AEInstallVersion.compare(*iter))
396 >                        {
397 >                                iter++; iter++;
398 >                                package.installerVersion = *iter;
399 >                        }
400 >                        else if (!NameOfMod.compare(*iter))
401 >                        {
402 >                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) // iterates through the words, ends if it reaches the end of the line or a "//" comment
403 >                                {
404 >                                        if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) // ignores "->" and "NameOfMod"
405                                                  package.name += *iter + " ";
399                                        }
406                                  }
401                                
407                          }
408 <                        else if (!ModString.compare(*iter)) {
408 >                        else if (!ModString.compare(*iter))
409 >                        {
410                                  iter++; iter++;
411                                  package.modStringName = *iter;
412                                  iter++;
413                                  package.modStringVersion = atoi((*iter).c_str());
414                          }
415 <                        else if (!HasOnis.compare(*iter)) {
415 >                        else if (!HasOnis.compare(*iter))
416 >                        {
417                                  iter++; iter++;  
418 <                                if ( boost::iequals(*iter, "Yes")) package.hasOnis = 1;
418 >                                if (boost::iequals(*iter, "Yes")) package.hasOnis = 1;
419                          }      
420 <                        else if (!HasBSL.compare(*iter)) {
421 <                                if(toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasBSL = true;
422 <                                else if ( boost::iequals(*iter, "Addon")) package.hasAddon = true;
420 >                        else if (!HasBSL.compare(*iter))
421 >                        {
422 >                                iter++; iter++;
423 >                                if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasBSL = true;
424 >                                else if (boost::iequals(*iter, "Addon")) package.hasAddon = true;
425                          }
426 <                        else if (!HasDeltas.compare(*iter)) {
426 >                        else if (!HasDeltas.compare(*iter))
427 >                        {
428                                  iter++; iter++;  
429 <                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1;
429 >                                if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasDeltas = 1;
430                          }
431 <                        else if (!HasDats.compare(*iter)) {
431 >                        else if (!HasDats.compare(*iter))
432 >                        {
433                                  iter++; iter++;  
434 <                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1;
434 >                                if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasDats = 1;
435                          }
436 <                        else if (!IsEngine.compare(*iter)) {
436 >                        else if (!IsEngine.compare(*iter))
437 >                        {
438                                  iter++; iter++;  
439 <                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1;
439 >                                if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.isEngine = 1;
440                          }
441 <                        else if (!GlobalNeeded.compare(*iter)) {
441 >                        else if (!GlobalNeeded.compare(*iter))
442 >                        {
443                                  iter++; iter++;  
444 <                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1;
445 <                                else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; // only place where checking for "No" is important atm.
444 >                                if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.globalNeeded = 1;
445 >                                else if (toupper((*iter)[0]) == 'N' && toupper((*iter)[1]) == 'O') package.globalNeeded = 1; // only place where checking for "No" is important atm
446                          }
447 <                        else if (!Category.compare(*iter))  {  
448 <                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     // iterates through the words, ends if it reaches end of line or a "//" comment
449 <                                        if (ARROW.compare(*iter) && Category.compare(*iter)) {                  // ignores "->" and "Category"
447 >                        else if (!Category.compare(*iter))
448 >                        {      
449 >                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++)
450 >                                {
451 >                                        if (ARROW.compare(*iter) && Category.compare(*iter)) // ignores "->" and "Category"
452                                                  package.category += *iter + " ";
438                                        }
453                                  }
454                          }
455 <                        else if (!Creator.compare(*iter))  {    //if it contains the name
456 <                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     // iterates through the words, ends if it reaches end of line or a "//" comment
457 <                                        if (ARROW.compare(*iter) && Creator.compare(*iter)) {                   // ignores "->" and "Creator"
455 >                        else if (!Creator.compare(*iter))
456 >                        {
457 >                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++)
458 >                                {
459 >                                        if (ARROW.compare(*iter) && Creator.compare(*iter)) // ignores "->" and "Creator"
460                                                  package.creator += *iter + " ";
445                                        }
461                                  }
462                          }
463 <                        else if (!Readme.compare(*iter))  {     //if it contains the name
464 <                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     // iterates through the words, ends if it reaches end of line or a "//" comment
465 <                                        if (ARROW.compare(*iter) && Readme.compare(*iter)) {                    // ignores "->" and "Readme"
466 <                                                if(!(*iter).compare("\\n")) package.readme += '\n';
463 >                        else if (!Readme.compare(*iter))
464 >                        {
465 >                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++)
466 >                                {
467 >                                        if (ARROW.compare(*iter) && Readme.compare(*iter)) // ignores "->" and "Readme"
468 >                                        {
469 >                                                if (!(*iter).compare("\\n")) package.readme += '\n';
470                                                  else package.readme += *iter + " ";
471                                          }
472                                  }
473                          }
474                  }
457                
475          }
476  
477          return package;
# Line 939 | Line 956 | bool ReadInstallInfoCfg(fstream *fileHan
956          
957          while (getline(*fileHandler, line))
958          {
959 +                StripNewlines(&line);
960                  tokenize(line, tokens);
961                  iter = tokens.begin();
962                  
# Line 1142 | Line 1160 | bool ProcessInstallerUpdate(Install_info
1160          string popenCommand = "../updates/" + strEUFN + "/install/";
1161   #ifdef WIN32
1162          // TODO: Fill in Windows equivalent of code below :-3
1163 +        popenCommand = "replace_installer.bat";
1164   #else
1165          // We can't just use '~' to mean "the home directory" because we need to check the path in C...
1166          // ...so we actually get the current user's shortname and manually construct the path to home
# Line 1163 | Line 1182 | bool ProcessInstallerUpdate(Install_info
1182   #endif
1183          file.close();
1184          file.clear();
1185 + #ifdef WIN32
1186 +        system(popenCommand.c_str());
1187 + #else
1188          popen(popenCommand.c_str(), "r");
1189 <        
1189 > #endif
1190          return true; // returning 'true' tells the Installer to quit itself ASAP so it can be replaced by the process that is now running
1191   }
1192  
# Line 1195 | Line 1217 | bool ProcessAEUpdate(Install_info_cfg *c
1217          
1218          // TODO: Fill in Windows equivalent of code below
1219   #ifdef WIN32
1220 <        string strTrashDir = "%RECYCLE%";
1220 >        string strTrashDir = "Trash\\";
1221   #else
1222          FILE *fUserName = NULL;
1223          char chrUserName[32];
# Line 1240 | Line 1262 | bool ProcessAEUpdate(Install_info_cfg *c
1262                                  needNewTrashDir = true;
1263                  }
1264          }
1265 <        
1265 > #ifndef WIN32
1266          if (!*installerJustUpdated || needNewTrashDir) // prepare a new directory for deleted files to go to
1267          {
1268                  tm tmStartTime = to_tm(startTime);
# Line 1248 | Line 1270 | bool ProcessAEUpdate(Install_info_cfg *c
1270                                            boost::lexical_cast<string>(tmStartTime.tm_min) + "-" + boost::lexical_cast<string>(tmStartTime.tm_sec) + "/";
1271                  create_directory(strTrashDir);
1272          }
1273 + #endif
1274          file.close();
1275          file.clear();
1276  
# Line 1323 | Line 1346 | bool ProcessAEUpdate(Install_info_cfg *c
1346                                  curPos = thePath.find("/", lastPos);
1347                                  aParentPath = aParentPath + "/";
1348                          }
1349 + #ifndef WIN32
1350                          rename((path)("../" + thePath), (path)(strTrashDir + thePath));
1351 + #else
1352 +                        remove((path)("../" + thePath));
1353 + #endif
1354                  }
1355          }
1356          
# Line 1346 | Line 1373 | bool ProcessAEUpdate(Install_info_cfg *c
1373                                  matchFound = true;
1374                                  if (iter1->modStringVersion > iter2->modStringVersion)
1375                                  {
1376 + #ifndef WIN32
1377                                          rename((path)(strPathToPackages + iter2->modStringName), (path)(strTrashDir + iter2->modStringName));
1378 + #else
1379 +                                        remove((path)(strPathToPackages + iter2->modStringName));
1380 + #endif
1381                                          rename((path)(strPathToEUFNPackages + iter1->modStringName), (path)(strPathToPackages + iter1->modStringName));
1382                                  }
1383                          }
# Line 1457 | Line 1488 | void tokenize(const string& str, vector<
1488          }
1489   }
1490  
1491 + /* StripNewlines() gets rids of any linebreaks that come from text returned by getline(); \
1492 + |  getline() should be stripping those out, but Windows CR/LF files seem to be sneaking   |
1493 + \  some extra return characters into strings in the ReadInstallInfoCfg() function.               */
1494 + void StripNewlines(string *theLine)
1495 + {
1496 +        int deleteFromHere = 0;
1497 +        deleteFromHere = theLine->find("\r");
1498 +        if (deleteFromHere > 0)
1499 +                theLine->erase(deleteFromHere, theLine->size());
1500 + }
1501 +
1502   void clearOldDats(void) {
1503          directory_iterator end_iter_gdf;
1504          for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );

Diff Legend

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