added wrapper function for loading and saving all setup files
[rocksndiamonds.git] / src / files.c
index 668a697f288cc12b92473f749b035d6c217fb5e4..4efaa553b090521489388493b5cf1a8b9e06bdd9 100644 (file)
@@ -9094,13 +9094,11 @@ static void FreeThreadData_ApiGetScore(void *data_raw)
   checked_free(data);
 }
 
-static void ApiGetScoreExt(struct HttpRequest *request,
-                          struct HttpResponse *response,
-                          void *data_raw)
+static boolean SetRequest_ApiGetScore(struct HttpRequest *request,
+                                     void *data_raw)
 {
   struct ApiGetScoreThreadData *data = data_raw;
   int level_nr = data->level_nr;
-  char *score_cache_filename = data->score_cache_filename;
 
   request->hostname = setup.api_server_hostname;
   request->port     = API_SERVER_PORT;
@@ -9118,25 +9116,18 @@ static void ApiGetScoreExt(struct HttpRequest *request,
           getPasswordJSON(setup.api_server_password),
           getProgramRealVersionString(),
           getProgramPlatformString(),
-          levelset.identifier, level_nr);
+          levelset.identifier,
+          level_nr);
 
   ConvertHttpRequestBodyToServerEncoding(request);
 
-  if (!DoHttpRequest(request, response))
-  {
-    Error("HTTP request failed: %s", GetHttpError());
-
-    return;
-  }
-
-  if (!HTTP_SUCCESS(response->status_code))
-  {
-    Error("server failed to handle request: %d %s",
-         response->status_code,
-         response->status_text);
+  return TRUE;
+}
 
