moved code for HTTP request handling to separate functions
[rocksndiamonds.git] / src / screens.c
index 27d35a301e254902e17a69034545a30c6c5dd53e..55aa0c22f855bd6abad91e51fcfd88a8353108d5 100644 (file)
@@ -283,6 +283,7 @@ static void MapScreenTreeGadgets(TreeInfo *);
 static void UpdateScreenMenuGadgets(int, boolean);
 
 static boolean OfferUploadTapes(void);
+static void execOfferUploadTapes(void);
 
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 
@@ -4041,11 +4042,39 @@ void HandleInfoScreen(int mx, int my, int dx, int dy, int button)
 // change name functions
 // ============================================================================
 
-static void RenamePlayerOnServerExt(struct HttpRequest *request,
-                                   struct HttpResponse *response,
-                                   char *player_name_raw,
-                                   char *player_uuid_raw)
+struct ApiRenamePlayerThreadData
+{
+  char *player_name;
+  char *player_uuid;
+};
+
+static void *CreateThreadData_ApiRenamePlayer(void)
 {
+  struct ApiRenamePlayerThreadData *data =
+    checked_malloc(sizeof(struct ApiRenamePlayerThreadData));
+
+  data->player_name = getStringCopy(setup.player_name);
+  data->player_uuid = getStringCopy(setup.player_uuid);
+
+  return data;
+}
+
+static void FreeThreadData_ApiRenamePlayer(void *data_raw)
+{
+  struct ApiRenamePlayerThreadData *data = data_raw;
+
+  checked_free(data->player_name);
+  checked_free(data->player_uuid);
+  checked_free(data);
+}
+
+static boolean SetRequest_ApiRenamePlayer(struct HttpRequest *request,
+                                         void *data_raw)
+{
+  struct ApiRenamePlayerThreadData *data = data_raw;
+  char *player_name_raw = data->player_name;
+  char *player_uuid_raw = data->player_uuid;
+
   request->hostname = setup.api_server_hostname;
   request->port     = API_SERVER_PORT;
   request->method   = API_SERVER_METHOD;
@@ -4058,11 +4087,13 @@ static void RenamePlayerOnServerExt(struct HttpRequest *request,
           "{\n"
           "%s"
           "  \"game_version\":         \"%s\",\n"
+          "  \"game_platform\":        \"%s\",\n"
           "  \"name\":                 \"%s\",\n"
           "  \"uuid\":                 \"%s\"\n"
           "}\n",
           getPasswordJSON(setup.api_server_password),
           getProgramRealVersionString(),
+          getProgramPlatformString(),
           player_name,
           player_uuid);
 
@@ -4071,6 +4102,22 @@ static void RenamePlayerOnServerExt(struct HttpRequest *request,
 
   ConvertHttpRequestBodyToServerEncoding(request);
 
+  return TRUE;
+}
+
+static void HandleResponse_ApiRenamePlayer(struct HttpResponse *response,
+                                          void *data_raw)
+{
+  // nothing to do here
+}
+
+static void ApiRenamePlayer_HttpRequestExt(struct HttpRequest *request,
+                                          struct HttpResponse *response,
+                                          void *data_raw)
+{
+  if (!SetRequest_ApiRenamePlayer(request, data_raw))
+    return;
+
   if (!DoHttpRequest(request, response))
   {
     Error("HTTP request failed: %s", GetHttpError());
@@ -4086,48 +4133,39 @@ static void RenamePlayerOnServerExt(struct HttpRequest *request,
 
     return;
   }
+
+  HandleResponse_ApiRenamePlayer(response, data_raw);
 }
 
-static void RenamePlayerOnServer(char *player_name, char *player_uuid)
+static void ApiRenamePlayer_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));
+  ApiRenamePlayer_HttpRequestExt(request, response, data_raw);
 
-  RenamePlayerOnServerExt(request, response, player_name, player_uuid);
-
-  checked_free(request);
-  checked_free(response);
+  FreeThreadData_ApiRenamePlayer(data_raw);
 }
 
