Skip to content

Commit 5a37286

Browse files
authored
check header in OpenReplay (#2807)
* check header in OpenReplay * add version_info for old replay * simplify * add newline char
1 parent 276543a commit 5a37286

4 files changed

Lines changed: 21 additions & 17 deletions

File tree

gframe/game.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,7 @@ void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const w
12421242
void Game::RefreshReplay() {
12431243
lstReplayList->clear();
12441244
FileSystem::TraversalDir(L"./replay", [this](const wchar_t* name, bool isdir) {
1245-
if (!isdir && IsExtension(name, L".yrp") && Replay::CheckReplay(name))
1245+
if (!isdir && IsExtension(name, L".yrp"))
12461246
lstReplayList->addItem(name);
12471247
});
12481248
}

gframe/menu_handler.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -523,10 +523,13 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
523523
}
524524
case LISTBOX_REPLAY_LIST: {
525525
int sel = mainGame->lstReplayList->getSelected();
526-
if(sel == -1)
526+
if(sel < 0)
527+
break;
528+
auto filename = mainGame->lstReplayList->getListItem(sel);
529+
if (!filename)
527530
break;
528531
wchar_t replay_path[256]{};
529-
myswprintf(replay_path, L"./replay/%ls", mainGame->lstReplayList->getListItem(sel));
532+
myswprintf(replay_path, L"./replay/%ls", filename);
530533
if (!temp_replay.OpenReplay(replay_path)) {
531534
mainGame->stReplayInfo->setText(L"Error");
532535
break;
@@ -536,8 +539,12 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
536539
time_t curtime;
537540
if(temp_replay.pheader.flag & REPLAY_UNIFORM)
538541
curtime = temp_replay.pheader.start_time;
539-
else
542+
else{
540543
curtime = temp_replay.pheader.seed;
544+
wchar_t version_info[256]{};
545+
myswprintf(version_info, L"version 0x%X\n", temp_replay.pheader.version);
546+
repinfo.append(version_info);
547+
}
541548
std::wcsftime(infobuf, sizeof infobuf / sizeof infobuf[0], L"%Y/%m/%d %H:%M:%S\n", std::localtime(&curtime));
542549
repinfo.append(infobuf);
543550
if (temp_replay.pheader.flag & REPLAY_SINGLE_MODE) {

gframe/replay.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,16 @@ bool Replay::OpenReplay(const wchar_t* name) {
111111
return false;
112112

113113
Reset();
114-
if(std::fread(&pheader, sizeof pheader, 1, rfp) < 1) {
114+
bool correct_header = true;
115+
if (std::fread(&pheader, sizeof pheader, 1, rfp) < 1)
116+
correct_header = false;
117+
else if (pheader.id != 0x31707279)
118+
correct_header = false;
119+
else if (pheader.version < 0x12d0u)
120+
correct_header = false;
121+
else if (pheader.version >= 0x1353u && !(pheader.flag & REPLAY_UNIFORM))
122+
correct_header = false;
123+
if (!correct_header) {
115124
std::fclose(rfp);
116125
return false;
117126
}
@@ -142,17 +151,6 @@ bool Replay::OpenReplay(const wchar_t* name) {
142151
data_position = 0;
143152
return true;
144153
}
145-
bool Replay::CheckReplay(const wchar_t* name) {
146-
wchar_t fname[256];
147-
myswprintf(fname, L"./replay/%ls", name);
148-
FILE* rfp = mywfopen(fname, "rb");
149-
if(!rfp)
150-
return false;
151-
ReplayHeader rheader;
152-
size_t count = std::fread(&rheader, sizeof rheader, 1, rfp);
153-
std::fclose(rfp);
154-
return count == 1 && rheader.id == 0x31707279 && rheader.version >= 0x12d0u && (rheader.version < 0x1353u || (rheader.flag & REPLAY_UNIFORM));
155-
}
156154
bool Replay::DeleteReplay(const wchar_t* name) {
157155
wchar_t fname[256];
158156
myswprintf(fname, L"./replay/%ls", name);

gframe/replay.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ class Replay {
5353
void SaveReplay(const wchar_t* name);
5454

5555
// play
56-
static bool CheckReplay(const wchar_t* name);
5756
static bool DeleteReplay(const wchar_t* name);
5857
static bool RenameReplay(const wchar_t* oldname, const wchar_t* newname);
5958
static size_t GetDeckPlayer(size_t deck_index) {

0 commit comments

Comments
 (0)