-    return;
-  }
+static void HandleResponse_ApiGetScore(struct HttpResponse *response,
+                                      void *data_raw)
+{
+  struct ApiGetScoreThreadData *data = data_raw;
 
   if (response->body_size == 0)
   {
@@ -9147,7 +9138,7 @@ static void ApiGetScoreExt(struct HttpRequest *request,
 
   ConvertHttpResponseBodyToClientEncoding(response);
 
-  char *filename = score_cache_filename;
+  char *filename = data->score_cache_filename;
   FILE *file;
   int i;
 
@@ -9171,23 +9162,111 @@ static void ApiGetScoreExt(struct HttpRequest *request,
   server_scores.updated = TRUE;
 }
 
-static void ApiGetScore(void *data_raw)
+#if defined(PLATFORM_EMSCRIPTEN)
+static void Emscripten_ApiGetScore_Loaded(unsigned handle, void *data_raw,
+                                         void *buffer, unsigned int size)
 {
-  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
-  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
+  struct HttpResponse *response = GetHttpResponseFromBuffer(buffer, size);
 
-  ApiGetScoreExt(request, response,
-                data_raw);
+  if (response != NULL)
+  {
+    HandleResponse_ApiGetScore(response, data_raw);
 
-  checked_free(request);
-  checked_free(response);
+    checked_free(response);
+  }
+  else
+  {
+    Error("server response too large to handle (%d bytes)", size);
+  }
+
+  FreeThreadData_ApiGetScore(data_raw);
 }
 
-static int ApiGetScoreThread(void *data_raw)
+static void Emscripten_ApiGetScore_Failed(unsigned handle, void *data_raw,
+                                         int code, const char *status)
+{
+  Error("server failed to handle request: %d %s", code, status);
+
+  FreeThreadData_ApiGetScore(data_raw);
+}
+
+static void Emscripten_ApiGetScore_Progress(unsigned handle, void *data_raw,
+                                           int bytes, int size)
+{
+  // nothing to do here
+}
+
+static void Emscripten_ApiGetScore_HttpRequest(struct HttpRequest *request,
+                                              void *data_raw)
+{
+  if (!SetRequest_ApiGetScore(request, data_raw))
+  {
+    FreeThreadData_ApiGetScore(data_raw);
+
+    return;
+  }
+
+  emscripten_async_wget2_data(request->uri,
+                             request->method,
+                             request->body,
+                             data_raw,
+                             TRUE,
+                             Emscripten_ApiGetScore_Loaded,
+                             Emscripten_ApiGetScore_Failed,
+                             Emscripten_ApiGetScore_Progress);
+}
+
+#else
+
+static void ApiGetScore_HttpRequestExt(struct HttpRequest *request,
+                                      struct HttpResponse *response,
+                                      void *data_raw)
 {
-  ApiGetScore(data_raw);
+  if (!SetRequest_ApiGetScore(request, data_raw))
+    return;
+
+  if (!DoHttpRequest(request, response))
+  {
+    Error("HTTP request failed: %s", GetHttpError());
+
+    return;
+  }
+
+  if (!HTTP_SUCCESS(response->status_code))
+  {
+    Error("server failed to handle request: %d %s",
+         response->status_code,
+         response->status_text);
+
+    return;
+  }
+
+  HandleResponse_ApiGetScore(response, data_raw);
+}
+
+static void ApiGetScore_HttpRequest(struct HttpRequest *request,
+                                   struct HttpResponse *response,
+                                   void *data_raw)
+{
+  ApiGetScore_HttpRequestExt(request, response, data_raw);
 
   FreeThreadData_ApiGetScore(data_raw);
+}
+#endif
+
+static int ApiGetScoreThread(void *data_raw)
+{
+  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
+  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
+
+#if defined(PLATFORM_EMSCRIPTEN)
+  Emscripten_ApiGetScore_HttpRequest(request, data_raw);
+#else
+  ApiGetScore_HttpRequest(request, response, data_raw);
+#endif
+
+  checked_free(request);
+  checked_free(response);
 
   return 0;
 }
@@ -9372,14 +9451,13 @@ static void FreeThreadData_ApiAddScore(void *data_raw)
   checked_free(data);
 }
 
-static void ApiAddScoreExt(struct HttpRequest *request,
-                          struct HttpResponse *response,
-                          void *data_raw)
+static boolean SetRequest_ApiAddScore(struct HttpRequest *request,
+                                     void *data_raw)
 {
   struct ApiAddScoreThreadData *data = data_raw;
-  int level_nr = data->level_nr;
-  char *score_tape_filename = data->score_tape_filename;
   struct ScoreEntry *score_entry = &data->score_entry;
+  char *score_tape_filename = data->score_tape_filename;
+  int level_nr = data->level_nr;
 
   request->hostname = setup.api_server_hostname;
   request->port     = API_SERVER_PORT;
@@ -9392,7 +9470,7 @@ static void ApiAddScoreExt(struct HttpRequest *request,
   {
     Error("loading and base64 encoding score tape file failed");
 
-    return;
+    return FALSE;
   }
 
   char *player_name_raw = score_entry->name;
@@ -9466,6 +9544,78 @@ static void ApiAddScoreExt(struct HttpRequest *request,
 
   ConvertHttpRequestBodyToServerEncoding(request);
 
+  return TRUE;
+}
+
+static void HandleResponse_ApiAddScore(struct HttpResponse *response,
+                                      void *data_raw)
+{
+  server_scores.uploaded = TRUE;
+}
+
+#if defined(PLATFORM_EMSCRIPTEN)
+static void Emscripten_ApiAddScore_Loaded(unsigned handle, void *data_raw,
+                                         void *buffer, unsigned int size)
+{
+  struct HttpResponse *response = GetHttpResponseFromBuffer(buffer, size);
+
+  if (response != NULL)
+  {
+    HandleResponse_ApiAddScore(response, data_raw);
+
+    checked_free(response);
+  }
+  else
+  {
+    Error("server response too large to handle (%d bytes)", size);
+  }
+
+  FreeThreadData_ApiAddScore(data_raw);
+}
+
+static void Emscripten_ApiAddScore_Failed(unsigned handle, void *data_raw,
+                                         int code, const char *status)
+{
+  Error("server failed to handle request: %d %s", code, status);
+
+  FreeThreadData_ApiAddScore(data_raw);
+}
+
+static void Emscripten_ApiAddScore_Progress(unsigned handle, void *data_raw,
+                                           int bytes, int size)
+{
+  // nothing to do here
+}
+
+static void Emscripten_ApiAddScore_HttpRequest(struct HttpRequest *request,
+                                              void *data_raw)
+{
+  if (!SetRequest_ApiAddScore(request, data_raw))
+  {
+    FreeThreadData_ApiAddScore(data_raw);
+
+    return;
+  }
+
+  emscripten_async_wget2_data(request->uri,
+                             request->method,
+                             request->body,
+                             data_raw,
+                             TRUE,
+                             Emscripten_ApiAddScore_Loaded,
+                             Emscripten_ApiAddScore_Failed,
+                             Emscripten_ApiAddScore_Progress);
+}
+
+#else
+
+static void ApiAddScore_HttpRequestExt(struct HttpRequest *request,
+                                      struct HttpResponse *response,
+                                      void *data_raw)
+{
+  if (!SetRequest_ApiAddScore(request, data_raw))
+    return;
+
   if (!DoHttpRequest(request, response))
   {
     Error("HTTP request failed: %s", GetHttpError());
@@ -9482,26 +9632,32 @@ static void ApiAddScoreExt(struct HttpRequest *request,
     return;
   }
 
-  server_scores.uploaded = TRUE;
+  HandleResponse_ApiAddScore(response, data_raw);
 }
 
-static void ApiAddScore(void *data_raw)
+static void ApiAddScore_HttpRequest(struct HttpRequest *request,
+                                   struct HttpResponse *response,
+                                   void *data_raw)
 {
-  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
-  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
+  ApiAddScore_HttpRequestExt(request, response, data_raw);
 
-  ApiAddScoreExt(request, response,
-                data_raw);
-
-  checked_free(request);
-  checked_free(response);
+  FreeThreadData_ApiAddScore(data_raw);
 }
+#endif
 
 static int ApiAddScoreThread(void *data_raw)
 {
-  ApiAddScore(data_raw);
+  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
+  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
 
-  FreeThreadData_ApiAddScore(data_raw);
+#if defined(PLATFORM_EMSCRIPTEN)
+  Emscripten_ApiAddScore_HttpRequest(request, data_raw);
+#else
+  ApiAddScore_HttpRequest(request, response, data_raw);
+#endif
+
+  checked_free(request);
+  checked_free(response);
 
   return 0;
 }
@@ -10752,7 +10908,7 @@ static void setSetupInfoFromTokenInfo(SetupFileHash *setup_file_hash,
                            token_info[token_nr].text);
 }
 
-static void decodeSetupFileHash(SetupFileHash *setup_file_hash)
+static void decodeSetupFileHash_Default(SetupFileHash *setup_file_hash)
 {
   int i, pnr;
 
@@ -10908,7 +11064,7 @@ void LoadSetupFromFilename(char *filename)
 
   if (setup_file_hash)
   {
-    decodeSetupFileHash(setup_file_hash);
+    decodeSetupFileHash_Default(setup_file_hash);
 
     freeSetupFileHash(setup_file_hash);
   }
@@ -10947,7 +11103,7 @@ static void LoadSetup_SpecialPostProcessing(void)
   }
 }
 
-void LoadSetup(void)
+void LoadSetup_Default(void)
 {
   char *filename;
 
@@ -11008,6 +11164,13 @@ void LoadSetup_EditorCascade(void)
   free(filename);
 }
 
+void LoadSetup(void)
+{
+  LoadSetup_Default();
+  LoadSetup_AutoSetup();
+  LoadSetup_EditorCascade();
+}
+
 static void addGameControllerMappingToHash(SetupFileHash *mappings_hash,
                                           char *mapping_line)
 {
@@ -11057,7 +11220,7 @@ static void LoadSetup_ReadGameControllerMappings(SetupFileHash *mappings_hash,
   fclose(file);
 }
 
-void SaveSetup(void)
+void SaveSetup_Default(void)
 {
   char *filename = getSetupFilename();
   FILE *file;
@@ -11218,6 +11381,13 @@ void SaveSetup_EditorCascade(void)
   free(filename);
 }
 
+void SaveSetup(void)
+{
+  SaveSetup_Default();
+  SaveSetup_AutoSetup();
+  SaveSetup_EditorCascade();
+}
+
 static void SaveSetup_WriteGameControllerMappings(SetupFileHash *mappings_hash,
                                                  char *filename)
 {