Ticket #3255: t3255_prevent_replay_overwrites_v4.patch

File t3255_prevent_replay_overwrites_v4.patch, 4.4 KB (added by elexis, 8 years ago)
  • source/ps/Replay.cpp

     
    2222#include "graphics/TerrainTextureManager.h"
    2323#include "lib/timer.h"
    2424#include "lib/file/file_system.h"
    2525#include "lib/res/h_mgr.h"
    2626#include "lib/tex/tex.h"
     27#include "ps/CLogger.h"
    2728#include "ps/Game.h"
    2829#include "ps/Loader.h"
    2930#include "ps/Mod.h"
    3031#include "ps/Profile.h"
    3132#include "ps/ProfileViewer.h"
    32 #include "ps/Pyrogenesis.h"
     33#include "ps/VisualReplay.h"
    3334#include "scriptinterface/ScriptInterface.h"
    3435#include "scriptinterface/ScriptStats.h"
    3536#include "simulation2/Simulation2.h"
    3637#include "simulation2/helpers/SimulationCommand.h"
    3738
     39#include <ctime>
    3840#include <sstream>
    3941#include <fstream>
    4042#include <iomanip>
    4143
    42 #if MSC_VERSION
    43 #include <process.h>
    44 #define getpid _getpid // use the non-deprecated function name
    45 #endif
    46 
    4744static std::string Hexify(const std::string& s)
    4845{
    4946    std::stringstream str;
    5047    str << std::hex;
    5148    for (size_t i = 0; i < s.size(); ++i)
    CReplayLogger::~CReplayLogger()  
    6360    delete m_Stream;
    6461}
    6562
    6663void CReplayLogger::StartGame(JS::MutableHandleValue attribs)
    6764{
     65    const time_t timestamp = std::time(nullptr);
     66
    6867    // Add timestamp, since the file-modification-date can change
    69     m_ScriptInterface.SetProperty(attribs, "timestamp", std::to_string(std::time(nullptr)));
     68    m_ScriptInterface.SetProperty(attribs, "timestamp", std::to_string(timestamp));
    7069
    7170    // Add engine version and currently loaded mods for sanity checks when replaying
    7271    m_ScriptInterface.SetProperty(attribs, "engine_version", CStr(engine_version));
    7372    m_ScriptInterface.SetProperty(attribs, "mods", g_modsLoaded);
    7473
    75     // Construct the directory name based on the PID, to be relatively unique.
    76     // Append "-1", "-2" etc if we run multiple matches in a single session,
    77     // to avoid accidentally overwriting earlier logs.
    78     std::wstringstream name;
    79     name << getpid();
    80 
    81     static int run = -1;
    82     if (++run)
    83         name << "-" << run;
     74    // Construct directory name (for example 2015-11-02_001)
     75    const struct tm* now = localtime(&timestamp);
     76    const CStr directoryFormat = "%04d-%02d-%02d_%03d";
     77    char directory[directoryFormat.length()];
     78    for (int i=1; i<=1000; ++i)
     79    {
     80        sprintf(directory, directoryFormat.c_str(), now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, i);
     81
     82        m_Directory = VisualReplay::GetDirectoryName() / wstring_from_utf8(CStr(directory));
     83
     84        if (!DirectoryExists(m_Directory) && !FileExists(m_Directory))
     85            break;
     86
     87        if (i==1000)
     88            LOGERROR("Overwriting %s", m_Directory.string8());
     89    }
    8490
    85     m_Directory = psLogDir() / L"sim_log" / name.str();
    8691    CreateDirectories(m_Directory, 0700);
    8792
    8893    m_Stream = new std::ofstream(OsString(m_Directory / L"commands.txt").c_str(), std::ofstream::out | std::ofstream::trunc);
    8994    *m_Stream << "start " << m_ScriptInterface.StringifyJSON(attribs, false) << "\n";
    9095}
  • source/ps/VisualReplay.cpp

    const u8 minimumReplayDuration = 3;  
    3939 */
    4040const bool debugParser = false;
    4141
    4242OsPath VisualReplay::GetDirectoryName()
    4343{
    44     return OsPath(psLogDir() / L"sim_log");
     44    return OsPath(psLogDir() / (L"replays_v" + wstring_from_utf8(engine_version)));
    4545}
    4646
    4747JS::Value VisualReplay::GetReplays(ScriptInterface& scriptInterface)
    4848{
    4949    TIMER(L"GetReplays");
  • source/simulation2/Simulation2.cpp

     
    3939#include "ps/ConfigDB.h"
    4040#include "ps/Filesystem.h"
    4141#include "ps/Loader.h"
    4242#include "ps/Profile.h"
    4343#include "ps/Pyrogenesis.h"
     44#include "ps/VisualReplay.h"
    4445#include "ps/XML/Xeromyces.h"
    4546
    4647#include <iomanip>
    4748
    4849#if MSC_VERSION
    void CSimulation2Impl::DumpState()  
    553554
    554555    std::stringstream pid;
    555556    pid << getpid();
    556557    std::stringstream name;\
    557558    name << std::setw(5) << std::setfill('0') << m_TurnNumber << ".txt";
    558     OsPath path = psLogDir() / "sim_log" / pid.str() / name.str();
     559    OsPath path = VisualReplay::GetDirectoryName() / "oos_log" / name.str();
    559560    CreateDirectories(path.Parent(), 0700);
    560561    std::ofstream file (OsString(path).c_str(), std::ofstream::out | std::ofstream::trunc);
    561562
    562563    file << "State hash: " << std::hex;
    563564    std::string hashRaw;