moved code for HTTP request handling to separate functions
[rocksndiamonds.git] / src / files.c
index 1c4faf2da5e2a7411b103313492ee9af3ba76406..6d99afccd0af57da1162fedb1ebe9c443f0be85a 100644 (file)
@@ -9068,11 +9068,38 @@ char *getPasswordJSON(char *password)
   return password_json;
 }
 
-static void ApiGetScoreExt(struct HttpRequest *request,
-                          struct HttpResponse *response,
-                          int level_nr,
-                          char *score_cache_filename)
+struct ApiGetScoreThreadData
+{
+  int level_nr;
+  char *score_cache_filename;
+};
+
+static void *CreateThreadData_ApiGetScore(int nr)
+{
+  struct ApiGetScoreThreadData *data =
+    checked_malloc(sizeof(struct ApiGetScoreThreadData));
+  char *score_cache_filename = getScoreCacheFilename(nr);
+
+  data->level_nr = nr;
+  data->score_cache_filename = getStringCopy(score_cache_filename);
+
+  return data;
+}
+
+static void FreeThreadData_ApiGetScore(void *data_raw)
+{
+  struct ApiGetScoreThreadData *data = data_raw;
+
+  checked_free(data->score_cache_filename);
+  checked_free(data);
+}
+
+static boolean SetRequest_ApiGetScore(struct HttpRequest *request,
+                                     void *data_raw)
 {
+  struct ApiGetScoreThreadData *data = data_raw;
+  int level_nr = data->level_nr;
+
   request->hostname = setup.api_server_hostname;
   request->port     = API_SERVER_PORT;
   request->method   = API_SERVER_METHOD;
@@ -9089,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)
   {
@@ -9118,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;
 
@@ -9142,45 +9162,57 @@ static void ApiGetScoreExt(struct HttpRequest *request,
   server_scores.updated = TRUE;
 }
 
-static void ApiGetScore(int level_nr, char *score_cache_filename)
+static void ApiGetScore_HttpRequestExt(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));
+  if (!SetRequest_ApiGetScore(request, data_raw))
+    return;
 
-  ApiGetScoreExt(request, response,
-                level_nr, score_cache_filename);
+  if (!DoHttpRequest(request, response))
+  {
+    Error("HTTP request failed: %s", GetHttpError());
 
-  checked_free(request);
-  checked_free(response);
+    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);
 }
 
