- return NULL;
- }
-
- for (i = 0; i < buffer_size; i++)
- {
- int c = fgetc(file);
-
- if (c == EOF)
- {
- Error("cannot read from input file '%s'", filename);
-
- fclose(file);
- checked_free(buffer);
-
- return NULL;
- }
-
- buffer[i] = (byte)c;
- }
-
- fclose(file);
-
- int buffer_encoded_size = base64_encoded_size(buffer_size);
- char *buffer_encoded = checked_malloc(buffer_encoded_size);
-
- base64_encode(buffer_encoded, buffer, buffer_size);
-
- checked_free(buffer);
-
- return buffer_encoded;
-}
-
-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 void ApiAddScoreExt(struct HttpRequest *request,
- struct HttpResponse *response,
- 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;
-
- request->hostname = setup.api_server_hostname;
- request->port = API_SERVER_PORT;
- request->method = API_SERVER_METHOD;
- request->uri = API_SERVER_URI_ADD;
-
- char *tape_base64 = get_file_base64(score_tape_filename);
-
- if (tape_base64 == NULL)
- {
- Error("loading and base64 encoding score tape file failed");
-
- return;
- }
-
- char *player_name_raw = score_entry->name;
- char *player_uuid_raw = setup.player_uuid;
-
- if (options.player_name != NULL && global.autoplay_leveldir != NULL)
- {
- player_name_raw = options.player_name;
- player_uuid_raw = "";
- }
-
- char *levelset_identifier = getEscapedJSON(leveldir_current->identifier);
- char *levelset_name = getEscapedJSON(leveldir_current->name);
- char *levelset_author = getEscapedJSON(leveldir_current->author);
- char *level_name = getEscapedJSON(level.name);
- char *level_author = getEscapedJSON(level.author);
- char *player_name = getEscapedJSON(player_name_raw);
- char *player_uuid = getEscapedJSON(player_uuid_raw);
-
- snprintf(request->body, MAX_HTTP_BODY_SIZE,
- "{\n"
- "%s"
- " \"game_version\": \"%s\",\n"
- " \"game_platform\": \"%s\",\n"
- " \"batch_time\": \"%d\",\n"
- " \"levelset_identifier\": \"%s\",\n"
- " \"levelset_name\": \"%s\",\n"
- " \"levelset_author\": \"%s\",\n"
- " \"levelset_num_levels\": \"%d\",\n"
- " \"levelset_first_level\": \"%d\",\n"
- " \"level_nr\": \"%d\",\n"
- " \"level_name\": \"%s\",\n"
- " \"level_author\": \"%s\",\n"
- " \"rate_time_over_score\": \"%d\",\n"
- " \"player_name\": \"%s\",\n"
- " \"player_uuid\": \"%s\",\n"
- " \"score\": \"%d\",\n"
- " \"time\": \"%d\",\n"
- " \"tape_basename\": \"%s\",\n"
- " \"tape\": \"%s\"\n"
- "}\n",
- getPasswordJSON(setup.api_server_password),
- getProgramRealVersionString(),
- getProgramPlatformString(),
- (int)global.autoplay_time,
- levelset_identifier,
- levelset_name,
- levelset_author,
- leveldir_current->levels,
- leveldir_current->first_level,
- level_nr,
- level_name,
- level_author,
- level.rate_time_over_score,
- player_name,
- player_uuid,
- score_entry->score,
- score_entry->time,
- score_entry->tape_basename,
- tape_base64);
-
- checked_free(tape_base64);
-
- checked_free(levelset_identifier);
- checked_free(levelset_name);
- checked_free(levelset_author);
- checked_free(level_name);
- checked_free(level_author);
- checked_free(player_name);
- checked_free(player_uuid);
-
- 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;
- }
-
- server_scores.uploaded = TRUE;
-}
-
-static int ApiAddScoreThread(void *data_raw)
-{
- struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
- struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
-
- ApiAddScoreExt(request, response,
- data_raw);
-
- FreeThreadData_ApiAddScore(data_raw);
-
- checked_free(request);
- checked_free(response);
-
- return 0;
-}
-
-static void ApiAddScoreAsThread(int nr, char *score_tape_filename)
-{
- struct ApiAddScoreThreadData *data =
- CreateThreadData_ApiAddScore(nr, score_tape_filename);
-
- ExecuteAsThread(ApiAddScoreThread,
- "ApiAddScore", data,
- "upload score to server");