-struct RenamePlayerOnServerThreadData
+static int ApiRenamePlayerThread(void *data_raw)
 {
-  char *player_name;
-  char *player_uuid;
-};
-
-static int RenamePlayerOnServerThread(void *data_raw)
-{
-  struct RenamePlayerOnServerThreadData *data = data_raw;
+  struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
+  struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
 
-  RenamePlayerOnServer(data->player_name, data->player_uuid);
+  ApiRenamePlayer_HttpRequest(request, response, data_raw);
 
-  checked_free(data->player_name);
-  checked_free(data->player_uuid);
-  checked_free(data);
+  checked_free(request);
+  checked_free(response);
 
   return 0;
 }
 
-static void RenamePlayerOnServerAsThread(void)
+static void ApiRenamePlayerAsThread(void)
 {
-  struct RenamePlayerOnServerThreadData *data =
-    checked_malloc(sizeof(struct RenamePlayerOnServerThreadData));
-
-  data->player_name = getStringCopy(setup.player_name);
-  data->player_uuid = getStringCopy(setup.player_uuid);
+  struct ApiRenamePlayerThreadData *data =
+    CreateThreadData_ApiRenamePlayer();
 
-  ExecuteAsThread(RenamePlayerOnServerThread,
-                 "RenamePlayerOnServer", data,
+  ExecuteAsThread(ApiRenamePlayerThread,
+                 "ApiRenamePlayer", data,
                  "rename player on server");
 }
 
@@ -4270,7 +4308,7 @@ static void setTypeNameValues(char *name, struct TextPosInfo *pos,
   SaveSetup();
 
   // change name of edited user on score server
-  RenamePlayerOnServerAsThread();
+  ApiRenamePlayerAsThread();
 
   if (game_status == GAME_MODE_PSEUDO_TYPENAMES || reset_setup)
   {
@@ -5568,6 +5606,9 @@ static void execSetupGame(void)
 
   execSetupGame_setNetworkServerText();
 
+  if (!setup.provide_uploading_tapes)
+    setHideSetupEntry(execOfferUploadTapes);
+
   setup_mode = SETUP_MODE_GAME;
 
   DrawSetupScreen();
@@ -6875,7 +6916,7 @@ static struct TokenInfo setup_info_game[] =
   { TYPE_PLAYER,       &setup.network_player_nr,"Preferred Network Player:" },
   { TYPE_TEXT_INPUT,   execGadgetNetworkServer, "Network Server Hostname:" },
   { TYPE_STRING,       &network_server_text,   ""                      },
-  { TYPE_SWITCH,       &setup.api_server,      "Use Highscore Server:" },
+  { TYPE_SWITCH,       &setup.use_api_server,  "Use Highscore Server:" },
   { TYPE_SWITCH,       &setup.only_show_local_scores, "Only Show Local Scores:" },
   { TYPE_ENTER_LIST,   execOfferUploadTapes,   "Upload All Tapes to Server" },
   { TYPE_SWITCH,       &setup.multiple_users,  "Multiple Users/Teams:" },
@@ -7481,8 +7522,8 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx)
     ToggleNetworkModeIfNeeded();
 
   // API server mode may have changed at this point
-  if (si->value == &setup.api_server)
-    runtime.api_server = setup.api_server;
+  if (si->value == &setup.use_api_server)
+    runtime.use_api_server = setup.use_api_server;
 
   // game speed list may have changed at this point
   if (si->value == &setup.game_speed_extended)
@@ -9879,6 +9920,11 @@ static boolean OfferUploadTapes(void)
 
   Request(message, REQ_CONFIRM);
 
+  // after all tapes have been uploaded, remove entry from setup menu
+  setup.provide_uploading_tapes = FALSE;
+
+  SaveSetup();
+
   return (num_tapes_uploaded > 0);
 }
 
@@ -9895,7 +9941,13 @@ void CheckUploadTapes(void)
       Request("You can upload your tapes from the setup menu later!",
              REQ_CONFIRM);
   }
+  else
+  {
+    // if tapes directory does not exist yet, never offer uploading all tapes
+    setup.provide_uploading_tapes = FALSE;
+  }
 
+  // after asking for uploading all tapes once, do not ask again
   setup.ask_for_uploading_tapes = FALSE;
 
   SaveSetup();