| 3067 | } |
| 3068 | |
| 3069 | bool SaveGame::LoadHeader(int slot, SaveGameHeader* header) |
| 3070 | { |
| 3071 | if (!IsSaveGameSlotValid(slot)) |
| 3072 | return false; |
| 3073 | |
| 3074 | if (!DoesSaveGameExist(slot)) |
| 3075 | return false; |
| 3076 | |
| 3077 | auto fileName = GetSavegameFilename(slot); |
| 3078 | |
| 3079 | std::ifstream file; |
| 3080 | file.open(fileName, std::ios_base::app | std::ios_base::binary); |
| 3081 | |
| 3082 | file.seekg(0, std::ios::end); |
| 3083 | size_t length = file.tellg(); |
| 3084 | file.seekg(0, std::ios::beg); |
| 3085 | |
| 3086 | if (length == 0) |
| 3087 | { |
| 3088 | TENLog(fmt::format("Savegame #{} has no data.", slot), LogLevel::Warning); |
| 3089 | return false; |
| 3090 | } |
| 3091 | |
| 3092 | try |
| 3093 | { |
| 3094 | int size; |
| 3095 | file.read(reinterpret_cast<char*>(&size), sizeof(size)); |
| 3096 | |
| 3097 | std::unique_ptr<char[]> buffer = std::make_unique<char[]>(size); |
| 3098 | file.read(buffer.get(), size); |
| 3099 | file.close(); |
| 3100 | |
| 3101 | bool bufferIsValid = Save::VerifySaveGameBuffer(flatbuffers::Verifier(reinterpret_cast<const unsigned char*>(buffer.get()), size)); |
| 3102 | |
| 3103 | if (size <= 0 || size >= length || !bufferIsValid) |
| 3104 | { |
| 3105 | TENLog(fmt::format("Incorrect data in savegame #{}. The level format may be outdated.", slot), LogLevel::Warning); |
| 3106 | return false; |
| 3107 | } |
| 3108 | |
| 3109 | const Save::SaveGame* s = Save::GetSaveGame(buffer.get()); |
| 3110 | |
| 3111 | header->Level = s->header()->level(); |
| 3112 | header->LevelName = s->header()->level_name()->str(); |
| 3113 | header->LevelHash = s->header()->level_hash(); |
| 3114 | header->Hours = s->header()->hours(); |
| 3115 | header->Minutes = s->header()->minutes(); |
| 3116 | header->Seconds = s->header()->seconds(); |
| 3117 | header->Level = s->header()->level(); |
| 3118 | header->Timer = s->header()->timer(); |
| 3119 | header->Count = s->header()->count(); |
| 3120 | |
| 3121 | return true; |
| 3122 | } |
| 3123 | catch (std::exception& ex) |
| 3124 | { |
| 3125 | TENLog(fmt::format("Error reading savegame #{}. Exception: {}", slot, ex.what()), LogLevel::Error); |
| 3126 | return false; |
nothing calls this directly
no test coverage detected