X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=79ed0aa7051ee186d7611ac7d95150b8f64bd8dc;hb=963345fd2614535471086111e64eded2cd9818e4;hp=8a5279b71a0122705844c3f1aaef7498052d3bf1;hpb=ab3d5a2937d41e04be3ae8884d9295d59ff346cd;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 8a5279b7..79ed0aa7 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1743,6 +1743,9 @@ void DrawMainMenu(void) OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); SyncEmscriptenFilesystem(); + + // needed once to upload tapes (after program start or after user change) + CheckUploadTapes(); } static void gotoTopLevelDir(void) @@ -2232,9 +2235,13 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) SaveLevelSetup_LastSeries(); SaveLevelSetup_SeriesInfo(); +#if defined(PLATFORM_EMSCRIPTEN) + Request("Close the browser window to quit!", REQ_CONFIRM); +#else if (!setup.ask_on_quit_program || Request("Do you really want to quit?", REQ_ASK | REQ_STAY_CLOSED)) SetGameStatus(GAME_MODE_QUIT); +#endif } } } @@ -4048,11 +4055,33 @@ struct ApiRenamePlayerThreadData char *player_uuid; }; -static void ApiRenamePlayerExt(struct HttpRequest *request, - struct HttpResponse *response, - char *player_name_raw, - char *player_uuid_raw) +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; @@ -4080,6 +4109,78 @@ static void ApiRenamePlayerExt(struct HttpRequest *request, ConvertHttpRequestBodyToServerEncoding(request); + return TRUE; +} + +static void HandleResponse_ApiRenamePlayer(struct HttpResponse *response, + void *data_raw) +{ + // nothing to do here +} + +#if defined(PLATFORM_EMSCRIPTEN) +static void Emscripten_ApiRenamePlayer_Loaded(unsigned handle, void *data_raw, + void *buffer, unsigned int size) +{ + struct HttpResponse *response = GetHttpResponseFromBuffer(buffer, size); + + if (response != NULL) + { + HandleResponse_ApiRenamePlayer(response, data_raw); + + checked_free(response); + } + else + { + Error("server response too large to handle (%d bytes)", size); + } + + FreeThreadData_ApiRenamePlayer(data_raw); +} + +static void Emscripten_ApiRenamePlayer_Failed(unsigned handle, void *data_raw, + int code, const char *status) +{ + Error("server failed to handle request: %d %s", code, status); + + FreeThreadData_ApiRenamePlayer(data_raw); +} + +static void Emscripten_ApiRenamePlayer_Progress(unsigned handle, void *data_raw, + int bytes, int size) +{ + // nothing to do here +} + +static void Emscripten_ApiRenamePlayer_HttpRequest(struct HttpRequest *request, + void *data_raw) +{ + if (!SetRequest_ApiRenamePlayer(request, data_raw)) + { + FreeThreadData_ApiRenamePlayer(data_raw); + + return; + } + + emscripten_async_wget2_data(request->uri, + request->method, + request->body, + data_raw, + TRUE, + Emscripten_ApiRenamePlayer_Loaded, + Emscripten_ApiRenamePlayer_Failed, + Emscripten_ApiRenamePlayer_Progress); +} + +#else + +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()); @@ -4095,39 +4196,40 @@ static void ApiRenamePlayerExt(struct HttpRequest *request, return; } + + HandleResponse_ApiRenamePlayer(response, data_raw); } -static void ApiRenamePlayer(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); - ApiRenamePlayerExt(request, response, player_name, player_uuid); - - checked_free(request); - checked_free(response); + FreeThreadData_ApiRenamePlayer(data_raw); } +#endif static int ApiRenamePlayerThread(void *data_raw) { - struct ApiRenamePlayerThreadData *data = data_raw; + struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest)); + struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse)); - ApiRenamePlayer(data->player_name, data->player_uuid); +#if defined(PLATFORM_EMSCRIPTEN) + Emscripten_ApiRenamePlayer_HttpRequest(request, data_raw); +#else + ApiRenamePlayer_HttpRequest(request, response, data_raw); +#endif - checked_free(data->player_name); - checked_free(data->player_uuid); - checked_free(data); + checked_free(request); + checked_free(response); return 0; } static void ApiRenamePlayerAsThread(void) { - struct ApiRenamePlayerThreadData *data = - checked_malloc(sizeof(struct ApiRenamePlayerThreadData)); - - data->player_name = getStringCopy(setup.player_name); - data->player_uuid = getStringCopy(setup.player_uuid); + struct ApiRenamePlayerThreadData *data = CreateThreadData_ApiRenamePlayer(); ExecuteAsThread(ApiRenamePlayerThread, "ApiRenamePlayer", data, @@ -4257,10 +4359,17 @@ static void setTypeNameValues(char *name, struct TextPosInfo *pos, // temporarily change active user to edited user user.nr = type_name_nr; - // load setup of edited user (unless creating user with current setup) - if (!create_user || - !Request("Use current setup values for the new player?", REQ_ASK)) + if (create_user && + Request("Use current setup values for the new player?", REQ_ASK)) + { + // use current setup values for new user, but create new player UUID + setup.player_uuid = getStringCopy(getUUID()); + } + else + { + // load setup for existing user (or start with defaults for new user) LoadSetup(); + } } char *setup_filename = getSetupFilename(); @@ -9881,7 +9990,19 @@ static boolean OfferUploadTapes(void) int num_tapes_uploaded = UploadTapes(); char message[100]; - sprintf(message, "%d tapes uploaded!", num_tapes_uploaded); + if (num_tapes_uploaded < 0) + { + Request("Cannot upload tapes to score server!", REQ_CONFIRM); + + return FALSE; + } + + if (num_tapes_uploaded == 0) + sprintf(message, "No tapes uploaded!"); + else if (num_tapes_uploaded == 1) + sprintf(message, "1 tape uploaded!"); + else + sprintf(message, "%d tapes uploaded!", num_tapes_uploaded); Request(message, REQ_CONFIRM); @@ -9890,7 +10011,7 @@ static boolean OfferUploadTapes(void) SaveSetup(); - return (num_tapes_uploaded > 0); + return TRUE; } void CheckUploadTapes(void) @@ -9898,6 +10019,9 @@ void CheckUploadTapes(void) if (!setup.ask_for_uploading_tapes) return; + // after asking for uploading all tapes once, do not ask again + setup.ask_for_uploading_tapes = FALSE; + if (directoryExists(getTapeDir(NULL))) { boolean tapes_uploaded = OfferUploadTapes(); @@ -9912,8 +10036,5 @@ void CheckUploadTapes(void) setup.provide_uploading_tapes = FALSE; } - // after asking for uploading all tapes once, do not ask again - setup.ask_for_uploading_tapes = FALSE; - SaveSetup(); }