1
0
forked from 0ad/0ad

Visual replay code cleanup. Refs #3440.

Moves StartVisualReplay() from JSInterface_VisualReplay.cpp to
VisualReplay.cpp, so that the former doesn't define any logic.
Uses replayFile.string8() instead of
utf8_from_wstring(replayFile.string()).
SAFE_DELETE instead of delete.
Fixes a compiler warning in getReplayDuration().

This was SVN commit r17314.
This commit is contained in:
elexis 2015-11-29 00:23:18 +00:00
parent 8cf2333568
commit 7de746cc58
4 changed files with 29 additions and 23 deletions

View File

@ -1485,8 +1485,7 @@ bool AutostartVisualReplay(const std::string& replayFile)
// TODO: Non progressive load can fail - need a decent way to handle this
LDR_NonprogressiveLoad();
PSRETURN ret = g_Game->ReallyStartGame();
ENSURE(ret == PSRETURN_OK);
ENSURE(g_Game->ReallyStartGame() == PSRETURN_OK);
ScriptInterface& scriptInterface = g_Game->GetSimulation2()->GetScriptInterface();

View File

@ -22,6 +22,8 @@
#include "gui/GUIManager.h"
#include "lib/allocators/shared_ptr.h"
#include "lib/utf8.h"
#include "network/NetClient.h"
#include "network/NetServer.h"
#include "ps/CLogger.h"
#include "ps/Filesystem.h"
#include "ps/Game.h"
@ -44,6 +46,21 @@ OsPath VisualReplay::GetDirectoryName()
return OsPath(psLogDir() / L"sim_log");
}
void VisualReplay::StartVisualReplay(CStrW directory)
{
ENSURE(!g_NetServer);
ENSURE(!g_NetClient);
ENSURE(!g_Game);
const OsPath replayFile = VisualReplay::GetDirectoryName() / directory / L"commands.txt";
if (!FileExists(replayFile))
return;
g_Game = new CGame(false, false);
g_Game->StartVisualReplay(replayFile.string8());
}
JS::Value VisualReplay::GetReplays(ScriptInterface& scriptInterface)
{
TIMER(L"GetReplays");
@ -129,7 +146,7 @@ inline int getReplayDuration(std::istream *replayStream, const CStr& fileName, c
if (!replayStream->good())
{
LOGERROR("Read error when determining replay duration at %i of %lu in %s", currentPosition - 2, fileSize, fileName.c_str());
LOGERROR("Read error when determining replay duration at %i of %llu in %s", currentPosition - 2, fileSize, fileName.c_str());
return -1;
}
@ -155,7 +172,7 @@ JS::Value VisualReplay::LoadReplayData(ScriptInterface& scriptInterface, OsPath&
const OsPath replayFile = GetDirectoryName() / directory / L"commands.txt";
if (debugParser)
debug_printf("Opening %s\n", utf8_from_wstring(replayFile.string()).c_str());
debug_printf("Opening %s\n", replayFile.string8().c_str());
if (!FileExists(replayFile))
return JSVAL_NULL;
@ -170,8 +187,7 @@ JS::Value VisualReplay::LoadReplayData(ScriptInterface& scriptInterface, OsPath&
return JSVAL_NULL;
// Open file
// TODO: enhancement: support unicode when OsString() is properly implemented for windows
const CStr fileName = utf8_from_wstring(replayFile.string());
const CStr fileName = replayFile.string8();
std::ifstream* replayStream = new std::ifstream(fileName.c_str());
// File must begin with "start"
@ -255,7 +271,7 @@ JS::Value VisualReplay::GetReplayAttributes(ScriptInterface::CxPrivate* pCxPriva
return attribs;
// Open file
std::istream* replayStream = new std::ifstream(utf8_from_wstring(replayFile.string()).c_str());
std::istream* replayStream = new std::ifstream(replayFile.string8().c_str());
CStr type, line;
ENSURE((*replayStream >> type).good() && type == "start");
@ -298,7 +314,7 @@ JS::Value VisualReplay::GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate
CStr line;
std::getline(*stream, line);
stream->close();
delete stream;
SAFE_DELETE(stream);
pCxPrivate->pScriptInterface->ParseJSON(line, &metadata);
return metadata;

View File

@ -36,6 +36,11 @@ namespace VisualReplay
*/
OsPath GetDirectoryName();
/**
* Replays the commands.txt file in the given subdirectory visually.
*/
void StartVisualReplay(CStrW directory);
/**
* Get a list of replays to display in the GUI.
*

View File

@ -17,26 +17,12 @@
#include "precompiled.h"
#include "network/NetClient.h"
#include "network/NetServer.h"
#include "ps/Filesystem.h"
#include "ps/Game.h"
#include "ps/VisualReplay.h"
#include "ps/scripting/JSInterface_VisualReplay.h"
void JSI_VisualReplay::StartVisualReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW directory)
{
ENSURE(!g_NetServer);
ENSURE(!g_NetClient);
ENSURE(!g_Game);
const OsPath replayFile = VisualReplay::GetDirectoryName() / directory / L"commands.txt";
if (FileExists(replayFile))
{
g_Game = new CGame(false, false);
// TODO: support unicode when OsString() is implemented for windows
g_Game->StartVisualReplay(utf8_from_wstring(replayFile.string()));
}
VisualReplay::StartVisualReplay(directory);
}
bool JSI_VisualReplay::DeleteReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW replayFile)