added escaping special characters in JSON strings for HTTP requests
[rocksndiamonds.git] / src / files.c
index a1901caea52d996c7fb7a5cd58f975d35f102165..75f0fe083942fec07af646a056c04992b2bcda8f 100644 (file)
@@ -5895,6 +5895,21 @@ int getMappedElement_SB(int element_ascii, boolean use_ces)
   return EL_UNDEFINED;
 }
 
+static void SetLevelSettings_SB(struct LevelInfo *level)
+{
+  // time settings
+  level->time = 0;
+  level->use_step_counter = TRUE;
+
+  // score settings
+  level->score[SC_TIME_BONUS] = 0;
+  level->time_score_base = 1;
+  level->rate_time_over_score = TRUE;
+
+  // game settings
+  level->auto_exit_sokoban = TRUE;
+}
+
 static void LoadLevelFromFileInfo_SB(struct LevelInfo *level,
                                     struct LevelFileInfo *level_file_info,
                                     boolean level_info_only)
@@ -6128,14 +6143,11 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level,
   }
 
   // set special level settings for Sokoban levels
-
-  level->time = 0;
-  level->use_step_counter = TRUE;
+  SetLevelSettings_SB(level);
 
   if (load_xsb_to_ces)
   {
     // special global settings can now be set in level template
-
     level->use_custom_template = TRUE;
   }
 }
@@ -6474,6 +6486,30 @@ static void LoadLevel_InitVersion(struct LevelInfo *level)
     level->keep_walkable_ce = TRUE;
 }
 
+static void LoadLevel_InitSettings_SB(struct LevelInfo *level)
+{
+  boolean is_sokoban_level = TRUE;    // unless non-Sokoban elements found
+  int x, y;
+
+  // check if this level is (not) a Sokoban level
+  for (y = 0; y < level->fieldy; y++)
+    for (x = 0; x < level->fieldx; x++)
+      if (!IS_SB_ELEMENT(Tile[x][y]))
+       is_sokoban_level = FALSE;
+
+  if (is_sokoban_level)
+  {
+    // set special level settings for Sokoban levels
+    SetLevelSettings_SB(level);
+  }
+}
+
+static void LoadLevel_InitSettings(struct LevelInfo *level)
+{
+  // adjust level settings for (non-native) Sokoban-style levels
+  LoadLevel_InitSettings_SB(level);
+}
+
 static void LoadLevel_InitStandardElements(struct LevelInfo *level)
 {
   int i, x, y;
@@ -6700,6 +6736,7 @@ static void LoadLevelTemplate_LoadAndInit(void)
 
   LoadLevel_InitVersion(&level_template);
   LoadLevel_InitElements(&level_template);
+  LoadLevel_InitSettings(&level_template);
 
   ActivateLevelTemplate();
 }
@@ -6740,6 +6777,7 @@ static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level)
   LoadLevel_InitVersion(&level);
   LoadLevel_InitElements(&level);
   LoadLevel_InitPlayfield(&level);
+  LoadLevel_InitSettings(&level);
 
   LoadLevel_InitNativeEngines(&level);
 }
@@ -8999,6 +9037,8 @@ static void DownloadServerScoreToCacheExt(struct HttpRequest *request,
           "}\n",
           levelset.identifier, nr, level.rate_time_over_score);
 
+  ConvertHttpRequestBodyToServerEncoding(request);
+
   if (!DoHttpRequest(request, response))
   {
     Error("HTTP request failed: %s", GetHttpError());
@@ -9234,6 +9274,11 @@ static void UploadScoreToServerExt(struct HttpRequest *request,
     return;
   }
 
+  char *levelset_identifier = getEscapedJSON(leveldir_current->identifier);
+  char *levelset_name       = getEscapedJSON(leveldir_current->name);
+  char *levelset_author     = getEscapedJSON(leveldir_current->author);
+  char *player_name         = getEscapedJSON(score_entry->name);
+
   snprintf(request->body, MAX_HTTP_BODY_SIZE,
           "{\n"
           "  \"game_version\":         \"%s\",\n"
@@ -9250,13 +9295,13 @@ static void UploadScoreToServerExt(struct HttpRequest *request,
           "  \"tape\":                 \"%s\"\n"
           "}\n",
           getProgramRealVersionString(),
-          leveldir_current->identifier,
-          leveldir_current->name,
-          leveldir_current->author,
+          levelset_identifier,
+          levelset_name,
+          levelset_author,
           leveldir_current->levels,
           leveldir_current->first_level,
           level_nr,
-          score_entry->name,
+          player_name,
           score_entry->score,
           score_entry->time,
           score_entry->tape_basename,
@@ -9264,6 +9309,11 @@ static void UploadScoreToServerExt(struct HttpRequest *request,
 
   checked_free(tape_base64);
 
+  checked_free(levelset_identifier);
+  checked_free(levelset_name);
+  checked_free(levelset_author);
+  checked_free(player_name);
+
   ConvertHttpRequestBodyToServerEncoding(request);
 
   if (!DoHttpRequest(request, response))