improved handling of failed tape uploads to score server
[rocksndiamonds.git] / src / tape.c
index 38bc0166394f487ef64a31a979ad25e4e89b316c..2a1a3ec345e5b65e85279bae23234da2ed97f801 100644 (file)
@@ -1540,7 +1540,7 @@ static int AutoPlayTapesExt(boolean initialize)
       // * solution tape may have native format (like Supaplex solution files)
 
       SaveScoreTape(level_nr);
-      SaveServerScore(level_nr);
+      SaveServerScore(level_nr, TRUE);
 
       AutoPlayTapes_WaitForUpload();
     }
@@ -1612,6 +1612,7 @@ static int AutoPlayTapesExt(boolean initialize)
         global.autoplay_level[tape.level_nr] = TRUE;
 
       global.autoplay_all = FALSE;
+      options.mytapes = FALSE;
     }
 
     if (autoplay.all_levelsets)
@@ -1667,6 +1668,41 @@ static int AutoPlayTapesExt(boolean initialize)
       init_level_set = FALSE;
     }
 
+    if (autoplay.all_levelsets && global.autoplay_mode == AUTOPLAY_MODE_UPLOAD)
+    {
+      boolean skip_levelset = FALSE;
+
+      if (!directoryExists(getTapeDir(autoplay.leveldir->subdir)))
+      {
+       Print("No tape directory for this level set found -- skipping.\n");
+
+       skip_levelset = TRUE;
+      }
+
+      if (CheckTapeDirectoryUploadsComplete(autoplay.leveldir->subdir))
+      {
+       Print("All tapes for this level set already uploaded -- skipping.\n");
+
+       skip_levelset = TRUE;
+      }
+
+      if (skip_levelset)
+      {
+       PrintTapeReplaySummary(&autoplay);
+
+       // continue with next level set
+       autoplay.leveldir = getNextValidAutoPlayEntry(autoplay.leveldir);
+
+       // all level sets processed
+       if (autoplay.leveldir == NULL)
+         break;
+
+       init_level_set = TRUE;
+
+       continue;
+      }
+    }
+
     if (global.autoplay_mode != AUTOPLAY_MODE_FIX || patch_nr == 0)
       level_nr = autoplay.level_nr++;
 
@@ -1680,6 +1716,9 @@ static int AutoPlayTapesExt(boolean initialize)
       if (!autoplay.all_levelsets)
        break;
 
+      if (global.autoplay_mode == AUTOPLAY_MODE_UPLOAD)
+       MarkTapeDirectoryUploadsAsComplete(autoplay.leveldir->subdir);
+
       // continue with next level set
       autoplay.leveldir = getNextValidAutoPlayEntry(autoplay.leveldir);
 
@@ -1701,12 +1740,8 @@ static int AutoPlayTapesExt(boolean initialize)
     if (!global.autoplay_all && !global.autoplay_level[level_nr])
       continue;
 
-    char *tape_filename = (autoplay.tape_filename ? autoplay.tape_filename :
-                           options.mytapes ? getTapeFilename(level_nr) :
-                           getSolutionTapeFilename(level_nr));
-
-    // speed things up in case of missing tapes (by skipping loading level)
-    if (!fileExists(tape_filename))
+    // speed things up in case of missing private tapes (skip loading level)
+    if (options.mytapes && !fileExists(getTapeFilename(level_nr)))
     {
       autoplay.num_tape_missing++;
 
@@ -1744,7 +1779,7 @@ static int AutoPlayTapesExt(boolean initialize)
     {
       autoplay.num_tape_missing++;
 
-      Print("Tape %03d: (invalid tape)\n", level_nr);
+      Print("Tape %03d: (no tape found)\n", level_nr);
 
       continue;
     }
@@ -1832,7 +1867,7 @@ static int AutoPlayTapesExt(boolean initialize)
        }
       }
 
-      SaveServerScoreFromFile(level_nr, autoplay.tape_filename);
+      SaveServerScoreFromFile(level_nr, TRUE, autoplay.tape_filename);
 
       boolean success = AutoPlayTapes_WaitForUpload();
 
@@ -1844,7 +1879,7 @@ static int AutoPlayTapesExt(boolean initialize)
 
       if (!success)
       {
-       num_tapes = -1;
+       num_tapes = -num_tapes;
 
        break;
       }