-struct ApiGetScoreThreadData
+static void ApiGetScore_HttpRequest(struct HttpRequest *request,
+                                   struct HttpResponse *response,
+                                   void *data_raw)
 {
-  int level_nr;
-  char *score_cache_filename;
-};
+  ApiGetScore_HttpRequestExt(request, response, data_raw);
+
+  FreeThreadData_ApiGetScore(data_raw);
+}
 
 static int ApiGetScoreThread(void *data_raw)
 {
-  struct ApiGetScoreThreadData *data = data_raw;
+  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
+  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
 
-  ApiGetScore(data->level_nr,
-             data->score_cache_filename);
+  ApiGetScore_HttpRequest(request, response, data_raw);
 
-  checked_free(data->score_cache_filename);
-  checked_free(data);
+  checked_free(request);
+  checked_free(response);
 
   return 0;
 }
 
 static void ApiGetScoreAsThread(int nr)
 {
-  struct ApiGetScoreThreadData *data =
-    checked_malloc(sizeof(struct ApiGetScoreThreadData));
-  char *score_cache_filename = getScoreCacheFilename(nr);
-
-  data->level_nr = nr;
-  data->score_cache_filename = getStringCopy(score_cache_filename);
+  struct ApiGetScoreThreadData *data = CreateThreadData_ApiGetScore(nr);
 
   ExecuteAsThread(ApiGetScoreThread,
                  "ApiGetScore", data,
@@ -9327,12 +9359,45 @@ static char *get_file_base64(char *filename)
   return buffer_encoded;
 }
 
-static void ApiAddScoreExt(struct HttpRequest *request,
-                          struct HttpResponse *response,
-                          int level_nr,
-                          char *score_tape_filename,
-                          struct ScoreEntry *score_entry)
+struct ApiAddScoreThreadData
+{
+  int level_nr;
+  char *score_tape_filename;
+  struct ScoreEntry score_entry;
+};
+
+static void *CreateThreadData_ApiAddScore(int nr, char *score_tape_filename)
+{
+  struct ApiAddScoreThreadData *data =
+    checked_malloc(sizeof(struct ApiAddScoreThreadData));
+  struct ScoreEntry *score_entry = &scores.entry[scores.last_added];
+
+  if (score_tape_filename == NULL)
+    score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr);
+
+  data->level_nr = nr;
+  data->score_entry = *score_entry;
+  data->score_tape_filename = getStringCopy(score_tape_filename);
+
+  return data;
+}
+
+static void FreeThreadData_ApiAddScore(void *data_raw)
 {
+  struct ApiAddScoreThreadData *data = data_raw;
+
+  checked_free(data->score_tape_filename);
+  checked_free(data);
+}
+
+static boolean SetRequest_ApiAddScore(struct HttpRequest *request,
+                                     void *data_raw)
+{
+  struct ApiAddScoreThreadData *data = data_raw;
+  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;
   request->method   = API_SERVER_METHOD;
@@ -9344,7 +9409,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;
@@ -9418,6 +9483,22 @@ static void ApiAddScoreExt(struct HttpRequest *request,
 
   ConvertHttpRequestBodyToServerEncoding(request);
 
+  return TRUE;
+}
+
+static void HandleResponse_ApiAddScore(struct HttpResponse *response,
+                                      void *data_raw)
+{
+  server_scores.uploaded = TRUE;
+}
+
+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());
@@ -9434,39 +9515,27 @@ static void ApiAddScoreExt(struct HttpRequest *request,
     return;
   }
 
-  server_scores.uploaded = TRUE;
+  HandleResponse_ApiAddScore(response, data_raw);
 }
 
-static void ApiAddScore(int level_nr, char *score_tape_filename,
-                       struct ScoreEntry *score_entry)
+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));
-
-  ApiAddScoreExt(request, response,
-                level_nr, score_tape_filename, score_entry);
+  ApiAddScore_HttpRequestExt(request, response, data_raw);
 
-  checked_free(request);
-  checked_free(response);
+  FreeThreadData_ApiAddScore(data_raw);
 }
 
-struct ApiAddScoreThreadData
-{
-  int level_nr;
-  char *score_tape_filename;
-  struct ScoreEntry score_entry;
-};
-
 static int ApiAddScoreThread(void *data_raw)
 {
-  struct ApiAddScoreThreadData *data = data_raw;
+  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
+  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
 
-  ApiAddScore(data->level_nr,
-             data->score_tape_filename,
-             &data->score_entry);
+  ApiAddScore_HttpRequest(request, response, data_raw);
 
-  checked_free(data->score_tape_filename);
-  checked_free(data);
+  checked_free(request);
+  checked_free(response);
 
   return 0;
 }
@@ -9474,15 +9543,7 @@ static int ApiAddScoreThread(void *data_raw)
 static void ApiAddScoreAsThread(int nr, char *score_tape_filename)
 {
   struct ApiAddScoreThreadData *data =
-    checked_malloc(sizeof(struct ApiAddScoreThreadData));
-  struct ScoreEntry *score_entry = &scores.entry[scores.last_added];
-
-  if (score_tape_filename == NULL)
-    score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr);
-
-  data->level_nr = nr;
-  data->score_entry = *score_entry;
-  data->score_tape_filename = getStringCopy(score_tape_filename);
+    CreateThreadData_ApiAddScore(nr, score_tape_filename);
 
   ExecuteAsThread(ApiAddScoreThread,
                  "ApiAddScore", data,