Fixed replay-from-url bug.
Need to use simgear::HTTP::FileRequestRef shared pointer, otherwise HTTPFileRequest will delete it after the transfer. Also changed callback to a lambda to match reinstated simgear API.
This commit is contained in:
parent
9fdb3e2c2a
commit
32a066f810
3 changed files with 13 additions and 11 deletions
|
@ -1992,7 +1992,7 @@ void FGReplay::call_indexContinuousRecording(void* ref, const void* data, size_t
|
||||||
* Actual data and signal configuration is not read when in "Preview" mode.
|
* Actual data and signal configuration is not read when in "Preview" mode.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
FGReplay::loadTape(const SGPath& Filename, bool Preview, SGPropertyNode& MetaMeta, simgear::HTTP::FileRequest* filerequest)
|
FGReplay::loadTape(const SGPath& Filename, bool Preview, SGPropertyNode& MetaMeta, simgear::HTTP::FileRequestRef filerequest)
|
||||||
{
|
{
|
||||||
SG_LOG(SG_SYSTEMS, SG_DEBUG, "loading Preview=" << Preview << " Filename=" << Filename);
|
SG_LOG(SG_SYSTEMS, SG_DEBUG, "loading Preview=" << Preview << " Filename=" << Filename);
|
||||||
|
|
||||||
|
@ -2026,14 +2026,16 @@ FGReplay::loadTape(const SGPath& Filename, bool Preview, SGPropertyNode& MetaMet
|
||||||
m_num_frames_multiplayer = 0;
|
m_num_frames_multiplayer = 0;
|
||||||
m_continuous_indexing_in.open(Filename.str());
|
m_continuous_indexing_in.open(Filename.str());
|
||||||
m_continuous_indexing_pos = in.tellg();
|
m_continuous_indexing_pos = in.tellg();
|
||||||
SG_LOG(SG_SYSTEMS, SG_DEBUG, "filerequest=" << filerequest);
|
SG_LOG(SG_SYSTEMS, SG_DEBUG, "filerequest=" << filerequest.get());
|
||||||
|
|
||||||
// Make an in-memory index of the recording.
|
// Make an in-memory index of the recording.
|
||||||
if (filerequest) {
|
if (filerequest) {
|
||||||
// Always call indexContinuousRecording once in case there is
|
filerequest->setCallback(
|
||||||
// nothing to download.
|
[this](const void* data, size_t numbytes)
|
||||||
indexContinuousRecording(nullptr, 1 /*Zero means EOF. */);
|
{
|
||||||
filerequest->setCallback(call_indexContinuousRecording, this);
|
indexContinuousRecording(data, numbytes);
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
indexContinuousRecording(nullptr, 0);
|
indexContinuousRecording(nullptr, 0);
|
||||||
|
|
|
@ -133,7 +133,7 @@ public:
|
||||||
const SGPath& Filename,
|
const SGPath& Filename,
|
||||||
bool Preview,
|
bool Preview,
|
||||||
SGPropertyNode& MetaMeta,
|
SGPropertyNode& MetaMeta,
|
||||||
simgear::HTTP::FileRequest* filerequest=nullptr
|
simgear::HTTP::FileRequestRef filerequest=nullptr
|
||||||
);
|
);
|
||||||
|
|
||||||
// Attempts to load Continuous recording header properties into
|
// Attempts to load Continuous recording header properties into
|
||||||
|
|
|
@ -1595,7 +1595,7 @@ fgOptLoadTape(const char* arg)
|
||||||
//
|
//
|
||||||
struct DelayedTapeLoader : SGPropertyChangeListener {
|
struct DelayedTapeLoader : SGPropertyChangeListener {
|
||||||
|
|
||||||
DelayedTapeLoader( const char * tape, simgear::HTTP::FileRequest* filerequest) :
|
DelayedTapeLoader( const char * tape, simgear::HTTP::FileRequestRef filerequest) :
|
||||||
_tape(SGPath::fromUtf8(tape)),
|
_tape(SGPath::fromUtf8(tape)),
|
||||||
_filerequest(filerequest)
|
_filerequest(filerequest)
|
||||||
{
|
{
|
||||||
|
@ -1627,11 +1627,11 @@ fgOptLoadTape(const char* arg)
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
SGPath _tape;
|
SGPath _tape;
|
||||||
simgear::HTTP::FileRequest* _filerequest;
|
simgear::HTTP::FileRequestRef _filerequest;
|
||||||
};
|
};
|
||||||
|
|
||||||
SGPropertyNode_ptr properties(new SGPropertyNode);
|
SGPropertyNode_ptr properties(new SGPropertyNode);
|
||||||
simgear::HTTP::FileRequest* filerequest = nullptr;
|
simgear::HTTP::FileRequestRef filerequest;
|
||||||
|
|
||||||
std::string path = urlToLocalPath(arg);
|
std::string path = urlToLocalPath(arg);
|
||||||
if (path == "") {
|
if (path == "") {
|
||||||
|
@ -1653,7 +1653,7 @@ fgOptLoadTape(const char* arg)
|
||||||
const char* url = arg;
|
const char* url = arg;
|
||||||
FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>();
|
FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>();
|
||||||
http->init();
|
http->init();
|
||||||
filerequest = new simgear::HTTP::FileRequest(url, path, true /*append*/);
|
filerequest.reset(new simgear::HTTP::FileRequest(url, path, true /*append*/));
|
||||||
long max_download_speed = fgGetLong("/sim/replay/download-max-bytes-per-sec");
|
long max_download_speed = fgGetLong("/sim/replay/download-max-bytes-per-sec");
|
||||||
if (max_download_speed != 0) {
|
if (max_download_speed != 0) {
|
||||||
// Can be useful to limite download speed for testing background
|
// Can be useful to limite download speed for testing background
|
||||||
|
|
Loading…
Reference in a new issue